From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 03:04:41 +0000 Subject: [PATCH] rk3568 rt init --- kernel/kernel/watchdog.c | 2 kernel/drivers/media/platform/rockchip/cif/dev.h | 1 kernel/kernel/rcu/tree.h | 6 kernel/drivers/video/rockchip/mpp/mpp_vepu2.c | 20 kernel/kernel/trace/trace_output.c | 19 kernel/kernel/rcu/rcu.h | 11 kernel/include/linux/mutex.h | 20 kernel/include/linux/radix-tree.h | 7 kernel/drivers/mmc/host/rtsx_usb_sdmmc.c | 1 kernel/drivers/mmc/host/sunxi-mmc.c | 1 kernel/arch/arm/mm/highmem.c | 58 kernel/kernel/rcu/tree.c | 153 kernel/tools/perf/bench/bench.h | 4 kernel/drivers/mmc/host/sdhci-spear.c | 1 kernel/include/linux/suspend.h | 6 kernel/drivers/soc/rockchip/rockchip_system_monitor.c | 35 kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi | 3 kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h | 7 kernel/arch/x86/kernel/fpu/core.c | 12 kernel/drivers/mmc/host/pxamci.c | 1 kernel/kernel/irq_work.c | 76 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c | 43 kernel/include/linux/smp.h | 3 kernel/include/linux/kdb.h | 2 kernel/kernel/printk/printk.c | 157 kernel/drivers/rkflash/sfc_nor.c | 21 kernel/kernel/sched/core.c | 520 kernel/kernel/stop_machine.c | 7 kernel/arch/arm/configs/at91_dt_defconfig | 2 kernel/include/linux/pstore.h | 8 kernel/drivers/gpu/drm/i915/i915_request.c | 8 kernel/drivers/video/rockchip/rga3/rga_job.c | 357 kernel/kernel/events/core.c | 4 kernel/sound/soc/codecs/Kconfig | 5 kernel/drivers/mmc/host/rtsx_pci_sdmmc.c | 1 kernel/include/linux/nfs_xdr.h | 2 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 74 kernel/kernel/rcu/tree_plugin.h | 158 kernel/arch/x86/include/asm/thread_info.h | 11 kernel/drivers/gpu/drm/drm_internal.h | 4 kernel/drivers/misc/eeprom/at24.c | 148 kernel/arch/x86/kvm/lapic.c | 2 kernel/drivers/tty/serial/8250/8250_core.c | 11 kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S | 45038 +++++++------- kernel/arch/arm64/crypto/crc32-ce-glue.c | 3 kernel/kernel/sched/completion.c | 34 kernel/kernel/fork.c | 45 kernel/kernel/workqueue.c | 341 kernel/drivers/scsi/libfc/fc_exch.c | 4 kernel/drivers/headset_observe/rk_headset.c | 10 kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c | 2 kernel/include/linux/buffer_head.h | 42 kernel/lib/Kconfig | 1 kernel/drivers/headset_observe/rk_headset.h | 1 kernel/drivers/mmc/host/sdhci-esdhc-imx.c | 1 kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c | 155 kernel/tools/perf/bench/futex-lock-pi.c | 11 kernel/include/linux/cgroup-defs.h | 2 kernel/include/linux/iommu.h | 5 kernel/arch/arm64/kernel/asm-offsets.c | 1 kernel/include/linux/highmem.h | 32 kernel/net/wireless/core.h | 4 kernel/include/linux/soc/rockchip/rk_vendor_storage.h | 37 kernel/arch/x86/mm/pageattr.c | 8 kernel/drivers/clk/rockchip/clk-out.c | 99 kernel/drivers/media/i2c/Kconfig | 11 kernel/arch/arm/boot/dts/rk322x.dtsi | 1 kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h | 42 kernel/arch/arm/kernel/signal.c | 3 kernel/fs/fscache/cookie.c | 8 kernel/drivers/char/random.c | 11 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c | 26 kernel/arch/x86/include/asm/preempt.h | 33 kernel/arch/arm/boot/dts/rk3528-evb2-ddr3-v10.dts | 12 kernel/drivers/iommu/iommu.c | 3 kernel/include/linux/spinlock.h | 12 kernel/crypto/cryptd.c | 19 kernel/kernel/time/tick-sched.c | 31 kernel/arch/x86/include/asm/fpu/api.h | 1 kernel/include/linux/spinlock_types_up.h | 4 kernel/tools/perf/util/parse-events.y | 4 kernel/kernel/sched/Makefile | 2 kernel/arch/alpha/include/asm/spinlock_types.h | 4 kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h | 47 kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile | 1 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c | 13 kernel/mm/zsmalloc.c | 80 kernel/drivers/iio/adc/rockchip_saradc.c | 18 kernel/arch/arm/mach-sti/platsmp.c | 10 kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c | 33 kernel/drivers/md/raid5.h | 1 kernel/arch/arm/mach-prima2/platsmp.c | 10 kernel/net/netfilter/core.c | 6 kernel/drivers/clk/rockchip/clk-pvtm.c | 3 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h | 1 kernel/drivers/video/rockchip/rga3/rga_common.c | 62 kernel/arch/arm/mach-spear/platsmp.c | 10 kernel/net/sched/sch_generic.c | 14 kernel/virt/kvm/arm/arm.c | 6 kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_y8_v8.S | 74565 +++++++++++++++++++++++++ kernel/drivers/iommu/rockchip-iommu.c | 213 kernel/arch/arm/kernel/entry-armv.S | 19 kernel/kernel/locking/rtmutex_common.h | 29 kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c | 22 kernel/drivers/misc/Kconfig | 12 kernel/drivers/nvmem/rockchip-otp.c | 17 kernel/include/linux/rtmutex.h | 22 kernel/include/linux/sched/wake_q.h | 27 kernel/arch/powerpc/kernel/entry_32.S | 29 kernel/drivers/usb/core/hub.c | 1 kernel/drivers/video/rockchip/rga3/rga2_reg_info.c | 241 kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 145 kernel/fs/inode.c | 2 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts | 2 kernel/mm/vmstat.c | 12 kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 6 kernel/arch/x86/mm/highmem_32.c | 13 kernel/net/xfrm/xfrm_ipcomp.c | 21 kernel/arch/sparc/kernel/irq_64.c | 2 kernel/Documentation/devicetree/bindings/clock/rockchip,clk-out.yaml | 107 kernel/drivers/mmc/host/sdhci-of-dwcmshc.c | 139 kernel/arch/powerpc/Kconfig | 6 kernel/drivers/md/raid5.c | 8 kernel/arch/powerpc/kernel/misc_32.S | 2 kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c | 18 kernel/fs/dcache.c | 50 kernel/arch/x86/kernel/apic/io_apic.c | 16 kernel/include/linux/irqflags.h | 23 kernel/kernel/Kconfig.locks | 4 kernel/mm/compaction.c | 6 kernel/drivers/tty/sysrq.c | 6 kernel/kernel/sched/cpudeadline.c | 4 kernel/fs/eventpoll.c | 4 kernel/fs/namespace.c | 8 kernel/include/linux/mm_types.h | 4 kernel/kernel/watchdog_hld.c | 10 kernel/arch/x86/include/asm/stackprotector.h | 8 kernel/drivers/mmc/host/wmt-sdmmc.c | 1 kernel/kernel/irq/handle.c | 8 kernel/kernel/rcu/srcutree.c | 36 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi | 1098 kernel/drivers/md/dm-rq.c | 1 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dts | 31 kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c | 2 kernel/arch/powerpc/include/asm/thread_info.h | 18 kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.h | 18 kernel/drivers/mmc/host/dw_mmc-k3.c | 1 kernel/arch/arm64/kernel/process.c | 2 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi | 163 kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.c | 1573 kernel/net/core/pktgen.c | 4 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi | 76 kernel/samples/trace_events/trace-events-sample.c | 2 kernel/include/linux/thread_info.h | 12 kernel/kernel/debug/kdb/kdb_io.c | 2 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h | 5 kernel/net/ipv4/icmp.c | 8 kernel/drivers/firmware/rockchip_sip.c | 32 kernel/drivers/scsi/fcoe/fcoe.c | 16 kernel/kernel/irq/settings.h | 12 kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt | 18 kernel/drivers/video/rockchip/rga3/rga_dma_buf.c | 60 kernel/drivers/mmc/host/wbsd.c | 1 kernel/include/linux/cpu.h | 1 kernel/drivers/mmc/host/jz4740_mmc.c | 1 kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h | 4 kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c | 191 kernel/fs/proc/array.c | 4 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dts | 31 kernel/drivers/net/phy/phy_device.c | 10 kernel/init/main.c | 1 kernel/drivers/extcon/extcon.c | 5 kernel/drivers/soc/rockchip/mtd_vendor_storage.c | 73 kernel/block/blk-ioc.c | 5 kernel/arch/arm64/boot/dts/rockchip/rk3528.dtsi | 2489 kernel/fs/namei.c | 4 kernel/fs/ext4/page-io.c | 6 kernel/drivers/video/rockchip/rga3/include/rga_drv.h | 26 kernel/arch/arm64/configs/rockchip_linux_defconfig | 512 kernel/arch/xtensa/include/asm/spinlock_types.h | 4 kernel/lib/ubsan.c | 69 kernel/drivers/usb/serial/Makefile | 1 kernel/drivers/clk/rockchip/clk-rk3528.c | 1175 kernel/arch/arm64/kernel/cpufeature.c | 6 kernel/arch/mips/kernel/mips-mt-fpaff.c | 2 kernel/include/linux/fscache.h | 1 kernel/include/linux/timer.h | 2 kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 1176 kernel/kernel/locking/spinlock_debug.c | 5 kernel/fs/nfs/nfs4proc.c | 4 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c | 27 kernel/include/linux/uaccess.h | 2 kernel/init/init_task.c | 14 kernel/include/dt-bindings/soc/rockchip-system-status.h | 4 kernel/lib/irq_poll.c | 5 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile | 33 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c | 2 kernel/sound/soc/rockchip/rockchip_pdm.c | 39 kernel/arch/sh/kernel/irq.c | 2 kernel/Makefile | 2 kernel/drivers/media/platform/rockchip/cif/capture.c | 141 kernel/drivers/gpu/drm/drm_prime.c | 20 kernel/sound/soc/codecs/rk817_codec.c | 117 kernel/arch/x86/kernel/irq_32.c | 2 kernel/include/soc/rockchip/rockchip_system_monitor.h | 6 kernel/arch/hexagon/include/asm/spinlock_types.h | 4 kernel/drivers/soc/rockchip/Kconfig.cpu | 3 kernel/drivers/mmc/host/mxs-mmc.c | 1 kernel/drivers/net/ethernet/stmicro/stmmac/common.h | 7 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi | 13 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c | 41 kernel/arch/x86/entry/entry_32.S | 17 kernel/drivers/firmware/arm_sdei.c | 41 kernel/init/Makefile | 2 kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 254 kernel/block/blk-softirq.c | 3 kernel/drivers/char/hw_random/rockchip-rng.c | 120 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 4 kernel/include/linux/locallock.h | 282 kernel/drivers/soc/rockchip/Kconfig | 13 kernel/drivers/usb/gadget/function/uvc_v4l2.c | 2 kernel/fs/squashfs/decompressor_multi_percpu.c | 16 kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S | 2097 kernel/drivers/video/rockchip/rga3/include/rga_iommu.h | 36 kernel/kernel/rcu/rcutorture.c | 7 kernel/drivers/devfreq/event/rockchip-dfi.c | 49 kernel/drivers/video/rockchip/rga3/rga_policy.c | 18 kernel/drivers/dma-buf/dma-buf.c | 8 kernel/sound/soc/generic/simple-card.c | 4 kernel/arch/arm/mach-imx/cpuidle-imx6q.c | 10 kernel/mm/swap.c | 74 kernel/drivers/soc/rockchip/rockchip_pm_config.c | 1 kernel/arch/arm/configs/rv1126-snapshot.config | 2 kernel/drivers/mmc/host/atmel-mci.c | 1 kernel/drivers/mmc/host/usdhi6rol0.c | 1 kernel/include/linux/rwlock_types.h | 4 kernel/drivers/spi/spi-rockchip.c | 386 kernel/drivers/devfreq/rockchip_dmc_dbg.c | 96 kernel/drivers/dma-buf/reservation.c | 43 kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi | 30 kernel/sound/soc/codecs/hdmi-codec.c | 67 kernel/kernel/time/posix-cpu-timers.c | 181 kernel/drivers/mmc/core/mmc_ops.c | 6 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dtsi | 92 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dts | 32 kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 7 kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt | 33 kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts | 12 kernel/arch/arm64/include/asm/thread_info.h | 6 kernel/kernel/sched/swait.c | 22 kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi | 2 kernel/kernel/rcu/tree_exp.h | 9 kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi | 10 kernel/include/net/net_seq_lock.h | 15 kernel/arch/arm/mach-omap2/omap-smp.c | 10 kernel/tools/perf/tests/bp_account.c | 2 kernel/drivers/media/i2c/Makefile | 1 kernel/net/packet/af_packet.c | 5 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts | 12 kernel/drivers/cpufreq/Kconfig.x86 | 2 kernel/fs/userfaultfd.c | 12 kernel/include/linux/dcache.h | 4 kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi | 6 kernel/drivers/mmc/host/sdhci-pxav3.c | 1 kernel/drivers/mmc/host/sh_mmcif.c | 1 kernel/drivers/mmc/host/moxart-mmc.c | 1 kernel/tools/lib/traceevent/Makefile | 2 kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c | 23 kernel/drivers/mmc/host/s3cmci.c | 1 kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h | 1 kernel/drivers/tty/serial/omap-serial.c | 12 kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c | 18 kernel/kernel/rcu/Kconfig | 6 kernel/localversion-rt | 1 kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c | 12 kernel/include/linux/arm_sdei.h | 40 kernel/drivers/headset_observe/rockchip_headset_core.c | 29 kernel/kernel/sched/sched.h | 14 kernel/kernel/sched/debug.c | 4 kernel/drivers/media/i2c/gc2145.c | 22 kernel/drivers/block/zram/zcomp.c | 13 kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi | 1 kernel/kernel/sched/cpupri.c | 4 kernel/crypto/scompress.c | 6 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h | 12 kernel/kernel/sched/rt.c | 8 kernel/drivers/mmc/host/tmio_mmc.c | 1 kernel/scripts/mkimg | 6 kernel/include/linux/device.h | 11 kernel/drivers/block/zram/zcomp.h | 1 kernel/kernel/time/timer.c | 89 kernel/include/linux/rwsem_rt.h | 69 kernel/drivers/mmc/host/sdhci-bcm-kona.c | 1 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c | 2 kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 18 kernel/drivers/usb/typec/tcpm/tcpm.c | 2 kernel/drivers/clk/rockchip/Kconfig | 6 kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | 2 kernel/kernel/trace/trace_events.c | 2 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c | 3 kernel/drivers/tty/serial/8250/8250_port.c | 5 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h | 2 kernel/drivers/rknpu/rknpu_debugger.c | 10 kernel/arch/arm/kernel/asm-offsets.c | 1 kernel/drivers/gpu/drm/drm_edid.c | 108 kernel/arch/arm64/configs/rockchip_rt.config | 22 kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c | 10 kernel/include/linux/workqueue.h | 4 kernel/kernel/power/wakeup_reason.c | 36 kernel/drivers/clk/rockchip/clk-rk3399.c | 4 kernel/drivers/media/platform/rockchip/isp/dmarx.c | 6 kernel/include/linux/sched/mm.h | 11 kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi | 2 kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c | 8 kernel/kernel/workqueue_internal.h | 5 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c | 20 kernel/include/uapi/linux/cec.h | 6 kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi | 11 kernel/drivers/hv/hv.c | 4 kernel/drivers/infiniband/hw/hfi1/sdma.c | 3 kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c | 84 kernel/include/linux/percpu.h | 29 kernel/drivers/gpu/drm/i915/intel_sprite.c | 13 kernel/arch/powerpc/platforms/ps3/device-init.c | 4 kernel/drivers/i2c/busses/i2c-hix5hd2.c | 3 kernel/arch/arm64/configs/rk3528_box.config | 65 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi | 29 kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi | 6 kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c | 55 kernel/sound/soc/rockchip/Kconfig | 1 kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c | 42 kernel/kernel/locking/rtmutex.c | 962 kernel/include/linux/interrupt.h | 63 kernel/net/sunrpc/svc_xprt.c | 4 kernel/sound/core/pcm_dmaengine.c | 12 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h | 19 kernel/drivers/pci/controller/rockchip-pcie-dma.h | 1 kernel/drivers/devfreq/rockchip_dmc.c | 134 kernel/drivers/video/rockchip/mpp/mpp_iep2.c | 105 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h | 8 kernel/kernel/rcu/update.c | 6 kernel/drivers/clk/rockchip/clk-rk3568.c | 6 kernel/virt/kvm/arm/arch_timer.c | 6 kernel/arch/arm/mach-qcom/platsmp.c | 10 kernel/include/linux/trace_events.h | 2 kernel/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi | 1406 kernel/tools/perf/util/parse-events.c | 61 kernel/drivers/devfreq/rockchip_bus.c | 1 kernel/drivers/mmc/host/dw_mmc.h | 3 kernel/drivers/net/phy/fixed_phy.c | 23 kernel/drivers/infiniband/hw/qib/qib_file_ops.c | 7 kernel/drivers/mmc/host/dw_mmc.c | 29 kernel/include/linux/spinlock_types_raw.h | 55 kernel/mm/slub.c | 139 kernel/security/apparmor/include/path.h | 19 kernel/sound/core/control_compat.c | 4 kernel/drivers/mmc/host/dw_mmc-pltfm.c | 1 kernel/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi | 88 kernel/net/core/gen_stats.c | 8 kernel/arch/arm/configs/sama5_defconfig | 2 kernel/fs/fuse/dir.c | 2 kernel/arch/arm64/include/asm/spinlock_types.h | 4 kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c | 509 kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h | 169 kernel/include/linux/bottom_half.h | 34 kernel/net/core/gen_estimator.c | 6 kernel/arch/x86/Kconfig | 8 kernel/drivers/clk/rockchip/Makefile | 3 kernel/kernel/locking/rwsem-rt.c | 312 kernel/block/blk-mq.h | 4 kernel/kernel/Kconfig.preempt | 39 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts | 8 kernel/block/blk-mq.c | 36 kernel/kernel/ksysfs.c | 12 kernel/drivers/crypto/rockchip/Kconfig | 4 kernel/fs/nfs/delegation.c | 4 kernel/arch/arm/mm/fault.c | 6 kernel/fs/nfs/inode.c | 4 kernel/arch/arm64/boot/dts/rockchip/Makefile | 9 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c | 24 kernel/include/linux/percpu-rwsem.h | 24 kernel/include/dt-bindings/suspend/rockchip-rk3528.h | 54 kernel/drivers/media/i2c/imx241.c | 1356 kernel/arch/arm/boot/dts/rk3036.dtsi | 24 kernel/kernel/sched/features.h | 8 kernel/drivers/pci/controller/dwc/pcie-designware-host.c | 4 kernel/drivers/mmc/host/mvsdio.c | 1 kernel/net/core/dev.c | 61 kernel/fs/cifs/readdir.c | 2 kernel/drivers/of/base.c | 19 kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c | 14 kernel/drivers/soc/rockchip/rockchip_opp_select.c | 160 kernel/drivers/mmc/core/core.c | 4 device/rockchip/common/build.sh | 2 kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi | 9 kernel/arch/arm64/configs/px30_linux_defconfig | 5 kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c | 2 kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c | 26 kernel/drivers/video/rockchip/mpp/mpp_vdpp.c | 70 kernel/include/drm/bridge/dw_hdmi.h | 6 kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c | 376 kernel/include/linux/nfs_fs.h | 4 kernel/lib/debugobjects.c | 5 kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig | 36 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c | 113 kernel/scripts/io-domain.sh | 21 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h | 13 kernel/arch/arm64/configs/rk3358_linux.config | 13 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi | 132 kernel/drivers/dma-buf/heaps/Makefile | 2 kernel/drivers/mmc/host/mtk-sd.c | 1 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c | 4 kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile | 2 kernel/lib/locking-selftest.c | 50 kernel/arch/x86/crypto/aesni-intel_glue.c | 22 kernel/arch/arm64/kernel/fpsimd.c | 31 kernel/drivers/iio/imu/inv_icm40605/icm40605.h | 3 kernel/mm/slab.c | 94 kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c | 2 kernel/drivers/media/platform/rockchip/isp/dev.c | 6 kernel/arch/x86/crypto/cast5_avx_glue.c | 21 kernel/drivers/video/rockchip/rga3/rga3_reg_info.c | 396 kernel/kernel/time/tick-common.c | 10 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 4 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | 1 kernel/kernel/power/suspend.c | 4 kernel/sound/soc/codecs/Makefile | 2 kernel/mm/slab.h | 2 kernel/include/linux/blk-cgroup.h | 2 kernel/arch/arm64/kernel/signal.c | 2 kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c | 81 kernel/include/linux/rcupdate.h | 75 kernel/drivers/media/platform/rockchip/isp/capture_v21.c | 113 kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h | 7 kernel/kernel/time/itimer.c | 1 kernel/arch/arm/plat-versatile/platsmp.c | 10 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h | 37 kernel/drivers/mmc/host/sdhci-s3c.c | 1 kernel/fs/exec.c | 2 kernel/drivers/mmc/host/omap_hsmmc.c | 1 kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c | 2 kernel/include/linux/vmstat.h | 4 kernel/sound/soc/codecs/rk3528_codec.c | 771 kernel/tools/perf/bench/sched-messaging.c | 4 kernel/include/linux/rcu_assign_pointer.h | 54 kernel/arch/arm/boot/dts/rk3288.dtsi | 3 kernel/sound/soc/codecs/rk3528_codec.h | 229 kernel/include/linux/extcon.h | 1 kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi | 3 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 26 kernel/drivers/irqchip/irq-gic-v3-its.c | 82 kernel/drivers/infiniband/hw/hfi1/affinity.c | 6 kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt | 3 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts | 10 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h | 47 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi | 13 kernel/drivers/media/platform/rockchip/isp/rkisp.c | 49 kernel/include/linux/memcontrol.h | 2 kernel/sound/core/pcm_trace.h | 26 kernel/net/wireless/scan.c | 12 kernel/drivers/mmc/host/davinci_mmc.c | 1 kernel/include/linux/wait.h | 5 kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S | 1807 kernel/drivers/usb/host/xhci-ring.c | 4 kernel/kernel/sched/swork.c | 173 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c | 15 kernel/drivers/rkflash/sfc_nand.c | 27 kernel/arch/arm/Makefile | 1 kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c | 311 kernel/include/linux/preempt.h | 107 kernel/drivers/leds/trigger/Kconfig | 1 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi | 16 kernel/arch/x86/kernel/fpu/signal.c | 2 kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h | 251 kernel/include/linux/jbd2.h | 24 kernel/arch/x86/kernel/process_32.c | 32 kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c | 1 kernel/include/linux/kthread.h | 4 kernel/include/linux/netdevice.h | 101 kernel/lib/radix-tree.c | 32 kernel/mm/Kconfig | 2 kernel/drivers/spi/spi-rockchip-test.c | 12 kernel/arch/arm/boot/dts/Makefile | 6 kernel/kernel/ptrace.c | 32 kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi | 27 kernel/drivers/soc/rockchip/rockchip_debug.c | 13 kernel/sound/soc/rockchip/rockchip_sai.c | 226 kernel/drivers/mmc/host/sdhci-tegra.c | 1 kernel/kernel/cpu.c | 44 kernel/drivers/soc/rockchip/flash_vendor_storage.c | 25 kernel/kernel/cgroup/cpuset.c | 68 kernel/arch/x86/include/asm/signal.h | 13 kernel/kernel/softirq.c | 750 kernel/arch/arm/boot/dts/rk3066a.dtsi | 20 kernel/kernel/irq/spurious.c | 8 kernel/drivers/mmc/host/au1xmmc.c | 1 kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h | 3 kernel/drivers/hv/vmbus_drv.c | 4 kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c | 24 kernel/include/dt-bindings/clock/rk3528-cru.h | 747 kernel/drivers/thermal/rockchip_thermal.c | 174 kernel/include/linux/seqlock.h | 66 kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c | 3 kernel/kernel/signal.c | 116 kernel/include/linux/netfilter/x_tables.h | 7 kernel/drivers/gpu/drm/i915/i915_gem.c | 10 kernel/drivers/rknpu/rknpu_drv.c | 14 kernel/drivers/video/rockchip/mpp/mpp_iommu.c | 9 kernel/security/apparmor/lsm.c | 2 kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h | 3 kernel/kernel/trace/trace_hwlat.c | 2 kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | 2 kernel/arch/arm64/configs/rk3326_linux.config | 17 kernel/drivers/crypto/rockchip/rk_crypto_core.c | 38 kernel/arch/arm/mach-exynos/platsmp.c | 12 kernel/include/linux/reservation.h | 4 kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c | 30 kernel/include/linux/rwsem.h | 11 kernel/drivers/video/rockchip/rga3/rga_drv.c | 201 kernel/net/bluetooth/rfcomm/sock.c | 7 kernel/fs/proc/proc_sysctl.c | 2 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c | 341 kernel/drivers/video/rockchip/mpp/mpp_iommu.h | 15 kernel/arch/arm64/kvm/va_layout.c | 7 kernel/drivers/media/platform/rockchip/isp/capture.c | 8 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h | 9 kernel/arch/arm64/boot/dts/rockchip/rk3528-android.dtsi | 106 kernel/drivers/md/bcache/Kconfig | 1 kernel/sound/soc/codecs/rk312x_codec.c | 3 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi | 92 kernel/kernel/locking/locktorture.c | 1 kernel/include/linux/usb/hcd.h | 3 kernel/arch/arm/boot/dts/rk3528-evb1-ddr4-v10.dts | 12 kernel/kernel/time/timekeeping.h | 3 kernel/drivers/staging/android/ion/ion_trace.h | 2 kernel/mm/vmalloc.c | 13 kernel/drivers/pwm/pwm-rockchip.c | 6 kernel/drivers/media/cec/cec-adap.c | 50 kernel/drivers/mmc/host/sdhci-acpi.c | 1 kernel/kernel/time/timekeeping.c | 6 kernel/fs/buffer.c | 21 kernel/drivers/pci/controller/dwc/Kconfig | 7 kernel/include/dt-bindings/display/rockchip-tve.h | 15 kernel/kernel/cgroup/rstat.c | 5 kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c | 26 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c | 1 kernel/include/linux/irq_work.h | 8 kernel/kernel/kthread.c | 42 kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c | 5 kernel/fs/nfs/dir.c | 12 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c | 49 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c | 1178 kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt | 1 kernel/arch/mips/Kconfig | 2 kernel/drivers/video/rockchip/rga3/include/rga_debugger.h | 1 kernel/arch/powerpc/platforms/cell/spufs/sched.c | 2 kernel/arch/x86/entry/entry_64.S | 18 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi | 137 kernel/drivers/gpu/drm/i915/i915_irq.c | 2 kernel/arch/mips/kernel/traps.c | 6 kernel/drivers/tee/optee/supp.c | 22 kernel/kernel/sched/topology.c | 1 kernel/include/linux/random.h | 2 kernel/mm/highmem.c | 6 kernel/include/asm-generic/percpu.h | 1 kernel/include/net/sch_generic.h | 19 kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi | 9 kernel/drivers/thermal/x86_pkg_temp_thermal.c | 24 kernel/drivers/soc/rockchip/rk_fiq_debugger.c | 181 kernel/drivers/video/rockchip/rga3/rga_fence.c | 4 kernel/include/linux/blk-mq.h | 2 kernel/arch/powerpc/include/asm/spinlock_types.h | 4 kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi | 21 kernel/drivers/video/rockchip/rga3/rga_iommu.c | 49 kernel/sound/soc/rockchip/rockchip_i2s_tdm.h | 37 kernel/drivers/mmc/host/android-goldfish.c | 1 kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi | 43 kernel/sound/soc/rockchip/rockchip_i2s_tdm.c | 951 kernel/net/wireless/sme.c | 32 kernel/drivers/tty/serial/amba-pl011.c | 17 kernel/include/linux/pid.h | 1 kernel/include/linux/sched.h | 162 kernel/drivers/mmc/host/dw_mmc-exynos.c | 1 kernel/arch/ia64/include/asm/spinlock_types.h | 4 kernel/arch/arm/boot/dts/rk312x.dtsi | 16 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dts | 35 kernel/drivers/usb/gadget/configfs.c | 21 kernel/kernel/time/tick-broadcast-hrtimer.c | 2 kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h | 168 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 624 kernel/drivers/video/rockchip/rga3/include/rga_common.h | 6 kernel/arch/arm64/include/asm/alternative.h | 6 kernel/drivers/mmc/host/sdhci-sirf.c | 1 kernel/drivers/gpu/drm/radeon/radeon_display.c | 2 kernel/include/linux/skbuff.h | 7 kernel/drivers/soc/rockchip/rockchip-cpuinfo.c | 9 kernel/kernel/irq/manage.c | 13 kernel/drivers/scsi/fcoe/fcoe_ctlr.c | 4 kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h | 6 kernel/include/linux/rwlock_rt.h | 119 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h | 13 kernel/arch/powerpc/kernel/entry_64.S | 32 kernel/arch/powerpc/kernel/irq.c | 2 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 520 kernel/arch/x86/kernel/asm-offsets.c | 2 kernel/fs/ntfs/aops.c | 10 kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi | 7 kernel/drivers/clocksource/Makefile | 3 kernel/drivers/usb/host/ehci-hub.c | 3 kernel/kernel/trace/trace.h | 2 kernel/include/net/gen_stats.h | 9 kernel/drivers/misc/nkio/nk_io_core.c_bak | 427 kernel/kernel/trace/trace.c | 37 kernel/arch/arm/boot/dts/rv1126.dtsi | 6 kernel/arch/powerpc/kernel/asm-offsets.c | 1 kernel/drivers/mmc/host/sdhci-cns3xxx.c | 1 kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt | 1 kernel/arch/arm/include/asm/switch_to.h | 8 kernel/drivers/media/platform/rockchip/cif/hw.h | 2 kernel/fs/aio.c | 13 kernel/kernel/power/hibernate.c | 7 kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt | 5 kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 2 kernel/drivers/media/platform/rockchip/cif/hw.c | 1 kernel/drivers/mmc/host/sdhci-dove.c | 1 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h | 10 kernel/drivers/video/rockchip/mpp/mpp_vepu1.c | 18 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c | 265 kernel/fs/locks.c | 32 kernel/include/linux/fs.h | 2 kernel/arch/arm64/boot/dts/rockchip/rk3528-iotest-lp3-v10.dts | 203 kernel/mm/page_alloc.c | 196 kernel/net/Kconfig | 2 kernel/include/linux/kernel.h | 4 kernel/lib/smp_processor_id.c | 7 kernel/include/linux/rockchip/rockchip_sip.h | 7 kernel/arch/arm64/kernel/entry.S | 12 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h | 7 kernel/drivers/media/platform/rockchip/isp/isp_params.h | 2 kernel/include/linux/spinlock_types_nort.h | 33 kernel/drivers/crypto/caam/qi.c | 43 kernel/sound/soc/rockchip/rockchip_spdif.c | 63 kernel/drivers/crypto/caam/qi.h | 2 kernel/include/linux/rwlock_types_rt.h | 55 kernel/kernel/time/posix-timers.c | 42 kernel/include/linux/blkdev.h | 5 kernel/sound/soc/rockchip/rockchip_spdif.h | 16 kernel/drivers/mmc/host/sdhci-of-hlwd.c | 1 kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c | 4 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c | 239 kernel/kernel/time/posix-timers.h | 2 kernel/net/ipv4/tcp_ipv4.c | 6 kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt | 1 kernel/include/linux/completion.h | 8 kernel/kernel/time/jiffies.c | 7 kernel/include/linux/stop_machine.h | 2 kernel/drivers/gpu/drm/i915/i915_trace.h | 6 kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c | 86 kernel/net/core/skbuff.c | 33 kernel/drivers/video/rockchip/rga3/include/rga_job.h | 14 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h | 2 kernel/drivers/mmc/host/sdhci-iproc.c | 1 kernel/drivers/mmc/host/sdhci-of-at91.c | 1 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c | 3 kernel/include/linux/posix-timers.h | 3 kernel/drivers/media/platform/rockchip/isp/hw.c | 3 kernel/drivers/usb/gadget/function/u_serial.c | 112 kernel/net/rfkill/rfkill-bt.c | 248 kernel/kernel/sched/fair.c | 86 kernel/drivers/dma-buf/heaps/rk_cma_heap.c | 616 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c | 225 kernel/kernel/locking/lockdep.c | 2 kernel/arch/arm/configs/rv1126-trailcamera.config | 2 kernel/tools/perf/bench/futex-hash.c | 12 kernel/include/linux/swap.h | 2 kernel/drivers/mmc/host/sdhci-pxav2.c | 1 kernel/include/linux/spinlock_types.h | 78 kernel/sound/soc/rockchip/rockchip_hdmi.c | 3 kernel/drivers/usb/core/hcd.c | 3 kernel/drivers/net/phy/motorcomm.c | 15 kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt | 4 kernel/drivers/mmc/host/sdhci_f_sdh30.c | 1 kernel/fs/nfs/nfs4state.c | 22 kernel/kernel/panic.c | 2 kernel/arch/powerpc/kernel/misc_64.S | 2 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c | 7 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts | 12 kernel/include/net/sock.h | 4 kernel/arch/arm/include/asm/spinlock_types.h | 4 kernel/drivers/usb/serial/option.c | 197 kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 334 kernel/lib/Kconfig.debug | 2 kernel/drivers/soc/rockchip/pm_domains.c | 47 kernel/fs/pstore/ram.c | 78 kernel/arch/arm/mach-at91/Kconfig | 25 kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c | 4 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 8 kernel/include/soc/at91/atmel_tcb.h | 183 kernel/arch/arm64/Kconfig | 1 kernel/include/linux/irqchip/arm-gic-v3.h | 1 kernel/init/Kconfig | 5 kernel/arch/x86/kvm/x86.c | 7 kernel/arch/arm/include/asm/irq.h | 2 kernel/include/linux/hrtimer.h | 29 kernel/include/linux/signal.h | 1 kernel/include/uapi/linux/rk-pcie-ep.h | 67 kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 41 kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 35 kernel/drivers/rtc/rtc-rk808.c | 7 kernel/arch/arm/configs/rockchip_linux_defconfig | 2 kernel/include/uapi/linux/rkisp21-config.h | 1 kernel/drivers/mmc/host/sdhci-st.c | 1 kernel/drivers/gpu/drm/bridge/lontium-lt9611.c | 10 kernel/drivers/media/platform/rockchip/isp/isp_ispp.h | 4 kernel/arch/arm/mach-hisi/platmcpm.c | 22 kernel/arch/arm64/boot/dts/rockchip/rk-stb-ir-keymap.dtsi | 397 kernel/drivers/clk/rockchip/clk.h | 28 kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi | 2 kernel/drivers/rkflash/sfc.c | 4 kernel/include/linux/spinlock_types_rt.h | 48 kernel/arch/powerpc/kvm/Kconfig | 1 kernel/lib/scatterlist.c | 2 kernel/drivers/rkflash/sfc.h | 5 kernel/include/linux/list_bl.h | 30 kernel/drivers/gpu/drm/rockchip/Makefile | 2 kernel/include/linux/idr.h | 5 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi | 672 kernel/drivers/media/i2c/imx464.c | 1042 kernel/scripts/mkcompile_h | 6 kernel/fs/timerfd.c | 6 kernel/drivers/mmc/host/omap.c | 1 kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 27 kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c | 3 kernel/arch/arm/kernel/entry-common.S | 9 kernel/fs/proc/base.c | 3 kernel/include/dt-bindings/input/rk-ir.h | 34 kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi | 243 kernel/drivers/pci/switch/switchtec.c | 24 kernel/arch/arm/Kconfig | 5 kernel/drivers/thermal/cpu_cooling.c | 2 kernel/drivers/media/platform/rockchip/isp1/rkisp1.c | 2 kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr4-v10-linux.dts | 13 kernel/net/rds/ib_rdma.c | 3 kernel/sound/soc/rockchip/rockchip_i2s.c | 120 kernel/drivers/clocksource/tcb_clksrc.c | 69 kernel/drivers/usb/gadget/legacy/inode.c | 4 kernel/drivers/misc/Makefile | 3 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo.dtsi | 497 kernel/drivers/cpufreq/cpufreq_interactive.c | 90 kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c | 128 kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c | 206 kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h | 7 kernel/drivers/video/rockchip/mpp/mpp_service.c | 35 kernel/drivers/clocksource/Kconfig | 13 kernel/kernel/locking/spinlock.c | 7 kernel/sound/soc/rockchip/rockchip_multi_dais.c | 10 kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c | 6 kernel/kernel/time/alarmtimer.c | 2 kernel/kernel/exit.c | 2 kernel/kernel/cgroup/cgroup.c | 9 kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h | 9 kernel/include/linux/pstore_ram.h | 20 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c | 17 kernel/include/linux/rockchip/cpu.h | 14 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dts | 50 kernel/mm/mmu_context.c | 2 kernel/fs/pstore/Kconfig | 6 kernel/include/dt-bindings/power/rk3528-power.h | 18 kernel/arch/sh/include/asm/spinlock_types.h | 4 kernel/drivers/usb/gadget/function/f_uac1.c | 8 kernel/drivers/mfd/fusb302.c | 119 kernel/drivers/mmc/host/dw_mmc-rockchip.c | 7 kernel/drivers/mfd/fusb302.h | 20 kernel/drivers/staging/android/vsoc.c | 6 kernel/mm/memcontrol.c | 28 kernel/include/linux/rcutree.h | 8 kernel/drivers/watchdog/watchdog_dev.c | 8 kernel/drivers/net/phy/rk630phy.c | 71 kernel/include/linux/swait.h | 16 kernel/fs/pstore/inode.c | 14 kernel/sound/soc/rockchip/rockchip_multicodecs.c | 516 kernel/kernel/futex.c | 126 kernel/include/linux/irq.h | 4 kernel/include/linux/spinlock_api_smp.h | 4 kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi | 4 kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c | 82 kernel/arch/arm/boot/dts/rk3528-evb3-lp4x-v10.dts | 12 kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 596 kernel/drivers/mmc/core/mmc.c | 27 kernel/drivers/video/rockchip/mpp/mpp_common.h | 91 kernel/include/linux/delay.h | 6 kernel/drivers/media/spi/ms41908.c | 16 kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi | 47 kernel/drivers/mmc/host/sdhci-of-arasan.c | 1 kernel/drivers/video/rockchip/mpp/mpp_common.c | 455 kernel/drivers/clocksource/timer-atmel-tcb.c | 617 kernel/arch/arm64/configs/rockchip_defconfig | 2 kernel/drivers/mailbox/rockchip-mailbox.c | 19 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi | 16 kernel/drivers/media/platform/rockchip/isp/regs_v2x.h | 2 kernel/arch/x86/platform/efi/efi_64.c | 10 kernel/drivers/gpu/drm/drm_gem.c | 17 kernel/drivers/hv/hyperv_vmbus.h | 1 kernel/include/linux/rbtree.h | 2 kernel/arch/powerpc/platforms/pseries/iommu.c | 16 kernel/include/linux/printk.h | 2 kernel/kernel/locking/Makefile | 9 kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c | 17 kernel/arch/s390/include/asm/spinlock_types.h | 4 kernel/drivers/pinctrl/pinctrl-rockchip.c | 208 kernel/arch/mips/include/asm/switch_to.h | 4 kernel/drivers/pinctrl/pinctrl-rockchip.h | 1 kernel/include/linux/platform_device.h | 4 kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 8 kernel/arch/arm/boot/dts/rk3528-evb4-ddr4-v10.dts | 12 kernel/arch/arm/include/asm/thread_info.h | 8 kernel/drivers/net/ethernet/stmicro/stmmac/Makefile | 23 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h | 9 kernel/arch/ia64/kernel/mca.c | 2 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c | 17 kernel/block/blk-core.c | 15 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c | 115 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c | 103 kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h | 673 kernel/drivers/video/rockchip/rga3/rga_mm.c | 279 kernel/arch/arm64/boot/dts/rockchip/px30.dtsi | 10 kernel/include/linux/regulator/consumer.h | 5 kernel/kernel/sched/deadline.c | 12 kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 6 kernel/include/net/neighbour.h | 6 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi | 13 kernel/arch/Kconfig | 1 kernel/fs/nfs/unlink.c | 35 kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c | 5 kernel/include/net/cfg80211.h | 15 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c | 234 kernel/arch/x86/mm/iomap_32.c | 11 kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c | 190 kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c | 162 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h | 6 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c | 128 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi | 138 kernel/include/linux/swork.h | 24 kernel/include/linux/sched/task.h | 11 kernel/sound/core/pcm_lib.c | 3 kernel/drivers/mmc/host/sdhci-of-esdhc.c | 1 kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c | 4 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c | 10 kernel/drivers/char/tpm/tpm_tis.c | 29 kernel/kernel/locking/rwlock-rt.c | 384 kernel/include/linux/spinlock_rt.h | 156 kernel/drivers/firmware/efi/efi.c | 5 kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi | 353 kernel/kernel/locking/mutex-rt.c | 223 kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi | 37 kernel/drivers/video/rockchip/mpp/mpp_debug.h | 3 kernel/drivers/block/zram/zram_drv.h | 3 kernel/kernel/time/hrtimer.c | 126 kernel/mm/kmemleak.c | 92 kernel/arch/arm64/crypto/Kconfig | 28 kernel/drivers/rknpu/rknpu_job.c | 8 kernel/fs/nfs/nfs4_fs.h | 2 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb4-ddr4-v10.dts | 35 kernel/arch/arm64/kernel/alternative.c | 1 kernel/drivers/gpu/drm/rockchip/inno_hdmi.c | 116 kernel/drivers/mmc/host/mxcmmc.c | 1 kernel/drivers/block/zram/zram_drv.c | 43 kernel/include/linux/irqdesc.h | 1 kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h | 2 kernel/net/sched/sch_api.c | 2 kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c | 46 kernel/drivers/video/rockchip/rga3/rga_debugger.c | 27 kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c | 23 kernel/include/soc/rockchip/rockchip_iommu.h | 15 /dev/null | 243 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c | 18 kernel/fs/fscache/main.c | 1 kernel/drivers/gpio/gpiolib-sysfs.c | 7 kernel/include/linux/mutex_rt.h | 130 kernel/drivers/connector/cn_proc.c | 6 kernel/drivers/i2c/busses/i2c-exynos5.c | 4 kernel/arch/x86/crypto/glue_helper.c | 31 kernel/arch/x86/entry/common.c | 11 kernel/mm/zswap.c | 12 kernel/drivers/usb/gadget/function/f_fs.c | 2 kernel/fs/autofs/expire.c | 3 886 files changed, 142,101 insertions(+), 33,523 deletions(-) diff --git a/device/rockchip/common/build.sh b/device/rockchip/common/build.sh index 1f60029..08a7b7a 100755 --- a/device/rockchip/common/build.sh +++ b/device/rockchip/common/build.sh @@ -652,7 +652,7 @@ build_check_cross_compile cd kernel - make ARCH=$RK_ARCH $RK_KERNEL_DEFCONFIG $RK_KERNEL_DEFCONFIG_FRAGMENT + make ARCH=$RK_ARCH $RK_KERNEL_DEFCONFIG rockchip_rt.config make ARCH=$RK_ARCH $RK_KERNEL_DTS.img -j$RK_JOBS if [ -f "$TOP_DIR/device/rockchip/$RK_TARGET_PRODUCT/$RK_KERNEL_FIT_ITS" ]; then $COMMON_DIR/mk-fitimage.sh $TOP_DIR/kernel/$RK_BOOT_IMG \ diff --git a/kernel/Documentation/devicetree/bindings/clock/rockchip,clk-out.yaml b/kernel/Documentation/devicetree/bindings/clock/rockchip,clk-out.yaml new file mode 100644 index 0000000..6582605 --- /dev/null +++ b/kernel/Documentation/devicetree/bindings/clock/rockchip,clk-out.yaml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/clock/rockchip,clk-out.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Rockchip Clock Out Control Module Binding + +maintainers: + - Sugar Zhang <sugar.zhang@rock-chips.com> + +description: | + This add support switch for clk-bidirection which located + at GRF, such as SAIx_MCLK_{IN OUT} which share the same pin. + and these config maybe located in many pieces of GRF, + which hard to addressed in one single clk driver. so, we add + this simple helper driver to address this situation. + + In order to simplify implement and usage, and also for safety + clk usage (avoid high freq glitch), we set all clk out as disabled + (which means Input default for clk-bidrection) in the pre-stage, + such boot-loader or init by HW default. And then set a safety freq + before enable clk-out, such as "assign-clock-rates" or clk_set_rate + in drivers. + +properties: + compatible: + enum: + - rockchip,clk-out + + reg: + maxItems: 1 + + "#clock-cells": + const: 1 + + clocks: + maxItems: 1 + description: parent clocks. + + power-domains: + maxItems: 1 + + clock-output-names: + maxItems: 1 + + rockchip,bit-shift: + $ref: /schemas/types.yaml#/definitions/uint32 + description: Defines the bit shift of clk out enable. + + rockchip,bit-set-to-disable: + type: boolean + description: | + By default this clock sets the bit at bit-shift to enable the clock. + Setting this property does the opposite: setting the bit disable + the clock and clearing it enables the clock. + +required: + - compatible + - reg + - clocks + - "#clock-cells" + - clock-output-names + - rockchip,bit-shift + +additionalProperties: false + +examples: + # Clock Provider node: + - | + mclkin_sai0: mclkin-sai0 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <12288000>; + clock-output-names = "mclk_sai0_from_io"; + }; + + mclkout_sai0: mclkout-sai0@ff040070 { + compatible = "rockchip,clk-out"; + reg = <0 0xff040070 0 0x4>; + clocks = <&cru MCLK_SAI0_OUT2IO>; + #clock-cells = <0>; + clock-output-names = "mclk_sai0_to_io"; + rockchip,bit-shift = <4>; + }; + + # Clock mclkout Consumer node: + - | + ext_codec { + clocks = <&mclkout_sai0>; + clock-names = "mclk"; + assigned-clocks = <&mclkout_sai0>; + assigned-clock-rates = <12288000>; + pinctrl-names = "default"; + pinctrl-0 = <&i2s0m0_mclk>; + }; + + # Clock mclkin Consumer node: + - | + ext_codec { + clocks = <&mclkin_sai0>; + clock-names = "mclk"; + assigned-clocks = <&cru CLK_SAI0>; + assigned-clock-parents = <&mclkin_sai0>; + pinctrl-names = "default"; + pinctrl-0 = <&i2s0m0_mclk>; + }; diff --git a/kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt b/kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt index eee2a7f..c0925e8 100644 --- a/kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt +++ b/kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt @@ -10,6 +10,7 @@ - "rockchip,rk3328-dfi" - for RK3328 SoCs. - "rockchip,rk3368-dfi" - for RK3368 SoCs. - "rockchip,rk3399-dfi" - for RK3399 SoCs. + - "rockchip,rk3528-dfi" - for RK3528 SoCs. - "rockchip,rk3568-dfi" - for RK3568 SoCs. - "rockchip,rv1126-dfi" - for RV1126 SoCs. diff --git a/kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt b/kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt index 507ab0a..5ae9f08 100644 --- a/kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt +++ b/kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt @@ -11,6 +11,7 @@ - "rockchip,rk3328-dmc" - for RK3328 SoCs. - "rockchip,rk3368-dmc" - for RK3368 SoCs. - "rockchip,rk3399-dmc" - for RK3399 SoCs. + - "rockchip,rk3528-dmc" - for RK3528 SoCs. - "rockchip,rk3568-dmc" - for RK3568 SoCs. - "rockchip,rv1126-dmc" - for RV1126 SoCs. - devfreq-events: Node to get DDR loading, Refer to diff --git a/kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt b/kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt index b6bb84a..b57d9cc 100644 --- a/kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt +++ b/kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt @@ -17,6 +17,10 @@ - #mbox-cells: Common mailbox binding property to identify the number of cells required for the mailbox specifier. Should be 1 +Optional properties : + + - rockchip,txpoll-period-ms: TX Done polling interval in milliseconds. + Example: -------- diff --git a/kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt b/kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt index 6f629b1..9a5b278 100644 --- a/kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt +++ b/kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt @@ -38,6 +38,12 @@ execute tuning when needed. If not specified, the host will do tuning for 360 times, namely tuning for each degree. +* pinctrl-names: should be "default" or "normal" combined with "idle". For + SDIO or eMMC devices, recommend to use "default". For SD/MMC cards, recommend + to use "normal" combined with "idle" to prevent power leak if vqmmc can't be + powered off. "normal" state is the same as "default" state, but "idle" state + should define the clk/cmd/data line to be pulled down or pulled none. + Example: rkdwmmc0@12200000 { @@ -47,3 +53,30 @@ #address-cells = <1>; #size-cells = <0>; }; + + /* "default" pinctrl */ + &rkdwmmc0{ + ... + pinctrl-names = "default" + pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>; + ... + }; + + /* "normal" combined with "idle" pinctrl */ + sdmmc_idle_gpios: sdmmc-idle-gpios { + rockchip,pins = + <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA7 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + &rkdwmmc0{ + ... + pinctrl-names = "normal", "idle"; + pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>; + pinctrl-1 = <&sdmmc_idle_gpios &sdmmc0_det>; + ... + } diff --git a/kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt b/kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt index e19737e..fe0f597 100644 --- a/kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt +++ b/kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt @@ -14,6 +14,7 @@ "rockchip,rk3366-gmac": found on RK3366 SoCs "rockchip,rk3368-gmac": found on RK3368 SoCs "rockchip,rk3399-gmac": found on RK3399 SoCs + "rockchip,rk3528-gmac": found on RK3528 SoCs "rockchip,rk3568-gmac": found on RK3568 SoCs "rockchip,rv1108-gmac": found on RV1108 SoCs "rockchip,rv1126-gmac": found on RV1126 SoCs diff --git a/kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt b/kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt index 6877e2c..06faee3 100644 --- a/kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt +++ b/kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt @@ -10,6 +10,7 @@ * "rockchip,rk3366-usb2phy" * "rockchip,rk3368-usb2phy" * "rockchip,rk3399-usb2phy" + * "rockchip,rk3528-usb2phy" * "rockchip,rk3568-usb2phy" * "rockchip,rv1108-usb2phy" - reg : the address offset of grf for usb-phy configuration. @@ -64,6 +65,7 @@ is always powered on. - rockchip,low-power-mode: when set, the port will enter low power state when suspend. + - rockchip,dis-u2-susphy: when set, disable otg suspend phy. Example: @@ -102,6 +104,7 @@ "rockchip,rk1808-usb2phy-grf", "syscon", "simple-mfd"; "rockchip,rk3308-usb2phy-grf", "syscon", "simple-mfd"; "rockchip,rk3328-usb2phy-grf", "syscon", "simple-mfd"; + "rockchip,rk3528-grf", "syscon", "simple-mfd"; "rockchip,rk3568-usb2phy-grf", "syscon"; - reg : the address offset of grf for usb-phy configuration. - #address-cells : should be 1. diff --git a/kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt b/kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt index e06a3aa..4fd173f 100644 --- a/kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt +++ b/kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt @@ -9,6 +9,7 @@ - "rockchip,pm-rk3328" - for RK3328 SOCs. - "rockchip,pm-rk3368" - for RK3368 SoCs. - "rockchip,pm-rk3399" - for RK3399 SoCs. +- "rockchip,pm-rk3528" - for RK3528 SoCs. - "rockchip,pm-rv1126" - for RV1126 SoCs. - rockchip,sleep-mode-config : the sleep mode config, @@ -164,6 +165,23 @@ >; }; + 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_suspend: rockchip_suspend { compatible = "rockchip,pm-rk3568"; status = "okay"; diff --git a/kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt b/kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt index 3016484..0dbc450 100644 --- a/kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt +++ b/kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt @@ -35,6 +35,11 @@ - rx-sample-delay-ns: nanoseconds to delay after the SCLK edge before sampling Rx data (may need to be fine tuned for high capacitance lines). No delay (0) by default. +- csm: ss_n be high for half or one sclk_out cycle after every frame data is + transferred: + - "0" for keep low; + - "1" for half sclk_out; + - "2" for one sclk_out. - pinctrl-names: Names for the pin configuration(s); may be "default" or "sleep", where the "sleep" configuration may describe the state the pins should be in during system suspend. See also diff --git a/kernel/Makefile b/kernel/Makefile index 8431633..995bb8c 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -463,7 +463,7 @@ -fno-strict-aliasing -fno-common -fshort-wchar \ -Werror-implicit-function-declaration \ -Werror=return-type -Wno-format-security \ - -w + -w \ -std=gnu89 KBUILD_CPPFLAGS := -D__KERNEL__ KBUILD_AFLAGS_KERNEL := diff --git a/kernel/arch/Kconfig b/kernel/arch/Kconfig index 8e0c3bb..ae3ce37 100644 --- a/kernel/arch/Kconfig +++ b/kernel/arch/Kconfig @@ -28,6 +28,7 @@ tristate "OProfile system profiling" depends on PROFILING depends on HAVE_OPROFILE + depends on !PREEMPT_RT_FULL select RING_BUFFER select RING_BUFFER_ALLOW_SWAP help diff --git a/kernel/arch/alpha/include/asm/spinlock_types.h b/kernel/arch/alpha/include/asm/spinlock_types.h index 1d5716b..6883bc9 100644 --- a/kernel/arch/alpha/include/asm/spinlock_types.h +++ b/kernel/arch/alpha/include/asm/spinlock_types.h @@ -2,10 +2,6 @@ #ifndef _ALPHA_SPINLOCK_TYPES_H #define _ALPHA_SPINLOCK_TYPES_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - typedef struct { volatile unsigned int lock; } arch_spinlock_t; diff --git a/kernel/arch/arm/Kconfig b/kernel/arch/arm/Kconfig index 930881c..019ef14 100644 --- a/kernel/arch/arm/Kconfig +++ b/kernel/arch/arm/Kconfig @@ -51,7 +51,7 @@ select HARDIRQS_SW_RESEND select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 - select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU + select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU && !PREEMPT_RT_BASE select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU select HAVE_ARCH_MMAP_RND_BITS if MMU select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT) @@ -91,6 +91,7 @@ select HAVE_PERF_EVENTS select HAVE_PERF_REGS select HAVE_PERF_USER_STACK_DUMP + select HAVE_PREEMPT_LAZY select HAVE_RCU_TABLE_FREE if (SMP && ARM_LPAE) select HAVE_REGS_AND_STACK_ACCESS_API select HAVE_RSEQ @@ -2165,7 +2166,7 @@ config KERNEL_MODE_NEON bool "Support for NEON in kernel mode" - depends on NEON && AEABI + depends on NEON && AEABI && !PREEMPT_RT_BASE help Say Y to include support for NEON in kernel mode. diff --git a/kernel/arch/arm/Makefile b/kernel/arch/arm/Makefile index db32b78..af600aa 100644 --- a/kernel/arch/arm/Makefile +++ b/kernel/arch/arm/Makefile @@ -158,6 +158,7 @@ textofs-$(CONFIG_ARCH_MESON) := 0x00208000 textofs-$(CONFIG_ARCH_AXXIA) := 0x00308000 textofs-$(CONFIG_CPU_RK3308) := 0x00058000 +textofs-$(CONFIG_CPU_RK3528) := 0x00208000 textofs-$(CONFIG_CPU_PX30) := 0x00208000 ifeq ($(CONFIG_ROCKCHIP_THUNDER_BOOT),y) textofs-$(CONFIG_CPU_RV1126) := 0x00608000 diff --git a/kernel/arch/arm/boot/dts/Makefile b/kernel/arch/arm/boot/dts/Makefile index 37479c9..142937f 100644 --- a/kernel/arch/arm/boot/dts/Makefile +++ b/kernel/arch/arm/boot/dts/Makefile @@ -930,7 +930,11 @@ rk3326-evb-lp3-v10.dtb \ rk3326-863-lp3-v10.dtb \ rk3326-evb-lp3-v10-avb.dtb \ - rk3326-863-lp3-v10-avb.dtb + rk3326-863-lp3-v10-avb.dtb \ + rk3528-evb1-ddr4-v10.dtb \ + rk3528-evb2-ddr3-v10.dtb \ + rk3528-evb3-lp4x-v10.dtb \ + rk3528-evb4-ddr4-v10.dtb dtb-$(CONFIG_ARCH_S3C24XX) += \ s3c2416-smdk2416.dtb dtb-$(CONFIG_ARCH_S3C64XX) += \ diff --git a/kernel/arch/arm/boot/dts/rk3036.dtsi b/kernel/arch/arm/boot/dts/rk3036.dtsi index ff5710b..b3a265e 100644 --- a/kernel/arch/arm/boot/dts/rk3036.dtsi +++ b/kernel/arch/arm/boot/dts/rk3036.dtsi @@ -742,35 +742,31 @@ bias-pull-pin-default; }; - pcfg_pull_up: pcfg-pull-up { - bias-pull-up; - }; - pcfg_pull_none: pcfg-pull-none { bias-disable; }; pwm0 { pwm0_pin: pwm0-pin { - rockchip,pins = <0 RK_PA0 2 &pcfg_pull_none>; + rockchip,pins = <0 RK_PA0 2 &pcfg_pull_default>; }; }; pwm1 { pwm1_pin: pwm1-pin { - rockchip,pins = <0 RK_PA1 2 &pcfg_pull_none>; + rockchip,pins = <0 RK_PA1 2 &pcfg_pull_default>; }; }; pwm2 { pwm2_pin: pwm2-pin { - rockchip,pins = <0 RK_PA1 2 &pcfg_pull_none>; + rockchip,pins = <0 RK_PA1 2 &pcfg_pull_default>; }; }; pwm3 { pwm3_pin: pwm3-pin { - rockchip,pins = <0 RK_PD3 1 &pcfg_pull_none>; + rockchip,pins = <0 RK_PD3 1 &pcfg_pull_default>; }; }; @@ -906,8 +902,8 @@ uart0 { uart0_xfer: uart0-xfer { - rockchip,pins = <0 RK_PC0 1 &pcfg_pull_up>, - <0 RK_PC1 1 &pcfg_pull_up>; + rockchip,pins = <0 RK_PC0 1 &pcfg_pull_default>, + <0 RK_PC1 1 &pcfg_pull_default>; }; uart0_cts: uart0-cts { @@ -921,16 +917,16 @@ uart1 { uart1_xfer: uart1-xfer { - rockchip,pins = <2 RK_PC6 1 &pcfg_pull_up>, - <2 RK_PC7 1 &pcfg_pull_up>; + rockchip,pins = <2 RK_PC6 1 &pcfg_pull_default>, + <2 RK_PC7 1 &pcfg_pull_default>; }; /* no rts / cts for uart1 */ }; uart2 { uart2_xfer: uart2-xfer { - rockchip,pins = <1 RK_PC2 2 &pcfg_pull_up>, - <1 RK_PC3 2 &pcfg_pull_up>; + rockchip,pins = <1 RK_PC2 2 &pcfg_pull_default>, + <1 RK_PC3 2 &pcfg_pull_default>; }; /* no rts / cts for uart2 */ }; diff --git a/kernel/arch/arm/boot/dts/rk3066a.dtsi b/kernel/arch/arm/boot/dts/rk3066a.dtsi index 2e36e01..e94a6d3 100644 --- a/kernel/arch/arm/boot/dts/rk3066a.dtsi +++ b/kernel/arch/arm/boot/dts/rk3066a.dtsi @@ -465,10 +465,6 @@ bias-pull-pin-default; }; - pcfg_pull_up: pcfg-pull-up { - bias-pull-up; - }; - pcfg_pull_none: pcfg_pull_none { bias-disable; }; @@ -609,8 +605,8 @@ uart0 { uart0_xfer: uart0-xfer { - rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up>, - <1 RK_PA1 1 &pcfg_pull_up>; + rockchip,pins = <1 RK_PA0 1 &pcfg_pull_default>, + <1 RK_PA1 1 &pcfg_pull_default>; }; uart0_cts: uart0-cts { @@ -624,8 +620,8 @@ uart1 { uart1_xfer: uart1-xfer { - rockchip,pins = <1 RK_PA4 1 &pcfg_pull_up>, - <1 RK_PA5 1 &pcfg_pull_up>; + rockchip,pins = <1 RK_PA4 1 &pcfg_pull_default>, + <1 RK_PA5 1 &pcfg_pull_default>; }; uart1_cts: uart1-cts { @@ -639,16 +635,16 @@ uart2 { uart2_xfer: uart2-xfer { - rockchip,pins = <1 RK_PB0 1 &pcfg_pull_up>, - <1 RK_PB1 1 &pcfg_pull_up>; + rockchip,pins = <1 RK_PB0 1 &pcfg_pull_default>, + <1 RK_PB1 1 &pcfg_pull_default>; }; /* no rts / cts for uart2 */ }; uart3 { uart3_xfer: uart3-xfer { - rockchip,pins = <3 RK_PD3 1 &pcfg_pull_up>, - <3 RK_PD4 1 &pcfg_pull_up>; + rockchip,pins = <3 RK_PD3 1 &pcfg_pull_default>, + <3 RK_PD4 1 &pcfg_pull_default>; }; uart3_cts: uart3-cts { diff --git a/kernel/arch/arm/boot/dts/rk312x.dtsi b/kernel/arch/arm/boot/dts/rk312x.dtsi index 8f879eb..c9abe0b 100644 --- a/kernel/arch/arm/boot/dts/rk312x.dtsi +++ b/kernel/arch/arm/boot/dts/rk312x.dtsi @@ -1292,10 +1292,6 @@ bias-pull-pin-default; }; - pcfg_pull_up: pcfg-pull-up { - bias-pull-up; - }; - pcfg_output_high: pcfg-output-high { output-high; }; @@ -1420,8 +1416,8 @@ uart0 { uart0_xfer: uart0-xfer { - rockchip,pins = <2 RK_PD2 2 &pcfg_pull_up>, - <2 RK_PD3 2 &pcfg_pull_up>; + rockchip,pins = <2 RK_PD2 2 &pcfg_pull_default>, + <2 RK_PD3 2 &pcfg_pull_none>; }; uart0_cts: uart0-cts { @@ -1435,8 +1431,8 @@ uart1 { uart1_xfer: uart1-xfer { - rockchip,pins = <1 RK_PB1 2 &pcfg_pull_up>, - <1 RK_PB2 2 &pcfg_pull_up>; + rockchip,pins = <1 RK_PB1 2 &pcfg_pull_default>, + <1 RK_PB2 2 &pcfg_pull_default>; }; uart1_cts: uart1-cts { @@ -1450,8 +1446,8 @@ uart2 { uart2_xfer: uart2-xfer { - rockchip,pins = <1 RK_PC2 2 &pcfg_pull_up>, - <1 RK_PC3 2 &pcfg_pull_up>; + rockchip,pins = <1 RK_PC2 2 &pcfg_pull_default>, + <1 RK_PC3 2 &pcfg_pull_none>; }; uart2_cts: uart2-cts { diff --git a/kernel/arch/arm/boot/dts/rk322x.dtsi b/kernel/arch/arm/boot/dts/rk322x.dtsi index ba61ecd..7faf704 100644 --- a/kernel/arch/arm/boot/dts/rk322x.dtsi +++ b/kernel/arch/arm/boot/dts/rk322x.dtsi @@ -1032,6 +1032,7 @@ reg-io-width = <4>; interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "hdmi", "hdmi_wakeup"; clocks = <&cru SCLK_HDMI_HDCP>, <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_CEC>; clock-names = "isfr", "iahb", "cec"; diff --git a/kernel/arch/arm/boot/dts/rk3288.dtsi b/kernel/arch/arm/boot/dts/rk3288.dtsi index 58bd444..c1373a9 100644 --- a/kernel/arch/arm/boot/dts/rk3288.dtsi +++ b/kernel/arch/arm/boot/dts/rk3288.dtsi @@ -1649,7 +1649,8 @@ reg-io-width = <4>; #sound-dai-cells = <0>; rockchip,grf = <&grf>; - interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>; + interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "hdmi", "hdmi_wakeup"; clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_HDCP>, <&cru SCLK_HDMI_CEC>; clock-names = "iahb", "isfr", "cec"; pinctrl-names = "default", "sleep"; diff --git a/kernel/arch/arm/boot/dts/rk3528-evb1-ddr4-v10.dts b/kernel/arch/arm/boot/dts/rk3528-evb1-ddr4-v10.dts new file mode 100644 index 0000000..d71a742 --- /dev/null +++ b/kernel/arch/arm/boot/dts/rk3528-evb1-ddr4-v10.dts @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "arm64/rockchip/rk3528-evb1-ddr4-v10.dts" + +/ { + model = "Rockchip RK3528 EVB1 DDR4 V10 Board (AArch32)"; + compatible = "rockchip,rk3528-evb1-ddr4-v10", "rockchip,rk3528"; +}; diff --git a/kernel/arch/arm/boot/dts/rk3528-evb2-ddr3-v10.dts b/kernel/arch/arm/boot/dts/rk3528-evb2-ddr3-v10.dts new file mode 100644 index 0000000..83855ac --- /dev/null +++ b/kernel/arch/arm/boot/dts/rk3528-evb2-ddr3-v10.dts @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "arm64/rockchip/rk3528-evb2-ddr3-v10.dts" + +/{ + model = "Rockchip RK3528 EVB2 DDR3 V10 Board (AArch32)"; + compatible = "rockchip,rk3528-evb2-ddr3-v10", "rockchip,rk3528"; +}; diff --git a/kernel/arch/arm/boot/dts/rk3528-evb3-lp4x-v10.dts b/kernel/arch/arm/boot/dts/rk3528-evb3-lp4x-v10.dts new file mode 100644 index 0000000..29939cc --- /dev/null +++ b/kernel/arch/arm/boot/dts/rk3528-evb3-lp4x-v10.dts @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "arm64/rockchip/rk3528-evb3-lp4x-v10.dts" + +/{ + model = "Rockchip RK3528 EVB3 LP4X V10 Board (AArch32)"; + compatible = "rockchip,rk3528-evb3-lp4x-v10", "rockchip,rk3528"; +}; diff --git a/kernel/arch/arm/boot/dts/rk3528-evb4-ddr4-v10.dts b/kernel/arch/arm/boot/dts/rk3528-evb4-ddr4-v10.dts new file mode 100644 index 0000000..71ff4de --- /dev/null +++ b/kernel/arch/arm/boot/dts/rk3528-evb4-ddr4-v10.dts @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "arm64/rockchip/rk3528-evb1-ddr4-v10.dts" + +/{ + model = "Rockchip RK3528 EVB4 DDR4 V10 Board (AArch32)"; + compatible = "rockchip,rk3528-evb4-ddr4-v10", "rockchip,rk3528"; +}; diff --git a/kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi b/kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi index e063e81..e4cfa71 100644 --- a/kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi +++ b/kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi @@ -1214,6 +1214,17 @@ /* sdmmc0_pwr */ <0 RK_PC0 1 &pcfg_pull_none>; }; + + /omit-if-no-ref/ + sdmmc0_idle_pins: sdmmc0-idle-pins { + rockchip,pins = + <1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>, + <1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_down>, + <1 RK_PA4 RK_FUNC_GPIO &pcfg_pull_down>, + <1 RK_PA5 RK_FUNC_GPIO &pcfg_pull_down>, + <1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_down>, + <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_down>; + }; }; spi0 { /omit-if-no-ref/ diff --git a/kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi b/kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi index 08b8738..fe9d6bb 100644 --- a/kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi +++ b/kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi @@ -19,6 +19,8 @@ thunder_boot_mmc: thunder-boot-mmc { compatible = "rockchip,thunder-boot-mmc"; reg = <0xffc50000 0x4000>; + clocks = <&cru HCLK_EMMC>, <&cru CLK_EMMC>; + clock-names = "biu", "ciu"; memory-region-src = <&ramdisk_c>; memory-region-dst = <&ramdisk_r>; memory-region-idmac = <&mmc_idmac>; @@ -26,6 +28,11 @@ }; &emmc { + /delete-property/ power-domains; memory-region-ecsd = <&mmc_ecsd>; post-power-on-delay-ms = <0>; }; + +&power { + /delete-node/ pd_nvm@RV1126_PD_NVM; +}; diff --git a/kernel/arch/arm/boot/dts/rv1126.dtsi b/kernel/arch/arm/boot/dts/rv1126.dtsi index 5182b61..5eebdbd 100644 --- a/kernel/arch/arm/boot/dts/rv1126.dtsi +++ b/kernel/arch/arm/boot/dts/rv1126.dtsi @@ -2125,7 +2125,7 @@ iommus = <&rkvdec_mmu>; rockchip,srv = <&mpp_srv>; rockchip,taskqueue-node = <0>; - rockchip,resetgroup-node = <0>; + rockchip,resetgroup-node = <1>; status = "disabled"; }; @@ -2364,8 +2364,9 @@ clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; max-frequency = <200000000>; - pinctrl-names = "default"; + pinctrl-names = "normal", "idle"; pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>; + pinctrl-1 = <&sdmmc0_idle_pins &sdmmc0_det>; status = "disabled"; }; @@ -2539,6 +2540,7 @@ snps,tx-ipgap-linecheck-dis-quirk; snps,tx-fifo-resize; snps,xhci-trb-ent-quirk; + snps,usb2-lpm-disable; status = "disabled"; }; }; diff --git a/kernel/arch/arm/configs/at91_dt_defconfig b/kernel/arch/arm/configs/at91_dt_defconfig index e4b1be6..f4b253b 100644 --- a/kernel/arch/arm/configs/at91_dt_defconfig +++ b/kernel/arch/arm/configs/at91_dt_defconfig @@ -19,6 +19,7 @@ CONFIG_ARCH_AT91=y CONFIG_SOC_AT91RM9200=y CONFIG_SOC_AT91SAM9=y +# CONFIG_ATMEL_CLOCKSOURCE_PIT is not set CONFIG_AEABI=y CONFIG_UACCESS_WITH_MEMCPY=y CONFIG_ZBOOT_ROM_TEXT=0x0 @@ -64,7 +65,6 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=4 CONFIG_BLK_DEV_RAM_SIZE=8192 -CONFIG_ATMEL_TCLIB=y CONFIG_ATMEL_SSC=y CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y diff --git a/kernel/arch/arm/configs/rockchip_linux_defconfig b/kernel/arch/arm/configs/rockchip_linux_defconfig index cb27cd6..056a967 100644 --- a/kernel/arch/arm/configs/rockchip_linux_defconfig +++ b/kernel/arch/arm/configs/rockchip_linux_defconfig @@ -173,7 +173,6 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_THIN_PROVISIONING=y -CONFIG_DM_VERITY=y CONFIG_NETDEVICES=y CONFIG_TUN=y CONFIG_VETH=y @@ -349,6 +348,7 @@ CONFIG_SND_USB_AUDIO=y CONFIG_SND_SOC=y CONFIG_SND_SOC_ROCKCHIP=y +CONFIG_SND_SOC_ROCKCHIP_SAI=y CONFIG_SND_SOC_ROCKCHIP_SPDIF=y CONFIG_SND_SOC_ROCKCHIP_MAX98090=y CONFIG_SND_SOC_ROCKCHIP_RT5645=y diff --git a/kernel/arch/arm/configs/rv1126-snapshot.config b/kernel/arch/arm/configs/rv1126-snapshot.config index 8129fa5..08230d2 100644 --- a/kernel/arch/arm/configs/rv1126-snapshot.config +++ b/kernel/arch/arm/configs/rv1126-snapshot.config @@ -17,7 +17,7 @@ # CONFIG_PM_DEBUG is not set # CONFIG_PM_DEVFREQ_EVENT is not set # CONFIG_PPS is not set -CONFIG_PSTORE_MCU_LOG=y +CONFIG_PSTORE_BOOT_LOG=y # CONFIG_PTP_1588_CLOCK is not set # CONFIG_PWRSEQ_EMMC is not set # CONFIG_PWRSEQ_SIMPLE is not set diff --git a/kernel/arch/arm/configs/rv1126-trailcamera.config b/kernel/arch/arm/configs/rv1126-trailcamera.config index 52abc6e..9e65283 100644 --- a/kernel/arch/arm/configs/rv1126-trailcamera.config +++ b/kernel/arch/arm/configs/rv1126-trailcamera.config @@ -19,7 +19,7 @@ # CONFIG_PM_DEBUG is not set # CONFIG_PM_DEVFREQ_EVENT is not set # CONFIG_PPS is not set -CONFIG_PSTORE_MCU_LOG=y +CONFIG_PSTORE_BOOT_LOG=y # CONFIG_PTP_1588_CLOCK is not set # CONFIG_PWRSEQ_EMMC is not set # CONFIG_PWRSEQ_SIMPLE is not set diff --git a/kernel/arch/arm/configs/sama5_defconfig b/kernel/arch/arm/configs/sama5_defconfig index 2080025..be92871 100644 --- a/kernel/arch/arm/configs/sama5_defconfig +++ b/kernel/arch/arm/configs/sama5_defconfig @@ -20,6 +20,7 @@ CONFIG_SOC_SAMA5D2=y CONFIG_SOC_SAMA5D3=y CONFIG_SOC_SAMA5D4=y +# CONFIG_ATMEL_CLOCKSOURCE_PIT is not set CONFIG_AEABI=y CONFIG_UACCESS_WITH_MEMCPY=y CONFIG_ZBOOT_ROM_TEXT=0x0 @@ -75,7 +76,6 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=4 CONFIG_BLK_DEV_RAM_SIZE=8192 -CONFIG_ATMEL_TCLIB=y CONFIG_ATMEL_SSC=y CONFIG_EEPROM_AT24=y CONFIG_SCSI=y diff --git a/kernel/arch/arm/include/asm/irq.h b/kernel/arch/arm/include/asm/irq.h index 46d4114..c421b5b 100644 --- a/kernel/arch/arm/include/asm/irq.h +++ b/kernel/arch/arm/include/asm/irq.h @@ -23,6 +23,8 @@ #endif #ifndef __ASSEMBLY__ +#include <linux/cpumask.h> + struct irqaction; struct pt_regs; diff --git a/kernel/arch/arm/include/asm/spinlock_types.h b/kernel/arch/arm/include/asm/spinlock_types.h index 5976958..a37c080 100644 --- a/kernel/arch/arm/include/asm/spinlock_types.h +++ b/kernel/arch/arm/include/asm/spinlock_types.h @@ -2,10 +2,6 @@ #ifndef __ASM_SPINLOCK_TYPES_H #define __ASM_SPINLOCK_TYPES_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - #define TICKET_SHIFT 16 typedef struct { diff --git a/kernel/arch/arm/include/asm/switch_to.h b/kernel/arch/arm/include/asm/switch_to.h index d3e937d..6ab96a2 100644 --- a/kernel/arch/arm/include/asm/switch_to.h +++ b/kernel/arch/arm/include/asm/switch_to.h @@ -4,6 +4,13 @@ #include <linux/thread_info.h> +#if defined CONFIG_PREEMPT_RT_FULL && defined CONFIG_HIGHMEM +void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p); +#else +static inline void +switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { } +#endif + /* * For v7 SMP cores running a preemptible kernel we may be pre-empted * during a TLB maintenance operation, so execute an inner-shareable dsb @@ -26,6 +33,7 @@ #define switch_to(prev,next,last) \ do { \ __complete_pending_tlbi(); \ + switch_kmaps(prev, next); \ last = __switch_to(prev,task_thread_info(prev), task_thread_info(next)); \ } while (0) diff --git a/kernel/arch/arm/include/asm/thread_info.h b/kernel/arch/arm/include/asm/thread_info.h index 8f55dc5..4f834bf 100644 --- a/kernel/arch/arm/include/asm/thread_info.h +++ b/kernel/arch/arm/include/asm/thread_info.h @@ -49,6 +49,7 @@ struct thread_info { unsigned long flags; /* low level flags */ int preempt_count; /* 0 => preemptable, <0 => bug */ + int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ mm_segment_t addr_limit; /* address limit */ struct task_struct *task; /* main task structure */ __u32 cpu; /* cpu */ @@ -139,7 +140,8 @@ #define TIF_SYSCALL_TRACE 4 /* syscall trace active */ #define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */ #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ -#define TIF_SECCOMP 7 /* seccomp syscall filtering active */ +#define TIF_SECCOMP 8 /* seccomp syscall filtering active */ +#define TIF_NEED_RESCHED_LAZY 7 #define TIF_NOHZ 12 /* in adaptive nohz mode */ #define TIF_USING_IWMMXT 17 @@ -149,6 +151,7 @@ #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) +#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) #define _TIF_UPROBE (1 << TIF_UPROBE) #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) @@ -164,7 +167,8 @@ * Change these and you break ASM code in entry-common.S */ #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ - _TIF_NOTIFY_RESUME | _TIF_UPROBE) + _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ + _TIF_NEED_RESCHED_LAZY) #endif /* __KERNEL__ */ #endif /* __ASM_ARM_THREAD_INFO_H */ diff --git a/kernel/arch/arm/kernel/asm-offsets.c b/kernel/arch/arm/kernel/asm-offsets.c index 40afe95..d634d6f 100644 --- a/kernel/arch/arm/kernel/asm-offsets.c +++ b/kernel/arch/arm/kernel/asm-offsets.c @@ -58,6 +58,7 @@ BLANK(); DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); + DEFINE(TI_PREEMPT_LAZY, offsetof(struct thread_info, preempt_lazy_count)); DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); DEFINE(TI_TASK, offsetof(struct thread_info, task)); DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); diff --git a/kernel/arch/arm/kernel/entry-armv.S b/kernel/arch/arm/kernel/entry-armv.S index cde22c0..857c9cd 100644 --- a/kernel/arch/arm/kernel/entry-armv.S +++ b/kernel/arch/arm/kernel/entry-armv.S @@ -209,11 +209,18 @@ #ifdef CONFIG_PREEMPT ldr r8, [tsk, #TI_PREEMPT] @ get preempt count - ldr r0, [tsk, #TI_FLAGS] @ get flags teq r8, #0 @ if preempt count != 0 + bne 1f @ return from exeption + ldr r0, [tsk, #TI_FLAGS] @ get flags + tst r0, #_TIF_NEED_RESCHED @ if NEED_RESCHED is set + blne svc_preempt @ preempt! + + ldr r8, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count + teq r8, #0 @ if preempt lazy count != 0 movne r0, #0 @ force flags to 0 - tst r0, #_TIF_NEED_RESCHED + tst r0, #_TIF_NEED_RESCHED_LAZY blne svc_preempt +1: #endif svc_exit r5, irq = 1 @ return from exception @@ -228,8 +235,14 @@ 1: bl preempt_schedule_irq @ irq en/disable is done inside ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS tst r0, #_TIF_NEED_RESCHED + bne 1b + tst r0, #_TIF_NEED_RESCHED_LAZY reteq r8 @ go again - b 1b + ldr r0, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count + teq r0, #0 @ if preempt lazy count != 0 + beq 1b + ret r8 @ go again + #endif __und_fault: diff --git a/kernel/arch/arm/kernel/entry-common.S b/kernel/arch/arm/kernel/entry-common.S index 0465d65..4767583 100644 --- a/kernel/arch/arm/kernel/entry-common.S +++ b/kernel/arch/arm/kernel/entry-common.S @@ -56,7 +56,9 @@ cmp r2, #TASK_SIZE blne addr_limit_check_failed ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing - tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK + tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) + bne fast_work_pending + tst r1, #_TIF_SECCOMP bne fast_work_pending @@ -93,8 +95,11 @@ cmp r2, #TASK_SIZE blne addr_limit_check_failed ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing - tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK + tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) + bne do_slower_path + tst r1, #_TIF_SECCOMP beq no_work_pending +do_slower_path: UNWIND(.fnend ) ENDPROC(ret_fast_syscall) diff --git a/kernel/arch/arm/kernel/signal.c b/kernel/arch/arm/kernel/signal.c index 1c01358..263b032 100644 --- a/kernel/arch/arm/kernel/signal.c +++ b/kernel/arch/arm/kernel/signal.c @@ -652,7 +652,8 @@ */ trace_hardirqs_off(); do { - if (likely(thread_flags & _TIF_NEED_RESCHED)) { + if (likely(thread_flags & (_TIF_NEED_RESCHED | + _TIF_NEED_RESCHED_LAZY))) { schedule(); } else { if (unlikely(!user_mode(regs))) diff --git a/kernel/arch/arm/mach-at91/Kconfig b/kernel/arch/arm/mach-at91/Kconfig index 903f23c..fa493a8 100644 --- a/kernel/arch/arm/mach-at91/Kconfig +++ b/kernel/arch/arm/mach-at91/Kconfig @@ -107,6 +107,31 @@ AT91SAM9X35 AT91SAM9XE +comment "Clocksource driver selection" + +config ATMEL_CLOCKSOURCE_PIT + bool "Periodic Interval Timer (PIT) support" + depends on SOC_AT91SAM9 || SOC_SAMA5 + default SOC_AT91SAM9 || SOC_SAMA5 + select ATMEL_PIT + help + Select this to get a clocksource based on the Atmel Periodic Interval + Timer. It has a relatively low resolution and the TC Block clocksource + should be preferred. + +config ATMEL_CLOCKSOURCE_TCB + bool "Timer Counter Blocks (TCB) support" + depends on SOC_AT91RM9200 || SOC_AT91SAM9 || SOC_SAMA5 || COMPILE_TEST + default SOC_AT91RM9200 || SOC_AT91SAM9 || SOC_SAMA5 + depends on !ATMEL_TCLIB + select ATMEL_ARM_TCB_CLKSRC + help + Select this to get a high precision clocksource based on a + TC block with a 5+ MHz base clock rate. + On platforms with 16-bit counters, two timer channels are combined + to make a single 32-bit timer. + It can also be used as a clock event device supporting oneshot mode. + config HAVE_AT91_UTMI bool diff --git a/kernel/arch/arm/mach-exynos/platsmp.c b/kernel/arch/arm/mach-exynos/platsmp.c index 6a1e682..17dca0f 100644 --- a/kernel/arch/arm/mach-exynos/platsmp.c +++ b/kernel/arch/arm/mach-exynos/platsmp.c @@ -239,7 +239,7 @@ sync_cache_w(&pen_release); } -static DEFINE_SPINLOCK(boot_lock); +static DEFINE_RAW_SPINLOCK(boot_lock); static void exynos_secondary_init(unsigned int cpu) { @@ -252,8 +252,8 @@ /* * Synchronise with the boot thread. */ - spin_lock(&boot_lock); - spin_unlock(&boot_lock); + raw_spin_lock(&boot_lock); + raw_spin_unlock(&boot_lock); } int exynos_set_boot_addr(u32 core_id, unsigned long boot_addr) @@ -317,7 +317,7 @@ * Set synchronisation state between this boot processor * and the secondary one */ - spin_lock(&boot_lock); + raw_spin_lock(&boot_lock); /* * The secondary processor is waiting to be released from @@ -344,7 +344,7 @@ if (timeout == 0) { printk(KERN_ERR "cpu1 power enable failed"); - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return -ETIMEDOUT; } } @@ -390,7 +390,7 @@ * calibrations, then wait for it to finish */ fail: - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return pen_release != -1 ? ret : 0; } diff --git a/kernel/arch/arm/mach-hisi/platmcpm.c b/kernel/arch/arm/mach-hisi/platmcpm.c index f66815c..00524ab 100644 --- a/kernel/arch/arm/mach-hisi/platmcpm.c +++ b/kernel/arch/arm/mach-hisi/platmcpm.c @@ -61,7 +61,7 @@ static void __iomem *sysctrl, *fabric; static int hip04_cpu_table[HIP04_MAX_CLUSTERS][HIP04_MAX_CPUS_PER_CLUSTER]; -static DEFINE_SPINLOCK(boot_lock); +static DEFINE_RAW_SPINLOCK(boot_lock); static u32 fabric_phys_addr; /* * [0]: bootwrapper physical address @@ -113,7 +113,7 @@ if (cluster >= HIP04_MAX_CLUSTERS || cpu >= HIP04_MAX_CPUS_PER_CLUSTER) return -EINVAL; - spin_lock_irq(&boot_lock); + raw_spin_lock_irq(&boot_lock); if (hip04_cpu_table[cluster][cpu]) goto out; @@ -147,7 +147,7 @@ out: hip04_cpu_table[cluster][cpu]++; - spin_unlock_irq(&boot_lock); + raw_spin_unlock_irq(&boot_lock); return 0; } @@ -162,11 +162,11 @@ cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); - spin_lock(&boot_lock); + raw_spin_lock(&boot_lock); hip04_cpu_table[cluster][cpu]--; if (hip04_cpu_table[cluster][cpu] == 1) { /* A power_up request went ahead of us. */ - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return; } else if (hip04_cpu_table[cluster][cpu] > 1) { pr_err("Cluster %d CPU%d boots multiple times\n", cluster, cpu); @@ -174,7 +174,7 @@ } last_man = hip04_cluster_is_down(cluster); - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); if (last_man) { /* Since it's Cortex A15, disable L2 prefetching. */ asm volatile( @@ -203,7 +203,7 @@ cpu >= HIP04_MAX_CPUS_PER_CLUSTER); count = TIMEOUT_MSEC / POLL_MSEC; - spin_lock_irq(&boot_lock); + raw_spin_lock_irq(&boot_lock); for (tries = 0; tries < count; tries++) { if (hip04_cpu_table[cluster][cpu]) goto err; @@ -211,10 +211,10 @@ data = readl_relaxed(sysctrl + SC_CPU_RESET_STATUS(cluster)); if (data & CORE_WFI_STATUS(cpu)) break; - spin_unlock_irq(&boot_lock); + raw_spin_unlock_irq(&boot_lock); /* Wait for clean L2 when the whole cluster is down. */ msleep(POLL_MSEC); - spin_lock_irq(&boot_lock); + raw_spin_lock_irq(&boot_lock); } if (tries >= count) goto err; @@ -231,10 +231,10 @@ goto err; if (hip04_cluster_is_down(cluster)) hip04_set_snoop_filter(cluster, 0); - spin_unlock_irq(&boot_lock); + raw_spin_unlock_irq(&boot_lock); return 1; err: - spin_unlock_irq(&boot_lock); + raw_spin_unlock_irq(&boot_lock); return 0; } #endif diff --git a/kernel/arch/arm/mach-imx/cpuidle-imx6q.c b/kernel/arch/arm/mach-imx/cpuidle-imx6q.c index 326e870..d9ac80a 100644 --- a/kernel/arch/arm/mach-imx/cpuidle-imx6q.c +++ b/kernel/arch/arm/mach-imx/cpuidle-imx6q.c @@ -17,22 +17,22 @@ #include "hardware.h" static int num_idle_cpus = 0; -static DEFINE_SPINLOCK(cpuidle_lock); +static DEFINE_RAW_SPINLOCK(cpuidle_lock); static int imx6q_enter_wait(struct cpuidle_device *dev, struct cpuidle_driver *drv, int index) { - spin_lock(&cpuidle_lock); + raw_spin_lock(&cpuidle_lock); if (++num_idle_cpus == num_online_cpus()) imx6_set_lpm(WAIT_UNCLOCKED); - spin_unlock(&cpuidle_lock); + raw_spin_unlock(&cpuidle_lock); cpu_do_idle(); - spin_lock(&cpuidle_lock); + raw_spin_lock(&cpuidle_lock); if (num_idle_cpus-- == num_online_cpus()) imx6_set_lpm(WAIT_CLOCKED); - spin_unlock(&cpuidle_lock); + raw_spin_unlock(&cpuidle_lock); return index; } diff --git a/kernel/arch/arm/mach-omap2/omap-smp.c b/kernel/arch/arm/mach-omap2/omap-smp.c index 1c73694..ac4d2f0 100644 --- a/kernel/arch/arm/mach-omap2/omap-smp.c +++ b/kernel/arch/arm/mach-omap2/omap-smp.c @@ -69,7 +69,7 @@ .startup_addr = omap5_secondary_startup, }; -static DEFINE_SPINLOCK(boot_lock); +static DEFINE_RAW_SPINLOCK(boot_lock); void __iomem *omap4_get_scu_base(void) { @@ -177,8 +177,8 @@ /* * Synchronise with the boot thread. */ - spin_lock(&boot_lock); - spin_unlock(&boot_lock); + raw_spin_lock(&boot_lock); + raw_spin_unlock(&boot_lock); } static int omap4_boot_secondary(unsigned int cpu, struct task_struct *idle) @@ -191,7 +191,7 @@ * Set synchronisation state between this boot processor * and the secondary one */ - spin_lock(&boot_lock); + raw_spin_lock(&boot_lock); /* * Update the AuxCoreBoot0 with boot state for secondary core. @@ -270,7 +270,7 @@ * Now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return 0; } diff --git a/kernel/arch/arm/mach-prima2/platsmp.c b/kernel/arch/arm/mach-prima2/platsmp.c index 75ef5d4..c17c86e 100644 --- a/kernel/arch/arm/mach-prima2/platsmp.c +++ b/kernel/arch/arm/mach-prima2/platsmp.c @@ -22,7 +22,7 @@ static void __iomem *clk_base; -static DEFINE_SPINLOCK(boot_lock); +static DEFINE_RAW_SPINLOCK(boot_lock); static void sirfsoc_secondary_init(unsigned int cpu) { @@ -36,8 +36,8 @@ /* * Synchronise with the boot thread. */ - spin_lock(&boot_lock); - spin_unlock(&boot_lock); + raw_spin_lock(&boot_lock); + raw_spin_unlock(&boot_lock); } static const struct of_device_id clk_ids[] = { @@ -75,7 +75,7 @@ /* make sure write buffer is drained */ mb(); - spin_lock(&boot_lock); + raw_spin_lock(&boot_lock); /* * The secondary processor is waiting to be released from @@ -107,7 +107,7 @@ * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return pen_release != -1 ? -ENOSYS : 0; } diff --git a/kernel/arch/arm/mach-qcom/platsmp.c b/kernel/arch/arm/mach-qcom/platsmp.c index 5494c9e..e8ce157 100644 --- a/kernel/arch/arm/mach-qcom/platsmp.c +++ b/kernel/arch/arm/mach-qcom/platsmp.c @@ -46,7 +46,7 @@ extern void secondary_startup_arm(void); -static DEFINE_SPINLOCK(boot_lock); +static DEFINE_RAW_SPINLOCK(boot_lock); #ifdef CONFIG_HOTPLUG_CPU static void qcom_cpu_die(unsigned int cpu) @@ -60,8 +60,8 @@ /* * Synchronise with the boot thread. */ - spin_lock(&boot_lock); - spin_unlock(&boot_lock); + raw_spin_lock(&boot_lock); + raw_spin_unlock(&boot_lock); } static int scss_release_secondary(unsigned int cpu) @@ -284,7 +284,7 @@ * set synchronisation state between this boot processor * and the secondary one */ - spin_lock(&boot_lock); + raw_spin_lock(&boot_lock); /* * Send the secondary CPU a soft interrupt, thereby causing @@ -297,7 +297,7 @@ * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return ret; } diff --git a/kernel/arch/arm/mach-spear/platsmp.c b/kernel/arch/arm/mach-spear/platsmp.c index 39038a0..6da5c93 100644 --- a/kernel/arch/arm/mach-spear/platsmp.c +++ b/kernel/arch/arm/mach-spear/platsmp.c @@ -32,7 +32,7 @@ sync_cache_w(&pen_release); } -static DEFINE_SPINLOCK(boot_lock); +static DEFINE_RAW_SPINLOCK(boot_lock); static void __iomem *scu_base = IOMEM(VA_SCU_BASE); @@ -47,8 +47,8 @@ /* * Synchronise with the boot thread. */ - spin_lock(&boot_lock); - spin_unlock(&boot_lock); + raw_spin_lock(&boot_lock); + raw_spin_unlock(&boot_lock); } static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle) @@ -59,7 +59,7 @@ * set synchronisation state between this boot processor * and the secondary one */ - spin_lock(&boot_lock); + raw_spin_lock(&boot_lock); /* * The secondary processor is waiting to be released from @@ -84,7 +84,7 @@ * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return pen_release != -1 ? -ENOSYS : 0; } diff --git a/kernel/arch/arm/mach-sti/platsmp.c b/kernel/arch/arm/mach-sti/platsmp.c index 231f19e..a3419b7 100644 --- a/kernel/arch/arm/mach-sti/platsmp.c +++ b/kernel/arch/arm/mach-sti/platsmp.c @@ -35,7 +35,7 @@ sync_cache_w(&pen_release); } -static DEFINE_SPINLOCK(boot_lock); +static DEFINE_RAW_SPINLOCK(boot_lock); static void sti_secondary_init(unsigned int cpu) { @@ -48,8 +48,8 @@ /* * Synchronise with the boot thread. */ - spin_lock(&boot_lock); - spin_unlock(&boot_lock); + raw_spin_lock(&boot_lock); + raw_spin_unlock(&boot_lock); } static int sti_boot_secondary(unsigned int cpu, struct task_struct *idle) @@ -60,7 +60,7 @@ * set synchronisation state between this boot processor * and the secondary one */ - spin_lock(&boot_lock); + raw_spin_lock(&boot_lock); /* * The secondary processor is waiting to be released from @@ -91,7 +91,7 @@ * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return pen_release != -1 ? -ENOSYS : 0; } diff --git a/kernel/arch/arm/mm/fault.c b/kernel/arch/arm/mm/fault.c index a9ee0d9..20b0e14 100644 --- a/kernel/arch/arm/mm/fault.c +++ b/kernel/arch/arm/mm/fault.c @@ -439,6 +439,9 @@ if (addr < TASK_SIZE) return do_page_fault(addr, fsr, regs); + if (interrupts_enabled(regs)) + local_irq_enable(); + if (user_mode(regs)) goto bad_area; @@ -506,6 +509,9 @@ static int do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) { + if (interrupts_enabled(regs)) + local_irq_enable(); + do_bad_area(addr, fsr, regs); return 0; } diff --git a/kernel/arch/arm/mm/highmem.c b/kernel/arch/arm/mm/highmem.c index d02f818..542692d 100644 --- a/kernel/arch/arm/mm/highmem.c +++ b/kernel/arch/arm/mm/highmem.c @@ -34,6 +34,11 @@ return *ptep; } +static unsigned int fixmap_idx(int type) +{ + return FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); +} + void *kmap(struct page *page) { might_sleep(); @@ -54,12 +59,13 @@ void *kmap_atomic(struct page *page) { + pte_t pte = mk_pte(page, kmap_prot); unsigned int idx; unsigned long vaddr; void *kmap; int type; - preempt_disable(); + preempt_disable_nort(); pagefault_disable(); if (!PageHighMem(page)) return page_address(page); @@ -79,7 +85,7 @@ type = kmap_atomic_idx_push(); - idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); + idx = fixmap_idx(type); vaddr = __fix_to_virt(idx); #ifdef CONFIG_DEBUG_HIGHMEM /* @@ -93,7 +99,10 @@ * in place, so the contained TLB flush ensures the TLB is updated * with the new mapping. */ - set_fixmap_pte(idx, mk_pte(page, kmap_prot)); +#ifdef CONFIG_PREEMPT_RT_FULL + current->kmap_pte[type] = pte; +#endif + set_fixmap_pte(idx, pte); return (void *)vaddr; } @@ -106,44 +115,75 @@ if (kvaddr >= (void *)FIXADDR_START) { type = kmap_atomic_idx(); - idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); + idx = fixmap_idx(type); if (cache_is_vivt()) __cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE); +#ifdef CONFIG_PREEMPT_RT_FULL + current->kmap_pte[type] = __pte(0); +#endif #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(vaddr != __fix_to_virt(idx)); - set_fixmap_pte(idx, __pte(0)); #else (void) idx; /* to kill a warning */ #endif + set_fixmap_pte(idx, __pte(0)); kmap_atomic_idx_pop(); } else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { /* this address was obtained through kmap_high_get() */ kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); } pagefault_enable(); - preempt_enable(); + preempt_enable_nort(); } EXPORT_SYMBOL(__kunmap_atomic); void *kmap_atomic_pfn(unsigned long pfn) { + pte_t pte = pfn_pte(pfn, kmap_prot); unsigned long vaddr; int idx, type; struct page *page = pfn_to_page(pfn); - preempt_disable(); + preempt_disable_nort(); pagefault_disable(); if (!PageHighMem(page)) return page_address(page); type = kmap_atomic_idx_push(); - idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); + idx = fixmap_idx(type); vaddr = __fix_to_virt(idx); #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(!pte_none(get_fixmap_pte(vaddr))); #endif - set_fixmap_pte(idx, pfn_pte(pfn, kmap_prot)); +#ifdef CONFIG_PREEMPT_RT_FULL + current->kmap_pte[type] = pte; +#endif + set_fixmap_pte(idx, pte); return (void *)vaddr; } +#if defined CONFIG_PREEMPT_RT_FULL +void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) +{ + int i; + + /* + * Clear @prev's kmap_atomic mappings + */ + for (i = 0; i < prev_p->kmap_idx; i++) { + int idx = fixmap_idx(i); + + set_fixmap_pte(idx, __pte(0)); + } + /* + * Restore @next_p's kmap_atomic mappings + */ + for (i = 0; i < next_p->kmap_idx; i++) { + int idx = fixmap_idx(i); + + if (!pte_none(next_p->kmap_pte[i])) + set_fixmap_pte(idx, next_p->kmap_pte[i]); + } +} +#endif diff --git a/kernel/arch/arm/plat-versatile/platsmp.c b/kernel/arch/arm/plat-versatile/platsmp.c index c236651..6b60f58 100644 --- a/kernel/arch/arm/plat-versatile/platsmp.c +++ b/kernel/arch/arm/plat-versatile/platsmp.c @@ -32,7 +32,7 @@ sync_cache_w(&pen_release); } -static DEFINE_SPINLOCK(boot_lock); +static DEFINE_RAW_SPINLOCK(boot_lock); void versatile_secondary_init(unsigned int cpu) { @@ -45,8 +45,8 @@ /* * Synchronise with the boot thread. */ - spin_lock(&boot_lock); - spin_unlock(&boot_lock); + raw_spin_lock(&boot_lock); + raw_spin_unlock(&boot_lock); } int versatile_boot_secondary(unsigned int cpu, struct task_struct *idle) @@ -57,7 +57,7 @@ * Set synchronisation state between this boot processor * and the secondary one */ - spin_lock(&boot_lock); + raw_spin_lock(&boot_lock); /* * This is really belt and braces; we hold unintended secondary @@ -87,7 +87,7 @@ * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ - spin_unlock(&boot_lock); + raw_spin_unlock(&boot_lock); return pen_release != -1 ? -ENOSYS : 0; } diff --git a/kernel/arch/arm64/Kconfig b/kernel/arch/arm64/Kconfig index 2be7500..337df6a 100644 --- a/kernel/arch/arm64/Kconfig +++ b/kernel/arch/arm64/Kconfig @@ -148,6 +148,7 @@ select HAVE_PERF_EVENTS select HAVE_PERF_REGS select HAVE_PERF_USER_STACK_DUMP + select HAVE_PREEMPT_LAZY select HAVE_REGS_AND_STACK_ACCESS_API select HAVE_RCU_TABLE_FREE select HAVE_RSEQ diff --git a/kernel/arch/arm64/boot/dts/rockchip/Makefile b/kernel/arch/arm64/boot/dts/rockchip/Makefile index a6f13d5..9ec92c9 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/Makefile +++ b/kernel/arch/arm64/boot/dts/rockchip/Makefile @@ -14,6 +14,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ddr3-v11-avb.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ddr3-v11-linux.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ddr4-v10.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ddr4-v10-linux.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ext-rk618.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ext-rk618-avb.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-z7-a0-rk618-dsi.dtb @@ -72,6 +73,14 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399pro-evb-v10-linux.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399pro-evb-v11-linux.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399pro-evb-v14-linux.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-demo1-lp4-v10.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-demo4-ddr4-v10.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb1-ddr4-v10.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb1-ddr4-v10-linux.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb2-ddr3-v10.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb3-lp4x-v10.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb4-ddr4-v10.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-iotest-lp3-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-box-demo-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-box-demo-v10-android9.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb-mipitest-v10.dtb diff --git a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts index 34b6829..2f9fe3d 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts +++ b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts @@ -6,3 +6,15 @@ #include "NK-R36S0.dtsi" #include "rk3568-android.dtsi" + +&bt_sco { + status = "okay"; +}; + +&bt_sound { + status = "okay"; +}; + +&i2s3_2ch { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi old mode 100755 new mode 100644 index 7e23798..f45ce09 --- a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi @@ -8,21 +8,12 @@ #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/pinctrl/rockchip.h> -#include <dt-bindings/display/media-bus-format.h> #include "rk3568.dtsi" #include "rk3568-evb.dtsi" / { model = "Rockchip RK3568 EVB1 DDR4 V10 Board"; compatible = "rockchip,rk3568-evb1-ddr4-v10", "rockchip,rk3568"; - - rk_headset: rk-headset { - compatible = "rockchip_headset"; - headset_gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_LOW>; - spk_ctl_gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>;//AMP_SD_GPIO4_C2_3V3 - pinctrl-names = "default"; - pinctrl-0 = <&hp_det>; - }; vcc2v5_sys: vcc2v5-ddr { compatible = "regulator-fixed"; @@ -34,6 +25,15 @@ vin-supply = <&vcc3v3_sys>; }; + vcc3v3_vga: vcc3v3-vga { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_vga"; + regulator-always-on; + regulator-boot-on; + gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>; + enable-active-high; + vin-supply = <&vcc3v3_sys>; + }; pcie30_avdd0v9: pcie30-avdd0v9 { compatible = "regulator-fixed"; @@ -60,9 +60,7 @@ regulator-name = "vcc3v3_pcie"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; - regulator-always-on; enable-active-high; - regulator-boot-on; gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>; startup-delay-us = <5000>; vin-supply = <&dc_12v>; @@ -87,8 +85,9 @@ enable-active-high; regulator-always-on; regulator-boot-on; - }; + }; #endif + ndj_io_init { compatible = "nk_io_control"; pinctrl-names = "default"; @@ -186,69 +185,7 @@ gpio_function = <1>; }; #endif - }; -#if 0 - nk_io_init { - compatible = "nk_io_control"; -// vcc3_io_en_gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>; //VCC3_IO_EN_GPIO0_C4_3V3 - hub_host2_5V_rest_gpio = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>; //HUB_RST_GPIO4_D2_3V3 - hub_host3_5v_gpio = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>; //HOST3_EN_GPIO4_B2_1V8 - vcc_5v_io = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>; //VCC5_IO_EN_GPIO1_A4_3V3 - vcc_12v_io = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; //VCC12_IO_EN_GPIO0_C7_3V3 - en_4g_gpio = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>; //4G_PWREN_H_GPIO0_C6 - reset_4g_gpio = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>; //4G_RST_GPIO01_B2_3V3 - air_mode_4g_gpio = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>; //4G_AIR_MODE_GPIO01_B0_3V3 - wake_4g_gpio = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>; //4G_WAKEUP_GPIO01_B1_3V3 - hp_en_gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;//HP_EN_GPIO3_A6_3V3 -// spk_out_gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>;//AMP_SD_GPIO4_C2_3V3 - wifi_power_en_gpio = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>; //WIFI_PWREN_GPIO3_C6_1V8 -// pcie_power_en_gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;//PCIE_PWREN_H_GPIO0_D4 - pinctrl-names = "default"; - pinctrl-0 = <&nk_io_gpio>; - }; -#endif - panel: panel { - compatible = "simple-panel"; - backlight = <&backlight>; - power-supply = <&vcc3v3_lcd0_n>; - enable-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>; //LCD0_VDD_H_GPIO2_D4 - reset-gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_LOW>; //7511_RST_GPIO3_D1 - edp-bl-gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>; //LCD0_BKLT_EN_3V3 - edp-bl-en = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>; //LCD0_BKLT_EN_3V3 - bus-format = <MEDIA_BUS_FMT_RGB888_1X24>; - bpc = <8>; - prepare-delay-ms = <200>; - enable-delay-ms = <20>; - lvds-gpio0 = <&gpio3 RK_PD2 GPIO_ACTIVE_HIGH>; //7511_GPIO0-GPIO3_D2 - lvds-gpio1 = <&gpio3 RK_PD3 GPIO_ACTIVE_HIGH>; //7511_GPIO1-GPIO3_D3 - lvds-gpio2 = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>; //7511_GPIO2-GPIO3_D4 - lvds-gpio3 = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>; //7511_GPIO3-GPIO3_D5 - nodka-lvds = <15>; - - display-timings { - native-mode = <&timing0>; - timing0: timing0 { - clock-frequency = <72500000>; - hactive = <1280>; - vactive = <800>; - hfront-porch = <70>; - hsync-len = <2>; - hback-porch = <88>; - vfront-porch = <7>; - vsync-len = <4>; - vback-porch = <17>; - hsync-active = <21>; - vsync-active = <0>; - de-active = <0>; - pixelclk-active = <0>; - }; - }; - ports { - panel_in: endpoint { - remote-endpoint = <&edp_out>; - }; - }; - }; +}; }; &combphy0_us { @@ -311,10 +248,6 @@ * video_phy0 needs to be enabled * when dsi0 is enabled */ -&video_phy0 { - status = "disabled"; -}; - &dsi0 { status = "disabled"; }; @@ -335,10 +268,6 @@ * video_phy1 needs to be enabled * when dsi1 is enabled */ - -&video_phy1 { - status = "okay"; -}; &dsi1 { status = "disabled"; }; @@ -348,102 +277,29 @@ }; &dsi1_in_vp1 { - status = "okay"; + status = "disabled"; }; &dsi1_panel { - power-supply = <&vcc3v3_lcd1_n>; //MIPI_3V3EN_GPIO3_A3_d_3V3 - vddio-mipi = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>; //MIPI_EN_1V8_GPIO3_A4_d_3V3 - reset-gpios = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>; //MIPI_RST_L_GPIO3_C7 - vcc-5v-gpio = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>; //VCC5_IO_EN_GPIO1_A4_3V3 - pinctrl-names = "default"; - pinctrl-0 = <&lcd1_rst_gpio>; + power-supply = <&vcc3v3_lcd1_n>; }; - -&route_dsi1 { - status = "disabled"; - connect = <&vp1_out_dsi1>; -}; - - -/* -* edp_start -*/ &edp { - force-hpd; - status = "okay"; - ports { - port@1 { - reg = <1>; - edp_out: endpoint { - remote-endpoint = <&panel_in>; - }; - }; - }; + hpd-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>; + status = "okay"; }; &edp_phy { - status = "okay"; - + status = "okay"; }; &edp_in_vp0 { - status = "disabled"; + status = "okay"; }; &edp_in_vp1 { - status = "okay"; - -}; - -&route_edp { - status = "okay"; - connect = <&vp1_out_edp>; -}; - -&route_edp { - status = "okay"; -}; -/* -* edp_end -*/ - -/* -* Hdmi_start -*/ - -&hdmi { - status = "okay"; - rockchip,phy-table = - <92812500 0x8009 0x0000 0x0270>, - <165000000 0x800b 0x0000 0x026d>, - <185625000 0x800b 0x0000 0x01ed>, - <297000000 0x800b 0x0000 0x01ad>, - <594000000 0x8029 0x0000 0x0088>, - <000000000 0x0000 0x0000 0x0000>; -}; - -&route_hdmi { - status = "okay"; - connect = <&vp0_out_hdmi>; -}; - -&hdmi_in_vp0 { - status = "okay"; -}; - -&hdmi_in_vp1 { status = "disabled"; }; - -&hdmi_sound { - status = "okay"; -}; - -/* - * Hdmi_END -*/ &gmac0 { phy-mode = "rgmii"; @@ -507,24 +363,8 @@ power-supply = <&vcc3v3_lcd0_n>; }; -&i2c3 { - status = "okay"; - //mac eeprom - eeprom@51 { - //compatible = "atmel,24c02"; - compatible = "atmel,24c256"; - reg = <0x51>; - }; - - //nk-mcu - nkmcu@15 { - compatible = "nk_mcu"; - reg = <0x15>; - }; -}; - &i2c4 { - status = "okay"; + status = "disabled"; gc8034: gc8034@37 { compatible = "galaxycore,gc8034"; status = "okay"; @@ -570,7 +410,7 @@ }; }; ov5695: ov5695@36 { - status = "okay"; + status = "disabled"; compatible = "ovti,ov5695"; reg = <0x36>; clocks = <&cru CLK_CIF_OUT>; @@ -593,19 +433,6 @@ }; }; -&i2c5 { - status = "okay"; - - hym8563: hym8563@51 { - compatible = "haoyu,hym8563"; - reg = <0x51>; - #clock-cells = <0>; - clock-frequency = <32768>; - clock-output-names = "xin32k"; - /* rtc_int is not connected */ - }; -}; - &mdio0 { rgmii_phy0: phy@0 { compatible = "ethernet-phy-ieee802.3-c22"; @@ -620,51 +447,50 @@ }; }; +&video_phy0 { + status = "disabled"; +}; +&video_phy1 { + status = "disabled"; +}; &pcie30phy { status = "okay"; }; -&pcie2x1 { - reset-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>; +&pcie3x2 { + reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>; vpcie3v3-supply = <&vcc3v3_pcie>; status = "okay"; }; &pinctrl { -// cam { -// camera_pwr: camera-pwr { -// rockchip,pins = -// /* camera power en */ -// <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; -// }; -// }; + cam { + camera_pwr: camera-pwr { + rockchip,pins = + /* camera power en */ + <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; headphone { hp_det: hp-det { - rockchip,pins = <0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_down>, - <4 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; + rockchip,pins = <3 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; }; }; wireless-wlan { wifi_host_wake_irq: wifi-host-wake-irq { - rockchip,pins = <2 RK_PB2 RK_FUNC_GPIO &pcfg_pull_down>; + rockchip,pins = <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_down>; }; }; wireless-bluetooth { - uart1_gpios: uart1-gpios { - rockchip,pins = <2 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>; + uart8_gpios: uart8-gpios { + rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; }; }; - lcd1 { - lcd1_rst_gpio: lcd1-rst-gpio { - rockchip,pins = <3 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>; - }; - }; - nk_io_init{ nk_io_gpio: nk-io-gpio{ rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>, @@ -692,6 +518,10 @@ }; }; +&rk809_sound { + hp-det-gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>; +}; + &rkisp { status = "disabled"; }; @@ -701,7 +531,7 @@ }; &rkisp_vir0 { - status = "disabled"; + status = "okay"; port { #address-cells = <1>; @@ -714,32 +544,34 @@ }; }; +&route_dsi0 { + status = "disabled"; + connect = <&vp1_out_dsi0>; +}; - - +&route_edp { + status = "okay"; + connect = <&vp0_out_edp>; +}; &sata2 { status = "okay"; }; &sdmmc2 { - status = "disabled"; -}; - -&sdmmc1 { - max-frequency = <150000000>; - supports-sdio; - bus-width = <4>; - disable-wp; - cap-sd-highspeed; - cap-sdio-irq; - keep-power-in-suspend; - mmc-pwrseq = <&sdio_pwrseq>; - non-removable; - pinctrl-names = "default"; - pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_cmd &sdmmc1_clk>; - sd-uhs-sdr104; - status = "okay"; + max-frequency = <150000000>; + supports-sdio; + bus-width = <4>; + disable-wp; + cap-sd-highspeed; + cap-sdio-irq; + keep-power-in-suspend; + mmc-pwrseq = <&sdio_pwrseq>; + non-removable; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk>; + sd-uhs-sdr104; + status = "okay"; }; &spdif_8ch { @@ -749,25 +581,25 @@ }; &uart8 { - status = "disabled"; + status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&uart8m0_xfer &uart8m0_ctsn>; }; &vcc3v3_lcd0_n { - gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>; + gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; enable-active-high; }; &vcc3v3_lcd1_n { - gpio = <&gpio3 RK_PA3 GPIO_ACTIVE_HIGH>; //MIPI_3V3EN_GPIO3_A3_d_3V3 + gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>; enable-active-high; }; &wireless_wlan { pinctrl-names = "default"; pinctrl-0 = <&wifi_host_wake_irq>; - WIFI,host_wake_irq = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>; + WIFI,host_wake_irq = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>; }; &wireless_bluetooth { @@ -775,47 +607,12 @@ clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; - uart_rts_gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_LOW>; + uart_rts_gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; - pinctrl-0 = <&uart1m0_rtsn>; - pinctrl-1 = <&uart1_gpios>; - BT,reset_gpio = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; - BT,wake_gpio = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>; - BT,wake_host_irq = <&gpio2 RK_PC1 GPIO_ACTIVE_HIGH>; + pinctrl-0 = <&uart8m0_rtsn>; + pinctrl-1 = <&uart8_gpios>; + BT,reset_gpio = <&gpio3 RK_PA0 GPIO_ACTIVE_HIGH>; + BT,wake_gpio = <&gpio3 RK_PA2 GPIO_ACTIVE_HIGH>; + BT,wake_host_irq = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>; status = "okay"; -}; - -&uart0 { - status = "okay"; -}; - -&uart1 { - pinctrl-names = "default"; - pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn>; - status = "okay"; -}; - -&uart3 { - status = "okay"; - pinctrl-0 = <&uart3m1_xfer>; -}; - -&uart4 { - status = "okay"; - pinctrl-0 = <&uart4m1_xfer>; -}; - -&uart5 { - status = "okay"; - pinctrl-0 = <&uart5m1_xfer>; -}; - -&uart7 { - status = "okay"; - pinctrl-0 = <&uart7m1_xfer>; -}; - -&uart9 { - status = "okay"; - pinctrl-0 = <&uart9m1_xfer>; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi index 8848618..ae7622c 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi @@ -99,33 +99,26 @@ status = "okay"; }; - rk809-sound { - compatible = "simple-audio-card"; - simple-audio-card,format = "i2s"; - simple-audio-card,name = "rockchip,rk809-codec"; - simple-audio-card,mclk-fs = <256>; - simple-audio-card,widgets = - "Microphone", "Mic Jack", - "Headphone", "Headphone Jack"; - simple-audio-card,routing = - "Mic Jack", "MICBIAS1", - "IN1P", "Mic Jack", - "Headphone Jack", "HPOL", - "Headphone Jack", "HPOR"; - simple-audio-card,cpu { - sound-dai = <&i2s1_2ch>; - }; - simple-audio-card,codec { - sound-dai = <&rk809_codec>; - }; - }; - - rk_headset: rk-headset { - compatible = "rockchip_headset"; - headset_gpio = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; + rk809_sound: rk809-sound { + status = "okay"; + compatible = "rockchip,multicodecs-card"; + rockchip,card-name = "rockchip-rk809"; + hp-det-gpio = <&gpio2 RK_PB0 GPIO_ACTIVE_LOW>; + io-channels = <&saradc 1>; + io-channel-names = "adc-detect"; + keyup-threshold-microvolt = <1800000>; + poll-interval = <100>; + rockchip,format = "i2s"; + rockchip,mclk-fs = <256>; + rockchip,cpu = <&i2s1_2ch>; + rockchip,codec = <&rk809_codec>; pinctrl-names = "default"; pinctrl-0 = <&hp_det>; - io-channels = <&saradc 1>; + play-pause-key { + label = "playpause"; + linux,code = <KEY_PLAYPAUSE>; + press-threshold-microvolt = <2000>; + }; }; sdio_pwrseq: sdio-pwrseq { diff --git a/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr4-v10-linux.dts b/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr4-v10-linux.dts new file mode 100644 index 0000000..e54b0f7 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr4-v10-linux.dts @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd + */ + +/dts-v1/; +#include "px30-evb-ddr3-v10-linux.dts" +#include "px30-ddr4p416dd6-timing.dtsi" + +/ { + model = "Rockchip linux PX30 evb ddr4 board"; + compatible = "rockchip,px30-evb-ddr4-v10-linux", "rockchip,px30"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/px30.dtsi b/kernel/arch/arm64/boot/dts/rockchip/px30.dtsi index 917a0e6..0d75f2a 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/px30.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/px30.dtsi @@ -982,6 +982,7 @@ pwm0: pwm@ff200000 { compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm"; reg = <0x0 0xff200000 0x0 0x10>; + interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm0_pin>; @@ -993,6 +994,7 @@ pwm1: pwm@ff200010 { compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm"; reg = <0x0 0xff200010 0x0 0x10>; + interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm1_pin>; @@ -1004,6 +1006,7 @@ pwm2: pwm@ff200020 { compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm"; reg = <0x0 0xff200020 0x0 0x10>; + interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm2_pin>; @@ -1015,6 +1018,8 @@ pwm3: pwm@ff200030 { compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm"; reg = <0x0 0xff200030 0x0 0x10>; + interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm3_pin>; @@ -1026,6 +1031,7 @@ pwm4: pwm@ff208000 { compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm"; reg = <0x0 0xff208000 0x0 0x10>; + interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm4_pin>; @@ -1037,6 +1043,7 @@ pwm5: pwm@ff208010 { compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm"; reg = <0x0 0xff208010 0x0 0x10>; + interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm5_pin>; @@ -1048,6 +1055,7 @@ pwm6: pwm@ff208020 { compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm"; reg = <0x0 0xff208020 0x0 0x10>; + interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm6_pin>; @@ -1059,6 +1067,8 @@ pwm7: pwm@ff208030 { compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm"; reg = <0x0 0xff208030 0x0 0x10>; + interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm7_pin>; diff --git a/kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi b/kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi index c0b4f5d..aefe70a 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi @@ -310,12 +310,12 @@ dram_dll_dis_freq = <IGNORE_THIS>; phy_dll_dis_freq = <IGNORE_THIS>; /* drv when odt on */ - phy_dq_drv_odten = <35>; + phy_dq_drv_odten = <44>; phy_ca_drv_odten = <38>; phy_clk_drv_odten = <47>; dram_dq_drv_odten = <40>; /* drv when odt off */ - phy_dq_drv_odtoff = <35>; + phy_dq_drv_odtoff = <44>; phy_ca_drv_odtoff = <38>; phy_clk_drv_odtoff = <47>; dram_dq_drv_odtoff = <40>; @@ -328,11 +328,11 @@ dram_dq_odt_en_freq = <800>; phy_odt_en_freq = <800>; /* slew rate when odt enable */ - phy_dq_sr_odten = <0x0>; + phy_dq_sr_odten = <0x7>; phy_ca_sr_odten = <0x1>; phy_clk_sr_odten = <0x1>; /* slew rate when odt disable */ - phy_dq_sr_odtoff = <0x0>; + phy_dq_sr_odtoff = <0x7>; phy_ca_sr_odtoff = <0x1>; phy_clk_sr_odtoff = <0x1>; /* ssmod setting*/ @@ -371,7 +371,7 @@ lp4_dq_vref_odten = <276>; lp4_ca_vref_odten = <380>; /* lp4 vref info when odt disable */ - phy_lp4_dq_vref_odtoff = <340>; + phy_lp4_dq_vref_odtoff = <420>; lp4_dq_vref_odtoff = <420>; lp4_ca_vref_odtoff = <420>; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk-stb-ir-keymap.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk-stb-ir-keymap.dtsi new file mode 100644 index 0000000..d18351e --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk-stb-ir-keymap.dtsi @@ -0,0 +1,397 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ +#include <dt-bindings/input/rk-ir.h> + +&pwm3 { + ir_key1 { + rockchip,usercode = <0xff00>; + rockchip,key_table = + <0xf9 KEY_HOME>, + <0xbf KEY_BACK>, + <0xfb KEY_MENU>, + <0xaa KEY_REPLY>, + <0xb9 KEY_UP>, + <0xe9 KEY_DOWN>, + <0xb8 KEY_LEFT>, + <0xea KEY_RIGHT>, + <0xeb KEY_VOLUMEDOWN>, + <0xef KEY_VOLUMEUP>, + <0xf7 KEY_MUTE>, + <0xe7 KEY_POWER>, + <0xfc KEY_POWER>, + <0xa9 KEY_VOLUMEDOWN>, + <0xa8 KEY_PLAYPAUSE>, + <0xe0 KEY_VOLUMEDOWN>, + <0xa5 KEY_VOLUMEDOWN>, + <0xab 183>, + <0xb7 388>, + <0xe8 388>, + <0xf8 184>, + <0xaf 185>, + <0xed KEY_VOLUMEDOWN>, + <0xee 186>, + <0xb3 KEY_VOLUMEDOWN>, + <0xf1 KEY_VOLUMEDOWN>, + <0xf2 KEY_VOLUMEDOWN>, + <0xf3 KEY_SEARCH>, + <0xb4 KEY_VOLUMEDOWN>, + <0xa4 KEY_SETUP>, + <0xbe KEY_SEARCH>; + }; + + /*for IPTV ltjc*/ + ir_key2 { + rockchip,usercode = <0xc43b>; + rockchip,key_table = + <0x7e KEY_REPLY>, + <0x7f KEY_BACK>, + <0x7a KEY_UP>, + <0x78 KEY_DOWN>, + <0x7b KEY_LEFT>, + <0x79 KEY_RIGHT>, + <0x66 KEY_VOLUMEUP>, + <0x65 KEY_VOLUMEDOWN>, + <0x69 KEY_POWER>, + <0x64 KEY_MUTE>, + <0x76 KEY_1>, + <0x75 KEY_2>, + <0x74 KEY_3>, + <0x73 KEY_4>, + <0x72 KEY_5>, + <0x71 KEY_6>, + <0x70 KEY_7>, + <0x6f KEY_8>, + <0x6e KEY_9>, + <0x77 KEY_0>, + <0x7c KEY_PAGEDOWN>, + <0x7d KEY_PAGEUP>, + <0x6a KEY_SETUP>, + <0x68 KEY_CHANNEL_UP>, + <0x67 KEY_CHANNEL_DN>, + <0x39 KEY_PORTAL>, + <0x29 KEY_HOME_PAGE>, + <0x33 KEY_CH_CUT_BACK>, + <0x34 KEY_LOCAL>, + <0x2d KEY_REVIEW>, + <0x2c KEY_ON_DEMAND>, + <0x2b KEY_INFO1>, + <0x2e KEY_DIRECT_SEEDING>, + <0x2d KEY_REVIEW>, + <0x2c KEY_ON_DEMAND>, + <0x2b KEY_INFO1>, + <0x63 KEY_SOUND1>, + <0x6c KEY_X1>, + <0x6d KEY_X2>, + <0x62 KEY_PLAYPAUSE>, + <0x6b KEY_EQUAL>, + <0x61 KEY_FASTFORWARD>, + <0x60 KEY_REWIND>, + <0x3b KEY_STOP>, + <0x35 KEY_BLUE>, + <0x36 KEY_YELLOW>, + <0x37 KEY_GREEN>, + <0x38 KEY_RED>, + <0x00 KEY_AUTOPAIR>; + }; + + ir_key3 { + rockchip,usercode = <0x1dcc>; + rockchip,key_table = + <0xee KEY_REPLY>, + <0xf0 KEY_BACK>, + <0xf8 KEY_UP>, + <0xbb KEY_DOWN>, + <0xef KEY_LEFT>, + <0xed KEY_RIGHT>, + <0xfc KEY_HOME>, + <0xf1 KEY_VOLUMEUP>, + <0xfd KEY_VOLUMEDOWN>, + <0xb7 KEY_SEARCH>, + <0xff KEY_POWER>, + <0xf3 KEY_MUTE>, + <0xbf KEY_MENU>, + <0xf9 0x191>, + <0xf5 0x192>, + <0xb3 388>, + <0xbe KEY_1>, + <0xba KEY_2>, + <0xb2 KEY_3>, + <0xbd KEY_4>, + <0xf9 KEY_5>, + <0xb1 KEY_6>, + <0xfc KEY_7>, + <0xf8 KEY_8>, + <0xb0 KEY_9>, + <0xb6 KEY_0>, + <0xb5 KEY_BACKSPACE>; + }; + + /* for IPTV */ + ir_key4 { + rockchip,usercode = <0x4db2>; + rockchip,key_table = + <0x31 KEY_REPLY>, + <0x3a KEY_BACK>, + <0x35 KEY_UP>, + <0x2d KEY_DOWN>, + <0x66 KEY_LEFT>, + <0x3e KEY_RIGHT>, + <0x7f KEY_VOLUMEUP>, + <0xfe KEY_VOLUMEDOWN>, + <0x23 KEY_POWER>, + <0x63 KEY_MUTE>, + <0x6d KEY_1>, + <0x6c KEY_2>, + <0x33 KEY_3>, + <0x71 KEY_4>, + <0x70 KEY_5>, + <0x37 KEY_6>, + <0x75 KEY_7>, + <0x74 KEY_8>, + <0x3b KEY_9>, + <0x78 KEY_0>, + <0x73 KEY_PAGEDOWN>, + <0x22 KEY_PAGEUP>, + <0x72 KEY_SETUP>, + <0x7a KEY_CHANNEL_UP>, + <0x79 KEY_CHANNEL_DN>, + <0x77 KEY_HOME_PAGE>, + <0x29 KEY_CH_CUT_BACK>, + <0x32 KEY_DIRECT_SEEDING>, + <0x6e KEY_REVIEW>, + <0x7c KEY_ON_DEMAND>, + <0x3c KEY_INFO1>, + <0x67 KEY_SOUND1>, + <0x25 KEY_X1>, + <0x2f KEY_X2>, + <0x7d KEY_LOCAL>, + <0x6a KEY_PLAYPAUSE>, + <0x0b KEY_EQUAL>; + }; + + /* for CMCC */ + ir_key5 { + rockchip,usercode = <0x1608>; + rockchip,key_table = + <0x4c KEY_REPLY>, + <0x4d KEY_BACK>, + <0x4b KEY_UP>, + <0x4a KEY_DOWN>, + <0x49 KEY_LEFT>, + <0x48 KEY_RIGHT>, + <0x4e KEY_HOME>, + <0x0b KEY_VOLUMEUP>, + <0x0c KEY_VOLUMEDOWN>, + <0x23 KEY_POWER>, + <0x45 KEY_MUTE>, + <0x44 KEY_MENU>, + <0x78 KEY_1>, + <0x77 KEY_2>, + <0x76 KEY_3>, + <0x75 KEY_4>, + <0x74 KEY_5>, + <0x73 KEY_6>, + <0x72 KEY_7>, + <0x71 KEY_8>, + <0x70 KEY_9>, + <0x79 KEY_0>, + <0x43 KEY_EQUAL>, + <0x72 KEY_X1>, + <0x5f KEY_SETUP>, + <0x25 KEY_DIRECT_SEEDING>, + <0x24 KEY_REVIEW>, + <0x21 KEY_ON_DEMAND>, + <0x20 KEY_INFO1>; + }; + + /* rk new remote */ + ir_key6 { + rockchip,usercode = <0xfe01>; + rockchip,key_table = + <0xec KEY_REPLY>, + <0xe6 KEY_BACK>, + <0xe9 KEY_UP>, + <0xe5 KEY_DOWN>, + <0xae KEY_LEFT>, + <0xaf KEY_RIGHT>, + <0xee KEY_HOME>, + <0xe7 KEY_VOLUMEUP>, + <0xef KEY_VOLUMEDOWN>, + <0xbf KEY_POWER>, + <0xbe KEY_MUTE>, + <0xb3 KEY_MENU>, + <0xff 388>, + <0xb1 KEY_1>, + <0xf2 KEY_2>, + <0xf3 KEY_3>, + <0xb5 KEY_4>, + <0xf6 KEY_5>, + <0xf7 KEY_6>, + <0xb9 KEY_7>, + <0xfa KEY_8>, + <0xfb KEY_9>, + <0xfe KEY_0>, + <0xbd KEY_EQUAL>, + <0xbc KEY_SETUP>, + <0xf0 KEY_LOCAL>, + <0x0d KEY_DIRECT_SEEDING>, + <0x0c KEY_REVIEW>, + <0x0b KEY_ON_DEMAND>, + <0x0a KEY_INFO1>, + <0x0e KEY_CH_CUT_BACK>; + }; + + /* for CTC */ + ir_key7 { + rockchip,usercode = <0x4cb3>; + rockchip,key_table = + <0x31 KEY_REPLY>, + <0x3a KEY_BACK>, + <0x35 KEY_UP>, + <0x2d KEY_DOWN>, + <0x66 KEY_LEFT>, + <0x3e KEY_RIGHT>, + <0x7f KEY_VOLUMEUP>, + <0x7e KEY_VOLUMEDOWN>, + <0x23 KEY_POWER>, + <0x63 KEY_MUTE>, + <0x6d KEY_1>, + <0x6c KEY_2>, + <0x33 KEY_3>, + <0x71 KEY_4>, + <0x70 KEY_5>, + <0x37 KEY_6>, + <0x75 KEY_7>, + <0x74 KEY_8>, + <0x3b KEY_9>, + <0x78 KEY_0>, + <0x73 KEY_PAGEDOWN>, + <0x22 KEY_PAGEUP>, + <0x72 KEY_SETUP>, + <0x7a KEY_CHANNEL_UP>, + <0x79 KEY_CHANNEL_DN>, + <0x77 KEY_MENU>, + <0x29 KEY_CH_CUT_BACK>, + <0x32 KEY_DIRECT_SEEDING>, + <0x6e KEY_REVIEW>, + <0x7c KEY_ON_DEMAND>, + <0x3c KEY_AUTOPAIR>, + <0x67 KEY_SOUND1>, + <0x25 KEY_X1>, + <0x2f KEY_X2>, + <0x7d KEY_HOME_PAGE>, + <0x6a KEY_PLAYPAUSE>, + <0x0b KEY_EQUAL>, + <0x1a KEY_F12>, + <0xbc KEY_F22>; + }; + + /* for CMCC */ + ir_key8 { + rockchip,usercode = <0xdd22>; + rockchip,key_table = + <0x31 KEY_REPLY>, + <0x6a KEY_BACK>, + <0x35 KEY_UP>, + <0x2d KEY_DOWN>, + <0x66 KEY_LEFT>, + <0x3e KEY_RIGHT>, + <0x7f KEY_VOLUMEUP>, + <0x7e KEY_VOLUMEDOWN>, + <0x23 KEY_POWER>, + <0x63 KEY_MUTE>, + <0x6d KEY_1>, + <0x6c KEY_2>, + <0x33 KEY_3>, + <0x71 KEY_4>, + <0x70 KEY_5>, + <0x37 KEY_6>, + <0x75 KEY_7>, + <0x74 KEY_8>, + <0x3b KEY_9>, + <0x78 KEY_0>, + <0x73 KEY_PAGEDOWN>, + <0x22 KEY_PAGEUP>, + <0x72 KEY_SETUP>, + <0x7a KEY_CHANNEL_UP>, + <0x79 KEY_CHANNEL_DN>, + <0x77 KEY_HOME_PAGE>, + <0x2f KEY_CH_CUT_BACK>, + <0x32 KEY_DIRECT_SEEDING>, + <0x6e KEY_REVIEW>, + <0x7c KEY_ON_DEMAND>, + <0x3c KEY_INFO1>, + <0x3a KEY_HELP>, + <0x67 KEY_SOUND1>, + <0x25 KEY_X2>, + <0x7d KEY_MENU>, + <0x3f KEY_EQUAL>, + <0x29 388>, + <0x26 KEY_PLAYPAUSE>, + <0x76 401>, + <0x7b 400>, + <0x69 66>; + }; + + /* for BJLT IPTV */ + ir_key9 { + rockchip,usercode = <0x3bc4>; + rockchip,key_table = + <0x81 KEY_REPLY>, + <0x80 KEY_BACK>, + <0x85 KEY_UP>, + <0x87 KEY_DOWN>, + <0x84 KEY_LEFT>, + <0x86 KEY_RIGHT>, + <0x99 KEY_VOLUMEUP>, + <0x9a KEY_VOLUMEDOWN>, + <0x96 KEY_POWER>, + <0x9b KEY_MUTE>, + <0x89 KEY_1>, + <0x8a KEY_2>, + <0x8b KEY_3>, + <0x8c KEY_4>, + <0x8d KEY_5>, + <0x8e KEY_6>, + <0x8f KEY_7>, + <0x90 KEY_8>, + <0x91 KEY_9>, + <0x88 KEY_0>, + <0x83 KEY_PAGEDOWN>, + <0x82 KEY_PAGEUP>, + <0x95 KEY_SETUP>, + <0x97 KEY_CHANNEL_UP>, + <0x98 KEY_CHANNEL_DN>, + <0xc6 KEY_LOCAL>, + <0xd6 KEY_HOME_PAGE>, + <0xd7 KEY_TRACK>, + <0xcc KEY_CH_CUT_BACK>, + <0xc3 KEY_INTERX>, + <0xd1 KEY_DIRECT_SEEDING>, + <0xd2 KEY_REVIEW>, + <0xd3 KEY_ON_DEMAND>, + <0xd4 KEY_INFO1>, + <0xc7 KEY_DIRECT_SEEDING>, + <0xc8 KEY_REVIEW>, + <0xc9 KEY_ON_DEMAND>, + <0xca KEY_INFO1>, + <0xcd KEY_FAVORITE>, + <0xce KEY_CHANNEL_POS>, + <0xcf KEY_HELP>, + <0xd0 KEY_EVENT>, + <0x9c KEY_SOUND1>, + <0x93 KEY_X1>, + <0x92 KEY_X2>, + <0xc0 KEY_END>, + <0xc1 KEY_GO_BEGINNING>, + <0x9d KEY_PLAYPAUSE>, + <0xc4 KEY_STOP>, + <0x94 KEY_EQUAL>, + <0x9e KEY_YELLOW>, + <0x9f KEY_BLUE>, + <0xcb KEY_APPLICATION>, + <0xc5 KEY_POS>; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi index a386cd2..9c897ba 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi @@ -43,6 +43,12 @@ / { compatible = "rockchip,linux", "rockchip,rk3326"; + aliases { + mmc0 = &emmc; + mmc1 = &sdmmc; + mmc2 = &sdio; + }; + chosen { bootargs = "earlycon=uart8250,mmio32,0xff160000 console=ttyFIQ0 rw root=PARTUUID=614e0000-0000 rootwait"; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi index 61199e7..13e9723 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -1006,6 +1006,7 @@ reg-io-width = <4>; interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "hdmi", "hdmi_wakeup"; clocks = <&cru PCLK_HDMI>, <&cru SCLK_HDMI_SFC>, <&cru SCLK_RTC32K>, diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi index cdaecbc..97d6434 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi @@ -33,6 +33,15 @@ compatible = "rockchip,drm-logo"; reg = <0x0 0x0 0x0 0x0>; }; + + ramoops: ramoops@110000 { + compatible = "ramoops"; + reg = <0x0 0x110000 0x0 0xf0000>; + record-size = <0x20000>; + console-size = <0x80000>; + ftrace-size = <0x00000>; + pmsg-size = <0x50000>; + }; }; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi index 04fd195..c370fc1 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi @@ -1658,7 +1658,8 @@ compatible = "rockchip,rk3368-dw-hdmi"; reg = <0x0 0xff980000 0x0 0x20000>; reg-io-width = <4>; - interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>; + interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "hdmi", "hdmi_wakeup"; clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_HDCP>, <&cru SCLK_HDMI_CEC>; clock-names = "iahb", "isfr", "cec"; pinctrl-names = "default"; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi index bbe1eed..6bd7174 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi @@ -46,6 +46,12 @@ / { compatible = "rockchip,linux", "rockchip,rk3399"; + aliases { + mmc0 = &sdhci; + mmc1 = &sdmmc; + mmc2 = &sdio0; + }; + chosen { bootargs = "earlycon=uart8250,mmio32,0xff1a0000 console=ttyFIQ0 rw root=PARTUUID=614e0000-0000 rootfstype=ext4 rootwait coherent_pool=1m"; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi index 36011b4..a9e8aec 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -448,6 +448,16 @@ status = "disabled"; }; + debug: debug@fe430000 { + compatible = "rockchip,debug"; + reg = <0x0 0xfe430000 0x0 0x1000>, + <0x0 0xfe432000 0x0 0x1000>, + <0x0 0xfe434000 0x0 0x1000>, + <0x0 0xfe436000 0x0 0x1000>, + <0x0 0xfe610000 0x0 0x1000>, + <0x0 0xfe710000 0x0 0x1000>; + }; + usbdrd3_0: usb@fe800000 { compatible = "rockchip,rk3399-dwc3"; #address-cells = <2>; @@ -2045,7 +2055,9 @@ hdmi: hdmi@ff940000 { compatible = "rockchip,rk3399-dw-hdmi"; reg = <0x0 0xff940000 0x0 0x20000>; - interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>; + interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH 0>; + interrupt-names = "hdmi", "hdmi_wakeup"; clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_SFR>, <&cru PLL_VPLL>, @@ -2301,6 +2313,29 @@ reg = <0x0 0xffa8f800 0x0 0x400>; }; + cci: cci@ffb00000 { + compatible = "arm,cci-500"; + reg = <0x0 0xffb00000 0x0 0x10000>; + ranges = <0x0 0x0 0xffb00000 0xa0000>; + #address-cells = <1>; + #size-cells = <1>; + status = "disabled"; + + cci_pmu: pmu@10000 { + compatible = "arm,cci-500-pmu,r0"; + reg = <0x10000 0x80000>; + interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>; + status = "disabled"; + }; + }; + rockchip_system_monitor: rockchip-system-monitor { compatible = "rockchip,system-monitor"; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-android.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-android.dtsi new file mode 100644 index 0000000..396bfdb --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-android.dtsi @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +/ { + chosen: chosen { + bootargs = "earlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0 driver_async_probe=dwmmc_rockchip,rk_gmac-dwmac,rockchip-drm drm_kms_helper.fbdev_emulation=0"; + }; + + fiq-debugger { + compatible = "rockchip,fiq-debugger"; + rockchip,serial-id = <0>; + rockchip,wake-irq = <0>; + /* If enable uart uses irq instead of fiq */ + rockchip,irq-mode-enable = <1>; + rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */ + interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&uart0m0_xfer>; + status = "okay"; + }; + + firmware { + optee { + compatible = "linaro,optee-tz"; + method = "smc"; + }; + }; + + reserved_memory: reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + cma { + compatible = "shared-dma-pool"; + reusable; + size = <0x0 0x00800000>; + linux,cma-default; + }; + + drm_logo: drm-logo@00000000 { + compatible = "rockchip,drm-logo"; + reg = <0x0 0x0 0x0 0x0>; + }; + + drm_cubic_lut: drm-cubic-lut@00000000 { + compatible = "rockchip,drm-cubic-lut"; + reg = <0x0 0x0 0x0 0x0>; + }; + + ramoops: ramoops@110000 { + compatible = "ramoops"; + /* 0x110000 to 0x1f0000 is for ramoops */ + reg = <0x0 0x110000 0x0 0xe0000>; + boot-log-size = <0x8000>; /* do not change */ + boot-log-count = <0x1>; /* do not change */ + console-size = <0x80000>; + pmsg-size = <0x30000>; + ftrace-size = <0x00000>; + record-size = <0x14000>; + }; + }; +}; + +&display_subsystem { + memory-region = <&drm_logo>, <&drm_cubic_lut>; + memory-region-names = "drm-logo", "drm-cubic-lut"; + /* devfreq = <&dmc>; */ + + route { + route_hdmi: route-hdmi { + status = "okay"; + logo,uboot = "logo.bmp"; + logo,kernel = "logo_kernel.bmp"; + logo,mode = "fullscreen"; + charge_logo,mode = "center"; + connect = <&vp0_out_hdmi>; + }; + route_tve: route-tve { + status = "okay"; + logo,uboot = "logo.bmp"; + logo,kernel = "logo_kernel.bmp"; + logo,mode = "fullscreen"; + charge_logo,mode = "center"; + connect = <&vp1_out_tve>; + }; + }; +}; + +&rng { + status = "okay"; +}; + +&vop { + /* + * 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, + */ + esmart_lb_mode = /bits/ 8 <3>; + support-multi-area; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo.dtsi new file mode 100644 index 0000000..aebd946 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo.dtsi @@ -0,0 +1,497 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528.dtsi" +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/rk-input.h> +#include <dt-bindings/pinctrl/rockchip.h> +#include "rk-stb-ir-keymap.dtsi" + +/ { + acodec_sound: acodec-sound { + status = "okay"; + compatible = "simple-audio-card"; + simple-audio-card,name = "rk3528-acodec"; + simple-audio-card,format = "i2s"; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,cpu { + sound-dai = <&sai2>; + }; + simple-audio-card,codec { + sound-dai = <&acodec>; + }; + }; + + adc_keys: adc-keys { + status = "okay"; + compatible = "adc-keys"; + io-channels = <&saradc 1>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + poll-interval = <100>; + + vol-up-key { + label = "volume up"; + linux,code = <KEY_VOLUMEUP>; + press-threshold-microvolt = <1750>; + }; + }; + + bt_sco: bt-sco { + status = "disabled"; + compatible = "delta,dfbmcs320"; + #sound-dai-cells = <1>; + }; + + bt_sound: bt-sound { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,format = "dsp_a"; + simple-audio-card,bitclock-inversion = <0>; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,name = "rockchip,bt"; + simple-audio-card,cpu { + sound-dai = <&sai0>; + }; + simple-audio-card,codec { + sound-dai = <&bt_sco 1>; + }; + }; + + dc_12v: dc-12v { + compatible = "regulator-fixed"; + regulator-name = "dc_12v"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <12000000>; + regulator-max-microvolt = <12000000>; + }; + + leds: gpio-leds { + compatible = "gpio-leds"; + ir { + gpios = <&gpio4 RK_PB7 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "none"; + default-state = "off"; + }; + net-red { + gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "none"; + default-state = "off"; + }; + net-green { + gpios = <&gpio4 RK_PC0 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "none"; + default-state = "off"; + }; + pwr-red { + gpios = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + retain-state-shutdown; + }; + pwr-green { + gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "none"; + default-state = "on"; + retain-state-suspended; + retain-state-shutdown; + }; + }; + + hdmi_sound: hdmi-sound { + compatible = "rockchip,hdmi"; + rockchip,mclk-fs = <128>; + rockchip,card-name = "rockchip,hdmi"; + rockchip,cpu = <&sai3>; + rockchip,codec = <&hdmi>; + rockchip,jack-det; + }; + + pdmics: dummy-codec { + status = "disabled"; + compatible = "rockchip,dummy-codec"; + #sound-dai-cells = <0>; + }; + + pdm_mic_array: pdm-mic-array { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,name = "rockchip,pdm-mic-array"; + simple-audio-card,cpu { + sound-dai = <&pdm>; + }; + simple-audio-card,codec { + sound-dai = <&pdmics>; + }; + }; + + spdif-sound { + status = "okay"; + compatible = "simple-audio-card"; + simple-audio-card,name = "ROCKCHIP,SPDIF"; + simple-audio-card,cpu { + sound-dai = <&spdif_8ch>; + }; + simple-audio-card,codec { + sound-dai = <&spdif_out>; + }; + }; + + spdif_out: spdif-out { + status = "okay"; + compatible = "linux,spdif-dit"; + #sound-dai-cells = <0>; + }; + + vcc5v0_sys: vcc5v0-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_sys"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&dc_12v>; + }; + + vcc5v0_host: vcc5v0-host-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_host"; + regulator-boot-on; + regulator-always-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + enable-active-high; + gpio = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>; + vin-supply = <&vcc5v0_sys>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_host_en>; + }; + + vdd_logic: vdd-logic { + compatible = "pwm-regulator"; + pwms = <&pwm2 0 5000 1>; + regulator-name = "vdd_logic"; + regulator-min-microvolt = <703000>; + regulator-max-microvolt = <1006000>; + regulator-init-microvolt = <900000>; + regulator-always-on; + regulator-boot-on; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc5v0_sys>; + status = "okay"; + }; + + vdd_cpu: vdd-cpu { + compatible = "pwm-regulator"; + pwms = <&pwm1 0 5000 1>; + regulator-name = "vdd_cpu"; + regulator-min-microvolt = <746000>; + regulator-max-microvolt = <1201000>; + regulator-init-microvolt = <953000>; + regulator-always-on; + regulator-boot-on; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc5v0_sys>; + status = "okay"; + }; + + vdd_0v9_s3: vdd-0v9-s3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_0v9_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vcc5v0_sys>; + }; + + vdd_1v8_s3: vdd-1v8-s3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_1v8_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc_3v3_s3: vcc-3v3-s3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc_ddr_s3: vcc-ddr-s3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_ddr_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + vin-supply = <&vcc5v0_sys>; + }; +}; + +&acodec { + pa-ctl-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>; + status = "okay"; +}; + +&avsd { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vdd_cpu>; +}; + +&crypto { + status = "okay"; +}; + +&dfi { + status = "okay"; +}; + +&display_subsystem { + status = "okay"; +}; + +&dmc { + center-supply = <&vdd_logic>; + status = "okay"; +}; + +&gmac0 { + status = "okay"; +}; + +&gpu { + mali-supply = <&vdd_logic>; + status = "okay"; +}; + +&gpu_bus { + bus-supply = <&vdd_logic>; + status = "okay"; +}; + +&hdmi { + status = "okay"; +}; + +&hdmi_in_vp0 { + status = "okay"; +}; + +&hdmiphy { + status = "okay"; +}; + +&iep { + status = "okay"; +}; + +&iep_mmu { + status = "okay"; +}; + +&jpegd { + status = "okay"; +}; + +&jpegd_mmu { + status = "okay"; +}; + +&mpp_srv { + status = "okay"; +}; + +&pinctrl { + usb { + vcc5v0_host_en: vcc5v0-host-en { + rockchip,pins = <4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&pwm1 { + status = "okay"; +}; + +&pwm2 { + status = "okay"; +}; + +&pwm3 { + compatible = "rockchip,remotectl-pwm"; + pinctrl-names = "default"; + pinctrl-0 = <&pwm3m0_pins>; + remote_pwm_id = <3>; + handle_cpu_id = <1>; + remote_support_psci = <0>; + status = "okay"; +}; + +&rga2 { + status = "okay"; +}; + +&rga2_mmu { + status = "okay"; +}; + +&rkvdec { + status = "okay"; +}; + +&rkvdec_mmu { + status = "okay"; +}; + +&rkvenc { + status = "okay"; +}; + +&rkvenc_mmu { + status = "okay"; +}; + +&rmii0_phy { + /delete-property/ pinctrl-names; + /delete-property/ pinctrl-0; +}; + +&rockchip_suspend { + status = "okay"; + rockchip,sleep-debug-en = <1>; + rockchip,virtual-poweroff = <1>; + rockchip,sleep-mode-config = < + (0 + | RKPM_SLP_ARMPD + ) + >; + rockchip,wakeup-config = < + (0 + | RKPM_CPU0_WKUP_EN + | RKPM_GPIO_WKUP_EN + ) + >; + rockchip,pwm-regulator-config = < + (0 + | RKPM_PWM1_M0_REGULATOR_EN + ) + >; +}; + +&sai0 { + pinctrl-0 = <&i2s0m0_lrck &i2s0m0_sclk &i2s0m0_sdi &i2s0m0_sdo>; + status = "disabled"; +}; + +&sai2 { + status = "okay"; +}; + +&sai3 { + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vdd_1v8_s3>; +}; + +&sdhci { + bus-width = <8>; + supports-emmc; + non-removable; + mmc-hs400-1_8v; + mmc-hs400-enhanced-strobe; + max-frequency = <200000000>; + fixed-emmc-driver-type = <4>; + status = "okay"; +}; + +&spdif_8ch { + status = "okay"; +}; + +&tsadc { + status = "okay"; +}; + +&tve { + status = "okay"; +}; + +&tve_in_vp1 { + status = "okay"; +}; + +&u2phy_host { + phy-supply = <&vcc5v0_host>; + status = "okay"; +}; + +&u2phy_otg { + phy-supply = <&vcc5v0_host>; + status = "okay"; +}; + +&usb2phy { + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usbdrd30 { + status = "okay"; +}; + +&usbdrd_dwc3 { + dr_mode = "otg"; + maximum-speed = "high-speed"; + extcon = <&usb2phy>; + phys = <&u2phy_otg>; + phy-names = "usb2-phy"; + snps,dis_u2_susphy_quirk; + snps,usb2-lpm-disable; + status = "okay"; +}; + +&vdpp { + status = "okay"; +}; + +&vdpu { + status = "okay"; +}; + +&vdpu_mmu { + status = "okay"; +}; + +&vop { + status = "okay"; +}; + +&vop_mmu { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dts new file mode 100644 index 0000000..d1084a5 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dts @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528-demo1-lp4-v10.dtsi" +#include "rk3528-android.dtsi" + +/{ + firmware { + android { + compatible = "android,firmware"; + boot_devices = "ffbf0000.mmc"; + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,dtbo"; + }; + fstab { + compatible = "android,fstab"; + vendor { + compatible = "android,vendor"; + dev = "/dev/block/by-name/vendor"; + type = "ext4"; + mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; + fsmgr_flags = "wait,avb"; + }; + }; + }; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi new file mode 100644 index 0000000..c1f34d0 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +/dts-v1/; + +#include "rk3528.dtsi" +#include "rk3528-demo.dtsi" + +/ { + model = "Rockchip RK3528 DEMO1 LP4 V10 Board"; + compatible = "rockchip,rk3528-demo1-lp4-v10", "rockchip,rk3528"; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_enable_h &wifi_reset &clkm0_32k_out>; + reset-gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>; + }; + + wireless_bluetooth: wireless-bluetooth { + compatible = "bluetooth-platdata"; + //wifi-bt-power-toggle; + uart_rts_gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>; + pinctrl-names = "default", "rts_gpio"; + pinctrl-0 = <&uart2m0_rtsn>; + pinctrl-1 = <&uart2m0_gpios>; + BT,reset_gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>; + BT,wake_host_irq = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + wireless_wlan: wireless-wlan { + compatible = "wlan-platdata"; + rockchip,grf = <&grf>; + wifi_chip_type = "rtl8822cs"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_host_wake_irq>; + WIFI,host_wake_irq = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; +}; + +&sdio1 { + max-frequency = <200000000>; + no-sd; + no-mmc; + supports-sdio; + bus-width = <4>; + disable-wp; + cap-sd-highspeed; + cap-sdio-irq; + keep-power-in-suspend; + non-removable; + mmc-pwrseq = <&sdio_pwrseq>; + pinctrl-names = "default"; + pinctrl-0 = <&sdio1_bus4 &sdio1_cmd &sdio1_clk>; + sd-uhs-sdr104; + status = "okay"; +}; + +&uart2 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart2m0_xfer &uart2m0_ctsn>; +}; + +&pinctrl { + sdio-pwrseq { + wifi_enable_h: wifi-enable-h { + rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + wireless-wlan { + wifi_host_wake_irq: wifi-host-wake-irq { + rockchip,pins = <3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_down>; + }; + + wifi_reset: wifi-reset { + rockchip,pins = <3 RK_PB4 RK_FUNC_GPIO &pcfg_output_high>; + }; + }; + + wireless-bluetooth { + uart2m0_gpios: uart2m0-gpios { + rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dts new file mode 100644 index 0000000..189753c --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dts @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528-demo4-ddr4-v10.dtsi" +#include "rk3528-android.dtsi" + + +/{ + firmware { + android { + compatible = "android,firmware"; + boot_devices = "ffbf0000.mmc"; + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,dtbo"; + }; + fstab { + compatible = "android,fstab"; + vendor { + compatible = "android,vendor"; + dev = "/dev/block/by-name/vendor"; + type = "ext4"; + mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; + fsmgr_flags = "wait,avb"; + }; + }; + }; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dtsi new file mode 100644 index 0000000..c2af2c2 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dtsi @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +/dts-v1/; + +#include "rk3528.dtsi" +#include "rk3528-demo.dtsi" + +/ { + model = "Rockchip RK3528 DEMO4 DDR4 V10 Board"; + compatible = "rockchip,rk3528-demo4-ddr4-v10", "rockchip,rk3528"; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_enable_h &wifi_reset>; + reset-gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>; + }; + + wireless_bluetooth: wireless-bluetooth { + compatible = "bluetooth-platdata"; + //wifi-bt-power-toggle; + uart_rts_gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>; + pinctrl-names = "default", "rts_gpio"; + pinctrl-0 = <&uart2m0_rtsn>; + pinctrl-1 = <&uart2m0_gpios>; + BT,reset_gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>; + BT,wake_host_irq = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + wireless_wlan: wireless-wlan { + compatible = "wlan-platdata"; + rockchip,grf = <&grf>; + wifi_chip_type = "rtl8822cs"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_host_wake_irq>; + WIFI,host_wake_irq = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; +}; + +&sdio1 { + max-frequency = <200000000>; + no-sd; + no-mmc; + supports-sdio; + bus-width = <4>; + disable-wp; + cap-sd-highspeed; + cap-sdio-irq; + keep-power-in-suspend; + non-removable; + mmc-pwrseq = <&sdio_pwrseq>; + pinctrl-names = "default"; + pinctrl-0 = <&sdio1_bus4 &sdio1_cmd &sdio1_clk>; + sd-uhs-sdr104; + status = "okay"; +}; + +&uart2 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart2m0_xfer &uart2m0_ctsn>; +}; + +&pinctrl { + sdio-pwrseq { + wifi_enable_h: wifi-enable-h { + rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + wireless-wlan { + wifi_host_wake_irq: wifi-host-wake-irq { + rockchip,pins = <3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_down>; + }; + + wifi_reset: wifi-reset { + rockchip,pins = <3 RK_PB4 RK_FUNC_GPIO &pcfg_output_high>; + }; + }; + + wireless-bluetooth { + uart2m0_gpios: uart2m0-gpios { + rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi new file mode 100644 index 0000000..58c9d22 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi @@ -0,0 +1,672 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528.dtsi" +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/rk-input.h> +#include <dt-bindings/pinctrl/rockchip.h> + +/ { + acodec_sound: acodec-sound { + status = "okay"; + compatible = "simple-audio-card"; + simple-audio-card,name = "rk3528-acodec"; + simple-audio-card,format = "i2s"; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,cpu { + sound-dai = <&sai2>; + }; + simple-audio-card,codec { + sound-dai = <&acodec>; + }; + }; + + adc_keys: adc-keys { + status = "okay"; + compatible = "adc-keys"; + io-channels = <&saradc 1>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + poll-interval = <100>; + + vol-up-key { + label = "volume up"; + linux,code = <KEY_VOLUMEUP>; + press-threshold-microvolt = <1750>; + }; + }; + + bt_sco: bt-sco { + status = "disabled"; + compatible = "delta,dfbmcs320"; + #sound-dai-cells = <1>; + }; + + bt_sound: bt-sound { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,format = "dsp_a"; + simple-audio-card,bitclock-inversion = <0>; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,name = "rockchip,bt"; + simple-audio-card,cpu { + sound-dai = <&sai0>; + }; + simple-audio-card,codec { + sound-dai = <&bt_sco 1>; + }; + }; + + dc_12v: dc-12v { + compatible = "regulator-fixed"; + regulator-name = "dc_12v"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <12000000>; + regulator-max-microvolt = <12000000>; + }; + + es7243_sound: es7243-sound { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,name = "rockchip,es7243"; + simple-audio-card,format = "i2s"; + simple-audio-card,mclk-fs = <256>; + + simple-audio-card,cpu { + sound-dai = <&sai1>; + }; + simple-audio-card,codec { + sound-dai = <&es7243e>; + }; + }; + + hdmi_sound: hdmi-sound { + compatible = "rockchip,hdmi"; + rockchip,mclk-fs = <128>; + rockchip,card-name = "rockchip,hdmi"; + rockchip,cpu = <&sai3>; + rockchip,codec = <&hdmi>; + rockchip,jack-det; + }; + + pdmics: dummy-codec { + status = "disabled"; + compatible = "rockchip,dummy-codec"; + #sound-dai-cells = <0>; + }; + + pdm_mic_array: pdm-mic-array { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,name = "rockchip,pdm-mic-array"; + simple-audio-card,cpu { + sound-dai = <&pdm>; + }; + simple-audio-card,codec { + sound-dai = <&pdmics>; + }; + }; + + spdif-sound { + status = "okay"; + compatible = "simple-audio-card"; + simple-audio-card,name = "ROCKCHIP,SPDIF"; + simple-audio-card,cpu { + sound-dai = <&spdif_8ch>; + }; + simple-audio-card,codec { + sound-dai = <&spdif_out>; + }; + }; + + spdif_out: spdif-out { + status = "okay"; + compatible = "linux,spdif-dit"; + #sound-dai-cells = <0>; + }; + + vcc5v0_sys: vcc5v0-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_sys"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&dc_12v>; + }; + + vcc5v0_host: vcc5v0-host-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_host"; + regulator-boot-on; + regulator-always-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + enable-active-high; + gpio = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>; + vin-supply = <&vcc5v0_sys>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_host_en>; + }; + + vcc5v0_otg: vcc5v0-otg-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_otg"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + enable-active-high; + gpio = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>; + vin-supply = <&vcc5v0_sys>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_otg_en>; + }; + + /omit-if-no-ref/ + vccio_sd: vccio-sd { + compatible = "regulator-gpio"; + regulator-name = "vccio_sd"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; + vin-supply = <&vcc5v0_sys>; + states = <1800000 0x0 + 3300000 0x1>; + }; + + vdd_logic: vdd-logic { + compatible = "pwm-regulator"; + pwms = <&pwm2 0 5000 1>; + regulator-name = "vdd_logic"; + regulator-min-microvolt = <705000>; + regulator-max-microvolt = <1006000>; + regulator-init-microvolt = <900000>; + regulator-always-on; + regulator-boot-on; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc5v0_sys>; + status = "okay"; + }; + + vdd_cpu: vdd-cpu { + compatible = "pwm-regulator"; + pwms = <&pwm1 0 5000 1>; + regulator-name = "vdd_cpu"; + regulator-min-microvolt = <746000>; + regulator-max-microvolt = <1201000>; + regulator-init-microvolt = <953000>; + regulator-always-on; + regulator-boot-on; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc5v0_sys>; + status = "okay"; + }; + + vdd_gpu: vdd-gpu { + compatible = "pwm-regulator"; + pwms = <&pwm0 0 5000 1>; + regulator-name = "vdd_gpu"; + regulator-min-microvolt = <705000>; + regulator-max-microvolt = <1148000>; + regulator-init-microvolt = <900000>; + regulator-always-on; + regulator-boot-on; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc5v0_sys>; + status = "okay"; + }; + + vdd_0v9_s3: vdd-0v9-s3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_0v9_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vcc5v0_sys>; + }; + + vdd_1v8_s3: vdd-1v8-s3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_1v8_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc_3v3_s3: vcc-3v3-s3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc5v0_sys>; + }; + + /omit-if-no-ref/ + vcc_sd: vcc-sd { + compatible = "regulator-fixed"; + gpio = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>; + regulator-name = "vcc_sd"; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_3v3_s3>; + }; + + vcc_ddr_s3: vcc-ddr-s3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_ddr_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + vin-supply = <&vcc5v0_sys>; + }; +}; + +&acodec { + pa-ctl-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>; + status = "okay"; +}; + +&avsd { + status = "okay"; +}; + +&combphy_pu { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vdd_cpu>; +}; + +&crypto { + status = "okay"; +}; + +&dfi { + status = "okay"; +}; + +&display_subsystem { + status = "okay"; +}; + +&dmc { + center-supply = <&vdd_logic>; + status = "okay"; +}; + +&gmac0 { + status = "okay"; +}; + +&gpu { + mali-supply = <&vdd_gpu>; + status = "okay"; +}; + +&gpu_bus { + bus-supply = <&vdd_logic>; + status = "okay"; +}; + +&hdmi { + status = "okay"; +}; + +&hdmi_in_vp0 { + status = "okay"; +}; + +&hdmiphy { + status = "okay"; +}; + +&i2c6 { + status = "disabled"; + es7243e: es7243e@10 { + status = "okay"; + #sound-dai-cells = <0>; + compatible = "ES7243E_MicArray_0"; + reg = <0x10>; + }; + + es7243e_11: es7243e@11 { + status = "okay"; + #sound-dai-cells = <0>; + compatible = "ES7243E_MicArray_1"; + reg = <0x11>; + }; + + es7243e_12: es7243e@12 { + status = "okay"; + #sound-dai-cells = <0>; + compatible = "ES7243E_MicArray_2"; + reg = <0x12>; + }; +}; + +&iep { + status = "okay"; +}; + +&iep_mmu { + status = "okay"; +}; + +&jpegd { + status = "okay"; +}; + +&jpegd_mmu { + status = "okay"; +}; + +&mpp_srv { + status = "okay"; +}; + +&pinctrl { + usb { + vcc5v0_host_en: vcc5v0-host-en { + rockchip,pins = <4 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + vcc5v0_otg_en: vcc5v0-otg-en { + rockchip,pins = <4 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&pwm0 { + status = "okay"; +}; + +&pwm1 { + status = "okay"; +}; + +&pwm2 { + status = "okay"; +}; + +&pwm3 { + compatible = "rockchip,remotectl-pwm"; + pinctrl-names = "default"; + pinctrl-0 = <&pwm3m0_pins>; + remote_pwm_id = <3>; + handle_cpu_id = <1>; + remote_support_psci = <0>; + status = "okay"; + + ir_key1 { + rockchip,usercode = <0x4040>; + rockchip,key_table = + <0xf2 KEY_REPLY>, + <0xba KEY_BACK>, + <0xf4 KEY_UP>, + <0xf1 KEY_DOWN>, + <0xef KEY_LEFT>, + <0xee KEY_RIGHT>, + <0xbd KEY_HOME>, + <0xea KEY_VOLUMEUP>, + <0xe3 KEY_VOLUMEDOWN>, + <0xe2 KEY_SEARCH>, + <0xb2 KEY_POWER>, + <0xbc KEY_MUTE>, + <0xec KEY_MENU>, + <0xbf 0x190>, + <0xe0 0x191>, + <0xe1 0x192>, + <0xe9 183>, + <0xe6 248>, + <0xe8 185>, + <0xe7 186>, + <0xf0 388>, + <0xbe 0x175>; + }; + + ir_key2 { + rockchip,usercode = <0xff00>; + rockchip,key_table = + <0xf9 KEY_HOME>, + <0xbf KEY_BACK>, + <0xfb KEY_MENU>, + <0xaa KEY_REPLY>, + <0xb9 KEY_UP>, + <0xe9 KEY_DOWN>, + <0xb8 KEY_LEFT>, + <0xea KEY_RIGHT>, + <0xeb KEY_VOLUMEDOWN>, + <0xef KEY_VOLUMEUP>, + <0xf7 KEY_MUTE>, + <0xe7 KEY_POWER>, + <0xfc KEY_POWER>, + <0xa9 KEY_VOLUMEDOWN>, + <0xa8 KEY_PLAYPAUSE>, + <0xe0 KEY_VOLUMEDOWN>, + <0xa5 KEY_VOLUMEDOWN>, + <0xab 183>, + <0xb7 388>, + <0xe8 388>, + <0xf8 184>, + <0xaf 185>, + <0xed KEY_VOLUMEDOWN>, + <0xee 186>, + <0xb3 KEY_VOLUMEDOWN>, + <0xf1 KEY_VOLUMEDOWN>, + <0xf2 KEY_VOLUMEDOWN>, + <0xf3 KEY_SEARCH>, + <0xb4 KEY_VOLUMEDOWN>, + <0xa4 KEY_SETUP>, + <0xbe KEY_SEARCH>; + }; + + ir_key3 { + rockchip,usercode = <0x1dcc>; + rockchip,key_table = + <0xee KEY_REPLY>, + <0xf0 KEY_BACK>, + <0xf8 KEY_UP>, + <0xbb KEY_DOWN>, + <0xef KEY_LEFT>, + <0xed KEY_RIGHT>, + <0xfc KEY_HOME>, + <0xf1 KEY_VOLUMEUP>, + <0xfd KEY_VOLUMEDOWN>, + <0xb7 KEY_SEARCH>, + <0xff KEY_POWER>, + <0xf3 KEY_MUTE>, + <0xbf KEY_MENU>, + <0xf9 0x191>, + <0xf5 0x192>, + <0xb3 388>, + <0xbe KEY_1>, + <0xba KEY_2>, + <0xb2 KEY_3>, + <0xbd KEY_4>, + <0xf9 KEY_5>, + <0xb1 KEY_6>, + <0xfc KEY_7>, + <0xf8 KEY_8>, + <0xb0 KEY_9>, + <0xb6 KEY_0>, + <0xb5 KEY_BACKSPACE>; + }; +}; + +&rga2 { + status = "okay"; +}; + +&rga2_mmu { + status = "okay"; +}; + +&rkvdec { + status = "okay"; +}; + +&rkvdec_mmu { + status = "okay"; +}; + +&rkvenc { + status = "okay"; +}; + +&rkvenc_mmu { + status = "okay"; +}; + +&rockchip_suspend { + status = "okay"; + rockchip,sleep-debug-en = <1>; + rockchip,virtual-poweroff = <1>; + rockchip,sleep-mode-config = < + (0 + | RKPM_SLP_ARMPD + ) + >; + rockchip,wakeup-config = < + (0 + | RKPM_CPU0_WKUP_EN + | RKPM_GPIO_WKUP_EN + ) + >; + rockchip,pwm-regulator-config = < + (0 + | RKPM_PWM0_M0_REGULATOR_EN + | RKPM_PWM1_M0_REGULATOR_EN + ) + >; +}; + +&sai0 { + pinctrl-0 = <&i2s0m1_lrck &i2s0m1_sclk &i2s0m1_sdi &i2s0m1_sdo>; + status = "disabled"; +}; + +&sai2 { + status = "okay"; +}; + +&sai3 { + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vdd_1v8_s3>; +}; + +&sdhci { + bus-width = <8>; + supports-emmc; + non-removable; + mmc-hs400-1_8v; + mmc-hs400-enhanced-strobe; + max-frequency = <200000000>; + fixed-emmc-driver-type = <4>; + status = "okay"; +}; + +&sdmmc { + bus-width = <4>; + cap-mmc-highspeed; + cap-sd-highspeed; + disable-wp; + max-frequency = <150000000>; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>; + rockchip,default-sample-phase = <90>; + supports-sd; + sd-uhs-sdr12; + sd-uhs-sdr25; + sd-uhs-sdr50; + sd-uhs-sdr104; + vqmmc-supply = <&vccio_sd>; + vmmc-supply = <&vcc_sd>; + status = "disabled"; +}; + +&sfc { + status = "okay"; +}; + +&spdif_8ch { + status = "okay"; +}; + +&tsadc { + status = "okay"; +}; + +&tve { + status = "okay"; +}; + +&tve_in_vp1 { + status = "okay"; +}; + +&u2phy_host { + phy-supply = <&vcc5v0_host>; + status = "okay"; +}; + +&u2phy_otg { + vbus-supply = <&vcc5v0_otg>; + status = "okay"; +}; + +&usb2phy { + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usbdrd30 { + status = "okay"; +}; + +&usbdrd_dwc3 { + dr_mode = "otg"; + extcon = <&usb2phy>; + status = "okay"; +}; + +&vdpp { + status = "okay"; +}; + +&vdpu { + status = "okay"; +}; + +&vdpu_mmu { + status = "okay"; +}; + +&vop { + status = "okay"; +}; + +&vop_mmu { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts new file mode 100644 index 0000000..28a1711 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528-evb1-ddr4-v10.dtsi" +#include "rk3528-linux.dtsi" diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dts new file mode 100644 index 0000000..ea05dde --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dts @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528-evb1-ddr4-v10.dtsi" +#include "rk3528-android.dtsi" + +/{ + firmware { + android { + compatible = "android,firmware"; + boot_devices = "ffbf0000.mmc"; + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,dtbo"; + }; + fstab { + compatible = "android,fstab"; + vendor { + compatible = "android,vendor"; + dev = "/dev/block/by-name/vendor"; + type = "ext4"; + mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; + fsmgr_flags = "wait,avb"; + }; + }; + }; + }; +}; + +&sdmmc { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi new file mode 100644 index 0000000..822d614 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +/dts-v1/; + +#include "rk3528.dtsi" +#include "rk3528-evb.dtsi" + +/ { + model = "Rockchip RK3528 EVB1 DDR4 V10 Board"; + compatible = "rockchip,rk3528-evb1-ddr4-v10", "rockchip,rk3528"; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_enable_h &clkm1_32k_out>; + reset-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>; + }; + + wireless_bluetooth: wireless-bluetooth { + compatible = "bluetooth-platdata"; + //wifi-bt-power-toggle; + uart_rts_gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; + pinctrl-names = "default", "rts_gpio"; + pinctrl-0 = <&uart2m1_rtsn>; + pinctrl-1 = <&uart2m1_gpios>; + BT,reset_gpio = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>; + BT,wake_gpio = <&gpio1 RK_PB4 GPIO_ACTIVE_HIGH>; + BT,wake_host_irq = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + wireless_wlan: wireless-wlan { + compatible = "wlan-platdata"; + rockchip,grf = <&grf>; + wifi_chip_type = "ap6275s"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_host_wake_irq>; + WIFI,host_wake_irq = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + +}; + +&es7243_sound { + status = "disabled"; +}; + +&gmac1 { + /* Use rgmii-rxid mode to disable rx delay inside Soc */ + phy-mode = "rgmii-rxid"; + clock_in_out = "output"; + + snps,reset-gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>; + snps,reset-active-low; + /* Reset time is 20ms, 100ms for rtl8211f */ + snps,reset-delays-us = <0 20000 100000>; + + tx_delay = <0x30>; + /* rx_delay = <0x3f>; */ + + pinctrl-names = "default"; + pinctrl-0 = <&rgmii_miim + &rgmii_tx_bus2 + &rgmii_rx_bus2 + &rgmii_rgmii_clk + &rgmii_rgmii_bus>; + + phy-handle = <&rgmii_phy>; + status = "okay"; +}; + +&i2c6 { + status = "okay"; +}; + +&mdio1 { + rgmii_phy: phy@1 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0x1>; + }; +}; + +&sai1 { + status = "okay"; +}; + +&sdio0 { + max-frequency = <200000000>; + no-sd; + no-mmc; + supports-sdio; + bus-width = <4>; + disable-wp; + cap-sd-highspeed; + cap-sdio-irq; + keep-power-in-suspend; + non-removable; + mmc-pwrseq = <&sdio_pwrseq>; + pinctrl-names = "default"; + pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>; + sd-uhs-sdr104; + status = "okay"; +}; + +&uart2 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart2m1_xfer &uart2m1_ctsn>; +}; + +&pinctrl { + sdio-pwrseq { + wifi_enable_h: wifi-enable-h { + rockchip,pins = <1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + wifi_32k: wifi-32k { + rockchip,pins = <1 RK_PC3 1 &pcfg_pull_none>; + }; + }; + + wireless-wlan { + wifi_host_wake_irq: wifi-host-wake-irq { + rockchip,pins = <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + + wireless-bluetooth { + uart2m1_gpios: uart2m1-gpios { + rockchip,pins = <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dts new file mode 100644 index 0000000..d94fbf1 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dts @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528-evb2-ddr3-v10.dtsi" +#include "rk3528-android.dtsi" + +/{ + firmware { + android { + compatible = "android,firmware"; + boot_devices = "ffbf0000.mmc"; + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,dtbo"; + }; + fstab { + compatible = "android,fstab"; + vendor { + compatible = "android,vendor"; + dev = "/dev/block/by-name/vendor"; + type = "ext4"; + mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; + fsmgr_flags = "wait,avb"; + }; + }; + }; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi new file mode 100644 index 0000000..2cd94a6 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +/dts-v1/; + +#include "rk3528.dtsi" +#include "rk3528-evb.dtsi" + +/ { + model = "Rockchip RK3528 EVB2 DDR3 V10 Board"; + compatible = "rockchip,rk3528-evb2-ddr3-v10", "rockchip,rk3528"; + + pcie20_usb30_avdd0v9: pcie20-usb30-avdd0v9 { + compatible = "regulator-fixed"; + regulator-name = "pcie20_usb30-avdd0v9"; + regulator-boot-on; + regulator-always-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vdd_0v9_s3>; + }; + + pcie20_usb30_avdd1v8: pcie20-usb30-avdd1v8 { + compatible = "regulator-fixed"; + regulator-name = "pcie20_usb30_avdd1v8"; + regulator-boot-on; + regulator-always-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vdd_1v8_s3>; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_enable_h &clkm1_32k_out>; + reset-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>; + }; + + vcc3v3_pcie20: vcc3v3-pcie20 { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_pcie20"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + enable-active-high; + gpio = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>; + startup-delay-us = <5000>; + vin-supply = <&dc_12v>; + }; + + wireless_bluetooth: wireless-bluetooth { + compatible = "bluetooth-platdata"; + //wifi-bt-power-toggle; + uart_rts_gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; + pinctrl-names = "default", "rts_gpio"; + pinctrl-0 = <&uart2m1_rtsn>; + pinctrl-1 = <&uart2m1_gpios>; + BT,reset_gpio = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>; + BT,wake_gpio = <&gpio1 RK_PB4 GPIO_ACTIVE_HIGH>; + BT,wake_host_irq = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + wireless_wlan: wireless-wlan { + compatible = "wlan-platdata"; + rockchip,grf = <&grf>; + wifi_chip_type = "ap6275s"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_host_wake_irq>; + WIFI,host_wake_irq = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; +}; + +&pcie2x1 { + reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_pcie20>; + status = "okay"; +}; + +&sdio0 { + max-frequency = <200000000>; + no-sd; + no-mmc; + supports-sdio; + bus-width = <4>; + disable-wp; + cap-sd-highspeed; + cap-sdio-irq; + keep-power-in-suspend; + non-removable; + mmc-pwrseq = <&sdio_pwrseq>; + pinctrl-names = "default"; + pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>; + sd-uhs-sdr104; + status = "okay"; +}; + +&uart2 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart2m1_xfer &uart2m1_ctsn>; +}; + +&usbdrd_dwc3 { + phys = <&u2phy_otg>; + phy-names = "usb2-phy"; + maximum-speed = "high-speed"; + snps,dis_u2_susphy_quirk; + snps,usb2-lpm-disable; +}; + +&pinctrl { + sdio-pwrseq { + wifi_enable_h: wifi-enable-h { + rockchip,pins = <1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + wifi_32k: wifi-32k { + rockchip,pins = <1 RK_PC3 1 &pcfg_pull_none>; + }; + }; + + wireless-wlan { + wifi_host_wake_irq: wifi-host-wake-irq { + rockchip,pins = <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + + wireless-bluetooth { + uart2m1_gpios: uart2m1-gpios { + rockchip,pins = <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dts new file mode 100644 index 0000000..8bfbdb5 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dts @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528-evb3-lp4x-v10.dtsi" +#include "rk3528-android.dtsi" + +/{ + firmware { + android { + compatible = "android,firmware"; + boot_devices = "ffbf0000.mmc"; + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,dtbo"; + }; + fstab { + compatible = "android,fstab"; + vendor { + compatible = "android,vendor"; + dev = "/dev/block/by-name/vendor"; + type = "ext4"; + mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; + fsmgr_flags = "wait,avb"; + }; + }; + }; + }; +}; + +&pdm { + status = "okay"; + pinctrl-0 = <&pdm_clk1 + &pdm_sdi0 + &pdm_sdi2>; +}; + +&pdmics { + status = "okay"; +}; + +&pdm_mic_array { + status = "okay"; +}; + +&sdmmc { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi new file mode 100644 index 0000000..a427da4 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +/dts-v1/; + +#include "rk3528.dtsi" +#include "rk3528-evb.dtsi" + +/ { + model = "Rockchip RK3528 EVB3 LP4X V10 Board"; + compatible = "rockchip,rk3528-evb3-lp4x-v10", "rockchip,rk3528"; + + vcc5v0_sys_s0: vcc5v0-sys-s0 { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_sys_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc_1v8_s0: vcc-1v8-s0 { + compatible = "regulator-fixed"; + regulator-name = "vcc_1v8_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc5v0_sys_s0>; + }; + + vcc_3v3_s0: vcc-3v3-s0 { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc5v0_sys_s0>; + }; + + vdd_0v9_s0: vdd-0v9-s0 { + compatible = "regulator-fixed"; + regulator-name = "vdd_0v9_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vcc5v0_sys_s0>; + }; + + wireless_bluetooth: wireless-bluetooth { + compatible = "bluetooth-platdata"; + uart_rts_gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>; + pinctrl-names = "default", "rts_gpio"; + pinctrl-0 = <&uart2m0_rtsn>; + pinctrl-1 = <&uart2m0_gpios>; + BT,reset_gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>; + BT,wake_gpio = <&gpio3 RK_PB4 GPIO_ACTIVE_HIGH>; + BT,wake_host_irq = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + wireless_wlan: wireless-wlan { + compatible = "wlan-platdata"; + rockchip,grf = <&grf>; + wifi_chip_type = "ap6275p"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_enable &wifi_host_wake_irq &clkm0_32k_out>; + WIFI,reset_gpio = <&gpio3 RK_PB2 GPIO_ACTIVE_HIGH>; + WIFI,host_wake_irq = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; +}; + +&pcie2x1 { + reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_perst>; + rockchip,skip-scan-in-resume; + status = "okay"; +}; + +&sai0 { + pinctrl-0 = <&i2s0m0_lrck &i2s0m0_sclk &i2s0m0_sdi &i2s0m0_sdo>; + status = "disabled"; +}; + +&uart2 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart2m0_xfer &uart2m0_ctsn>; +}; + +&usbdrd_dwc3 { + phys = <&u2phy_otg>; + phy-names = "usb2-phy"; + maximum-speed = "high-speed"; + snps,dis_u2_susphy_quirk; + snps,usb2-lpm-disable; +}; + +&pinctrl { + wireless-wlan { + wifi_perst: wifi-perst { + rockchip,pins = <3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>; + }; + + wifi_enable: wifi-enable { + rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_output_high>; + }; + + wifi_host_wake_irq: wifi-host-wake-irq { + rockchip,pins = <3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + + wireless-bluetooth { + uart2m0_gpios: uart2m0-gpios { + rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&acodec { + pa-ctl-gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>; + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb4-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb4-ddr4-v10.dts new file mode 100644 index 0000000..ea05dde --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb4-ddr4-v10.dts @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +#include "rk3528-evb1-ddr4-v10.dtsi" +#include "rk3528-android.dtsi" + +/{ + firmware { + android { + compatible = "android,firmware"; + boot_devices = "ffbf0000.mmc"; + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,dtbo"; + }; + fstab { + compatible = "android,fstab"; + vendor { + compatible = "android,vendor"; + dev = "/dev/block/by-name/vendor"; + type = "ext4"; + mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; + fsmgr_flags = "wait,avb"; + }; + }; + }; + }; +}; + +&sdmmc { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-iotest-lp3-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-iotest-lp3-v10.dts new file mode 100644 index 0000000..2483985 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-iotest-lp3-v10.dts @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +/dts-v1/; + +#include <dt-bindings/gpio/gpio.h> + +#include "rk3528.dtsi" +#include "rk3528-android.dtsi" + +/ { + model = "Rockchip RK3528 IOTEST LP3 V10 Board"; + compatible = "rockchip,rk3528-iotest-lp3-v10", "rockchip,rk3528"; + + firmware { + android { + compatible = "android,firmware"; + boot_devices = "ffbf0000.mmc"; + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,dtbo"; + }; + fstab { + compatible = "android,fstab"; + vendor { + compatible = "android,vendor"; + dev = "/dev/block/by-name/vendor"; + type = "ext4"; + mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; + fsmgr_flags = "wait,avb"; + }; + }; + }; + }; + + dc_12v: dc-12v { + compatible = "regulator-fixed"; + regulator-name = "dc_12v"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <12000000>; + regulator-max-microvolt = <12000000>; + }; + + vcc5v0_sys: vcc5v0-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_sys"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&dc_12v>; + }; + + vdd_logic: vdd-logic { + compatible = "pwm-regulator"; + pwms = <&pwm2 0 5000 1>; + regulator-name = "vdd_logic"; + regulator-min-microvolt = <705000>; + regulator-max-microvolt = <1006000>; + regulator-init-microvolt = <900000>; + regulator-always-on; + regulator-boot-on; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc5v0_sys>; + status = "okay"; + }; + + vdd_cpu: vdd-cpu { + compatible = "pwm-regulator"; + pwms = <&pwm1 0 5000 1>; + regulator-name = "vdd_cpu"; + regulator-min-microvolt = <746000>; + regulator-max-microvolt = <1201000>; + regulator-init-microvolt = <953000>; + regulator-always-on; + regulator-boot-on; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc5v0_sys>; + status = "okay"; + }; + + vdd_gpu: vdd-gpu { + compatible = "pwm-regulator"; + pwms = <&pwm0 0 5000 1>; + regulator-name = "vdd_gpu"; + regulator-min-microvolt = <705000>; + regulator-max-microvolt = <1148000>; + regulator-init-microvolt = <900000>; + regulator-always-on; + regulator-boot-on; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc5v0_sys>; + status = "okay"; + }; + + vdd_0v9_s3: vdd-0v9-s3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_0v9_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vcc5v0_sys>; + }; + + vdd_1v8_s3: vdd-1v8-s3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_1v8_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc_3v3_s3: vcc-3v3-s3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc_ddr_s3: vcc-ddr-s3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_ddr_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + vin-supply = <&vcc5v0_sys>; + }; +}; + +&cpu0 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu0_opp_table { + /delete-node/ opp-1416000000; + /delete-node/ opp-1608000000; +}; + +&pwm0 { + status = "okay"; +}; + +&pwm1 { + status = "okay"; +}; + +&pwm2 { + status = "okay"; +}; + +&sdhci { + bus-width = <8>; + supports-emmc; + non-removable; + max-frequency = <200000000>; + status = "okay"; +}; + +&u2phy_host { + status = "okay"; +}; + +&u2phy_otg { + status = "okay"; +}; + +&usb2phy { + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usbdrd30 { + status = "okay"; +}; + +&usbdrd_dwc3 { + dr_mode = "peripheral"; + maximum-speed = "high-speed"; + extcon = <&usb2phy>; + phys = <&u2phy_otg>; + phy-names = "usb2-phy"; + snps,dis_u2_susphy_quirk; + snps,usb2-lpm-disable; + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi new file mode 100644 index 0000000..dd31a07 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * + */ + +/ { + chosen: chosen { + bootargs = "earlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait"; + }; + + fiq-debugger { + compatible = "rockchip,fiq-debugger"; + rockchip,serial-id = <0>; + rockchip,wake-irq = <0>; + /* If enable uart uses irq instead of fiq */ + rockchip,irq-mode-enable = <1>; + rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */ + interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&uart0m0_xfer>; + status = "okay"; + }; + + firmware { + optee { + compatible = "linaro,optee-tz"; + method = "smc"; + }; + }; + + reserved_memory: reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + drm_logo: drm-logo@00000000 { + compatible = "rockchip,drm-logo"; + reg = <0x0 0x0 0x0 0x0>; + }; + + drm_cubic_lut: drm-cubic-lut@00000000 { + compatible = "rockchip,drm-cubic-lut"; + reg = <0x0 0x0 0x0 0x0>; + }; + + ramoops: ramoops@110000 { + compatible = "ramoops"; + /* 0x110000 to 0x1f0000 is for ramoops */ + reg = <0x0 0x110000 0x0 0xe0000>; + boot-log-size = <0x8000>; /* do not change */ + boot-log-count = <0x1>; /* do not change */ + console-size = <0x80000>; + pmsg-size = <0x30000>; + ftrace-size = <0x00000>; + record-size = <0x14000>; + }; + }; +}; + +&display_subsystem { + memory-region = <&drm_logo>, <&drm_cubic_lut>; + memory-region-names = "drm-logo", "drm-cubic-lut"; + /* devfreq = <&dmc>; */ + + route { + route_hdmi: route-hdmi { + status = "disabled"; + logo,uboot = "logo.bmp"; + logo,kernel = "logo_kernel.bmp"; + logo,mode = "center"; + charge_logo,mode = "center"; + connect = <&vp0_out_hdmi>; + }; + route_tve: route-tve { + status = "disabled"; + logo,uboot = "logo.bmp"; + logo,kernel = "logo_kernel.bmp"; + logo,mode = "center"; + charge_logo,mode = "center"; + connect = <&vp1_out_tve>; + }; + }; +}; + +&rng { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi new file mode 100644 index 0000000..7035a4e --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi @@ -0,0 +1,1406 @@ +// 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 { + /omit-if-no-ref/ + arm_pins: arm-pins { + rockchip,pins = + /* arm_avs */ + <4 RK_PC4 3 &pcfg_pull_none>; + }; + }; + + clk { + /omit-if-no-ref/ + clkm0_32k_out: clkm0-32k-out { + rockchip,pins = + /* clkm0_32k_out */ + <3 RK_PC3 3 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + clkm1_32k_out: clkm1-32k-out { + rockchip,pins = + /* clkm1_32k_out */ + <1 RK_PC3 1 &pcfg_pull_none>; + }; + }; + + emmc { + /omit-if-no-ref/ + emmc_rstnout: emmc-rstnout { + rockchip,pins = + /* emmc_rstn */ + <1 RK_PD6 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + emmc_clk: emmc-clk { + rockchip,pins = + /* emmc_clk */ + <1 RK_PD5 1 &pcfg_pull_up_drv_level_2>; + }; + + /omit-if-no-ref/ + emmc_cmd: emmc-cmd { + rockchip,pins = + /* emmc_cmd */ + <1 RK_PD4 1 &pcfg_pull_up_drv_level_2>; + }; + + /omit-if-no-ref/ + emmc_strb: emmc-strb { + rockchip,pins = + /* emmc_strb */ + <1 RK_PD7 1 &pcfg_pull_none>; + }; + }; + + eth { + /omit-if-no-ref/ + eth_pins: eth-pins { + rockchip,pins = + /* eth_clk_25m_out */ + <3 RK_PB5 2 &pcfg_pull_none_drv_level_2>; + }; + }; + + fephy { + /omit-if-no-ref/ + fephym0_led_dpx: fephym0-led_dpx { + rockchip,pins = + /* fephy_led_dpx_m0 */ + <4 RK_PB5 2 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + fephym0_led_link: fephym0-led_link { + rockchip,pins = + /* fephy_led_link_m0 */ + <4 RK_PC0 2 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + fephym0_led_spd: fephym0-led_spd { + rockchip,pins = + /* fephy_led_spd_m0 */ + <4 RK_PB7 2 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + fephym1_led_dpx: fephym1-led_dpx { + rockchip,pins = + /* fephy_led_dpx_m1 */ + <2 RK_PA4 5 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + fephym1_led_link: fephym1-led_link { + rockchip,pins = + /* fephy_led_link_m1 */ + <2 RK_PA6 5 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + fephym1_led_spd: fephym1-led_spd { + rockchip,pins = + /* fephy_led_spd_m1 */ + <2 RK_PA5 5 &pcfg_pull_none>; + }; + }; + + fspi { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + fspi_csn0: fspi-csn0 { + rockchip,pins = + /* fspi_csn0 */ + <1 RK_PD0 2 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + fspi_csn1: fspi-csn1 { + rockchip,pins = + /* fspi_csn1 */ + <1 RK_PD1 2 &pcfg_pull_none>; + }; + }; + + gpu { + /omit-if-no-ref/ + gpu_pins: gpu-pins { + rockchip,pins = + /* gpu_avs */ + <4 RK_PC3 3 &pcfg_pull_none>; + }; + }; + + hdmi { + /omit-if-no-ref/ + hdmi_pins: hdmi-pins { + rockchip,pins = + /* hdmi_tx_cec */ + <0 RK_PA3 1 &pcfg_pull_none>, + /* hdmi_tx_scl */ + <0 RK_PA4 1 &pcfg_pull_none_smt>, + /* hdmi_tx_sda */ + <0 RK_PA5 1 &pcfg_pull_none_smt>; + }; + + /omit-if-no-ref/ + hdmi_pins_idle: hdmi-pins-idle { + rockchip,pins = + /* hdmi_tx_cec */ + <0 RK_PA3 1 &pcfg_pull_none>, + /* hdmi_tx_scl */ + <0 RK_PA4 0 &pcfg_output_low_pull_down>, + /* hdmi_tx_sda */ + <0 RK_PA5 0 &pcfg_output_low_pull_down>; + }; + }; + + hsm { + /omit-if-no-ref/ + hsmm0_pins: hsmm0-pins { + rockchip,pins = + /* hsm_clk_out_m0 */ + <2 RK_PA2 4 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + hsmm1_pins: hsmm1-pins { + rockchip,pins = + /* hsm_clk_out_m1 */ + <1 RK_PA4 3 &pcfg_pull_none>; + }; + }; + + i2c0 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + i2s0m0_lrck: i2s0m0-lrck { + rockchip,pins = + /* i2s0_lrck_m0 */ + <3 RK_PB6 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s0m0_mclk: i2s0m0-mclk { + rockchip,pins = + /* i2s0_mclk_m0 */ + <3 RK_PB4 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s0m0_sclk: i2s0m0-sclk { + rockchip,pins = + /* i2s0_sclk_m0 */ + <3 RK_PB5 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s0m0_sdi: i2s0m0-sdi { + rockchip,pins = + /* i2s0m0_sdi */ + <3 RK_PB7 1 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + i2s0m0_sdo: i2s0m0-sdo { + rockchip,pins = + /* i2s0m0_sdo */ + <3 RK_PC0 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s0m1_lrck: i2s0m1-lrck { + rockchip,pins = + /* i2s0_lrck_m1 */ + <1 RK_PB6 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s0m1_mclk: i2s0m1-mclk { + rockchip,pins = + /* i2s0_mclk_m1 */ + <1 RK_PB4 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s0m1_sclk: i2s0m1-sclk { + rockchip,pins = + /* i2s0_sclk_m1 */ + <1 RK_PB5 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s0m1_sdi: i2s0m1-sdi { + rockchip,pins = + /* i2s0m1_sdi */ + <1 RK_PB7 1 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + i2s0m1_sdo: i2s0m1-sdo { + rockchip,pins = + /* i2s0m1_sdo */ + <1 RK_PC0 1 &pcfg_pull_none>; + }; + }; + + i2s1 { + /omit-if-no-ref/ + i2s1_lrck: i2s1-lrck { + rockchip,pins = + /* i2s1_lrck */ + <4 RK_PA6 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_mclk: i2s1-mclk { + rockchip,pins = + /* i2s1_mclk */ + <4 RK_PA4 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sclk: i2s1-sclk { + rockchip,pins = + /* i2s1_sclk */ + <4 RK_PA5 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sdi0: i2s1-sdi0 { + rockchip,pins = + /* i2s1_sdi0 */ + <4 RK_PB4 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sdi1: i2s1-sdi1 { + rockchip,pins = + /* i2s1_sdi1 */ + <4 RK_PB3 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sdi2: i2s1-sdi2 { + rockchip,pins = + /* i2s1_sdi2 */ + <4 RK_PA3 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sdi3: i2s1-sdi3 { + rockchip,pins = + /* i2s1_sdi3 */ + <4 RK_PA2 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sdo0: i2s1-sdo0 { + rockchip,pins = + /* i2s1_sdo0 */ + <4 RK_PA7 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sdo1: i2s1-sdo1 { + rockchip,pins = + /* i2s1_sdo1 */ + <4 RK_PB0 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sdo2: i2s1-sdo2 { + rockchip,pins = + /* i2s1_sdo2 */ + <4 RK_PB1 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + i2s1_sdo3: i2s1-sdo3 { + rockchip,pins = + /* i2s1_sdo3 */ + <4 RK_PB2 1 &pcfg_pull_none>; + }; + }; + + jtag { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + pdm_clk0: pdm-clk0 { + rockchip,pins = + /* pdm_clk0 */ + <4 RK_PB5 3 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + pdm_clk1: pdm-clk1 { + rockchip,pins = + /* pdm_clk1 */ + <4 RK_PA4 3 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + pdm_sdi0: pdm-sdi0 { + rockchip,pins = + /* pdm_sdi0 */ + <4 RK_PB2 3 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + pdm_sdi1: pdm-sdi1 { + rockchip,pins = + /* pdm_sdi1 */ + <4 RK_PB1 3 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + pdm_sdi2: pdm-sdi2 { + rockchip,pins = + /* pdm_sdi2 */ + <4 RK_PB3 3 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + pdm_sdi3: pdm-sdi3 { + rockchip,pins = + /* pdm_sdi3 */ + <4 RK_PC1 3 &pcfg_pull_none>; + }; + }; + + pmu { + /omit-if-no-ref/ + pmu_pins: pmu-pins { + rockchip,pins = + /* pmu_debug */ + <4 RK_PA0 4 &pcfg_pull_none>; + }; + }; + + pwm0 { + /omit-if-no-ref/ + pwm0m0_pins: pwm0m0-pins { + rockchip,pins = + /* pwm0_m0 */ + <4 RK_PC3 1 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm0m1_pins: pwm0m1-pins { + rockchip,pins = + /* pwm0_m1 */ + <1 RK_PA2 5 &pcfg_pull_none_drv_level_0>; + }; + }; + + pwm1 { + /omit-if-no-ref/ + pwm1m0_pins: pwm1m0-pins { + rockchip,pins = + /* pwm1_m0 */ + <4 RK_PC4 1 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm1m1_pins: pwm1m1-pins { + rockchip,pins = + /* pwm1_m1 */ + <1 RK_PA3 4 &pcfg_pull_none_drv_level_0>; + }; + }; + + pwm2 { + /omit-if-no-ref/ + pwm2m0_pins: pwm2m0-pins { + rockchip,pins = + /* pwm2_m0 */ + <4 RK_PC5 1 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm2m1_pins: pwm2m1-pins { + rockchip,pins = + /* pwm2_m1 */ + <1 RK_PA7 2 &pcfg_pull_none_drv_level_0>; + }; + }; + + pwm3 { + /omit-if-no-ref/ + pwm3m0_pins: pwm3m0-pins { + rockchip,pins = + /* pwm3_m0 */ + <4 RK_PC6 1 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm3m1_pins: pwm3m1-pins { + rockchip,pins = + /* pwm3_m1 */ + <2 RK_PA4 3 &pcfg_pull_none_drv_level_0>; + }; + }; + + pwm4 { + /omit-if-no-ref/ + pwm4m0_pins: pwm4m0-pins { + rockchip,pins = + /* pwm4_m0 */ + <4 RK_PB7 1 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm4m1_pins: pwm4m1-pins { + rockchip,pins = + /* pwm4_m1 */ + <1 RK_PA4 2 &pcfg_pull_none_drv_level_0>; + }; + }; + + pwm5 { + /omit-if-no-ref/ + pwm5m0_pins: pwm5m0-pins { + rockchip,pins = + /* pwm5_m0 */ + <4 RK_PC0 1 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm5m1_pins: pwm5m1-pins { + rockchip,pins = + /* pwm5_m1 */ + <3 RK_PC3 1 &pcfg_pull_none_drv_level_0>; + }; + }; + + pwm6 { + /omit-if-no-ref/ + pwm6m0_pins: pwm6m0-pins { + rockchip,pins = + /* pwm6_m0 */ + <4 RK_PC1 1 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm6m1_pins: pwm6m1-pins { + rockchip,pins = + /* pwm6_m1 */ + <1 RK_PC3 3 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm6m2_pins: pwm6m2-pins { + rockchip,pins = + /* pwm6_m2 */ + <3 RK_PC1 1 &pcfg_pull_none_drv_level_0>; + }; + }; + + pwm7 { + /omit-if-no-ref/ + pwm7m0_pins: pwm7m0-pins { + rockchip,pins = + /* pwm7_m0 */ + <4 RK_PC2 1 &pcfg_pull_none_drv_level_0>; + }; + + /omit-if-no-ref/ + pwm7m1_pins: pwm7m1-pins { + rockchip,pins = + /* pwm7_m1 */ + <1 RK_PC2 2 &pcfg_pull_none_drv_level_0>; + }; + }; + + pwr { + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + refm0_pins: refm0-pins { + rockchip,pins = + /* ref_clk_out_m0 */ + <0 RK_PA1 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + refm1_pins: refm1-pins { + rockchip,pins = + /* ref_clk_out_m1 */ + <3 RK_PC3 6 &pcfg_pull_none>; + }; + }; + + rgmii { + /omit-if-no-ref/ + rgmii_miim: rgmii-miim { + rockchip,pins = + /* rgmii_mdc */ + <3 RK_PB6 2 &pcfg_pull_none_drv_level_2>, + /* rgmii_mdio */ + <3 RK_PB7 2 &pcfg_pull_none_drv_level_2>; + }; + + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + rgmii_tx_bus2: rgmii-tx_bus2 { + rockchip,pins = + /* rgmii_txd0 */ + <3 RK_PA1 2 &pcfg_pull_none_drv_level_2>, + /* rgmii_txd1 */ + <3 RK_PA0 2 &pcfg_pull_none_drv_level_2>, + /* rgmii_txen */ + <3 RK_PC0 2 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + 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_drv_level_2>; + }; + + /omit-if-no-ref/ + 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_drv_level_2>, + /* rgmii_txd3 */ + <3 RK_PB0 2 &pcfg_pull_none_drv_level_2>; + }; + + /omit-if-no-ref/ + rgmii_clk: rgmii-clk { + rockchip,pins = + /* rgmii_clk */ + <3 RK_PB4 2 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + rgmii_txer: rgmii-txer { + rockchip,pins = + /* rgmii_txer */ + <3 RK_PC1 2 &pcfg_pull_none>; + }; + }; + + scr { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + sdio0_clk: sdio0-clk { + rockchip,pins = + /* sdio0_clk */ + <1 RK_PA5 1 &pcfg_pull_up_drv_level_2>; + }; + + /omit-if-no-ref/ + sdio0_cmd: sdio0-cmd { + rockchip,pins = + /* sdio0_cmd */ + <1 RK_PA4 1 &pcfg_pull_up_drv_level_2>; + }; + + /omit-if-no-ref/ + sdio0_det: sdio0-det { + rockchip,pins = + /* sdio0_det */ + <1 RK_PA6 1 &pcfg_pull_up>; + }; + + /omit-if-no-ref/ + sdio0_pwren: sdio0-pwren { + rockchip,pins = + /* sdio0_pwren */ + <1 RK_PA7 1 &pcfg_pull_none>; + }; + }; + + sdio1 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + sdio1_clk: sdio1-clk { + rockchip,pins = + /* sdio1_clk */ + <3 RK_PA4 1 &pcfg_pull_up_drv_level_2>; + }; + + /omit-if-no-ref/ + sdio1_cmd: sdio1-cmd { + rockchip,pins = + /* sdio1_cmd */ + <3 RK_PA5 1 &pcfg_pull_up_drv_level_2>; + }; + + /omit-if-no-ref/ + sdio1_det: sdio1-det { + rockchip,pins = + /* sdio1_det */ + <3 RK_PB3 1 &pcfg_pull_up>; + }; + + /omit-if-no-ref/ + sdio1_pwren: sdio1-pwren { + rockchip,pins = + /* sdio1_pwren */ + <3 RK_PB2 1 &pcfg_pull_none>; + }; + }; + + sdmmc { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + sdmmc_clk: sdmmc-clk { + rockchip,pins = + /* sdmmc_clk */ + <2 RK_PA5 1 &pcfg_pull_up_drv_level_2>; + }; + + /omit-if-no-ref/ + sdmmc_cmd: sdmmc-cmd { + rockchip,pins = + /* sdmmc_cmd */ + <2 RK_PA4 1 &pcfg_pull_up_drv_level_2>; + }; + + /omit-if-no-ref/ + sdmmc_det: sdmmc-det { + rockchip,pins = + /* sdmmc_detn */ + <2 RK_PA6 1 &pcfg_pull_up>; + }; + + /omit-if-no-ref/ + sdmmc_pwren: sdmmc-pwren { + rockchip,pins = + /* sdmmc_pwren */ + <4 RK_PA1 1 &pcfg_pull_none>; + }; + }; + + spdif { + /omit-if-no-ref/ + spdifm0_pins: spdifm0-pins { + rockchip,pins = + /* spdif_tx_m0 */ + <4 RK_PA0 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + spdifm1_pins: spdifm1-pins { + rockchip,pins = + /* spdif_tx_m1 */ + <1 RK_PC3 2 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + spdifm2_pins: spdifm2-pins { + rockchip,pins = + /* spdif_tx_m2 */ + <3 RK_PC3 2 &pcfg_pull_none>; + }; + }; + + spi0 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + spi0_csn0: spi0-csn0 { + rockchip,pins = + /* spi0_csn0 */ + <4 RK_PB6 2 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + spi0_csn1: spi0-csn1 { + rockchip,pins = + /* spi0_csn1 */ + <4 RK_PC1 2 &pcfg_pull_none>; + }; + }; + + spi1 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + spi1_csn0: spi1-csn0 { + rockchip,pins = + /* spi1_csn0 */ + <1 RK_PC1 1 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + spi1_csn1: spi1-csn1 { + rockchip,pins = + /* spi1_csn1 */ + <1 RK_PC2 1 &pcfg_pull_none>; + }; + }; + + tsi0 { + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart1_ctsn: uart1-ctsn { + rockchip,pins = + /* uart1_ctsn */ + <4 RK_PA4 2 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart1_rtsn: uart1-rtsn { + rockchip,pins = + /* uart1_rtsn */ + <4 RK_PA5 2 &pcfg_pull_none>; + }; + }; + + uart2 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart2m0_ctsn: uart2m0-ctsn { + rockchip,pins = + /* uart2m0_ctsn */ + <3 RK_PA3 1 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart2m0_rtsn: uart2m0-rtsn { + rockchip,pins = + /* uart2m0_rtsn */ + <3 RK_PA2 1 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart2m1_ctsn: uart2m1-ctsn { + rockchip,pins = + /* uart2m1_ctsn */ + <1 RK_PB3 1 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart2m1_rtsn: uart2m1-rtsn { + rockchip,pins = + /* uart2m1_rtsn */ + <1 RK_PB2 1 &pcfg_pull_none>; + }; + }; + + uart3 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart3_ctsn: uart3-ctsn { + rockchip,pins = + /* uart3_ctsn */ + <4 RK_PA3 3 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart3_rtsn: uart3-rtsn { + rockchip,pins = + /* uart3_rtsn */ + <4 RK_PA2 3 &pcfg_pull_none>; + }; + }; + + uart4 { + /omit-if-no-ref/ + uart4_xfer: uart4-xfer { + rockchip,pins = + /* uart4_rx */ + <2 RK_PA2 3 &pcfg_pull_up>, + /* uart4_tx */ + <2 RK_PA3 3 &pcfg_pull_up>; + }; + + /omit-if-no-ref/ + uart4_ctsn: uart4-ctsn { + rockchip,pins = + /* uart4_ctsn */ + <2 RK_PA1 3 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart4_rtsn: uart4-rtsn { + rockchip,pins = + /* uart4_rtsn */ + <2 RK_PA0 3 &pcfg_pull_none>; + }; + }; + + uart5 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart5m0_ctsn: uart5m0-ctsn { + rockchip,pins = + /* uart5m0_ctsn */ + <1 RK_PA6 2 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart5m0_rtsn: uart5m0-rtsn { + rockchip,pins = + /* uart5m0_rtsn */ + <1 RK_PA5 2 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart5m1_ctsn: uart5m1-ctsn { + rockchip,pins = + /* uart5m1_ctsn */ + <1 RK_PD3 2 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart5m1_rtsn: uart5m1-rtsn { + rockchip,pins = + /* uart5m1_rtsn */ + <1 RK_PD2 2 &pcfg_pull_none>; + }; + }; + + uart6 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart6_ctsn: uart6-ctsn { + rockchip,pins = + /* uart6_ctsn */ + <3 RK_PA4 4 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart6_rtsn: uart6-rtsn { + rockchip,pins = + /* uart6_rtsn */ + <3 RK_PA5 4 &pcfg_pull_none>; + }; + }; + + uart7 { + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart7m0_ctsn: uart7m0-ctsn { + rockchip,pins = + /* uart7m0_ctsn */ + <3 RK_PB0 4 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart7m0_rtsn: uart7m0-rtsn { + rockchip,pins = + /* uart7m0_rtsn */ + <3 RK_PB1 4 &pcfg_pull_none>; + }; + + /omit-if-no-ref/ + 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>; + }; + + /omit-if-no-ref/ + uart7m1_ctsn: uart7m1-ctsn { + rockchip,pins = + /* uart7m1_ctsn */ + <1 RK_PB0 4 &pcfg_pull_none>; + }; + /omit-if-no-ref/ + uart7m1_rtsn: uart7m1-rtsn { + rockchip,pins = + /* uart7m1_rtsn */ + <1 RK_PB1 4 &pcfg_pull_none>; + }; + }; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528.dtsi new file mode 100644 index 0000000..adf9222 --- /dev/null +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528.dtsi @@ -0,0 +1,2489 @@ +// 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; + }; + + clocks { + compatible = "simple-bus"; + #address-cells = <2>; + #size-cells = <2>; + ranges; + + xin24m: xin24m { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <24000000>; + clock-output-names = "xin24m"; + }; + + mclkin_sai0: mclkin-sai0 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <0>; + clock-output-names = "i2s0_mclkin"; + }; + + mclkin_sai1: mclkin-sai1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <0>; + clock-output-names = "i2s1_mclkin"; + }; + + mclkout_sai0: mclkout-sai0@ff340014 { + compatible = "rockchip,clk-out"; + reg = <0 0xff340014 0 0x4>; + clocks = <&cru MCLK_SAI_I2S0>; + #clock-cells = <0>; + clock-output-names = "mclk_sai0_to_io"; + rockchip,bit-shift = <1>; + rockchip,bit-set-to-disable; + }; + + mclkout_sai1: mclkout-sai1@ff320004 { + compatible = "rockchip,clk-out"; + reg = <0 0xff320004 0 0x4>; + clocks = <&cru MCLK_SAI_I2S1>; + #clock-cells = <0>; + clock-output-names = "mclk_sai1_to_io"; + rockchip,bit-shift = <14>; + rockchip,bit-set-to-disable; + }; + }; + + 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>; + #cooling-cells = <2>; /* min followed by max */ + dynamic-power-coefficient = <147>; + 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; + + mbist-vmin = <825000 925000 975000>; + nvmem-cells = <&cpu_leakage>, <&cpu_opp_info>, <&cpu_mbist_vmin>; + nvmem-cell-names = "leakage", "opp-info", "mbist-vmin"; + + rockchip,video-4k-freq = <1200000>; + rockchip,pvtm-voltage-sel = < + 0 1320 0 + 1321 1350 1 + 1351 1375 2 + 1376 1405 3 + 1406 1435 4 + 1436 1470 5 + 1471 1505 6 + 1506 1540 7 + 1541 1575 8 + 1576 1610 9 + 1611 1640 10 + 1641 9999 11 + >; + rockchip,pvtm-pvtpll; + rockchip,pvtm-offset = <0x18>; + rockchip,pvtm-sample-time = <1100>; + rockchip,pvtm-freq = <1608000>; + rockchip,pvtm-volt = <900000>; + rockchip,pvtm-ref-temp = <40>; + rockchip,pvtm-temp-prop = <0 0>; + rockchip,pvtm-thermal-zone = "soc-thermal"; + rockchip,grf = <&grf>; + rockchip,temp-hysteresis = <5000>; + rockchip,low-temp = <10000>; + rockchip,low-temp-min-volt = <900000>; + + opp-408000000 { + opp-hz = /bits/ 64 <408000000>; + opp-microvolt = <825000 825000 1100000>; + opp-microvolt-L0 = <875000 875000 1100000>; + opp-microvolt-L1 = <875000 875000 1100000>; + opp-microvolt-L2 = <875000 875000 1100000>; + opp-microvolt-L3 = <875000 875000 1100000>; + opp-microvolt-L4 = <875000 875000 1100000>; + opp-microvolt-L5 = <850000 850000 1100000>; + clock-latency-ns = <40000>; + opp-suspend; + }; + opp-600000000 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <825000 825000 1100000>; + opp-microvolt-L0 = <875000 875000 1100000>; + opp-microvolt-L1 = <875000 875000 1100000>; + opp-microvolt-L2 = <875000 875000 1100000>; + opp-microvolt-L3 = <875000 875000 1100000>; + opp-microvolt-L4 = <875000 875000 1100000>; + opp-microvolt-L5 = <850000 850000 1100000>; + clock-latency-ns = <40000>; + }; + opp-816000000 { + opp-hz = /bits/ 64 <816000000>; + opp-microvolt = <825000 825000 1100000>; + opp-microvolt-L0 = <875000 875000 1100000>; + opp-microvolt-L1 = <875000 875000 1100000>; + opp-microvolt-L2 = <875000 875000 1100000>; + opp-microvolt-L3 = <875000 875000 1100000>; + opp-microvolt-L4 = <875000 875000 1100000>; + opp-microvolt-L5 = <850000 850000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1008000000 { + opp-hz = /bits/ 64 <1008000000>; + opp-microvolt = <825000 825000 1100000>; + opp-microvolt-L0 = <875000 875000 1100000>; + opp-microvolt-L1 = <875000 875000 1100000>; + opp-microvolt-L2 = <875000 875000 1100000>; + opp-microvolt-L3 = <875000 875000 1100000>; + opp-microvolt-L4 = <875000 875000 1100000>; + opp-microvolt-L5 = <850000 850000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1200000000 { + opp-hz = /bits/ 64 <1200000000>; + opp-microvolt = <825000 825000 1100000>; + opp-microvolt-L0 = <900000 900000 1100000>; + opp-microvolt-L1 = <887500 887500 1100000>; + opp-microvolt-L2 = <875000 875000 1100000>; + opp-microvolt-L3 = <875000 875000 1100000>; + opp-microvolt-L4 = <875000 875000 1100000>; + opp-microvolt-L5 = <862500 862500 1100000>; + opp-microvolt-L6 = <850000 850000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1416000000 { + opp-hz = /bits/ 64 <1416000000>; + opp-microvolt = <962500 962500 1100000>; + opp-microvolt-L1 = <950000 950000 1100000>; + opp-microvolt-L2 = <950000 950000 1100000>; + opp-microvolt-L3 = <937500 937500 1100000>; + opp-microvolt-L4 = <925000 925000 1100000>; + opp-microvolt-L5 = <912500 912500 1100000>; + opp-microvolt-L6 = <900000 900000 1100000>; + opp-microvolt-L7 = <887500 887000 1100000>; + opp-microvolt-L8 = <875000 875000 1100000>; + opp-microvolt-L9 = <862500 862500 1100000>; + opp-microvolt-L10 = <850000 850000 1100000>; + opp-microvolt-L11 = <850000 850000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1608000000 { + opp-hz = /bits/ 64 <1608000000>; + opp-microvolt = <1012500 1012500 1100000>; + opp-microvolt-L2 = <1000000 1000000 1100000>; + opp-microvolt-L3 = <987500 987500 1100000>; + opp-microvolt-L4 = <975000 975000 1100000>; + opp-microvolt-L5 = <962500 962500 1100000>; + opp-microvolt-L6 = <950000 950000 1100000>; + opp-microvolt-L7 = <937500 937500 1100000>; + opp-microvolt-L8 = <925000 925000 1100000>; + opp-microvolt-L9 = <912500 912500 1100000>; + opp-microvolt-L10 = <900000 900000 1100000>; + opp-microvolt-L11 = <887500 887500 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>; + opp-microvolt-L7 = <975000 975000 1100000>; + opp-microvolt-L8 = <962500 962500 1100000>; + opp-microvolt-L9 = <950000 950000 1100000>; + opp-microvolt-L10 = <937500 937500 1100000>; + opp-microvolt-L11 = <925000 925000 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>; + opp-microvolt-L7 = <1012500 1012500 1100000>; + opp-microvolt-L8 = <1000000 1000000 1100000>; + opp-microvolt-L9 = <987500 987500 1100000>; + opp-microvolt-L10 = <975000 975000 1100000>; + opp-microvolt-L11 = <962500 962500 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"; + }; + + dmc: dmc { + compatible = "rockchip,rk3528-dmc"; + interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "complete"; + devfreq-events = <&dfi>; + clocks = <&scmi_clk SCMI_CLK_DDR>; + clock-names = "dmc_clk"; + operating-points-v2 = <&dmc_opp_table>; + upthreshold = <40>; + downdifferential = <20>; + system-status-level = < + /* system status freq level */ + SYS_STATUS_NORMAL DMC_FREQ_LEVEL_HIGH + >; + auto-min-freq = <324000>; + auto-freq-en = <0>; + status = "disabled"; + }; + + dmc_opp_table: dmc-opp-table { + compatible = "operating-points-v2"; + + mbist-vmin = <850000 900000>; + nvmem-cells = <&log_leakage>, <&dmc_opp_info>, <&logic_mbist_vmin>; + nvmem-cell-names = "leakage", "opp-info", "mbist-vmin"; + + rockchip,temp-hysteresis = <5000>; + rockchip,low-temp = <10000>; + rockchip,low-temp-min-volt = <900000>; + + rockchip,leakage-voltage-sel = < + 1 10 0 + 11 14 1 + 15 22 2 + 23 28 3 + 29 254 4 + >; + + opp-920000000 { + opp-hz = /bits/ 64 <920000000>; + opp-microvolt = <850000 850000 1000000>; + }; + opp-1056000000 { + opp-hz = /bits/ 64 <1056000000>; + opp-microvolt = <850000 850000 1000000>; + opp-microvolt-L0 = <875000 875000 1000000>; + opp-microvolt-L1 = <850000 850000 1000000>; + opp-microvolt-L2 = <850000 850000 1000000>; + opp-microvolt-L3 = <850000 850000 1000000>; + opp-microvolt-L4 = <850000 850000 1000000>; + }; + opp-1184000000 { + opp-hz = /bits/ 64 <1184000000>; + opp-microvolt = <900000 900000 1000000>; + opp-microvolt-L0 = <950000 950000 1000000>; + opp-microvolt-L1 = <925000 925000 1000000>; + opp-microvolt-L2 = <900000 900000 1000000>; + opp-microvolt-L3 = <875000 875000 1000000>; + opp-microvolt-L4 = <862500 862500 1000000>; + status = "disabled"; + }; + }; + + 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>; + + assigned-clocks = <&scmi_clk SCMI_CLK_CPU>; + assigned-clock-rates = <1200000000>; + }; + }; + }; + + mpp_srv: mpp-srv { + compatible = "rockchip,mpp-service"; + rockchip,taskqueue-count = <5>; + rockchip,resetgroup-count = <5>; + rockchip,grf = <&grf>; + rockchip,grf-mem-offset = <0x20010>, <0x40034>, <0x40034>, + <0x600e0>, <0x600e0>; + rockchip,grf-mem-on-values = <0x00000021>, <0x0f040000>, <0x0f040000>, + <0xf0040000>, <0xf0040000>; + rockchip,grf-mem-off-values = <0xffff0021>, <0x0f040f04>, <0x0f040f04>, + <0xf004f004>, <0xf004f004>; + rockchip,grf-names = "grf_rkvenc2", "grf_vdpu1", "grf_vdpu2", + "grf_iep2", "grf_vdpp"; + status = "disabled"; + }; + + 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"; + rockchip,polling-delay = <200>; /* milliseconds */ + rockchip,temp-hysteresis = <5000>; /* millicelsius */ + rockchip,offline-cpu-temp = <105000>; /* millicelsius */ + rockchip,temp-offline-cpus = "2-3"; + }; + + thermal_zones: thermal-zones { + soc_thermal: soc-thermal { + polling-delay-passive = <20>; /* milliseconds */ + polling-delay = <1000>; /* milliseconds */ + sustainable-power = <638>; /* milliwatts */ + + thermal-sensors = <&tsadc 0>; + + trips { + threshold: trip-point-0 { + temperature = <95000>; + hysteresis = <2000>; + type = "passive"; + }; + target: trip-point-1 { + temperature = <110000>; + hysteresis = <2000>; + type = "passive"; + }; + soc_crit: soc-crit { + temperature = <120000>; /* millicelsius */ + hysteresis = <2000>; /* millicelsius */ + type = "critical"; + }; + }; + + cooling-maps { + map0 { + trip = <&target>; + cooling-device = + <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + contribution = <1024>; + }; + map1 { + trip = <&target>; + cooling-device = + <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + contribution = <1024>; + }; + }; + + }; + }; + + 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>; + }; + + sram: sram@fe480000 { + compatible = "mmio-sram"; + reg = <0x0 0xfe480000 0x0 0xc000>; + + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x0 0xfe480000 0xc000>; + + /* start address and size should be 4k algin */ + rkvdec_sram: rkvdec-sram@0 { + reg = <0x0 0xc000>; + }; + }; + + 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>; + priority-init = <0x202>; + }; + + 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 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>, + <&cru ACLK_VO_ROOT>, + <&cru ACLK_VPU_ROOT>, + <&cru ACLK_VPU_L_ROOT>; + + assigned-clock-rates = + <32768>, + <1188000000>, + <1000000000>, + <996000000>, + <250000000>, + <500000000>, + <50000000>, + <100000000>, + <150000000>, + <200000000>, + <300000000>, + <340000000>, + <400000000>, + <600000000>, + <50000000>, + <100000000>, + <125000000>, + <500000000>, + <340000000>, + <300000000>, + <200000000>; + }; + + 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>; + pm_qos = <&qos_vdpp>; + }; + 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>; + #cooling-cells = <2>; + rockchip,grf = <&grf>; + status = "disabled"; + + gpu_power_model: power-model { + compatible = "simple-power-model"; + leakage-range= <1 3>; + ls = <(-15658) 67354 0>; + static-coefficient = <10000>; + dynamic-coefficient = <724>; + ts = <3156546 120154 (-2506) 39>; + thermal-zone = "soc-thermal"; + }; + }; + + gpu_opp_table: gpu-opp-table { + compatible = "operating-points-v2"; + + mbist-vmin = <825000 925000>; + nvmem-cells = <&gpu_leakage>, <&gpu_opp_info>, <&gpu_mbist_vmin>; + nvmem-cell-names = "leakage", "opp-info", "mbist-vmin"; + + rockchip,pvtm-voltage-sel = < + 0 750 0 + 751 770 1 + 771 790 2 + 791 810 3 + 811 830 4 + 831 850 5 + 851 870 6 + 871 890 7 + 891 9999 8 + >; + rockchip,pvtm-pvtpll; + rockchip,pvtm-offset = <0x10018>; + rockchip,pvtm-sample-time = <1100>; + rockchip,pvtm-freq = <800000>; + rockchip,pvtm-volt = <900000>; + rockchip,pvtm-ref-temp = <40>; + rockchip,pvtm-temp-prop = <0 0>; + rockchip,pvtm-thermal-zone = "soc-thermal"; + rockchip,grf = <&grf>; + rockchip,temp-hysteresis = <5000>; + rockchip,low-temp = <10000>; + rockchip,low-temp-min-volt = <900000>; + + opp-300000000 { + opp-hz = /bits/ 64 <300000000>; + opp-microvolt = <875000 875000 1000000>; + opp-microvolt-L5 = <850000 850000 1000000>; + opp-microvolt-L6 = <837500 837500 1000000>; + opp-microvolt-L7 = <825000 825000 1000000>; + opp-microvolt-L8 = <825000 825000 1000000>; + }; + opp-500000000 { + opp-hz = /bits/ 64 <500000000>; + opp-microvolt = <875000 875000 1000000>; + opp-microvolt-L5 = <850000 850000 1000000>; + opp-microvolt-L6 = <837500 837500 1000000>; + opp-microvolt-L7 = <825000 825000 1000000>; + opp-microvolt-L8 = <825000 825000 1000000>; + }; + opp-600000000 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <875000 875000 1000000>; + opp-microvolt-L5 = <850000 850000 1000000>; + opp-microvolt-L6 = <837500 837500 1000000>; + opp-microvolt-L7 = <825000 825000 1000000>; + opp-microvolt-L8 = <825000 825000 1000000>; + }; + opp-700000000 { + opp-hz = /bits/ 64 <700000000>; + opp-microvolt = <900000 900000 1000000>; + opp-microvolt-L1 = <887500 887500 1000000>; + opp-microvolt-L2 = <875000 875000 1000000>; + opp-microvolt-L3 = <875000 875000 1000000>; + opp-microvolt-L4 = <875000 875000 1000000>; + opp-microvolt-L5 = <850000 850000 1000000>; + opp-microvolt-L6 = <837500 837500 1000000>; + opp-microvolt-L7 = <825000 825000 1000000>; + opp-microvolt-L8 = <825000 825000 1000000>; + clock-latency-ns = <40000>; + }; + opp-800000000 { + opp-hz = /bits/ 64 <800000000>; + opp-microvolt = <950000 950000 1000000>; + opp-microvolt-L1 = <937500 937500 1000000>; + opp-microvolt-L2 = <925000 925000 1000000>; + opp-microvolt-L3 = <912500 912500 1000000>; + opp-microvolt-L4 = <900000 900000 1000000>; + opp-microvolt-L5 = <887500 887500 1000000>; + opp-microvolt-L6 = <875000 875000 1000000>; + opp-microvolt-L7 = <862500 862500 1000000>; + opp-microvolt-L8 = <850000 850000 1000000>; + clock-latency-ns = <40000>; + }; + }; + + gpu_bus: gpu-bus { + compatible = "rockchip,rk3528-bus"; + rockchip,busfreq-policy = "clkfreq"; + clocks = <&scmi_clk SCMI_CLK_GPU>; + clock-names = "bus"; + operating-points-v2 = <&gpu_bus_opp_table>; + status = "disabled"; + }; + + gpu_bus_opp_table: gpu-bus-opp-table { + compatible = "operating-points-v2"; + + nvmem-cells = <&log_leakage>; + nvmem-cell-names = "leakage"; + + rockchip,leakage-voltage-sel = < + 1 22 0 + 23 254 1 + >; + + opp-700000000 { + opp-hz = /bits/ 64 <700000000>; + opp-microvolt = <850000 850000 1000000>; + }; + opp-800000000 { + opp-hz = /bits/ 64 <800000000>; + opp-microvolt = <875000 875000 1000000>; + opp-microvolt-L1 = <850000 850000 1000000>; + }; + }; + + rkvdec: rkvdec@ff740100 { + compatible = "rockchip,rkv-decoder-rk3528", "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"; + iommus = <&rkvdec_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <0>; + rockchip,resetgroup-node = <0>; + rockchip,task-capacity = <16>; + rockchip,sram = <&rkvdec_sram>; + /* rcb_iova: start and size */ + rockchip,rcb-iova = <0x10000000 65536>; + rockchip,rcb-min-width = <512>; + 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"; + #iommu-cells = <0>; + rockchip,shootdown-entire; + rockchip,master-handle-irq; + status = "disabled"; + }; + + rkvenc: rkvenc@ff780000 { + compatible = "rockchip,rkv-encoder-rk3528", "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>; + 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"; + #iommu-cells = <0>; + rockchip,shootdown-entire; + 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"; + rockchip,normal-rates = <300000000>, <0>; + assigned-clocks = <&cru ACLK_VPU>; + assigned-clock-rates = <300000000>; + resets = <&cru SRST_ARESETN_VPU>, <&cru SRST_HRESETN_VPU>; + reset-names = "shared_video_a", "shared_video_h"; + iommus = <&vdpu_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <2>; + rockchip,resetgroup-node = <2>; + rockchip,disable-auto-freq; + 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>; + #iommu-cells = <0>; + rockchip,shootdown-entire; + 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"; + rockchip,normal-rates = <300000000>, <0>; + assigned-clocks = <&cru ACLK_VPU>; + assigned-clock-rates = <300000000>; + resets = <&cru SRST_ARESETN_VPU>, <&cru SRST_HRESETN_VPU>; + reset-names = "shared_video_a", "shared_video_h"; + iommus = <&vdpu_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <2>; + rockchip,resetgroup-node = <2>; + rockchip,disable-auto-freq; + 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 = <&inno_hdmiphy_clk>; + 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>; + rockchip,grf = <&grf>; + rockchip,grf-offset = <0x600e0>; + rockchip,grf-values = <0x0ff10000>, <0x0ff10ff1>; + 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>; + 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>; + rockchip,shootdown-entire; + rockchip,disable-mmu-reset; + 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>; + rockchip,disable-auto-freq; + 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,normal-rates = <340000000>, <0>; + assigned-clocks = <&cru ACLK_JPEG_DECODER>; + assigned-clock-rates = <340000000>; + rockchip,disable-auto-freq; + resets = <&cru SRST_ARESETN_JPEG_DECODER>, <&cru SRST_HRESETN_JPEG_DECODER>; + reset-names = "video_a", "video_h"; + 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>; + #iommu-cells = <0>; + rockchip,shootdown-entire; + 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 = <0x0ff80006>; + rockchip,lumafilter1 = <0x00090010>; + rockchip,lumafilter2 = <0x0ffb0fd8>; + rockchip,lumafilter3 = <0x00080057>; + rockchip,lumafilter4 = <0x0fef0f64>; + rockchip,lumafilter5 = <0x0016010a>; + rockchip,lumafilter6 = <0x0f830df7>; + rockchip,lumafilter7 = <0x08de055f>; + rockchip,tve-upsample = <DCLK_UPSAMPLEx4>; + rockchip,grf = <&grf>; + nvmem-cells = <&vdac_out_current>, <&test_version>; + nvmem-cell-names = "out-current", "version"; + 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>; + interrupt-names = "hdmi", "hdmi_wakeup"; + clocks = <&cru PCLK_HDMI>, + <&cru CLK_SFR_HDMI>, + <&cru CLK_CEC_HDMI>, + <&inno_hdmiphy_clk>; + clock-names = "iahb", "isfr", "cec", "dclk_vop"; + ddc-i2c-scl-high-time-ns = <9625>; + ddc-i2c-scl-low-time-ns = <10000>; + reg-io-width = <4>; + rockchip,grf = <&grf>; + pinctrl-names = "default", "idle"; + pinctrl-0 = <&hdmi_pins>; + pinctrl-1 = <&hdmi_pins_idle>; + 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"; + }; + }; + }; + }; + + dfi: dfi@ff930000 { + reg = <0x0 0xff930000 0x0 0x400>; + compatible = "rockchip,rk3528-dfi"; + rockchip,grf = <&grf>; + 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>, <&cru SCLK_IN_SPI0>; + clock-names = "spiclk", "apb_pclk", "sclk_in"; + 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>, <&cru SCLK_IN_SPI1>; + clock-names = "spiclk", "apb_pclk", "sclk_in"; + 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"; + resets = <&cru SRST_PRESETN_WDT_NS>; + reset-names = "reset"; + 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"; + assigned-clocks = <&cru MCLK_SAI_I2S3>; + assigned-clock-rates = <6144000>; + dmas = <&dmac 5>; + dma-names = "tx"; + resets = <&cru SRST_MRESETN_SAI_I2S3>, <&cru SRST_HRESETN_SAI_I2S3>; + reset-names = "m", "h"; + rockchip,always-on; + #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_lrck + &i2s0m0_sclk + &i2s0m0_sdi + &i2s0m0_sdo>; + #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_sclk + &i2s1_lrck + &i2s1_sdi0 + &i2s1_sdi1 + &i2s1_sdi2 + &i2s1_sdi3 + &i2s1_sdo0 + &i2s1_sdo1 + &i2s1_sdo2 + &i2s1_sdo3>; + #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; + 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>; + }; + cpu_mbist_vmin: cpu-mbist-vmin@9 { + reg = <0x09 0x1>; + bits = <0 3>; + }; + gpu_mbist_vmin: gpu-mbist-vmin@9 { + reg = <0x09 0x1>; + bits = <3 2>; + }; + logic_mbist_vmin: logic-mbist-vmin@9 { + reg = <0x09 0x1>; + bits = <5 2>; + }; + 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>; + }; + test_version: test-version@29 { + reg = <0x29 0x1>; + }; + macphy_bgs: macphy-bgs@2d { + reg = <0x2d 0x1>; + }; + macphy_txlevel: macphy-txlevel@2e { + reg = <0x2e 0x2>; + }; + vdac_out_current: vdac-out-current@30 { + reg = <0x30 0x1>; + }; + cpu_opp_info: cpu-opp-info@32 { + reg = <0x32 0x6>; + }; + gpu_opp_info: gpu-opp-info@38 { + reg = <0x38 0x6>; + }; + dmc_opp_info: dmc-opp-info@3e { + reg = <0x3e 0x6>; + }; + }; + + 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"; + status = "disabled"; + + inno_hdmiphy_clk: clk-port { + #clock-cells = <0>; + clock-output-names = "clk_hdmiphy_pixel_io"; + status = "okay"; + }; + }; + + 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/kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi index 36f43fe..471782c 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi @@ -32,6 +32,27 @@ }; }; + bt_sco: bt-sco { + status = "disabled"; + compatible = "delta,dfbmcs320"; + #sound-dai-cells = <1>; + }; + + bt_sound: bt-sound { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,format = "dsp_a"; + simple-audio-card,bitclock-inversion = <0>; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,name = "rockchip,bt"; + simple-audio-card,cpu { + sound-dai = <&i2s2_2ch>; + }; + simple-audio-card,codec { + sound-dai = <&bt_sco 1>; + }; + }; + dc_12v: dc-12v { compatible = "regulator-fixed"; regulator-name = "dc_12v"; @@ -215,6 +236,12 @@ &i2s1m0_sdo0>; }; +&i2s2_2ch { + pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>; + rockchip,bclk-fs = <32>; + status = "disabled"; +}; + &iep { status = "okay"; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi index 400aba7..cf4f9f8 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi @@ -14,7 +14,7 @@ }; display_reserved: framebuffer@10900000 { - reg = <0x0 0x10900000 0x0 0x3000000>; + reg = <0x0 0x10900000 0x0 0x3300000>; }; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts index f602ed9..55e31aa 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts @@ -5,3 +5,15 @@ #include "rk3566-evb1-ddr4-v10.dtsi" #include "rk3568-android.dtsi" + +&bt_sco { + status = "okay"; +}; + +&bt_sound { + status = "okay"; +}; + +&i2s3_2ch { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi index 92ea490..037cb76 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi @@ -25,13 +25,6 @@ vin-supply = <&dc_12v>; }; - rk_headset: rk-headset { - compatible = "rockchip_headset"; - headset_gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>; - pinctrl-names = "default"; - pinctrl-0 = <&hp_det>; - }; - vcc3v3_vga: vcc3v3-vga { compatible = "regulator-fixed"; regulator-name = "vcc3v3_vga"; @@ -54,6 +47,13 @@ }; }; +&bt_sound { + status = "disabled"; + simple-audio-card,cpu { + sound-dai = <&i2s2_2ch>; + }; +}; + &audiopwmout_diff { status = "disabled"; }; @@ -67,11 +67,11 @@ }; &csi2_dphy_hw { - status = "okay"; + status = "disabled"; }; &csi2_dphy1 { - status = "okay"; + status = "disabled"; /* * dphy1 only used for split mode, @@ -108,7 +108,7 @@ }; &csi2_dphy2 { - status = "okay"; + status = "disabled"; /* * dphy2 only used for split mode, @@ -160,7 +160,7 @@ * when dsi0 is enabled */ &dsi0 { - status = "okay"; + status = "disabled"; }; &dsi0_in_vp0 { @@ -168,7 +168,7 @@ }; &dsi0_in_vp1 { - status = "okay"; + status = "disabled"; }; &dsi0_panel { @@ -216,6 +216,33 @@ &edp_in_vp1 { status = "disabled"; +}; + +&gmac1 { + phy-mode = "rgmii"; + clock_in_out = "output"; + + snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>; + snps,reset-active-low; + /* Reset time is 20ms, 100ms for rtl8211f */ + snps,reset-delays-us = <0 20000 100000>; + + assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>; + assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&cru CLK_MAC1_2TOP>; + assigned-clock-rates = <0>, <125000000>; + + pinctrl-names = "default"; + pinctrl-0 = <&gmac1m1_miim + &gmac1m1_tx_bus2 + &gmac1m1_rx_bus2 + &gmac1m1_rgmii_clk + &gmac1m1_rgmii_bus>; + + tx_delay = <0x4f>; + rx_delay = <0x26>; + + phy-handle = <&rgmii_phy1>; + status = "okay"; }; /* @@ -280,6 +307,12 @@ }; }; +&i2s2_2ch { + pinctrl-0 = <&i2s2m1_sclktx &i2s2m1_lrcktx &i2s2m1_sdi &i2s2m1_sdo>; + rockchip,bclk-fs = <32>; + status = "disabled"; +}; + &i2s3_2ch { status = "disabled"; }; @@ -318,7 +351,7 @@ }; &video_phy0 { - status = "okay"; + status = "disabled"; }; &video_phy1 { @@ -368,15 +401,15 @@ }; &rkisp { - status = "okay"; + status = "disabled"; }; &rkisp_mmu { - status = "okay"; + status = "disabled"; }; &rkisp_vir0 { - status = "okay"; + status = "disabled"; port { #address-cells = <1>; @@ -390,7 +423,7 @@ }; &route_dsi0 { - status = "okay"; + status = "disabled"; connect = <&vp1_out_dsi0>; }; @@ -443,6 +476,9 @@ WIFI,host_wake_irq = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>; }; +&work_led { + gpios = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>; +}; &pinctrl { cam { @@ -450,12 +486,6 @@ rockchip,pins = /* camera power en */ <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; - }; - }; - - headphone { - hp_det: hp-det { - rockchip,pins = <3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_down>; }; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts index 1df8e34..957a99b 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts @@ -6,13 +6,3 @@ #include "rk3566-evb2-lp4x-v10.dtsi" #include "rk3568-linux.dtsi" -#include <dt-bindings/display/rockchip_vop.h> - -&vp0 { - cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>; -}; - -&vp1 { - cursor-win-id = <ROCKCHIP_VOP2_CLUSTER1>; -}; - diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi index 2c9361e..7550829 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi @@ -16,13 +16,6 @@ model = "Rockchip RK3566 EVB2 LP4X V10 Board"; compatible = "rockchip,rk3566-evb2-lp4x-v10", "rockchip,rk3566"; - rk_headset: rk-headset { - compatible = "rockchip_headset"; - headset_gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>; - pinctrl-names = "default"; - pinctrl-0 = <&hp_det>; - }; - vcc_camera: vcc-camera-regulator { compatible = "regulator-fixed"; gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; @@ -43,6 +36,13 @@ gpio = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>; startup-delay-us = <5000>; vin-supply = <&dc_12v>; + }; +}; + +&bt_sound { + status = "disabled"; + simple-audio-card,cpu { + sound-dai = <&i2s2_2ch>; }; }; @@ -369,6 +369,12 @@ }; }; +&i2s2_2ch { + pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>; + rockchip,bclk-fs = <32>; + status = "disabled"; +}; + &mdio1 { rgmii_phy0: phy@0 { compatible = "ethernet-phy-ieee802.3-c22"; @@ -439,12 +445,6 @@ rockchip,pins = /* camera power en */ <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; - }; - }; - - headphone { - hp_det: hp-det { - rockchip,pins = <3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_down>; }; }; @@ -594,6 +594,9 @@ WIFI,host_wake_irq = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>; }; +&work_led { + gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>; +}; &wireless_bluetooth { compatible = "bluetooth-platdata"; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi index 740ee86..c57602c 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi @@ -44,6 +44,13 @@ }; }; +&bt_sound { + status = "disabled"; + simple-audio-card,cpu { + sound-dai = <&i2s2_2ch>; + }; +}; + &combphy1_usq { status = "okay"; }; @@ -263,6 +270,12 @@ }; &i2s1_8ch { + status = "disabled"; +}; + +&i2s2_2ch { + pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>; + rockchip,bclk-fs = <32>; status = "disabled"; }; @@ -493,3 +506,6 @@ WIFI,host_wake_irq = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>; }; +&work_led { + gpios = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi index ed52312..55bfa76 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi @@ -47,6 +47,13 @@ status = "disabled"; }; +&bt_sound { + status = "disabled"; + simple-audio-card,cpu { + sound-dai = <&i2s2_2ch>; + }; +}; + &combphy1_usq { status = "okay"; }; @@ -169,6 +176,12 @@ status = "disabled"; }; +&i2s2_2ch { + pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>; + rockchip,bclk-fs = <32>; + status = "disabled"; +}; + &i2s3_2ch { status = "disabled"; }; @@ -280,6 +293,9 @@ status = "disabled"; }; +&work_led { + status = "disabled"; +}; &pinctrl { headphone { diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi index 60c299e..eeb3945 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi @@ -38,7 +38,7 @@ }; &rkisp { - rockchip,iq-feature = /bits/ 64 <0x3FBF7FE67FF>; + rockchip,iq-feature = /bits/ 64 <0x1BFBF7FE67FF>; }; &usbdrd_dwc3 { @@ -54,6 +54,7 @@ /delete-node/ &gmac0_clkin; /delete-node/ &gmac0_xpcsclk; /delete-node/ &gmac0; +/delete-node/ &gmac_uio0; /delete-node/ &pcie30_phy_grf; /delete-node/ &pcie30phy; /delete-node/ &pcie3x1; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi index 7eb6ffd..4f75dec 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi @@ -7,7 +7,8 @@ rockchip_amp: rockchip-amp { compatible = "rockchip,rk3568-amp"; clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>, - <&cru PCLK_TIMER>, <&cru CLK_TIMER4>, <&cru CLK_TIMER5>; + <&cru PCLK_TIMER>, <&cru CLK_TIMER4>, <&cru CLK_TIMER5>, + <&cru ACLK_MCU>; clock-names = "baudclk", "apb_pclk", "pclk", "timer"; assigned-clocks = <&cru SCLK_UART4>, <&cru CLK_TIMER4>, @@ -60,6 +61,12 @@ reg = <0x0 0x8000000 0x0 0x100000>; no-map; }; + + /* mcu address */ + mcu_reserved: mcu@8200000 { + reg = <0x0 0x8200000 0x0 0x100000>; + no-map; + }; }; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi index 67a6953..12e9c2d 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi @@ -6,7 +6,7 @@ / { chosen: chosen { - bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait net.ifnames=0"; + bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait net.ifnames=0 isolcpus=3 nohz_full=3"; }; aliases { diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi index 99247fb..abe5eb1 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi @@ -94,7 +94,7 @@ standby_idle = <0>; pd_dis_freq = <1066>; sr_dis_freq = <800>; - dram_dll_dis_freq = <625>; + dram_dll_dis_freq = <500>; phy_dll_dis_freq = <IGNORE_THIS>; /* drv when odt on */ phy_dq_drv_odten = <37>; @@ -393,7 +393,7 @@ lp4_dq_vref_odten = <228>; lp4_ca_vref_odten = <343>; /* lp4 vref info when odt disable */ - phy_lp4_dq_vref_odtoff = <420>; + phy_lp4_dq_vref_odtoff = <245>; lp4_dq_vref_odtoff = <420>; lp4_ca_vref_odtoff = <343>; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi old mode 100755 new mode 100644 index 4063bc3..f5802f1 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi @@ -103,7 +103,7 @@ backlight1: backlight1 { compatible = "pwm-backlight"; - pwms = <&pwm6 0 25000 0>; + pwms = <&pwm5 0 25000 0>; brightness-levels = < 0 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 @@ -141,6 +141,27 @@ default-brightness-level = <200>; }; + bt_sco: bt-sco { + status = "disabled"; + compatible = "delta,dfbmcs320"; + #sound-dai-cells = <1>; + }; + + bt_sound: bt-sound { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,format = "dsp_a"; + simple-audio-card,bitclock-inversion = <0>; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,name = "rockchip,bt"; + simple-audio-card,cpu { + sound-dai = <&i2s3_2ch>; + }; + simple-audio-card,codec { + sound-dai = <&bt_sco 1>; + }; + }; + dc_12v: dc-12v { compatible = "regulator-fixed"; regulator-name = "dc_12v"; @@ -161,8 +182,8 @@ leds: leds { compatible = "gpio-leds"; - sys_led: sys_led { - gpios = <&gpio3 RK_PD0 GPIO_ACTIVE_HIGH>; + work_led: work { + gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>; linux,default-trigger = "heartbeat"; }; }; @@ -187,17 +208,15 @@ rk809_sound: rk809-sound { status = "okay"; - compatible = "simple-audio-card"; - simple-audio-card,format = "i2s"; - simple-audio-card,name = "rockchip,rk809-codec"; - simple-audio-card,mclk-fs = <256>; - - simple-audio-card,cpu { - sound-dai = <&i2s1_8ch>; - }; - simple-audio-card,codec { - sound-dai = <&rk809_codec>; - }; + compatible = "rockchip,multicodecs-card"; + rockchip,card-name = "rockchip-rk809"; + hp-det-gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>; + rockchip,format = "i2s"; + rockchip,mclk-fs = <256>; + rockchip,cpu = <&i2s1_8ch>; + rockchip,codec = <&rk809_codec>; + pinctrl-names = "default"; + pinctrl-0 = <&hp_det>; }; spdif-sound { @@ -273,8 +292,6 @@ vcc5v0_otg: vcc5v0-otg-regulator { compatible = "regulator-fixed"; regulator-name = "vcc5v0_otg"; - egulator-boot-on; - regulator-always-on; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; enable-active-high; @@ -291,7 +308,7 @@ regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; enable-active-high; - gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>; //VCC3_IO_EN_GPIO0_C4_3V3 + gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; vin-supply = <&vcc3v3_sys>; regulator-state-mem { @@ -328,7 +345,7 @@ * - PDN (power down when low) */ post-power-on-delay-ms = <200>; - reset-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_LOW>; }; wireless_wlan: wireless-wlan { @@ -419,198 +436,267 @@ dsi,format = <MIPI_DSI_FMT_RGB888>; dsi,lanes = <4>; panel-init-sequence = [ - 39 00 05 FF 03 98 81 03 - 39 00 03 01 01 00 - 39 00 03 02 01 00 - 39 00 03 03 01 53 - 39 00 03 04 01 D3 - 39 00 03 05 01 00 - 39 00 03 06 01 0D - 39 00 03 07 01 08 - 39 00 03 08 01 00 - 39 00 03 09 01 00 - 39 00 03 0a 01 00 - 39 00 03 0b 01 00 - 39 00 03 0c 01 00 - 39 00 03 0d 01 00 - 39 00 03 0e 01 00 - 39 00 03 0f 01 28 - 39 00 03 10 01 28 - 39 00 03 11 01 00 - 39 00 03 12 01 00 - 39 00 03 13 01 00 - 39 00 03 14 01 00 - 39 00 03 15 01 00 - 39 00 03 16 01 00 - 39 00 03 17 01 00 - 39 00 03 18 01 00 - 39 00 03 19 01 00 - 39 00 03 1a 01 00 - 39 00 03 1b 01 00 - 39 00 03 1c 01 00 - 39 00 03 1d 01 00 - 39 00 03 1e 01 40 - 39 00 03 1f 01 80 - 39 00 03 20 01 06 - 39 00 03 21 01 01 - 39 00 03 22 01 00 - 39 00 03 23 01 00 - 39 00 03 24 01 00 - 39 00 03 25 01 00 - 39 00 03 26 01 00 - 39 00 03 27 01 00 - 39 00 03 28 01 33 - 39 00 03 29 01 33 - 39 00 03 2a 01 00 - 39 00 03 2b 01 00 - 39 00 03 2c 01 00 - 39 00 03 2d 01 00 - 39 00 03 2e 01 00 - 39 00 03 2f 01 00 - 39 00 03 30 01 00 - 39 00 03 31 01 00 - 39 00 03 32 01 00 - 39 00 03 33 01 00 - 39 00 03 34 01 03 - 39 00 03 35 01 00 - 39 00 03 36 01 00 - 39 00 03 37 01 00 - 39 00 03 38 01 96 - 39 00 03 39 01 00 - 39 00 03 3a 01 00 - 39 00 03 3b 01 00 - 39 00 03 3c 01 00 - 39 00 03 3d 01 00 - 39 00 03 3e 01 00 - 39 00 03 3f 01 00 - 39 00 03 40 01 00 - 39 00 03 41 01 00 - 39 00 03 42 01 00 - 39 00 03 43 01 00 - 39 00 03 44 01 00 - 39 00 03 50 01 00 - 39 00 03 51 01 23 - 39 00 03 52 01 45 - 39 00 03 53 01 67 - 39 00 03 54 01 89 - 39 00 03 55 01 AB - 39 00 03 56 01 01 - 39 00 03 57 01 23 - 39 00 03 58 01 45 - 39 00 03 59 01 67 - 39 00 03 5a 01 89 - 39 00 03 5b 01 AB - 39 00 03 5c 01 CD - 39 00 03 5d 01 EF - 39 00 03 5e 01 00 - 39 00 03 5f 01 08 - 39 00 03 60 01 08 - 39 00 03 61 01 06 - 39 00 03 62 01 06 - 39 00 03 63 01 01 - 39 00 03 64 01 01 - 39 00 03 65 01 00 - 39 00 03 66 01 00 - 39 00 03 67 01 02 - 39 00 03 68 01 15 - 39 00 03 69 01 15 - 39 00 03 6a 01 14 - 39 00 03 6b 01 14 - 39 00 03 6c 01 0D - 39 00 03 6d 01 0D - 39 00 03 6e 01 0C - 39 00 03 6f 01 0C - 39 00 03 70 01 0F - 39 00 03 71 01 0F - 39 00 03 72 01 0E - 39 00 03 73 01 0E - 39 00 03 74 01 02 - 39 00 03 75 01 08 - 39 00 03 76 01 08 - 39 00 03 77 01 06 - 39 00 03 78 01 06 - 39 00 03 79 01 01 - 39 00 03 7a 01 01 - 39 00 03 7b 01 00 - 39 00 03 7c 01 00 - 39 00 03 7d 01 02 - 39 00 03 7e 01 15 - 39 00 03 7f 01 15 - 39 00 03 80 01 14 - 39 00 03 81 01 14 - 39 00 03 82 01 0D - 39 00 03 83 01 0D - 39 00 03 84 01 0C - 39 00 03 85 01 0C - 39 00 03 86 01 0F - 39 00 03 87 01 0F - 39 00 03 88 01 0E - 39 00 03 89 01 0E - 39 00 03 8A 01 02 - 39 00 05 FF 03 98 81 04 - 39 00 03 C5 01 3A - 39 00 03 6E 01 2B - 39 00 03 6F 01 37 - 39 00 03 3A 01 24 - 39 00 03 8D 01 1A - 39 00 03 87 01 BA - 39 00 03 B2 01 D1 - 39 00 03 88 01 0B - 39 00 03 38 01 01 - 39 00 03 39 01 00 - 39 00 03 B5 01 02 - 39 00 03 31 01 25 - 39 00 03 3B 01 98 - 39 00 05 FF 03 98 81 01 - 39 00 03 22 01 0A - 39 00 03 31 01 00 - 39 00 03 53 01 3D - 39 00 03 55 01 3D - 39 00 03 50 01 85 - 39 00 03 51 01 80 - 39 00 03 60 01 06 - 39 00 03 62 01 20 - 39 00 03 A0 01 00 - 39 00 03 A1 01 21 - 39 00 03 A2 01 35 - 39 00 03 A3 01 19 - 39 00 03 A4 01 1E - 39 00 03 A5 01 33 - 39 00 03 A6 01 27 - 39 00 03 A7 01 26 - 39 00 03 A8 01 AF - 39 00 03 A9 01 1B - 39 00 03 AA 01 27 - 39 00 03 AB 01 8D - 39 00 03 AC 01 1A - 39 00 03 AD 01 1B - 39 00 03 AE 01 50 - 39 00 03 AF 01 26 - 39 00 03 B0 01 2B - 39 00 03 B1 01 54 - 39 00 03 B2 01 5E - 39 00 03 B3 01 23 - 39 00 03 C0 01 00 - 39 00 03 C1 01 21 - 39 00 03 C2 01 35 - 39 00 03 C3 01 19 - 39 00 03 C4 01 1E - 39 00 03 C5 01 33 - 39 00 03 C6 01 27 - 39 00 03 C7 01 26 - 39 00 03 C8 01 AF - 39 00 03 C9 01 1B - 39 00 03 CA 01 27 - 39 00 03 CB 01 8D - 39 00 03 CC 01 1A - 39 00 03 CD 01 1B - 39 00 03 CE 01 50 - 39 00 03 CF 01 26 - 39 00 03 D0 01 2B - 39 00 03 D1 01 54 - 39 00 03 D2 01 5E - 39 00 03 D3 01 23 - 39 00 05 FF 03 98 81 00 + 23 00 02 FE 21 + 23 00 02 04 00 + 23 00 02 00 64 + 23 00 02 2A 00 + 23 00 02 26 64 + 23 00 02 54 00 + 23 00 02 50 64 + 23 00 02 7B 00 + 23 00 02 77 64 + 23 00 02 A2 00 + 23 00 02 9D 64 + 23 00 02 C9 00 + 23 00 02 C5 64 + 23 00 02 01 71 + 23 00 02 27 71 + 23 00 02 51 71 + 23 00 02 78 71 + 23 00 02 9E 71 + 23 00 02 C6 71 + 23 00 02 02 89 + 23 00 02 28 89 + 23 00 02 52 89 + 23 00 02 79 89 + 23 00 02 9F 89 + 23 00 02 C7 89 + 23 00 02 03 9E + 23 00 02 29 9E + 23 00 02 53 9E + 23 00 02 7A 9E + 23 00 02 A0 9E + 23 00 02 C8 9E + 23 00 02 09 00 + 23 00 02 05 B0 + 23 00 02 31 00 + 23 00 02 2B B0 + 23 00 02 5A 00 + 23 00 02 55 B0 + 23 00 02 80 00 + 23 00 02 7C B0 + 23 00 02 A7 00 + 23 00 02 A3 B0 + 23 00 02 CE 00 + 23 00 02 CA B0 + 23 00 02 06 C0 + 23 00 02 2D C0 + 23 00 02 56 C0 + 23 00 02 7D C0 + 23 00 02 A4 C0 + 23 00 02 CB C0 + 23 00 02 07 CF + 23 00 02 2F CF + 23 00 02 58 CF + 23 00 02 7E CF + 23 00 02 A5 CF + 23 00 02 CC CF + 23 00 02 08 DD + 23 00 02 30 DD + 23 00 02 59 DD + 23 00 02 7F DD + 23 00 02 A6 DD + 23 00 02 CD DD + 23 00 02 0E 15 + 23 00 02 0A E9 + 23 00 02 36 15 + 23 00 02 32 E9 + 23 00 02 5F 15 + 23 00 02 5B E9 + 23 00 02 85 15 + 23 00 02 81 E9 + 23 00 02 AD 15 + 23 00 02 A9 E9 + 23 00 02 D3 15 + 23 00 02 CF E9 + 23 00 02 0B 14 + 23 00 02 33 14 + 23 00 02 5C 14 + 23 00 02 82 14 + 23 00 02 AA 14 + 23 00 02 D0 14 + 23 00 02 0C 36 + 23 00 02 34 36 + 23 00 02 5D 36 + 23 00 02 83 36 + 23 00 02 AB 36 + 23 00 02 D1 36 + 23 00 02 0D 6B + 23 00 02 35 6B + 23 00 02 5E 6B + 23 00 02 84 6B + 23 00 02 AC 6B + 23 00 02 D2 6B + 23 00 02 13 5A + 23 00 02 0F 94 + 23 00 02 3B 5A + 23 00 02 37 94 + 23 00 02 64 5A + 23 00 02 60 94 + 23 00 02 8A 5A + 23 00 02 86 94 + 23 00 02 B2 5A + 23 00 02 AE 94 + 23 00 02 D8 5A + 23 00 02 D4 94 + 23 00 02 10 D1 + 23 00 02 38 D1 + 23 00 02 61 D1 + 23 00 02 87 D1 + 23 00 02 AF D1 + 23 00 02 D5 D1 + 23 00 02 11 04 + 23 00 02 39 04 + 23 00 02 62 04 + 23 00 02 88 04 + 23 00 02 B0 04 + 23 00 02 D6 04 + 23 00 02 12 05 + 23 00 02 3A 05 + 23 00 02 63 05 + 23 00 02 89 05 + 23 00 02 B1 05 + 23 00 02 D7 05 + 23 00 02 18 AA + 23 00 02 14 36 + 23 00 02 42 AA + 23 00 02 3D 36 + 23 00 02 69 AA + 23 00 02 65 36 + 23 00 02 8F AA + 23 00 02 8B 36 + 23 00 02 B7 AA + 23 00 02 B3 36 + 23 00 02 DD AA + 23 00 02 D9 36 + 23 00 02 15 74 + 23 00 02 3F 74 + 23 00 02 66 74 + 23 00 02 8C 74 + 23 00 02 B4 74 + 23 00 02 DA 74 + 23 00 02 16 9F + 23 00 02 40 9F + 23 00 02 67 9F + 23 00 02 8D 9F + 23 00 02 B5 9F + 23 00 02 DB 9F + 23 00 02 17 DC + 23 00 02 41 DC + 23 00 02 68 DC + 23 00 02 8E DC + 23 00 02 B6 DC + 23 00 02 DC DC + 23 00 02 1D FF + 23 00 02 19 03 + 23 00 02 47 FF + 23 00 02 43 03 + 23 00 02 6E FF + 23 00 02 6A 03 + 23 00 02 94 FF + 23 00 02 90 03 + 23 00 02 BC FF + 23 00 02 B8 03 + 23 00 02 E2 FF + 23 00 02 DE 03 + 23 00 02 1A 35 + 23 00 02 44 35 + 23 00 02 6B 35 + 23 00 02 91 35 + 23 00 02 B9 35 + 23 00 02 DF 35 + 23 00 02 1B 45 + 23 00 02 45 45 + 23 00 02 6C 45 + 23 00 02 92 45 + 23 00 02 BA 45 + 23 00 02 E0 45 + 23 00 02 1C 55 + 23 00 02 46 55 + 23 00 02 6D 55 + 23 00 02 93 55 + 23 00 02 BB 55 + 23 00 02 E1 55 + 23 00 02 22 FF + 23 00 02 1E 68 + 23 00 02 4C FF + 23 00 02 48 68 + 23 00 02 73 FF + 23 00 02 6F 68 + 23 00 02 99 FF + 23 00 02 95 68 + 23 00 02 C1 FF + 23 00 02 BD 68 + 23 00 02 E7 FF + 23 00 02 E3 68 + 23 00 02 1F 7E + 23 00 02 49 7E + 23 00 02 70 7E + 23 00 02 96 7E + 23 00 02 BE 7E + 23 00 02 E4 7E + 23 00 02 20 97 + 23 00 02 4A 97 + 23 00 02 71 97 + 23 00 02 97 97 + 23 00 02 BF 97 + 23 00 02 E5 97 + 23 00 02 21 B5 + 23 00 02 4B B5 + 23 00 02 72 B5 + 23 00 02 98 B5 + 23 00 02 C0 B5 + 23 00 02 E6 B5 + 23 00 02 25 F0 + 23 00 02 23 E8 + 23 00 02 4F F0 + 23 00 02 4D E8 + 23 00 02 76 F0 + 23 00 02 74 E8 + 23 00 02 9C F0 + 23 00 02 9A E8 + 23 00 02 C4 F0 + 23 00 02 C2 E8 + 23 00 02 EA F0 + 23 00 02 E8 E8 + 23 00 02 24 FF + 23 00 02 4E FF + 23 00 02 75 FF + 23 00 02 9B FF + 23 00 02 C3 FF + 23 00 02 E9 FF + 23 00 02 FE 3D + 23 00 02 00 04 + 23 00 02 FE 23 + 23 00 02 08 82 + 23 00 02 0A 00 + 23 00 02 0B 00 + 23 00 02 0C 01 + 23 00 02 16 00 + 23 00 02 18 02 + 23 00 02 1B 04 + 23 00 02 19 04 + 23 00 02 1C 81 + 23 00 02 1F 00 + 23 00 02 20 03 + 23 00 02 23 04 + 23 00 02 21 01 + 23 00 02 54 63 + 23 00 02 55 54 + 23 00 02 6E 45 + 23 00 02 6D 36 + 23 00 02 FE 3D + 23 00 02 55 78 + 23 00 02 FE 20 + 23 00 02 26 30 + 23 00 02 FE 3D + 23 00 02 20 71 + 23 00 02 50 8F + 23 00 02 51 8F + 23 00 02 FE 00 + 23 00 02 35 00 + 05 78 01 11 + 05 1E 01 29 ]; panel-exit-sequence = [ @@ -671,242 +757,303 @@ status = "okay"; compatible = "simple-panel-dsi"; reg = <0>; - power-supply = <&vcc3v3_lcd1_n>; //MIPI_3V3EN_GPIO3_A3_d_3V3 - vddio-mipi = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>; //MIPI_EN_1V8_GPIO3_A4_d_3V3 - reset-gpios = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>; //MIPI_RST_L_GPIO3_C7 - vcc-5v-gpio = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>; //VCC5_IO_EN_GPIO1_A4_3V3 - reset-delay-ms = <200>; - enable-delay-ms = <60>; - init-delay-ms = <120>; - disable-delay-ms = <60>; - prepare-delay-ms = <120>; - unprepare-delay-ms = <120>; - backlight = <&backlight1>; - dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | - MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>; - dsi,format = <MIPI_DSI_FMT_RGB888>; - dsi,lanes = <4>; + backlight = <&backlight1>; + reset-delay-ms = <60>; + enable-delay-ms = <60>; + prepare-delay-ms = <60>; + unprepare-delay-ms = <60>; + disable-delay-ms = <60>; + dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>; + dsi,format = <MIPI_DSI_FMT_RGB888>; + dsi,lanes = <4>; + panel-init-sequence = [ + 23 00 02 FE 21 + 23 00 02 04 00 + 23 00 02 00 64 + 23 00 02 2A 00 + 23 00 02 26 64 + 23 00 02 54 00 + 23 00 02 50 64 + 23 00 02 7B 00 + 23 00 02 77 64 + 23 00 02 A2 00 + 23 00 02 9D 64 + 23 00 02 C9 00 + 23 00 02 C5 64 + 23 00 02 01 71 + 23 00 02 27 71 + 23 00 02 51 71 + 23 00 02 78 71 + 23 00 02 9E 71 + 23 00 02 C6 71 + 23 00 02 02 89 + 23 00 02 28 89 + 23 00 02 52 89 + 23 00 02 79 89 + 23 00 02 9F 89 + 23 00 02 C7 89 + 23 00 02 03 9E + 23 00 02 29 9E + 23 00 02 53 9E + 23 00 02 7A 9E + 23 00 02 A0 9E + 23 00 02 C8 9E + 23 00 02 09 00 + 23 00 02 05 B0 + 23 00 02 31 00 + 23 00 02 2B B0 + 23 00 02 5A 00 + 23 00 02 55 B0 + 23 00 02 80 00 + 23 00 02 7C B0 + 23 00 02 A7 00 + 23 00 02 A3 B0 + 23 00 02 CE 00 + 23 00 02 CA B0 + 23 00 02 06 C0 + 23 00 02 2D C0 + 23 00 02 56 C0 + 23 00 02 7D C0 + 23 00 02 A4 C0 + 23 00 02 CB C0 + 23 00 02 07 CF + 23 00 02 2F CF + 23 00 02 58 CF + 23 00 02 7E CF + 23 00 02 A5 CF + 23 00 02 CC CF + 23 00 02 08 DD + 23 00 02 30 DD + 23 00 02 59 DD + 23 00 02 7F DD + 23 00 02 A6 DD + 23 00 02 CD DD + 23 00 02 0E 15 + 23 00 02 0A E9 + 23 00 02 36 15 + 23 00 02 32 E9 + 23 00 02 5F 15 + 23 00 02 5B E9 + 23 00 02 85 15 + 23 00 02 81 E9 + 23 00 02 AD 15 + 23 00 02 A9 E9 + 23 00 02 D3 15 + 23 00 02 CF E9 + 23 00 02 0B 14 + 23 00 02 33 14 + 23 00 02 5C 14 + 23 00 02 82 14 + 23 00 02 AA 14 + 23 00 02 D0 14 + 23 00 02 0C 36 + 23 00 02 34 36 + 23 00 02 5D 36 + 23 00 02 83 36 + 23 00 02 AB 36 + 23 00 02 D1 36 + 23 00 02 0D 6B + 23 00 02 35 6B + 23 00 02 5E 6B + 23 00 02 84 6B + 23 00 02 AC 6B + 23 00 02 D2 6B + 23 00 02 13 5A + 23 00 02 0F 94 + 23 00 02 3B 5A + 23 00 02 37 94 + 23 00 02 64 5A + 23 00 02 60 94 + 23 00 02 8A 5A + 23 00 02 86 94 + 23 00 02 B2 5A + 23 00 02 AE 94 + 23 00 02 D8 5A + 23 00 02 D4 94 + 23 00 02 10 D1 + 23 00 02 38 D1 + 23 00 02 61 D1 + 23 00 02 87 D1 + 23 00 02 AF D1 + 23 00 02 D5 D1 + 23 00 02 11 04 + 23 00 02 39 04 + 23 00 02 62 04 + 23 00 02 88 04 + 23 00 02 B0 04 + 23 00 02 D6 04 + 23 00 02 12 05 + 23 00 02 3A 05 + 23 00 02 63 05 + 23 00 02 89 05 + 23 00 02 B1 05 + 23 00 02 D7 05 + 23 00 02 18 AA + 23 00 02 14 36 + 23 00 02 42 AA + 23 00 02 3D 36 + 23 00 02 69 AA + 23 00 02 65 36 + 23 00 02 8F AA + 23 00 02 8B 36 + 23 00 02 B7 AA + 23 00 02 B3 36 + 23 00 02 DD AA + 23 00 02 D9 36 + 23 00 02 15 74 + 23 00 02 3F 74 + 23 00 02 66 74 + 23 00 02 8C 74 + 23 00 02 B4 74 + 23 00 02 DA 74 + 23 00 02 16 9F + 23 00 02 40 9F + 23 00 02 67 9F + 23 00 02 8D 9F + 23 00 02 B5 9F + 23 00 02 DB 9F + 23 00 02 17 DC + 23 00 02 41 DC + 23 00 02 68 DC + 23 00 02 8E DC + 23 00 02 B6 DC + 23 00 02 DC DC + 23 00 02 1D FF + 23 00 02 19 03 + 23 00 02 47 FF + 23 00 02 43 03 + 23 00 02 6E FF + 23 00 02 6A 03 + 23 00 02 94 FF + 23 00 02 90 03 + 23 00 02 BC FF + 23 00 02 B8 03 + 23 00 02 E2 FF + 23 00 02 DE 03 + 23 00 02 1A 35 + 23 00 02 44 35 + 23 00 02 6B 35 + 23 00 02 91 35 + 23 00 02 B9 35 + 23 00 02 DF 35 + 23 00 02 1B 45 + 23 00 02 45 45 + 23 00 02 6C 45 + 23 00 02 92 45 + 23 00 02 BA 45 + 23 00 02 E0 45 + 23 00 02 1C 55 + 23 00 02 46 55 + 23 00 02 6D 55 + 23 00 02 93 55 + 23 00 02 BB 55 + 23 00 02 E1 55 + 23 00 02 22 FF + 23 00 02 1E 68 + 23 00 02 4C FF + 23 00 02 48 68 + 23 00 02 73 FF + 23 00 02 6F 68 + 23 00 02 99 FF + 23 00 02 95 68 + 23 00 02 C1 FF + 23 00 02 BD 68 + 23 00 02 E7 FF + 23 00 02 E3 68 + 23 00 02 1F 7E + 23 00 02 49 7E + 23 00 02 70 7E + 23 00 02 96 7E + 23 00 02 BE 7E + 23 00 02 E4 7E + 23 00 02 20 97 + 23 00 02 4A 97 + 23 00 02 71 97 + 23 00 02 97 97 + 23 00 02 BF 97 + 23 00 02 E5 97 + 23 00 02 21 B5 + 23 00 02 4B B5 + 23 00 02 72 B5 + 23 00 02 98 B5 + 23 00 02 C0 B5 + 23 00 02 E6 B5 + 23 00 02 25 F0 + 23 00 02 23 E8 + 23 00 02 4F F0 + 23 00 02 4D E8 + 23 00 02 76 F0 + 23 00 02 74 E8 + 23 00 02 9C F0 + 23 00 02 9A E8 + 23 00 02 C4 F0 + 23 00 02 C2 E8 + 23 00 02 EA F0 + 23 00 02 E8 E8 + 23 00 02 24 FF + 23 00 02 4E FF + 23 00 02 75 FF + 23 00 02 9B FF + 23 00 02 C3 FF + 23 00 02 E9 FF + 23 00 02 FE 3D + 23 00 02 00 04 + 23 00 02 FE 23 + 23 00 02 08 82 + 23 00 02 0A 00 + 23 00 02 0B 00 + 23 00 02 0C 01 + 23 00 02 16 00 + 23 00 02 18 02 + 23 00 02 1B 04 + 23 00 02 19 04 + 23 00 02 1C 81 + 23 00 02 1F 00 + 23 00 02 20 03 + 23 00 02 23 04 + 23 00 02 21 01 + 23 00 02 54 63 + 23 00 02 55 54 + 23 00 02 6E 45 + 23 00 02 6D 36 + 23 00 02 FE 3D + 23 00 02 55 78 + 23 00 02 FE 20 + 23 00 02 26 30 + 23 00 02 FE 3D + 23 00 02 20 71 + 23 00 02 50 8F + 23 00 02 51 8F + 23 00 02 FE 00 + 23 00 02 35 00 + 05 78 01 11 + 05 1E 01 29 + ]; - panel-init-sequence = [ - 39 00 04 FF 98 81 03 - 15 00 02 01 00 - 15 00 02 02 00 - 15 00 02 03 53 - 15 00 02 04 D3 - 15 00 02 05 00 - 15 00 02 06 0D - 15 00 02 07 08 - 15 00 02 08 00 - 15 00 02 09 00 - 15 00 02 0a 00 - 15 00 02 0b 00 - 15 00 02 0c 00 - 15 00 02 0d 00 - 15 00 02 0e 00 - 15 00 02 0f 28 - 15 00 02 10 28 - 15 00 02 11 00 - 15 00 02 12 00 - 15 00 02 13 00 - 15 00 02 14 00 - 15 00 02 15 00 - 15 00 02 16 00 - 15 00 02 17 00 - 15 00 02 18 00 - 15 00 02 19 00 - 15 00 02 1a 00 - 15 00 02 1b 00 - 15 00 02 1c 00 - 15 00 02 1d 00 - 15 00 02 1e 40 - 15 00 02 1f 80 - 15 00 02 20 06 - 15 00 02 21 01 - 15 00 02 22 00 - 15 00 02 23 00 - 15 00 02 24 00 - 15 00 02 25 00 - 15 00 02 26 00 - 15 00 02 27 00 - 15 00 02 28 33 - 15 00 02 29 33 - 15 00 02 2a 00 - 15 00 02 2b 00 - 15 00 02 2c 00 - 15 00 02 2d 00 - 15 00 02 2e 00 - 15 00 02 2f 00 - 15 00 02 30 00 - 15 00 02 31 00 - 15 00 02 32 00 - 15 00 02 33 00 - 15 00 02 34 03 - 15 00 02 35 00 - 15 00 02 36 00 - 15 00 02 37 00 - 15 00 02 38 96 - 15 00 02 39 00 - 15 00 02 3a 00 - 15 00 02 3b 00 - 15 00 02 3c 00 - 15 00 02 3d 00 - 15 00 02 3e 00 - 15 00 02 3f 00 - 15 00 02 40 00 - 15 00 02 41 00 - 15 00 02 42 00 - 15 00 02 43 00 - 15 00 02 44 00 - 15 00 02 50 00 - 15 00 02 51 23 - 15 00 02 52 45 - 15 00 02 53 67 - 15 00 02 54 89 - 15 00 02 55 AB - 15 00 02 56 01 - 15 00 02 57 23 - 15 00 02 58 45 - 15 00 02 59 67 - 15 00 02 5a 89 - 15 00 02 5b AB - 15 00 02 5c CD - 15 00 02 5d EF - 15 00 02 5e 00 - 15 00 02 5f 08 - 15 00 02 60 08 - 15 00 02 61 06 - 15 00 02 62 06 - 15 00 02 63 01 - 15 00 02 64 01 - 15 00 02 65 00 - 15 00 02 66 00 - 15 00 02 67 02 - 15 00 02 68 15 - 15 00 02 69 15 - 15 00 02 6a 14 - 15 00 02 6b 14 - 15 00 02 6c 0D - 15 00 02 6d 0D - 15 00 02 6e 0C - 15 00 02 6f 0C - 15 00 02 70 0F - 15 00 02 71 0F - 15 00 02 72 0E - 15 00 02 73 0E - 15 00 02 74 02 - 15 00 02 75 08 - 15 00 02 76 08 - 15 00 02 77 06 - 15 00 02 78 06 - 15 00 02 79 01 - 15 00 02 7a 01 - 15 00 02 7b 00 - 15 00 02 7c 00 - 15 00 02 7d 02 - 15 00 02 7e 15 - 15 00 02 7f 15 - 15 00 02 80 14 - 15 00 02 81 14 - 15 00 02 82 0D - 15 00 02 83 0D - 15 00 02 84 0C - 15 00 02 85 0C - 15 00 02 86 0F - 15 00 02 87 0F - 15 00 02 88 0E - 15 00 02 89 0E - 15 00 02 8A 02 - 39 00 04 FF 98 81 04 - 15 00 02 C5 3A - 15 00 02 6E 2B - 15 00 02 6F 37 - 15 00 02 3A 24 - 15 00 02 8D 1A - 15 00 02 87 BA - 15 00 02 B2 D1 - 15 00 02 88 0B - 15 00 02 38 01 - 15 00 02 39 00 - 15 00 02 B5 02 - 15 00 02 31 25 - 15 00 02 3B 98 - 39 00 04 FF 98 81 01 - 15 00 02 22 0A - 15 00 02 31 00 - 15 00 02 53 3D - 15 00 02 55 3D - 15 00 02 50 85 - 15 00 02 51 80 - 15 00 02 60 06 - 15 00 02 62 20 - 15 00 02 A0 00 - 15 00 02 A1 21 - 15 00 02 A2 35 - 15 00 02 A3 19 - 15 00 02 A4 1E - 15 00 02 A5 33 - 15 00 02 A6 27 - 15 00 02 A7 26 - 15 00 02 A8 AF - 15 00 02 A9 1B - 15 00 02 AA 27 - 15 00 02 AB 8D - 15 00 02 AC 1A - 15 00 02 AD 1B - 15 00 02 AE 50 - 15 00 02 AF 26 - 15 00 02 B0 2B - 15 00 02 B1 54 - 15 00 02 B2 5E - 15 00 02 B3 23 - 15 00 02 C0 00 - 15 00 02 C1 21 - 15 00 02 C2 35 - 15 00 02 C3 19 - 15 00 02 C4 1E - 15 00 02 C5 33 - 15 00 02 C6 27 - 15 00 02 C7 26 - 15 00 02 C8 AF - 15 00 02 C9 1B - 15 00 02 CA 27 - 15 00 02 CB 8D - 15 00 02 CC 1A - 15 00 02 CD 1B - 15 00 02 CE 50 - 15 00 02 CF 26 - 15 00 02 D0 2B - 15 00 02 D1 54 - 15 00 02 D2 5E - 15 00 02 D3 23 - 39 00 04 FF 98 81 00 - 15 78 01 11 - 15 05 01 29 - ]; + panel-exit-sequence = [ + 05 00 01 28 + 05 00 01 10 + ]; - panel-exit-sequence = [ - 05 00 01 28 - 05 00 01 10 - ]; - - disp_timings1: display-timings { - native-mode = <&dsi1_timing0>; - dsi1_timing0: timing0 { - clock-frequency = <69000000>; - hactive = <800>; - vactive = <1280>; - hfront-porch = <32>; - hsync-len = <20>; - hback-porch = <20>; - vfront-porch = <16>; - vsync-len = <5>; - vback-porch = <12>; - hsync-active = <0>; - vsync-active = <0>; - de-active = <0>; - pixelclk-active = <1>; - }; - }; + disp_timings1: display-timings { + native-mode = <&dsi1_timing0>; + dsi1_timing0: timing0 { + clock-frequency = <132000000>; + hactive = <1080>; + vactive = <1920>; + hfront-porch = <15>; + hsync-len = <2>; + hback-porch = <30>; + vfront-porch = <15>; + vsync-len = <2>; + vback-porch = <15>; + hsync-active = <0>; + vsync-active = <0>; + de-active = <0>; + pixelclk-active = <1>; + }; + }; ports { #address-cells = <1>; @@ -940,7 +1087,28 @@ status = "okay"; }; +&hdmi { + status = "okay"; + rockchip,phy-table = + <92812500 0x8009 0x0000 0x0270>, + <165000000 0x800b 0x0000 0x026d>, + <185625000 0x800b 0x0000 0x01ed>, + <297000000 0x800b 0x0000 0x01ad>, + <594000000 0x8029 0x0000 0x0088>, + <000000000 0x0000 0x0000 0x0000>; +}; +&hdmi_in_vp0 { + status = "okay"; +}; + +&hdmi_in_vp1 { + status = "disabled"; +}; + +&hdmi_sound { + status = "okay"; +}; &i2c0 { status = "okay"; @@ -954,7 +1122,6 @@ regulator-min-microvolt = <712500>; regulator-max-microvolt = <1390000>; regulator-init-microvolt = <900000>; - regulator-initial-mode = <1>; regulator-ramp-delay = <2300>; fcs,suspend-voltage-selector = <1>; regulator-boot-on; @@ -1116,8 +1283,8 @@ vccio_acodec: LDO_REG4 { regulator-always-on; regulator-boot-on; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; regulator-name = "vccio_acodec"; regulator-state-mem { regulator-off-in-suspend; @@ -1274,6 +1441,12 @@ &i2s1m0_sdo0>; }; +&i2s3_2ch { + pinctrl-0 = <&i2s3m0_sclk &i2s3m0_lrck &i2s3m0_sdi &i2s3m0_sdo>; + rockchip,bclk-fs = <32>; + status = "disabled"; +}; + &iep { status = "okay"; }; @@ -1309,6 +1482,12 @@ }; &pinctrl { + + headphone { + hp_det: hp-det { + rockchip,pins = <3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; mxc6655xa { mxc6655xa_irq_gpio: mxc6655xa_irq_gpio { @@ -1348,8 +1527,7 @@ sdio-pwrseq { wifi_enable_h: wifi-enable-h { - rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; - //WIFI_REG_ON_H_GPIO2_B1 + rockchip,pins = <3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>; }; }; @@ -1398,10 +1576,6 @@ }; &pwm4 { - status = "okay"; -}; - -&pwm6 { status = "okay"; }; @@ -1544,7 +1718,10 @@ status = "okay"; }; - +&route_hdmi { + status = "okay"; + connect = <&vp0_out_hdmi>; +}; &saradc { status = "okay"; @@ -1641,15 +1818,6 @@ }; &usbhost_dwc3 { -// phys = <&u2phy0_host>; -// phy-names = "usb2-phy"; -// maximum-speed = "high-speed"; -// snps,dis_u2_susphy_quirk; - status = "okay"; -}; - -&combphy1_usq { -// rockchip,dis-u3otg1-port; status = "okay"; }; @@ -1682,8 +1850,8 @@ &vop { status = "okay"; - assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; - assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; + assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>, <&cru DCLK_VOP2>; + assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>, <&cru PLL_GPLL>; }; &vop_mmu { diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts index 51f93da..3df954f 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts @@ -11,7 +11,7 @@ memory { device_type = "memory"; reg = <0x0 0x03880000 0x0 0x04b80000>, - <0x0 0x08400000 0x0 0x77c00000>; + <0x0 0x0a200000 0x0 0x75e00000>; }; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts index 00c28f3..c505c37 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts @@ -6,3 +6,15 @@ #include "rk3568-evb1-ddr4-v10.dtsi" #include "rk3568-android.dtsi" + +&bt_sco { + status = "okay"; +}; + +&bt_sound { + status = "okay"; +}; + +&i2s3_2ch { + status = "okay"; +}; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi index 0cb57e9..f45ce09 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi @@ -15,13 +15,6 @@ model = "Rockchip RK3568 EVB1 DDR4 V10 Board"; compatible = "rockchip,rk3568-evb1-ddr4-v10", "rockchip,rk3568"; - rk_headset: rk-headset { - compatible = "rockchip_headset"; - headset_gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>; - pinctrl-names = "default"; - pinctrl-0 = <&hp_det>; - }; - vcc2v5_sys: vcc2v5-ddr { compatible = "regulator-fixed"; regulator-name = "vcc2v5-sys"; @@ -82,7 +75,7 @@ regulator-max-microvolt = <3300000>; vin-supply = <&vcc5v0_sys>; }; - +#if 0 vcc_camera: vcc-camera-regulator { compatible = "regulator-fixed"; gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; @@ -93,6 +86,106 @@ regulator-always-on; regulator-boot-on; }; +#endif + + ndj_io_init { + compatible = "nk_io_control"; + pinctrl-names = "default"; + pinctrl-0 = <&nk_io_gpio>; + + //gpio_op0 = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>; + + vcc_5v { + gpio_num = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>; //VCC5_IO_EN_GPIO1_A4_3V3 + gpio_function = <0>; + }; + + vcc_12v { + gpio_num = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; //VCC12_IO_EN_GPIO0_C7_3V3 + gpio_function = <0>; + }; + + hub_host2_rst { + gpio_num = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>; //HUB_RST_GPIO4_D2_3V3 + gpio_function = <3>; + }; + + hub_host3 { + gpio_num = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>; //HOST3_EN_GPIO4_B2_1V8 + gpio_function = <0>; + }; + + wake_4g { + gpio_num = <&gpio1 RK_PB1 GPIO_ACTIVE_LOW>; //4G_WAKEUP_GPIO01_B1_3V3 + gpio_function = <0>; + }; + + air_mode_4g { + gpio_num = <&gpio1 RK_PB0 GPIO_ACTIVE_LOW>; //4G_AIR_MODE_GPIO01_B0_3V3 + gpio_function = <0>; + }; + + reset_4g { + gpio_num = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; //4G_RST_GPIO01_B2_3V3 + gpio_function = <3>; + }; + + en_4g { + gpio_num = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>; //4G_PWREN_H_GPIO0_C6 + gpio_function = <0>; + }; + + hp_en { + gpio_num = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;//HP_EN_GPIO3_A6_3V3 + gpio_function = <0>; + }; + + wifi_power_en { + gpio_num = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>; //WIFI_PWREN_GPIO3_C6_1V8 + gpio_function = <0>; + }; + #if 0 + do1 { + gpio_num = <&gpio1 RK_PD0 GPIO_ACTIVE_LOW>; + gpio_function = <0>; + }; + + do2 { + gpio_num = <&gpio1 RK_PD2 GPIO_ACTIVE_HIGH>; + gpio_function = <0>; + }; + + do3 { + gpio_num = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>; + gpio_function = <0>; + }; + + do4 { + gpio_num = <&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>; + gpio_function = <0>; + }; + + do5 { + gpio_num = <&gpio2 RK_PD6 GPIO_ACTIVE_LOW>; + gpio_function = <0>; + }; + + do6 { + gpio_num = <&gpio2 RK_PD7 GPIO_ACTIVE_LOW>; + gpio_function = <0>; + }; + + do7 { + gpio_num = <&gpio3 RK_PA0 GPIO_ACTIVE_LOW>; + gpio_function = <0>; + }; + + di1 { + gpio_num = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>; + gpio_function = <1>; + }; + #endif +}; }; &combphy0_us { @@ -108,11 +201,11 @@ }; &csi2_dphy_hw { - status = "okay"; + status = "disabled"; }; &csi2_dphy0 { - status = "okay"; + status = "disabled"; ports { #address-cells = <1>; @@ -156,7 +249,7 @@ * when dsi0 is enabled */ &dsi0 { - status = "okay"; + status = "disabled"; }; &dsi0_in_vp0 { @@ -164,7 +257,7 @@ }; &dsi0_in_vp1 { - status = "okay"; + status = "disabled"; }; &dsi0_panel { @@ -232,14 +325,14 @@ rx_delay = <0x2f>; phy-handle = <&rgmii_phy0>; - status = "okay"; + status = "disabled"; }; &gmac1 { phy-mode = "rgmii"; clock_in_out = "output"; - snps,reset-gpio = <&gpio2 RK_PD1 GPIO_ACTIVE_LOW>; + snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>; snps,reset-active-low; /* Reset time is 20ms, 100ms for rtl8211f */ snps,reset-delays-us = <0 20000 100000>; @@ -271,7 +364,7 @@ }; &i2c4 { - status = "okay"; + status = "disabled"; gc8034: gc8034@37 { compatible = "galaxycore,gc8034"; status = "okay"; @@ -317,7 +410,7 @@ }; }; ov5695: ov5695@36 { - status = "okay"; + status = "disabled"; compatible = "ovti,ov5695"; reg = <0x36>; clocks = <&cru CLK_CIF_OUT>; @@ -355,7 +448,7 @@ }; &video_phy0 { - status = "okay"; + status = "disabled"; }; &video_phy1 { @@ -397,14 +490,44 @@ rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; }; }; + + nk_io_init{ + nk_io_gpio: nk-io-gpio{ + rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>, + <0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>, + <0 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>, + <4 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>, + <4 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>, + <1 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>, + <0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>, + <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>, + <1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>, + <1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>, + <2 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>,//93 SPI2_CS0_M1_3V3 + <2 RK_PD6 RK_FUNC_GPIO &pcfg_pull_none>,//94 SPI2_MOSI_M1_3V3 + <2 RK_PD7 RK_FUNC_GPIO &pcfg_pull_none>,//95 SPI2_MISO_M1_3V3 + <3 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>,//96 SPI2_CLK_M1_3V3 + <0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&rk809_sound { + hp-det-gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>; }; &rkisp { - status = "okay"; + status = "disabled"; }; &rkisp_mmu { - status = "okay"; + status = "disabled"; }; &rkisp_vir0 { @@ -422,7 +545,7 @@ }; &route_dsi0 { - status = "okay"; + status = "disabled"; connect = <&vp1_out_dsi0>; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi index 55caf89..e73325e 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi @@ -72,6 +72,13 @@ }; }; +&bt_sound { + status = "disabled"; + simple-audio-card,cpu { + sound-dai = <&i2s2_2ch>; + }; +}; + &combphy0_us { status = "okay"; }; @@ -219,6 +226,12 @@ status = "disabled"; }; +&i2s2_2ch { + pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>; + rockchip,bclk-fs = <32>; + status = "disabled"; +}; + &mdio1 { qsgmii_phy0: phy@0 { compatible = "ethernet-phy-id001c.c942", "ethernet-phy-ieee802.3-c22"; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi index fb47739..22617ca 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi @@ -84,6 +84,13 @@ }; }; +&bt_sound { + status = "disabled"; + simple-audio-card,cpu { + sound-dai = <&i2s2_2ch>; + }; +}; + &combphy0_us { status = "okay"; }; @@ -356,6 +363,12 @@ status = "disabled"; }; +&i2s2_2ch { + pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>; + rockchip,bclk-fs = <32>; + status = "disabled"; +}; + &mdio0 { sgmii_phy: phy@1 { compatible = "ethernet-phy-ieee802.3-c22"; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi index 4452111..f268186 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi @@ -50,6 +50,13 @@ }; }; +&bt_sound { + status = "disabled"; + simple-audio-card,cpu { + sound-dai = <&i2s2_2ch>; + }; +}; + &combphy0_us { status = "okay"; }; @@ -235,6 +242,12 @@ /delete-node/ mxc6655xa@15; }; +&i2s2_2ch { + pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>; + rockchip,bclk-fs = <32>; + status = "disabled"; +}; + &csi2_dphy_hw { status = "okay"; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi index 5623aa8..c7e3096 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi @@ -5,6 +5,13 @@ */ / { + aliases { + mmc0 = &sdhci; + mmc1 = &sdmmc0; + mmc2 = &sdmmc1; + mmc3 = &sdmmc2; + }; + chosen: chosen { bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait"; }; @@ -37,27 +44,6 @@ <0x0 0xfd90e000 0x0 0x1000>, <0x0 0xfd90f000 0x0 0x1000>; }; - - rk809_sound: rk809-sound { - status = "okay"; - compatible = "simple-audio-card"; - simple-audio-card,format = "i2s"; - simple-audio-card,hp-det-gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>; - simple-audio-card,name = "rockchip,rk809-codec"; - simple-audio-card,widgets = "Headphones", "Headphones Jack"; - simple-audio-card,mclk-fs = <256>; - simple-audio-card,cpu { - sound-dai = <&i2s1_8ch>; - }; - simple-audio-card,codec { - sound-dai = <&rk809_codec>; - }; - }; -}; - -&hdmi_sound { - status = "okay"; - rockchip,jack-det; }; &reserved_memory { @@ -69,25 +55,6 @@ ftrace-size = <0x00000>; pmsg-size = <0x50000>; }; -}; - -&rk809_codec { - #sound-dai-cells = <0>; - compatible = "rockchip,rk809-codec", "rockchip,rk817-codec"; - clocks = <&cru I2S1_MCLKOUT>; - clock-names = "mclk"; - assigned-clocks = <&cru I2S1_MCLKOUT>, <&cru I2S1_MCLK_TX_IOE>; - assigned-clock-rates = <12288000>; - assigned-clock-parents = <&cru I2S1_MCLKOUT_TX>, <&cru I2S1_MCLKOUT_TX>; - pinctrl-names = "default"; - pinctrl-0 = <&i2s1m0_mclk &hp_det>; - hp-volume = <20>; - spk-volume = <3>; - status = "okay"; -}; - -&rk_headset { - status = "disabled"; }; &rng { diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi index 16e0539..8a1dc80 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi @@ -35,13 +35,23 @@ compatible = "simple-audio-card"; simple-audio-card,format = "i2s"; simple-audio-card,mclk-fs = <256>; - simple-audio-card,name = "rockchip,i2s1-sound"; + simple-audio-card,name = "rockchip-i2s1"; simple-audio-card,cpu { sound-dai = <&i2s1_8ch>; }; simple-audio-card,codec { sound-dai = <&es8311>; }; + }; + + rk618_hdmi_sound: rk618-hdmi-sound { + status = "okay"; + compatible = "rockchip,hdmi"; + rockchip,mclk-fs = <128>; + rockchip,card-name = "rk618-hdmi"; + rockchip,cpu = <&spdif_8ch>; + rockchip,codec = <&rk618_hdmi>; + rockchip,jack-det; }; vcc2v5_sys: vcc2v5-ddr { @@ -230,7 +240,7 @@ status = "okay"; }; - hdmi { + rk618_hdmi: hdmi { compatible = "rockchip,rk618-hdmi"; clocks = <&clock HDMI_CLK>; clock-names = "hdmi"; @@ -238,6 +248,8 @@ assigned-clock-parents = <&clock VIF0_CLK>; interrupt-parent = <&gpio0>; interrupts = <8 IRQ_TYPE_LEVEL_HIGH>; + rockchip,format = "spdif"; + #sound-dai-cells = <0>; status = "okay"; ports { @@ -420,6 +432,20 @@ status = "okay"; }; +&spdif_out { + status = "disabled"; +}; + +&spdif_sound { + status = "disabled"; +}; + +&spdif_8ch { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&spdifm1_tx>; +}; + &pinctrl { rk618 { rk618_reset: rk618-reeset { diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi index 94b0e27..c82fbef 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi @@ -42,24 +42,19 @@ }; hdmi_sound: hdmi-sound { - compatible = "simple-audio-card"; - simple-audio-card,format = "i2s"; - simple-audio-card,mclk-fs = <128>; - simple-audio-card,name = "hdmi-sound"; status = "okay"; - - simple-audio-card,cpu { - sound-dai = <&i2s0_8ch>; - }; - simple-audio-card,codec { - sound-dai = <&hdmi>; - }; + compatible = "rockchip,hdmi"; + rockchip,mclk-fs = <128>; + rockchip,card-name = "rockchip-hdmi0"; + rockchip,cpu = <&i2s0_8ch>; + rockchip,codec = <&hdmi>; + rockchip,jack-det; }; - spdif-sound { + spdif_sound: spdif-sound { status = "okay"; compatible = "simple-audio-card"; - simple-audio-card,name = "ROCKCHIP,SPDIF"; + simple-audio-card,name = "ROCKCHIP-SPDIF"; simple-audio-card,cpu { sound-dai = <&spdif_8ch>; }; diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi old mode 100755 new mode 100644 index 9b53dab..32a4478 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi @@ -22,7 +22,6 @@ #address-cells = <2>; #size-cells = <2>; - aliases { csi2dphy0 = &csi2_dphy0; csi2dphy1 = &csi2_dphy1; @@ -127,12 +126,14 @@ opp-shared; mbist-vmin = <825000 900000 950000>; - nvmem-cells = <&cpu_leakage>, <&core_pvtm>, <&mbist_vmin>; - nvmem-cell-names = "leakage", "pvtm", "mbist-vmin"; + nvmem-cells = <&cpu_leakage>, <&core_pvtm>, <&mbist_vmin>, <&cpu_opp_info>; + nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info"; + rockchip,max-volt = <1150000>; rockchip,pvtm-voltage-sel = < 0 84000 0 - 84001 91000 1 - 91001 100000 2 + 84001 87000 1 + 87001 91000 2 + 91001 100000 3 >; rockchip,pvtm-freq = <408000>; rockchip,pvtm-volt = <900000>; @@ -147,31 +148,22 @@ rockchip,low-temp = <0>; rockchip,low-temp-adjust-volt = < /* MHz MHz uV */ - 0 1608 75000 + 0 1992 75000 >; opp-408000000 { opp-hz = /bits/ 64 <408000000>; opp-microvolt = <850000 850000 1150000>; - opp-microvolt-L0 = <850000 850000 1150000>; - opp-microvolt-L1 = <825000 825000 1150000>; - opp-microvolt-L2 = <825000 825000 1150000>; clock-latency-ns = <40000>; }; opp-600000000 { opp-hz = /bits/ 64 <600000000>; - opp-microvolt = <850000 825000 1150000>; - opp-microvolt-L0 = <850000 850000 1150000>; - opp-microvolt-L1 = <825000 825000 1150000>; - opp-microvolt-L2 = <825000 825000 1150000>; + opp-microvolt = <850000 850000 1150000>; clock-latency-ns = <40000>; }; opp-816000000 { opp-hz = /bits/ 64 <816000000>; opp-microvolt = <850000 850000 1150000>; - opp-microvolt-L0 = <850000 850000 1150000>; - opp-microvolt-L1 = <825000 825000 1150000>; - opp-microvolt-L2 = <825000 825000 1150000>; clock-latency-ns = <40000>; opp-suspend; }; @@ -179,40 +171,45 @@ opp-hz = /bits/ 64 <1104000000>; opp-microvolt = <900000 900000 1150000>; opp-microvolt-L0 = <900000 900000 1150000>; - opp-microvolt-L1 = <825000 825000 1150000>; - opp-microvolt-L2 = <825000 825000 1150000>; + opp-microvolt-L1 = <850000 850000 1150000>; + opp-microvolt-L2 = <850000 850000 1150000>; + opp-microvolt-L3 = <850000 850000 1150000>; clock-latency-ns = <40000>; }; opp-1416000000 { opp-hz = /bits/ 64 <1416000000>; - opp-microvolt = <1000000 1000000 1150000>; - opp-microvolt-L0 = <1000000 1000000 1150000>; - opp-microvolt-L1 = <925000 925000 1150000>; - opp-microvolt-L2 = <925000 925000 1150000>; + opp-microvolt = <1025000 1025000 1150000>; + opp-microvolt-L0 = <1025000 1025000 1150000>; + opp-microvolt-L1 = <975000 975000 1150000>; + opp-microvolt-L2 = <950000 950000 1150000>; + opp-microvolt-L3 = <925000 925000 1150000>; clock-latency-ns = <40000>; }; opp-1608000000 { opp-hz = /bits/ 64 <1608000000>; - opp-microvolt = <1075000 1075000 1150000>; - opp-microvolt-L0 = <1075000 1075000 1150000>; - opp-microvolt-L1 = <1000000 1000000 1150000>; - opp-microvolt-L2 = <1000000 1000000 1150000>; + opp-microvolt = <1100000 1100000 1150000>; + opp-microvolt-L0 = <1100000 1100000 1150000>; + opp-microvolt-L1 = <1050000 1050000 1150000>; + opp-microvolt-L2 = <1025000 1025000 1150000>; + opp-microvolt-L3 = <1000000 1000000 1150000>; clock-latency-ns = <40000>; }; opp-1800000000 { opp-hz = /bits/ 64 <1800000000>; - opp-microvolt = <1125000 1125000 1150000>; - opp-microvolt-L0 = <1125000 1125000 1150000>; - opp-microvolt-L1 = <1050000 1050000 1150000>; - opp-microvolt-L2 = <1050000 1050000 1150000>; + opp-microvolt = <1150000 1150000 1150000>; + opp-microvolt-L0 = <1150000 1150000 1150000>; + opp-microvolt-L1 = <1100000 1100000 1150000>; + opp-microvolt-L2 = <1075000 1075000 1150000>; + opp-microvolt-L3 = <1050000 1050000 1150000>; clock-latency-ns = <40000>; }; opp-1992000000 { opp-hz = /bits/ 64 <1992000000>; opp-microvolt = <1150000 1150000 1150000>; opp-microvolt-L0 = <1150000 1150000 1150000>; - opp-microvolt-L1 = <1100000 1100000 1150000>; - opp-microvolt-L2 = <1075000 1075000 1150000>; + opp-microvolt-L1 = <1150000 1150000 1150000>; + opp-microvolt-L2 = <1125000 1125000 1150000>; + opp-microvolt-L3 = <1100000 1100000 1150000>; clock-latency-ns = <40000>; }; }; @@ -254,7 +251,7 @@ logo,kernel = "logo_kernel.bmp"; logo,mode = "center"; charge_logo,mode = "center"; - connect = <&vp1_out_dsi1>; + connect = <&vp0_out_dsi1>; }; route_edp: route-edp { status = "disabled"; @@ -262,7 +259,7 @@ logo,kernel = "logo_kernel.bmp"; logo,mode = "center"; charge_logo,mode = "center"; - connect = <&vp1_out_edp>; + connect = <&vp0_out_edp>; }; route_hdmi: route-hdmi { status = "disabled"; @@ -270,7 +267,7 @@ logo,kernel = "logo_kernel.bmp"; logo,mode = "center"; charge_logo,mode = "center"; - connect = <&vp0_out_hdmi>; + connect = <&vp1_out_hdmi>; }; route_lvds: route-lvds { status = "disabled"; @@ -308,7 +305,7 @@ reg = <0x14>; #clock-cells = <1>; - rockchip,clk-init = <1416000000>; + rockchip,clk-init = <1104000000>; }; }; @@ -939,7 +936,7 @@ dmas = <&dmac0 0>, <&dmac0 1>; pinctrl-names = "default"; pinctrl-0 = <&uart0_xfer>; - status = "okay"; + status = "disabled"; }; pwm0: pwm@fdd70000 { @@ -1110,76 +1107,70 @@ compatible = "operating-points-v2"; mbist-vmin = <825000 900000 950000>; - nvmem-cells = <&npu_leakage>, <&core_pvtm>, <&mbist_vmin>; - nvmem-cell-names = "leakage", "pvtm", "mbist-vmin"; + nvmem-cells = <&npu_leakage>, <&core_pvtm>, <&mbist_vmin>, <&npu_opp_info>; + nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info"; + rockchip,max-volt = <1000000>; rockchip,temp-hysteresis = <5000>; rockchip,low-temp = <0>; rockchip,low-temp-adjust-volt = < /* MHz MHz uV */ - 0 700 50000 + 0 1000 50000 >; rockchip,pvtm-voltage-sel = < 0 84000 0 - 84001 91000 1 - 91001 100000 2 + 84001 87000 1 + 87001 91000 2 + 91001 100000 3 >; rockchip,pvtm-ch = <0 5>; opp-200000000 { opp-hz = /bits/ 64 <200000000>; opp-microvolt = <850000 850000 1000000>; - opp-microvolt-L0 = <850000 850000 1000000>; - opp-microvolt-L1 = <825000 825000 1000000>; - opp-microvolt-L2 = <825000 825000 1000000>; }; opp-300000000 { opp-hz = /bits/ 64 <297000000>; opp-microvolt = <850000 850000 1000000>; - opp-microvolt-L0 = <850000 850000 1000000>; - opp-microvolt-L1 = <825000 825000 1000000>; - opp-microvolt-L2 = <825000 825000 1000000>; }; opp-400000000 { opp-hz = /bits/ 64 <400000000>; opp-microvolt = <850000 850000 1000000>; - opp-microvolt-L0 = <850000 850000 1000000>; - opp-microvolt-L1 = <825000 825000 1000000>; - opp-microvolt-L2 = <825000 825000 1000000>; }; opp-600000000 { opp-hz = /bits/ 64 <600000000>; - opp-microvolt = <875000 875000 1000000>; - opp-microvolt-L0 = <875000 875000 1000000>; - opp-microvolt-L1 = <825000 825000 1000000>; - opp-microvolt-L2 = <825000 825000 1000000>; + opp-microvolt = <850000 850000 1000000>; }; opp-700000000 { opp-hz = /bits/ 64 <700000000>; - opp-microvolt = <900000 900000 1000000>; - opp-microvolt-L0 = <900000 900000 1000000>; + opp-microvolt = <875000 875000 1000000>; + opp-microvolt-L0 = <875000 875000 1000000>; opp-microvolt-L1 = <850000 850000 1000000>; opp-microvolt-L2 = <850000 850000 1000000>; + opp-microvolt-L3 = <850000 850000 1000000>; }; opp-800000000 { opp-hz = /bits/ 64 <800000000>; opp-microvolt = <925000 925000 1000000>; opp-microvolt-L0 = <925000 925000 1000000>; - opp-microvolt-L1 = <875000 875000 1000000>; + opp-microvolt-L1 = <900000 900000 1000000>; opp-microvolt-L2 = <875000 875000 1000000>; + opp-microvolt-L3 = <875000 875000 1000000>; }; opp-900000000 { opp-hz = /bits/ 64 <900000000>; opp-microvolt = <975000 975000 1000000>; opp-microvolt-L0 = <975000 975000 1000000>; - opp-microvolt-L1 = <925000 925000 1000000>; - opp-microvolt-L2 = <900000 900000 1000000>; + opp-microvolt-L1 = <950000 950000 1000000>; + opp-microvolt-L2 = <925000 925000 1000000>; + opp-microvolt-L3 = <900000 900000 1000000>; }; opp-1000000000 { opp-hz = /bits/ 64 <1000000000>; opp-microvolt = <1000000 1000000 1000000>; opp-microvolt-L0 = <1000000 1000000 1000000>; - opp-microvolt-L1 = <950000 950000 1000000>; - opp-microvolt-L2 = <925000 925000 1000000>; + opp-microvolt-L1 = <975000 975000 1000000>; + opp-microvolt-L2 = <950000 950000 1000000>; + opp-microvolt-L3 = <925000 925000 1000000>; status = "disabled"; }; }; @@ -1210,8 +1201,8 @@ opp-hz = /bits/ 64 <700000000>; opp-microvolt = <900000>; opp-microvolt-L0 = <900000>; - opp-microvolt-L1 = <850000>; - opp-microvolt-L2 = <850000>; + opp-microvolt-L1 = <875000>; + opp-microvolt-L2 = <875000>; }; opp-900000000 { opp-hz = /bits/ 64 <900000000>; @@ -1272,56 +1263,58 @@ compatible = "operating-points-v2"; mbist-vmin = <825000 900000 950000>; - nvmem-cells = <&gpu_leakage>, <&core_pvtm>, <&mbist_vmin>; - nvmem-cell-names = "leakage", "pvtm", "mbist-vmin"; + nvmem-cells = <&gpu_leakage>, <&core_pvtm>, <&mbist_vmin>, <&gpu_opp_info>; + nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info"; + rockchip,max-volt = <1000000>; + rockchip,temp-hysteresis = <5000>; + rockchip,low-temp = <0>; + rockchip,low-temp-adjust-volt = < + /* MHz MHz uV */ + 0 800 50000 + >; rockchip,pvtm-voltage-sel = < 0 84000 0 - 84001 91000 1 - 91001 100000 2 + 84001 87000 1 + 87001 91000 2 + 91001 100000 3 >; rockchip,pvtm-ch = <0 5>; opp-200000000 { opp-hz = /bits/ 64 <200000000>; - opp-microvolt = <850000>; - opp-microvolt-L0 = <850000>; - opp-microvolt-L1 = <825000>; - opp-microvolt-L2 = <825000>; + opp-microvolt = <850000 850000 1000000>; }; opp-300000000 { opp-hz = /bits/ 64 <300000000>; - opp-microvolt = <850000>; - opp-microvolt-L0 = <850000>; - opp-microvolt-L1 = <825000>; - opp-microvolt-L2 = <825000>; + opp-microvolt = <850000 850000 1000000>; }; opp-400000000 { opp-hz = /bits/ 64 <400000000>; - opp-microvolt = <850000>; - opp-microvolt-L0 = <850000>; - opp-microvolt-L1 = <825000>; - opp-microvolt-L2 = <825000>; + opp-microvolt = <850000 850000 1000000>; }; opp-600000000 { opp-hz = /bits/ 64 <600000000>; - opp-microvolt = <875000>; - opp-microvolt-L0 = <875000>; - opp-microvolt-L1 = <825000>; - opp-microvolt-L2 = <825000>; + opp-microvolt = <900000 900000 1000000>; + opp-microvolt-L0 = <900000 900000 1000000>; + opp-microvolt-L1 = <875000 875000 1000000>; + opp-microvolt-L2 = <850000 850000 1000000>; + opp-microvolt-L3 = <850000 850000 1000000>; }; opp-700000000 { opp-hz = /bits/ 64 <700000000>; - opp-microvolt = <950000>; - opp-microvolt-L0 = <950000>; - opp-microvolt-L1 = <900000>; - opp-microvolt-L2 = <850000>; + opp-microvolt = <950000 950000 1000000>; + opp-microvolt-L0 = <950000 950000 1000000>; + opp-microvolt-L1 = <925000 925000 1000000>; + opp-microvolt-L2 = <900000 900000 1000000>; + opp-microvolt-L3 = <875000 875000 1000000>; }; opp-800000000 { opp-hz = /bits/ 64 <800000000>; - opp-microvolt = <1000000>; - opp-microvolt-L0 = <1000000>; - opp-microvolt-L1 = <950000>; - opp-microvolt-L2 = <900000>; + opp-microvolt = <1000000 1000000 1000000>; + opp-microvolt-L0 = <1000000 1000000 1000000>; + opp-microvolt-L1 = <975000 975000 1000000>; + opp-microvolt-L2 = <950000 950000 1000000>; + opp-microvolt-L3 = <925000 925000 1000000>; }; }; @@ -1381,6 +1374,7 @@ clock-names = "aclk", "iface"; clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>; power-domains = <&power RK3568_PD_VPU>; + rockchip,shootdown-entire; #iommu-cells = <0>; status = "disabled"; }; @@ -1433,6 +1427,7 @@ clock-names = "aclk", "iface"; clocks = <&cru ACLK_JDEC>, <&cru HCLK_JDEC>; power-domains = <&power RK3568_PD_RGA>; + rockchip,shootdown-entire; #iommu-cells = <0>; status = "disabled"; }; @@ -1462,6 +1457,7 @@ clock-names = "aclk", "iface"; clocks = <&cru ACLK_JENC>, <&cru HCLK_JENC>; power-domains = <&power RK3568_PD_RGA>; + rockchip,shootdown-entire; #iommu-cells = <0>; status = "disabled"; }; @@ -1492,6 +1488,7 @@ clock-names = "aclk", "iface"; #iommu-cells = <0>; power-domains = <&power RK3568_PD_RGA>; + rockchip,shootdown-entire; //rockchip,disable-device-link-resume; status = "disabled"; }; @@ -1545,8 +1542,8 @@ opp-hz = /bits/ 64 <297000000>; opp-microvolt = <900000>; opp-microvolt-L0 = <900000>; - opp-microvolt-L1 = <850000>; - opp-microvolt-L2 = <850000>; + opp-microvolt-L1 = <875000>; + opp-microvolt-L2 = <875000>; }; opp-400000000 { opp-hz = /bits/ 64 <400000000>; @@ -1567,6 +1564,7 @@ clock-names = "aclk", "iface"; rockchip,disable-mmu-reset; rockchip,enable-cmd-retry; + rockchip,shootdown-entire; #iommu-cells = <0>; power-domains = <&power RK3568_PD_RKVENC>; status = "disabled"; @@ -1630,7 +1628,7 @@ opp-hz = /bits/ 64 <297000000>; opp-microvolt = <900000>; opp-microvolt-L0 = <900000>; - opp-microvolt-L1 = <850000>; + opp-microvolt-L1 = <875000>; }; opp-400000000 { opp-hz = /bits/ 64 <400000000>; @@ -1646,6 +1644,7 @@ clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>; clock-names = "aclk", "iface"; power-domains = <&power RK3568_PD_RKVDEC>; + rockchip,shootdown-entire; #iommu-cells = <0>; status = "disabled"; }; @@ -1740,7 +1739,7 @@ rockchip,grf = <&grf>; power-domains = <&power RK3568_PD_VI>; iommus = <&rkisp_mmu>; - rockchip,iq-feature = /bits/ 64 <0x3FBFFFE67FF>; + rockchip,iq-feature = /bits/ 64 <0x1BFBFFFE67FF>; status = "disabled"; }; @@ -1769,6 +1768,13 @@ status = "disabled"; }; + gmac_uio1: uio@fe010000 { + compatible = "rockchip,uio-gmac"; + reg = <0x0 0xfe010000 0x0 0x10000>; + rockchip,ethernet = <&gmac1>; + status = "disabled"; + }; + gmac1: ethernet@fe010000 { compatible = "rockchip,rk3568-gmac", "snps,dwmac-4.20a"; reg = <0x0 0xfe010000 0x0 0x10000>; @@ -1780,12 +1786,12 @@ <&cru SCLK_GMAC1_RX_TX>, <&cru CLK_MAC1_REFOUT>, <&cru ACLK_GMAC1>, <&cru PCLK_GMAC1>, <&cru SCLK_GMAC1_RX_TX>, <&cru CLK_GMAC1_PTP_REF>, - <&cru PCLK_XPCS>; + <&cru PCLK_XPCS>, <&cru CLK_XPCS_EEE>; clock-names = "stmmaceth", "mac_clk_rx", "mac_clk_tx", "clk_mac_refout", "aclk_mac", "pclk_mac", "clk_mac_speed", "ptp_ref", - "pclk_xpcs"; + "pclk_xpcs", "clk_xpcs_eee"; resets = <&cru SRST_A_GMAC1>; reset-names = "stmmaceth"; @@ -2006,7 +2012,8 @@ hdmi: hdmi@fe0a0000 { compatible = "rockchip,rk3568-dw-hdmi"; reg = <0x0 0xfe0a0000 0x0 0x20000>; - interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>; + interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "hdmi", "hdmi_wakeup"; clocks = <&cru PCLK_HDMI_HOST>, <&cru CLK_HDMI_SFR>, <&cru CLK_HDMI_CEC>, @@ -2325,8 +2332,9 @@ compatible = "operating-points-v2"; mbist-vmin = <825000 900000 950000>; - nvmem-cells = <&log_leakage>, <&core_pvtm>, <&mbist_vmin>; - nvmem-cell-names = "leakage", "pvtm", "mbist-vmin"; + nvmem-cells = <&log_leakage>, <&core_pvtm>, <&mbist_vmin>, <&dmc_opp_info>; + nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info"; + rockchip,max-volt = <1000000>; rockchip,temp-hysteresis = <5000>; rockchip,low-temp = <0>; rockchip,low-temp-adjust-volt = < @@ -2345,9 +2353,9 @@ opp-1560000000 { opp-hz = /bits/ 64 <1560000000>; - opp-microvolt = <900000>; - opp-microvolt-L0 = <900000>; - opp-microvolt-L1 = <850000>; + opp-microvolt = <900000 900000 1000000>; + opp-microvolt-L0 = <900000 900000 1000000>; + opp-microvolt-L1 = <875000 875000 1000000>; }; }; @@ -2398,7 +2406,7 @@ reg-names = "pcie-dbi", "pcie-apb"; resets = <&cru SRST_PCIE20_POWERUP>; reset-names = "pipe"; - status = "okay"; + status = "disabled"; pcie2x1_intc: legacy-interrupt-controller { interrupt-controller; @@ -2517,6 +2525,13 @@ }; }; + gmac_uio0: uio@fe2a0000 { + compatible = "rockchip,uio-gmac"; + reg = <0x0 0xfe2a0000 0x0 0x10000>; + rockchip,ethernet = <&gmac0>; + status = "disabled"; + }; + gmac0: ethernet@fe2a0000 { compatible = "rockchip,rk3568-gmac", "snps,dwmac-4.20a"; reg = <0x0 0xfe2a0000 0x0 0x10000>; @@ -2528,12 +2543,12 @@ <&cru SCLK_GMAC0_RX_TX>, <&cru CLK_MAC0_REFOUT>, <&cru ACLK_GMAC0>, <&cru PCLK_GMAC0>, <&cru SCLK_GMAC0_RX_TX>, <&cru CLK_GMAC0_PTP_REF>, - <&cru PCLK_XPCS>; + <&cru PCLK_XPCS>, <&cru CLK_XPCS_EEE>; clock-names = "stmmaceth", "mac_clk_rx", "mac_clk_tx", "clk_mac_refout", "aclk_mac", "pclk_mac", "clk_mac_speed", "ptp_ref", - "pclk_xpcs"; + "pclk_xpcs", "clk_xpcs_eee"; resets = <&cru SRST_A_GMAC0>; reset-names = "stmmaceth"; @@ -2718,6 +2733,18 @@ }; tsadc_trim_base: tsadc-trim-base@32 { reg = <0x32 0x1>; + }; + cpu_opp_info: cpu-opp-info@36 { + reg = <0x36 0x6>; + }; + gpu_opp_info: gpu-opp-info@3c { + reg = <0x3c 0x6>; + }; + npu_opp_info: npu-opp-info@42 { + reg = <0x42 0x6>; + }; + dmc_opp_info: dmc-opp-info@48 { + reg = <0x48 0x6>; }; }; @@ -3112,7 +3139,7 @@ dmas = <&dmac0 2>, <&dmac0 3>; pinctrl-names = "default"; pinctrl-0 = <&uart1m0_xfer>; - status = "okay"; + status = "disabled"; }; uart2: serial@fe660000 { diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi index e86cf3e..0b05c46 100644 --- a/kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi @@ -85,7 +85,7 @@ /delete-node/ opp-1560000000; opp-780000000 { opp-hz = /bits/ 64 <780000000>; - opp-microvolt = <850000>; + opp-microvolt = <875000>; }; }; diff --git a/kernel/arch/arm64/configs/px30_linux_defconfig b/kernel/arch/arm64/configs/px30_linux_defconfig index b71b414..d3b7a7f 100644 --- a/kernel/arch/arm64/configs/px30_linux_defconfig +++ b/kernel/arch/arm64/configs/px30_linux_defconfig @@ -365,9 +365,6 @@ CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP=y CONFIG_MEMORY=y CONFIG_IIO=y -CONFIG_IIO_BUFFER=y -CONFIG_IIO_KFIFO_BUF=y -CONFIG_IIO_TRIGGER=y CONFIG_ROCKCHIP_SARADC=y CONFIG_SENSORS_ISL29018=y CONFIG_SENSORS_TSL2563=y @@ -403,6 +400,8 @@ CONFIG_SQUASHFS=y CONFIG_PSTORE=y CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_PMSG=y +CONFIG_PSTORE_FTRACE=y CONFIG_PSTORE_RAM=y CONFIG_NFS_FS=y CONFIG_NFS_V3_ACL=y diff --git a/kernel/arch/arm64/configs/rk3326_linux.config b/kernel/arch/arm64/configs/rk3326_linux.config index 02bdbca..51e7dca 100644 --- a/kernel/arch/arm64/configs/rk3326_linux.config +++ b/kernel/arch/arm64/configs/rk3326_linux.config @@ -1,26 +1,13 @@ # CONFIG_ETHERNET is not set CONFIG_MD=y -CONFIG_PSTORE=y # CONFIG_ROCKCHIP_ANALOGIX_DP is not set -CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS=y -CONFIG_SND_SOC_ROCKCHIP_PDM=y -CONFIG_USB_CONFIGFS_F_MTP=y CONFIG_VIDEO_GC2155=y CONFIG_VIDEO_ROCKCHIP_CIF=y # CONFIG_BCACHE is not set # CONFIG_BLK_DEV_DM is not set # CONFIG_BLK_DEV_MD is not set -# CONFIG_DPM_WATCHDOG is not set -CONFIG_PSTORE_CONSOLE=y -# CONFIG_PSTORE_FTRACE is not set -# CONFIG_PSTORE_PMSG is not set -CONFIG_PSTORE_RAM=y -CONFIG_REED_SOLOMON=y -CONFIG_REED_SOLOMON_DEC8=y -CONFIG_REED_SOLOMON_ENC8=y +CONFIG_ROCKCHIP_CIF_USE_DUMMY_BUF=y +# CONFIG_ROCKCHIP_CIF_USE_NONE_DUMMY_BUF is not set # CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y -# CONFIG_USB_CONFIGFS_F_PTP is not set -CONFIG_USB_F_MTP=y -CONFIG_ZLIB_DEFLATE=y diff --git a/kernel/arch/arm64/configs/rk3358_linux.config b/kernel/arch/arm64/configs/rk3358_linux.config index 4be7a7c..5884a7b 100644 --- a/kernel/arch/arm64/configs/rk3358_linux.config +++ b/kernel/arch/arm64/configs/rk3358_linux.config @@ -1,2 +1,15 @@ +# CONFIG_ETHERNET is not set CONFIG_LTE=y +CONFIG_MD=y +# CONFIG_ROCKCHIP_ANALOGIX_DP is not set +CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS=y +CONFIG_VIDEO_GC2155=y +CONFIG_VIDEO_ROCKCHIP_CIF=y +# CONFIG_BCACHE is not set +# CONFIG_BLK_DEV_DM is not set +# CONFIG_BLK_DEV_MD is not set CONFIG_LTE_RM310=y +CONFIG_ROCKCHIP_CIF_USE_DUMMY_BUF=y +# CONFIG_ROCKCHIP_CIF_USE_NONE_DUMMY_BUF is not set +# CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set +CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y diff --git a/kernel/arch/arm64/configs/rk3528_box.config b/kernel/arch/arm64/configs/rk3528_box.config new file mode 100644 index 0000000..7e1102d --- /dev/null +++ b/kernel/arch/arm64/configs/rk3528_box.config @@ -0,0 +1,65 @@ +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_BATTERY_CW2015 is not set +# CONFIG_CHARGER_BQ25700 is not set +# CONFIG_CPU_PX30 is not set +# CONFIG_CPU_RK3328 is not set +# CONFIG_CPU_RK3368 is not set +# CONFIG_CPU_RK3399 is not set +# CONFIG_CPU_RK3568 is not set +# CONFIG_CRYPTO_DEV_ROCKCHIP_V1 is not set +# CONFIG_CRYPTO_DEV_ROCKCHIP_V2 is not set +# CONFIG_DRM_ROCKCHIP_RK618 is not set +# CONFIG_DRM_ROCKCHIP_RK628 is not set +# CONFIG_FUSB_30X is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_LEDS_RGB13H is not set +# CONFIG_MALI_BIFROST is not set +# CONFIG_MALI_MIDGARD is not set +# CONFIG_REGULATOR_ACT8865 is not set +# CONFIG_REGULATOR_DIO5632 is not set +# CONFIG_REGULATOR_FAN53555 is not set +# CONFIG_REGULATOR_LP8752 is not set +# CONFIG_REGULATOR_MP8865 is not set +# CONFIG_REGULATOR_TPS65132 is not set +# CONFIG_REGULATOR_XZ3216 is not set +# CONFIG_RK_NAND is not set +# CONFIG_ROCKCHIP_ANALOGIX_DP is not set +# CONFIG_ROCKCHIP_CDN_DP is not set +# CONFIG_ROCKCHIP_CLK_BOOST is not set +# CONFIG_ROCKCHIP_DDRCLK_SIP is not set +# CONFIG_ROCKCHIP_DW_MIPI_DSI is not set +# CONFIG_ROCKCHIP_INNO_HDMI is not set +# CONFIG_ROCKCHIP_LVDS is not set +# CONFIG_ROCKCHIP_PLL_RK3066 is not set +# CONFIG_ROCKCHIP_PLL_RK3399 is not set +# CONFIG_ROCKCHIP_RGB is not set +# CONFIG_ROCKCHIP_RKNPU is not set +# CONFIG_ROCKCHIP_VOP is not set +# CONFIG_SENSOR_DEVICE is not set +# CONFIG_VIDEO_DW9714 is not set +# CONFIG_VIDEO_GC0312 is not set +# CONFIG_VIDEO_GC032A is not set +# CONFIG_VIDEO_GC2053 is not set +# CONFIG_VIDEO_GC2093 is not set +# CONFIG_VIDEO_GC2145 is not set +# CONFIG_VIDEO_GC2355 is not set +# CONFIG_VIDEO_GC2385 is not set +# CONFIG_VIDEO_GC4C33 is not set +# CONFIG_VIDEO_GC8034 is not set +# CONFIG_VIDEO_LT6911UXC is not set +# CONFIG_VIDEO_LT8619C is not set +# CONFIG_VIDEO_OV13850 is not set +# CONFIG_VIDEO_OV2680 is not set +# CONFIG_VIDEO_OV5648 is not set +# CONFIG_VIDEO_OV5695 is not set +# CONFIG_VIDEO_OV8858 is not set +# CONFIG_VIDEO_RK628_CSI is not set +# CONFIG_VIDEO_ROCKCHIP_ISP is not set +# CONFIG_VIDEO_ROCKCHIP_ISP1 is not set +# CONFIG_VIDEO_SGM3784 is not set +# CONFIG_VIDEO_TC35874X is not set +# CONFIG_VIDEO_VM149C is not set +CONFIG_VLAN_8021Q=y +# CONFIG_BRIDGE_VLAN_FILTERING is not set +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_VLAN_8021Q_MVRP is not set diff --git a/kernel/arch/arm64/configs/rockchip_defconfig b/kernel/arch/arm64/configs/rockchip_defconfig index 639f853..1dc96ba 100644 --- a/kernel/arch/arm64/configs/rockchip_defconfig +++ b/kernel/arch/arm64/configs/rockchip_defconfig @@ -675,6 +675,7 @@ CONFIG_SND_SOC_ES8316=y CONFIG_SND_SOC_ES8396=y CONFIG_SND_SOC_RK3328=y +CONFIG_SND_SOC_RK3528=y CONFIG_SND_SOC_RK817=y CONFIG_SND_SOC_RK_CODEC_DIGITAL=y CONFIG_SND_SOC_RT5640=y @@ -844,6 +845,7 @@ CONFIG_CPU_RK3328=y CONFIG_CPU_RK3368=y CONFIG_CPU_RK3399=y +CONFIG_CPU_RK3528=y CONFIG_CPU_RK3568=y CONFIG_ANDROID_VERSION=0x08000000 CONFIG_ROCKCHIP_PM_DOMAINS=y diff --git a/kernel/arch/arm64/configs/rockchip_linux_defconfig b/kernel/arch/arm64/configs/rockchip_linux_defconfig index f37d5dc..2efcace 100644 --- a/kernel/arch/arm64/configs/rockchip_linux_defconfig +++ b/kernel/arch/arm64/configs/rockchip_linux_defconfig @@ -4,10 +4,10 @@ # # -# Compiler: aarch64-linux-gnu-gcc (Linaro GCC 6.3-2017.05) 6.3.1 20170404 +# Compiler: aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621 # CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=60301 +CONFIG_GCC_VERSION=100301 CONFIG_CLANG_VERSION=0 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y @@ -28,11 +28,10 @@ CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="localhost" -CONFIG_SWAP=y +# CONFIG_SWAP is not set CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y -CONFIG_POSIX_MQUEUE=y -CONFIG_POSIX_MQUEUE_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y # CONFIG_USELIB is not set # CONFIG_AUDIT is not set @@ -67,15 +66,22 @@ # Timers subsystem # CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ_COMMON=y -# CONFIG_HZ_PERIODIC is not set -CONFIG_NO_HZ_IDLE=y +CONFIG_HZ_PERIODIC=y +# CONFIG_NO_HZ_IDLE is not set # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y +CONFIG_PREEMPT=y +CONFIG_PREEMPT_RT_BASE=y +CONFIG_PREEMPT_RT=y +CONFIG_HAVE_PREEMPT_LAZY=y +CONFIG_PREEMPT_LAZY=y # CONFIG_PREEMPT_NONE is not set -CONFIG_PREEMPT_VOLUNTARY=y -# CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT__LL is not set +# CONFIG_PREEMPT_RTB is not set +CONFIG_PREEMPT_RT_FULL=y +CONFIG_PREEMPT_COUNT=y # # CPU/Task time and stats accounting @@ -91,12 +97,15 @@ # # RCU Subsystem # -CONFIG_TREE_RCU=y +CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_BOOST_DELAY=500 CONFIG_BUILD_BIN2C=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y @@ -112,26 +121,17 @@ CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_CGROUPS=y -CONFIG_PAGE_COUNTER=y -CONFIG_MEMCG=y -# CONFIG_MEMCG_SWAP is not set -CONFIG_MEMCG_KMEM=y +# CONFIG_MEMCG is not set # CONFIG_BLK_CGROUP is not set -CONFIG_CGROUP_SCHED=y -CONFIG_FAIR_GROUP_SCHED=y -CONFIG_CFS_BANDWIDTH=y -# CONFIG_RT_GROUP_SCHED is not set +# CONFIG_CGROUP_SCHED is not set # CONFIG_CGROUP_PIDS is not set # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y -CONFIG_CGROUP_CPUACCT=y -# CONFIG_CGROUP_PERF is not set -CONFIG_CGROUP_BPF=y +# CONFIG_CGROUP_CPUACCT is not set # CONFIG_CGROUP_DEBUG is not set -CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y @@ -185,8 +185,7 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_BASE_RELATIVE=y -CONFIG_BPF_SYSCALL=y -# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +# CONFIG_BPF_SYSCALL is not set # CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_RSEQ=y @@ -198,23 +197,17 @@ # # Kernel Performance Events And Counters # -CONFIG_PERF_EVENTS=y -# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# CONFIG_PERF_EVENTS is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_SYSFS=y CONFIG_SLUB_DEBUG=y -# CONFIG_SLUB_MEMCG_SYSFS_ON is not set # CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set CONFIG_SLUB=y -# CONFIG_SLOB is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set -CONFIG_SLUB_CPU_PARTIAL=y CONFIG_SYSTEM_DATA_VERIFICATION=y -CONFIG_PROFILING=y -CONFIG_TRACEPOINTS=y +# CONFIG_PROFILING is not set CONFIG_ARM64=y CONFIG_64BIT=y CONFIG_MMU=y @@ -334,6 +327,7 @@ CONFIG_PCIE_DW_ROCKCHIP=y # CONFIG_PCIE_DW_DMATEST is not set # CONFIG_PCIE_DW_ROCKCHIP_EP is not set +CONFIG_PCIE_RK_THREADED_INIT=y # CONFIG_PCI_HISI is not set # CONFIG_PCIE_KIRIN is not set @@ -391,9 +385,9 @@ CONFIG_HOLES_IN_ZONE=y # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set -CONFIG_HZ_300=y -# CONFIG_HZ_1000 is not set -CONFIG_HZ=300 +# CONFIG_HZ_300 is not set +CONFIG_HZ_1000=y +CONFIG_HZ=1000 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y @@ -402,7 +396,6 @@ CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_HAVE_ARCH_PFN_VALID=y -CONFIG_HW_PERF_EVENTS=y CONFIG_SYS_SUPPORTS_HUGETLBFS=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y @@ -460,7 +453,6 @@ # CONFIG_SUSPEND_SKIP_SYNC is not set CONFIG_HAS_WAKELOCK=y CONFIG_WAKELOCK=y -# CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set @@ -489,15 +481,13 @@ # CPU Idle # CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_DT_IDLE_STATES=y # # ARM CPU Idle Drivers # -CONFIG_ARM_CPUIDLE=y +# CONFIG_ARM_CPUIDLE is not set # # CPU Frequency scaling @@ -507,13 +497,13 @@ CONFIG_CPU_FREQ_GOV_COMMON=y # CONFIG_CPU_FREQ_STAT is not set # CONFIG_CPU_FREQ_TIMES is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y @@ -554,30 +544,15 @@ CONFIG_ARM64_CRYPTO=y CONFIG_CRYPTO_SHA256_ARM64=y # CONFIG_CRYPTO_SHA512_ARM64 is not set -CONFIG_CRYPTO_SHA1_ARM64_CE=y -CONFIG_CRYPTO_SHA2_ARM64_CE=y -# CONFIG_CRYPTO_SHA512_ARM64_CE is not set -# CONFIG_CRYPTO_SHA3_ARM64 is not set -# CONFIG_CRYPTO_SM3_ARM64_CE is not set -# CONFIG_CRYPTO_SM4_ARM64_CE is not set -CONFIG_CRYPTO_GHASH_ARM64_CE=y -# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set # CONFIG_CRYPTO_CRC32_ARM64_CE is not set CONFIG_CRYPTO_AES_ARM64=y -CONFIG_CRYPTO_AES_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64_CE_CCM=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y -# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set -# CONFIG_CRYPTO_CHACHA20_NEON is not set # CONFIG_CRYPTO_POLY1305_NEON is not set -# CONFIG_CRYPTO_AES_ARM64_BS is not set # # General architecture-dependent options # # CONFIG_KPROBES is not set # CONFIG_JUMP_LABEL is not set -CONFIG_UPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y @@ -592,7 +567,6 @@ CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_CLK=y -CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y @@ -662,7 +636,6 @@ # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set # CONFIG_TRIM_UNUSED_KSYMS is not set -CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_SCSI_REQUEST=y CONFIG_BLK_DEV_BSG=y @@ -716,37 +689,7 @@ CONFIG_MQ_IOSCHED_KYBER=y # CONFIG_IOSCHED_BFQ is not set CONFIG_ASN1=y -CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y -CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_LOCK=y -CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y -CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_INLINE_READ_LOCK=y -CONFIG_ARCH_INLINE_READ_LOCK_BH=y -CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y -CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_READ_UNLOCK=y -CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y -CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_INLINE_WRITE_LOCK=y -CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y -CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y -CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y -CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y @@ -802,9 +745,7 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_CLEANCACHE is not set -# CONFIG_FRONTSWAP is not set CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set @@ -844,7 +785,6 @@ # CONFIG_XFRM_STATISTICS is not set CONFIG_NET_KEY=y # CONFIG_NET_KEY_MIGRATE is not set -# CONFIG_XDP_SOCKETS is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y @@ -896,60 +836,30 @@ # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y -CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y -CONFIG_NETFILTER_FAMILY_BRIDGE=y # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set -CONFIG_NF_CONNTRACK=y +# CONFIG_NF_CONNTRACK is not set # CONFIG_NF_LOG_NETDEV is not set -# CONFIG_NF_CONNTRACK_MARK is not set -# CONFIG_NF_CONNTRACK_ZONES is not set -CONFIG_NF_CONNTRACK_PROCFS=y -# CONFIG_NF_CONNTRACK_EVENTS is not set -# CONFIG_NF_CONNTRACK_TIMEOUT is not set -# CONFIG_NF_CONNTRACK_TIMESTAMP is not set -# CONFIG_NF_CONNTRACK_LABELS is not set -CONFIG_NF_CT_PROTO_DCCP=y -CONFIG_NF_CT_PROTO_SCTP=y -CONFIG_NF_CT_PROTO_UDPLITE=y -# CONFIG_NF_CONNTRACK_AMANDA is not set -# CONFIG_NF_CONNTRACK_FTP is not set -# CONFIG_NF_CONNTRACK_H323 is not set -# CONFIG_NF_CONNTRACK_IRC is not set -# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set -# CONFIG_NF_CONNTRACK_SNMP is not set -# CONFIG_NF_CONNTRACK_PPTP is not set -# CONFIG_NF_CONNTRACK_SANE is not set -# CONFIG_NF_CONNTRACK_SIP is not set -# CONFIG_NF_CONNTRACK_TFTP is not set -# CONFIG_NF_CT_NETLINK is not set -CONFIG_NF_NAT=y -CONFIG_NF_NAT_NEEDED=y -CONFIG_NF_NAT_PROTO_DCCP=y -CONFIG_NF_NAT_PROTO_UDPLITE=y -CONFIG_NF_NAT_PROTO_SCTP=y # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=y # # Xtables combined modules # -CONFIG_NETFILTER_XT_MARK=y -# CONFIG_NETFILTER_XT_CONNMARK is not set +# CONFIG_NETFILTER_XT_MARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set -# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set @@ -957,12 +867,9 @@ # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set -CONFIG_NETFILTER_XT_NAT=y -# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set -# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set @@ -971,16 +878,10 @@ # # Xtables matches # -CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y +# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set -# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set -# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set -CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set @@ -988,11 +889,9 @@ # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set -CONFIG_NETFILTER_XT_MATCH_IPVS=y # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set @@ -1003,7 +902,6 @@ # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set -# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA2 is not set @@ -1012,85 +910,30 @@ # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set -# CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # CONFIG_IP_SET is not set -CONFIG_IP_VS=y -# CONFIG_IP_VS_IPV6 is not set -# CONFIG_IP_VS_DEBUG is not set -CONFIG_IP_VS_TAB_BITS=12 - -# -# IPVS transport protocol load balancing support -# -# CONFIG_IP_VS_PROTO_TCP is not set -# CONFIG_IP_VS_PROTO_UDP is not set -# CONFIG_IP_VS_PROTO_ESP is not set -# CONFIG_IP_VS_PROTO_AH is not set -# CONFIG_IP_VS_PROTO_SCTP is not set - -# -# IPVS scheduler -# -# CONFIG_IP_VS_RR is not set -# CONFIG_IP_VS_WRR is not set -# CONFIG_IP_VS_LC is not set -# CONFIG_IP_VS_WLC is not set -# CONFIG_IP_VS_FO is not set -# CONFIG_IP_VS_OVF is not set -# CONFIG_IP_VS_LBLC is not set -# CONFIG_IP_VS_LBLCR is not set -# CONFIG_IP_VS_DH is not set -# CONFIG_IP_VS_SH is not set -# CONFIG_IP_VS_MH is not set -# CONFIG_IP_VS_SED is not set -# CONFIG_IP_VS_NQ is not set - -# -# IPVS SH scheduler -# -CONFIG_IP_VS_SH_TAB_BITS=8 - -# -# IPVS MH scheduler -# -CONFIG_IP_VS_MH_TAB_INDEX=12 - -# -# IPVS application helper -# -# CONFIG_IP_VS_NFCT is not set +# CONFIG_IP_VS is not set # # IP: Netfilter Configuration # -CONFIG_NF_DEFRAG_IPV4=y # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set # CONFIG_NF_REJECT_IPV4 is not set -CONFIG_NF_NAT_IPV4=y -CONFIG_NF_NAT_MASQUERADE_IPV4=y CONFIG_IP_NF_IPTABLES=y # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set -CONFIG_IP_NF_FILTER=y -# CONFIG_IP_NF_TARGET_REJECT is not set -# CONFIG_IP_NF_TARGET_SYNPROXY is not set -CONFIG_IP_NF_NAT=y -CONFIG_IP_NF_TARGET_MASQUERADE=y -# CONFIG_IP_NF_TARGET_NETMAP is not set -# CONFIG_IP_NF_TARGET_REDIRECT is not set +# CONFIG_IP_NF_FILTER is not set CONFIG_IP_NF_MANGLE=y -# CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set @@ -1104,10 +947,7 @@ # CONFIG_NF_DUP_IPV6 is not set # CONFIG_NF_REJECT_IPV6 is not set # CONFIG_NF_LOG_IPV6 is not set -# CONFIG_NF_NAT_IPV6 is not set # CONFIG_IP6_NF_IPTABLES is not set -CONFIG_NF_DEFRAG_IPV6=y -# CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_BPFILTER is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set @@ -1115,14 +955,11 @@ # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set -CONFIG_STP=y -CONFIG_BRIDGE=y -CONFIG_BRIDGE_IGMP_SNOOPING=y +# CONFIG_BRIDGE is not set CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set -CONFIG_LLC=y # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -1148,10 +985,8 @@ CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set # CONFIG_CGROUP_NET_CLASSID is not set -CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y # CONFIG_BPF_JIT is not set -# CONFIG_BPF_STREAM_PARSER is not set CONFIG_ETHTOOL=y CONFIG_FILTER=y CONFIG_NET_FLOW_LIMIT=y @@ -1160,7 +995,6 @@ # Network testing # # CONFIG_NET_PKTGEN is not set -# CONFIG_NET_DROP_MONITOR is not set # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set CONFIG_BT=y @@ -1344,7 +1178,6 @@ # CONFIG_SSFDC is not set # CONFIG_SM_FTL is not set # CONFIG_MTD_OOPS is not set -# CONFIG_MTD_SWAP is not set # CONFIG_MTD_PARTITIONED_MASTER is not set # @@ -1419,9 +1252,7 @@ # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -CONFIG_ZRAM=y -# CONFIG_ZRAM_WRITEBACK is not set -# CONFIG_ZRAM_MEMORY_TRACKING is not set +# CONFIG_ZRAM is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y @@ -1480,7 +1311,7 @@ # # EEPROM support # -CONFIG_EEPROM_AT24=y +# CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set @@ -1638,7 +1469,6 @@ # CONFIG_ATA_SFF is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set -# CONFIG_BCACHE is not set # CONFIG_BLK_DEV_DM is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set @@ -1664,9 +1494,9 @@ # CONFIG_GTP is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set -CONFIG_TUN=y +# CONFIG_TUN is not set # CONFIG_TUN_VNET_CROSS_LE is not set -CONFIG_VETH=y +# CONFIG_VETH is not set # CONFIG_VIRTIO_NET is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set @@ -1751,10 +1581,15 @@ CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y +# CONFIG_STMMAC_UIO is not set +CONFIG_STMMAC_ETHTOOL=y +CONFIG_STMMAC_FULL=y +CONFIG_STMMAC_PTP=y CONFIG_STMMAC_PLATFORM=y # CONFIG_DWMAC_DWC_QOS_ETH is not set CONFIG_DWMAC_GENERIC=y CONFIG_DWMAC_ROCKCHIP=y +CONFIG_DWMAC_ROCKCHIP_TOOL=y # CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set @@ -1819,39 +1654,30 @@ # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set -CONFIG_PPP=y -CONFIG_PPP_BSDCOMP=y -CONFIG_PPP_DEFLATE=y -CONFIG_PPP_FILTER=y -CONFIG_PPP_MPPE=y -CONFIG_PPP_MULTILINK=y -CONFIG_PPPOE=y -CONFIG_PPP_ASYNC=y -CONFIG_PPP_SYNC_TTY=y +# CONFIG_PPP is not set # CONFIG_SLIP is not set -CONFIG_SLHC=y CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_RTL8152 is not set +CONFIG_USB_RTL8150=y +CONFIG_USB_RTL8152=y # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=y CONFIG_USB_NET_AX88179_178A=y CONFIG_USB_NET_CDCETHER=y -CONFIG_USB_NET_CDC_EEM=y +# CONFIG_USB_NET_CDC_EEM is not set CONFIG_USB_NET_CDC_NCM=y # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set -# CONFIG_USB_NET_CDC_MBIM is not set +CONFIG_USB_NET_CDC_MBIM=y # CONFIG_USB_NET_DM9601 is not set # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set # CONFIG_USB_NET_SMSC75XX is not set # CONFIG_USB_NET_SMSC95XX is not set # CONFIG_USB_NET_GL620A is not set -CONFIG_USB_NET_NET1080=y +# CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set # CONFIG_USB_NET_MCS7830 is not set CONFIG_USB_NET_RNDIS_HOST=y @@ -1868,32 +1694,95 @@ # CONFIG_USB_NET_CH9200 is not set CONFIG_WLAN=y # CONFIG_WIRELESS_WDS is not set -# CONFIG_WLAN_VENDOR_ADMTEK is not set -# CONFIG_WLAN_VENDOR_ATH is not set -# CONFIG_WLAN_VENDOR_ATMEL is not set -# CONFIG_WLAN_VENDOR_BROADCOM is not set -# CONFIG_WLAN_VENDOR_CISCO is not set -# CONFIG_WLAN_VENDOR_INTEL is not set -# CONFIG_WLAN_VENDOR_INTERSIL is not set -# CONFIG_WLAN_VENDOR_MARVELL is not set -# CONFIG_WLAN_VENDOR_MEDIATEK is not set -# CONFIG_WLAN_VENDOR_RALINK is not set -# CONFIG_WLAN_VENDOR_REALTEK is not set -# CONFIG_WLAN_VENDOR_RSI is not set -# CONFIG_WLAN_VENDOR_ST is not set -# CONFIG_WLAN_VENDOR_TI is not set -# CONFIG_WLAN_VENDOR_ZYDAS is not set -# CONFIG_WLAN_VENDOR_QUANTENNA is not set +CONFIG_WLAN_VENDOR_ADMTEK=y +# CONFIG_ADM8211 is not set +CONFIG_WLAN_VENDOR_ATH=y +# CONFIG_ATH_DEBUG is not set +# CONFIG_ATH5K is not set +# CONFIG_ATH5K_PCI is not set +# CONFIG_ATH9K is not set +# CONFIG_ATH9K_HTC is not set +# CONFIG_CARL9170 is not set +# CONFIG_ATH6KL is not set +# CONFIG_AR5523 is not set +# CONFIG_WIL6210 is not set +# CONFIG_ATH10K is not set +# CONFIG_WCN36XX is not set +CONFIG_WLAN_VENDOR_ATMEL=y +# CONFIG_ATMEL is not set +# CONFIG_AT76C50X_USB is not set +CONFIG_WLAN_VENDOR_BROADCOM=y +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +# CONFIG_BRCMSMAC is not set +# CONFIG_BRCMFMAC is not set +CONFIG_WLAN_VENDOR_CISCO=y +CONFIG_WLAN_VENDOR_INTEL=y +# CONFIG_IPW2100 is not set +# CONFIG_IPW2200 is not set +# CONFIG_IWL4965 is not set +# CONFIG_IWL3945 is not set +# CONFIG_IWLWIFI is not set +CONFIG_WLAN_VENDOR_INTERSIL=y +# CONFIG_HOSTAP is not set +# CONFIG_HERMES is not set +# CONFIG_P54_COMMON is not set +# CONFIG_PRISM54 is not set +CONFIG_WLAN_VENDOR_MARVELL=y +# CONFIG_LIBERTAS is not set +CONFIG_LIBERTAS_THINFIRM=y +# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set +# CONFIG_LIBERTAS_THINFIRM_USB is not set +CONFIG_MWIFIEX=m +CONFIG_MWIFIEX_SDIO=m +# CONFIG_MWIFIEX_PCIE is not set +# CONFIG_MWIFIEX_USB is not set +# CONFIG_MWL8K is not set +CONFIG_WLAN_VENDOR_MEDIATEK=y +# CONFIG_MT7601U is not set +# CONFIG_MT76x0U is not set +# CONFIG_MT76x2E is not set +# CONFIG_MT76x2U is not set +CONFIG_WLAN_VENDOR_RALINK=y +# CONFIG_RT2X00 is not set +CONFIG_WLAN_VENDOR_REALTEK=y +# CONFIG_RTL8180 is not set +# CONFIG_RTL8187 is not set +CONFIG_RTL_CARDS=y +# CONFIG_RTL8192CE is not set +# CONFIG_RTL8192SE is not set +# CONFIG_RTL8192DE is not set +# CONFIG_RTL8723AE is not set +# CONFIG_RTL8723BE is not set +# CONFIG_RTL8188EE is not set +# CONFIG_RTL8192EE is not set +# CONFIG_RTL8821AE is not set +# CONFIG_RTL8192CU is not set +# CONFIG_RTL8XXXU is not set +CONFIG_WLAN_VENDOR_RSI=y +# CONFIG_RSI_91X is not set +CONFIG_WLAN_VENDOR_ST=y +# CONFIG_CW1200 is not set +CONFIG_WLAN_VENDOR_TI=y +# CONFIG_WL1251 is not set +# CONFIG_WL12XX is not set +# CONFIG_WL18XX is not set +# CONFIG_WLCORE is not set +CONFIG_WLAN_VENDOR_ZYDAS=y +# CONFIG_USB_ZD1201 is not set +# CONFIG_ZD1211RW is not set +CONFIG_WLAN_VENDOR_QUANTENNA=y +# CONFIG_QTNFMAC_PEARL_PCIE is not set CONFIG_WL_ROCKCHIP=y CONFIG_WIFI_BUILD_MODULE=y -# CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is not set +CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y # CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set CONFIG_BCMDHD=y CONFIG_AP6XXX=m # CONFIG_AP6XXX_WIFI6 is not set # CONFIG_AP6XXX_INDEP_POWER is not set -CONFIG_BCMDHD_FW_PATH="/etc/firmware/fw_bcmdhd.bin" -CONFIG_BCMDHD_NVRAM_PATH="/etc/firmware/nvram_ap6398s.txt" +CONFIG_BCMDHD_FW_PATH="/vendor/etc/firmware/fw_bcmdhd.bin" +CONFIG_BCMDHD_NVRAM_PATH="/vendor/etc/firmware/nvram.txt" # CONFIG_BCMDHD_STATIC_IF is not set CONFIG_RTL_WIRELESS_SOLUTION=y # CONFIG_RTL8188EU is not set @@ -1907,7 +1796,7 @@ # CONFIG_CYW_BCMDHD is not set # CONFIG_UWE5621DS is not set # CONFIG_MAC80211_HWSIM is not set -# CONFIG_USB_NET_RNDIS_WLAN is not set +CONFIG_USB_NET_RNDIS_WLAN=y # CONFIG_VIRT_WIFI is not set # @@ -1953,7 +1842,7 @@ # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_GPIO_POLLED=y -CONFIG_KEYBOARD_TCA6416=m +# CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set @@ -2361,6 +2250,7 @@ # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set +# CONFIG_NTP_PPS is not set # # PPS clients support @@ -2922,6 +2812,8 @@ # # USB HDMI CEC adapters # +# CONFIG_USB_PULSE8_CEC is not set +# CONFIG_USB_RAINSHADOW_CEC is not set # CONFIG_MEDIA_PCI_SUPPORT is not set CONFIG_V4L_PLATFORM_DRIVERS=y # CONFIG_VIDEO_CAFE_CCIC is not set @@ -3056,6 +2948,7 @@ # CONFIG_VIDEO_IMX178 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set +# CONFIG_VIDEO_IMX241 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX307 is not set @@ -3524,11 +3417,12 @@ # RGA # # CONFIG_ROCKCHIP_RGA is not set -CONFIG_ROCKCHIP_RGA2=y -# CONFIG_ROCKCHIP_RGA2_PROC_FS is not set -CONFIG_ROCKCHIP_RGA2_DEBUG_FS=y -CONFIG_ROCKCHIP_RGA2_DEBUGGER=y -# CONFIG_ROCKCHIP_MULTI_RGA is not set +# CONFIG_ROCKCHIP_RGA2 is not set +CONFIG_ROCKCHIP_MULTI_RGA=y +CONFIG_ROCKCHIP_RGA_ASYNC=y +# CONFIG_ROCKCHIP_RGA_PROC_FS is not set +CONFIG_ROCKCHIP_RGA_DEBUG_FS=y +CONFIG_ROCKCHIP_RGA_DEBUGGER=y # # IEP @@ -3540,14 +3434,14 @@ CONFIG_ROCKCHIP_MPP_RKVDEC=y CONFIG_ROCKCHIP_MPP_RKVDEC2=y CONFIG_ROCKCHIP_MPP_RKVENC=y -# CONFIG_ROCKCHIP_MPP_RKVENC2 is not set +CONFIG_ROCKCHIP_MPP_RKVENC2=y CONFIG_ROCKCHIP_MPP_VDPU1=y CONFIG_ROCKCHIP_MPP_VEPU1=y CONFIG_ROCKCHIP_MPP_VDPU2=y CONFIG_ROCKCHIP_MPP_VEPU2=y CONFIG_ROCKCHIP_MPP_IEP2=y CONFIG_ROCKCHIP_MPP_JPGDEC=y -# CONFIG_ROCKCHIP_MPP_VDPP is not set +CONFIG_ROCKCHIP_MPP_VDPP=y CONFIG_VIDEOMODE_HELPERS=y CONFIG_HDMI=y @@ -3641,7 +3535,7 @@ CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y # CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS is not set CONFIG_SND_SOC_ROCKCHIP_PDM=y -# CONFIG_SND_SOC_ROCKCHIP_SAI is not set +CONFIG_SND_SOC_ROCKCHIP_SAI=y CONFIG_SND_SOC_ROCKCHIP_SPDIF=y # CONFIG_SND_SOC_ROCKCHIP_VAD is not set CONFIG_SND_SOC_ROCKCHIP_MAX98090=y @@ -3734,6 +3628,7 @@ # CONFIG_SND_SOC_RK3228 is not set # CONFIG_SND_SOC_RK3308 is not set CONFIG_SND_SOC_RK3328=y +CONFIG_SND_SOC_RK3528=y # CONFIG_SND_SOC_RK630 is not set CONFIG_SND_SOC_RK817=y CONFIG_SND_SOC_RK_CODEC_DIGITAL=y @@ -3960,9 +3855,9 @@ # # USB Device Class drivers # -# CONFIG_USB_ACM is not set +CONFIG_USB_ACM=y # CONFIG_USB_PRINTER is not set -# CONFIG_USB_WDM is not set +CONFIG_USB_WDM=y # CONFIG_USB_TMC is not set # @@ -4274,9 +4169,8 @@ # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_MTD is not set -CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set -# CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_ACTIVITY is not set # CONFIG_LEDS_TRIGGER_GPIO is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set @@ -4322,7 +4216,7 @@ CONFIG_RTC_DRV_HYM8563=y # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_RK630 is not set -# CONFIG_RTC_DRV_RK808 is not set +CONFIG_RTC_DRV_RK808=y # CONFIG_RTC_DRV_RK_TIMER is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set @@ -4439,10 +4333,11 @@ CONFIG_DMABUF_CACHE=y CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set -# CONFIG_DMABUF_HEAPS is not set -# CONFIG_DMABUF_PAGE_POOL is not set -# CONFIG_DMABUF_HEAPS_DEFERRED_FREE is not set -# CONFIG_DMABUF_HEAPS_PAGE_POOL is not set +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_DEFERRED_FREE=y +CONFIG_DMABUF_HEAPS_PAGE_POOL=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +CONFIG_DMABUF_HEAPS_CMA=y # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set @@ -4600,6 +4495,7 @@ # CONFIG_ROCKCHIP_CLK_COMPENSATION is not set CONFIG_ROCKCHIP_CLK_BOOST=y CONFIG_ROCKCHIP_CLK_INV=y +CONFIG_ROCKCHIP_CLK_OUT=y CONFIG_ROCKCHIP_CLK_PVTM=y CONFIG_ROCKCHIP_DCLK_DIV=y # CONFIG_ROCKCHIP_DDRCLK_SCPI is not set @@ -4699,7 +4595,9 @@ CONFIG_CPU_RK3328=y # CONFIG_CPU_RK3368 is not set CONFIG_CPU_RK3399=y +CONFIG_CPU_RK3528=y CONFIG_CPU_RK3568=y +CONFIG_NO_GKI=y CONFIG_ANDROID_VERSION=0x08010000 CONFIG_ROCKCHIP_AMP=y CONFIG_ROCKCHIP_CPUINFO=y @@ -4739,7 +4637,7 @@ # DEVFREQ Drivers # CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y -CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y +# CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ is not set CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y CONFIG_PM_DEVFREQ_EVENT=y CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y @@ -5177,15 +5075,6 @@ # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_POWERCAP is not set # CONFIG_MCB is not set - -# -# Performance monitor support -# -# CONFIG_ARM_CCI_PMU is not set -# CONFIG_ARM_CCN is not set -CONFIG_ARM_PMU=y -# CONFIG_ARM_DSU_PMU is not set -# CONFIG_ARM_SPE_PMU is not set CONFIG_RAS=y # @@ -5243,6 +5132,7 @@ CONFIG_ROCKCHIP_RKNPU_DEBUG_FS=y # CONFIG_ROCKCHIP_RKNPU_PROC_FS is not set # CONFIG_ROCKCHIP_RKNPU_FENCE is not set +# CONFIG_ROCKCHIP_RKNPU_SRAM is not set CONFIG_ROCKCHIP_RKNPU_DRM_GEM=y # @@ -5292,12 +5182,7 @@ # CONFIG_AUTOFS_FS is not set CONFIG_FUSE_FS=y # CONFIG_CUSE is not set -CONFIG_OVERLAY_FS=y -CONFIG_OVERLAY_FS_REDIRECT_DIR=y -CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y -CONFIG_OVERLAY_FS_INDEX=y -CONFIG_OVERLAY_FS_XINO_AUTO=y -CONFIG_OVERLAY_FS_METACOPY=y +# CONFIG_OVERLAY_FS is not set # CONFIG_INCREMENTAL_FS is not set # @@ -5407,9 +5292,8 @@ CONFIG_PSTORE_CONSOLE=y # CONFIG_PSTORE_CONSOLE_FORCE is not set # CONFIG_PSTORE_PMSG is not set -# CONFIG_PSTORE_FTRACE is not set CONFIG_PSTORE_RAM=y -# CONFIG_PSTORE_MCU_LOG is not set +# CONFIG_PSTORE_BOOT_LOG is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y @@ -5418,7 +5302,6 @@ CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y -CONFIG_NFS_SWAP=y # CONFIG_NFS_V4_1 is not set # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y @@ -5430,7 +5313,6 @@ CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y -CONFIG_SUNRPC_SWAP=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set @@ -5502,7 +5384,6 @@ # CONFIG_ENCRYPTED_KEYS is not set # CONFIG_KEY_DH_OPERATIONS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITY_PERF_EVENTS_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y @@ -5561,7 +5442,6 @@ # CONFIG_CRYPTO_MCRYPTD is not set # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_TEST is not set -CONFIG_CRYPTO_SIMD=y # CONFIG_CRYPTO_CURVE25519 is not set # @@ -5692,7 +5572,7 @@ CONFIG_CRYPTO_DEV_ROCKCHIP=y CONFIG_CRYPTO_DEV_ROCKCHIP_V1=y CONFIG_CRYPTO_DEV_ROCKCHIP_V2=y -# CONFIG_CRYPTO_DEV_ROCKCHIP_V3 is not set +CONFIG_CRYPTO_DEV_ROCKCHIP_V3=y CONFIG_CRYPTO_DEV_ROCKCHIP_DEV=y # CONFIG_CRYPTO_DEV_VIRTIO is not set # CONFIG_CRYPTO_DEV_CCREE is not set @@ -5712,7 +5592,6 @@ # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -CONFIG_BINARY_PRINTF=y # # Library routines @@ -5850,7 +5729,6 @@ # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_PAGE_POISONING is not set -# CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SLUB_DEBUG_ON is not set @@ -5876,19 +5754,26 @@ # # Debug Lockups and Hangs # -# CONFIG_SOFTLOCKUP_DETECTOR is not set +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HAVE_HARDLOCKUP_DETECTOR_OTHER_CPU=y -# CONFIG_HARDLOCKUP_DETECTOR is not set +CONFIG_HARDLOCKUP_DETECTOR_OTHER_CPU=y +CONFIG_HARDLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 -CONFIG_SCHED_DEBUG=y +# CONFIG_SCHED_DEBUG is not set CONFIG_SCHED_INFO=y CONFIG_SCHEDSTATS=y # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_TIMEKEEPING is not set +CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) @@ -5897,13 +5782,11 @@ # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set -CONFIG_DEBUG_SPINLOCK=y +# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set CONFIG_STACKTRACE=y @@ -5933,7 +5816,6 @@ # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set -CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y @@ -5941,40 +5823,8 @@ CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y -CONFIG_RING_BUFFER=y -CONFIG_EVENT_TRACING=y -CONFIG_CONTEXT_SWITCH_TRACER=y -CONFIG_TRACING=y -CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y -CONFIG_FTRACE=y -CONFIG_FUNCTION_TRACER=y -CONFIG_FUNCTION_GRAPH_TRACER=y -# CONFIG_PREEMPTIRQ_EVENTS is not set -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_HWLAT_TRACER is not set -# CONFIG_FTRACE_SYSCALLS is not set -# CONFIG_TRACER_SNAPSHOT is not set -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -# CONFIG_PROFILE_ALL_BRANCHES is not set -# CONFIG_STACK_TRACER is not set -CONFIG_BLK_DEV_IO_TRACE=y -CONFIG_UPROBE_EVENTS=y -CONFIG_BPF_EVENTS=y -CONFIG_PROBE_EVENTS=y -CONFIG_DYNAMIC_FTRACE=y -# CONFIG_FUNCTION_PROFILER is not set -CONFIG_FTRACE_MCOUNT_RECORD=y -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_HIST_TRIGGERS is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -CONFIG_TRACING_EVENTS_GPIO=y +# CONFIG_FTRACE is not set # CONFIG_DMA_API_DEBUG is not set CONFIG_RUNTIME_TESTING_MENU=y CONFIG_LKDTM=y diff --git a/kernel/arch/arm64/configs/rockchip_rt.config b/kernel/arch/arm64/configs/rockchip_rt.config new file mode 100644 index 0000000..6754436 --- /dev/null +++ b/kernel/arch/arm64/configs/rockchip_rt.config @@ -0,0 +1,22 @@ +# CONFIG_ARM_CPUIDLE is not set +# CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ is not set +# CONFIG_CGROUP_CPUACCT is not set +# CONFIG_CGROUP_SCHED is not set +# CONFIG_CPU_FREQ_TIMES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_FTRACE is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +# CONFIG_MALI_BIFROST_ENABLE_TRACE is not set +# CONFIG_MALI_BIFROST_SYSTEM_TRACE is not set +# CONFIG_PSI is not set +# CONFIG_PERF_EVENTS is not set +# CONFIG_PROFILING is not set +# CONFIG_SCHED_DEBUG is not set +# CONFIG_SCHED_INFO is not set +# CONFIG_SWAP is not set +# CONFIG_TASKSTATS is not set +# CONFIG_ZRAM is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +CONFIG_HZ_PERIODIC=y +CONFIG_HZ_1000=y +CONFIG_PREEMPT_RT_FULL=y diff --git a/kernel/arch/arm64/crypto/Kconfig b/kernel/arch/arm64/crypto/Kconfig index 273d727..263d4ef 100644 --- a/kernel/arch/arm64/crypto/Kconfig +++ b/kernel/arch/arm64/crypto/Kconfig @@ -19,43 +19,43 @@ config CRYPTO_SHA1_ARM64_CE tristate "SHA-1 digest algorithm (ARMv8 Crypto Extensions)" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_HASH select CRYPTO_SHA1 config CRYPTO_SHA2_ARM64_CE tristate "SHA-224/SHA-256 digest algorithm (ARMv8 Crypto Extensions)" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_HASH select CRYPTO_SHA256_ARM64 config CRYPTO_SHA512_ARM64_CE tristate "SHA-384/SHA-512 digest algorithm (ARMv8 Crypto Extensions)" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_HASH select CRYPTO_SHA512_ARM64 config CRYPTO_SHA3_ARM64 tristate "SHA3 digest algorithm (ARMv8.2 Crypto Extensions)" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_HASH select CRYPTO_SHA3 config CRYPTO_SM3_ARM64_CE tristate "SM3 digest algorithm (ARMv8.2 Crypto Extensions)" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_HASH select CRYPTO_SM3 config CRYPTO_SM4_ARM64_CE tristate "SM4 symmetric cipher (ARMv8.2 Crypto Extensions)" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_ALGAPI select CRYPTO_SM4 config CRYPTO_GHASH_ARM64_CE tristate "GHASH/AES-GCM using ARMv8 Crypto Extensions" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_HASH select CRYPTO_GF128MUL select CRYPTO_AES @@ -63,7 +63,7 @@ config CRYPTO_CRCT10DIF_ARM64_CE tristate "CRCT10DIF digest algorithm using PMULL instructions" - depends on KERNEL_MODE_NEON && CRC_T10DIF + depends on KERNEL_MODE_NEON && CRC_T10DIF && !PREEMPT_RT_BASE select CRYPTO_HASH config CRYPTO_CRC32_ARM64_CE @@ -77,13 +77,13 @@ config CRYPTO_AES_ARM64_CE tristate "AES core cipher using ARMv8 Crypto Extensions" - depends on ARM64 && KERNEL_MODE_NEON + depends on ARM64 && KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_ALGAPI select CRYPTO_AES_ARM64 config CRYPTO_AES_ARM64_CE_CCM tristate "AES in CCM mode using ARMv8 Crypto Extensions" - depends on ARM64 && KERNEL_MODE_NEON + depends on ARM64 && KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_ALGAPI select CRYPTO_AES_ARM64_CE select CRYPTO_AES_ARM64 @@ -91,7 +91,7 @@ config CRYPTO_AES_ARM64_CE_BLK tristate "AES in ECB/CBC/CTR/XTS modes using ARMv8 Crypto Extensions" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_BLKCIPHER select CRYPTO_AES_ARM64_CE select CRYPTO_AES_ARM64 @@ -99,7 +99,7 @@ config CRYPTO_AES_ARM64_NEON_BLK tristate "AES in ECB/CBC/CTR/XTS modes using NEON instructions" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_BLKCIPHER select CRYPTO_AES_ARM64 select CRYPTO_AES @@ -107,7 +107,7 @@ config CRYPTO_CHACHA20_NEON tristate "ChaCha20, XChaCha20, and XChaCha12 stream ciphers using NEON instructions" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_BLKCIPHER select CRYPTO_LIB_CHACHA_GENERIC select CRYPTO_ARCH_HAVE_LIB_CHACHA @@ -120,7 +120,7 @@ config CRYPTO_AES_ARM64_BS tristate "AES in ECB/CBC/CTR/XTS modes using bit-sliced NEON algorithm" - depends on KERNEL_MODE_NEON + depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE select CRYPTO_BLKCIPHER select CRYPTO_AES_ARM64_NEON_BLK select CRYPTO_AES_ARM64 diff --git a/kernel/arch/arm64/crypto/crc32-ce-glue.c b/kernel/arch/arm64/crypto/crc32-ce-glue.c index 34b4e3d..ae055cd 100644 --- a/kernel/arch/arm64/crypto/crc32-ce-glue.c +++ b/kernel/arch/arm64/crypto/crc32-ce-glue.c @@ -208,7 +208,8 @@ static int __init crc32_pmull_mod_init(void) { - if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_PMULL)) { + if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && + !IS_ENABLED(CONFIG_PREEMPT_RT_BASE) && (elf_hwcap & HWCAP_PMULL)) { crc32_pmull_algs[0].update = crc32_pmull_update; crc32_pmull_algs[1].update = crc32c_pmull_update; diff --git a/kernel/arch/arm64/include/asm/alternative.h b/kernel/arch/arm64/include/asm/alternative.h index bb616e2..0d7a627 100644 --- a/kernel/arch/arm64/include/asm/alternative.h +++ b/kernel/arch/arm64/include/asm/alternative.h @@ -35,6 +35,12 @@ static inline void apply_alternatives_module(void *start, size_t length) { } #endif +#ifdef CONFIG_KVM_ARM_HOST +void kvm_compute_layout(void); +#else +static inline void kvm_compute_layout(void) { } +#endif + #define ALTINSTR_ENTRY(feature) \ " .word 661b - .\n" /* label */ \ " .word 663f - .\n" /* new instruction */ \ diff --git a/kernel/arch/arm64/include/asm/spinlock_types.h b/kernel/arch/arm64/include/asm/spinlock_types.h index a157ff4..f952fdd 100644 --- a/kernel/arch/arm64/include/asm/spinlock_types.h +++ b/kernel/arch/arm64/include/asm/spinlock_types.h @@ -16,10 +16,6 @@ #ifndef __ASM_SPINLOCK_TYPES_H #define __ASM_SPINLOCK_TYPES_H -#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__ASM_SPINLOCK_H) -# error "please don't include this file directly" -#endif - #include <asm-generic/qspinlock_types.h> #include <asm-generic/qrwlock_types.h> diff --git a/kernel/arch/arm64/include/asm/thread_info.h b/kernel/arch/arm64/include/asm/thread_info.h index e445e87..7271a41 100644 --- a/kernel/arch/arm64/include/asm/thread_info.h +++ b/kernel/arch/arm64/include/asm/thread_info.h @@ -43,6 +43,7 @@ u64 ttbr0; /* saved TTBR0_EL1 */ #endif int preempt_count; /* 0 => preemptable, <0 => bug */ + int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ #ifdef CONFIG_SHADOW_CALL_STACK void *shadow_call_stack; #endif @@ -79,6 +80,7 @@ #define TIF_FOREIGN_FPSTATE 3 /* CPU's FP state is not current's */ #define TIF_UPROBE 4 /* uprobe breakpoint or singlestep */ #define TIF_FSCHECK 5 /* Check FS is USER_DS on return */ +#define TIF_NEED_RESCHED_LAZY 6 #define TIF_NOHZ 7 #define TIF_SYSCALL_TRACE 8 #define TIF_SYSCALL_AUDIT 9 @@ -98,6 +100,7 @@ #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) #define _TIF_FOREIGN_FPSTATE (1 << TIF_FOREIGN_FPSTATE) +#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) #define _TIF_NOHZ (1 << TIF_NOHZ) #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) @@ -111,8 +114,9 @@ #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \ - _TIF_UPROBE | _TIF_FSCHECK) + _TIF_UPROBE | _TIF_FSCHECK | _TIF_NEED_RESCHED_LAZY) +#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \ _TIF_NOHZ) diff --git a/kernel/arch/arm64/kernel/alternative.c b/kernel/arch/arm64/kernel/alternative.c index 0dd30d0..c3d9b90 100644 --- a/kernel/arch/arm64/kernel/alternative.c +++ b/kernel/arch/arm64/kernel/alternative.c @@ -212,6 +212,7 @@ void __init apply_alternatives_all(void) { /* better not try code patching on a live SMP system */ + kvm_compute_layout(); stop_machine(__apply_alternatives_multi_stop, NULL, cpu_online_mask); } diff --git a/kernel/arch/arm64/kernel/asm-offsets.c b/kernel/arch/arm64/kernel/asm-offsets.c index b8f83cf..15ae400 100644 --- a/kernel/arch/arm64/kernel/asm-offsets.c +++ b/kernel/arch/arm64/kernel/asm-offsets.c @@ -42,6 +42,7 @@ BLANK(); DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags)); DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count)); + DEFINE(TSK_TI_PREEMPT_LAZY, offsetof(struct task_struct, thread_info.preempt_lazy_count)); DEFINE(TSK_TI_ADDR_LIMIT, offsetof(struct task_struct, thread_info.addr_limit)); #ifdef CONFIG_ARM64_SW_TTBR0_PAN DEFINE(TSK_TI_TTBR0, offsetof(struct task_struct, thread_info.ttbr0)); diff --git a/kernel/arch/arm64/kernel/cpufeature.c b/kernel/arch/arm64/kernel/cpufeature.c index 38ee272..641d064 100644 --- a/kernel/arch/arm64/kernel/cpufeature.c +++ b/kernel/arch/arm64/kernel/cpufeature.c @@ -1115,14 +1115,14 @@ static void cpu_enable_ssbs(const struct arm64_cpu_capabilities *__unused) { static bool undef_hook_registered = false; - static DEFINE_SPINLOCK(hook_lock); + static DEFINE_RAW_SPINLOCK(hook_lock); - spin_lock(&hook_lock); + raw_spin_lock(&hook_lock); if (!undef_hook_registered) { register_undef_hook(&ssbs_emulation_hook); undef_hook_registered = true; } - spin_unlock(&hook_lock); + raw_spin_unlock(&hook_lock); if (arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE) { sysreg_clear_set(sctlr_el1, 0, SCTLR_ELx_DSSBS); diff --git a/kernel/arch/arm64/kernel/entry.S b/kernel/arch/arm64/kernel/entry.S index 8f50a54..833595d 100644 --- a/kernel/arch/arm64/kernel/entry.S +++ b/kernel/arch/arm64/kernel/entry.S @@ -646,11 +646,16 @@ #ifdef CONFIG_PREEMPT ldr w24, [tsk, #TSK_TI_PREEMPT] // get preempt count - cbnz w24, 1f // preempt count != 0 + cbnz w24, 2f // preempt count != 0 ldr x0, [tsk, #TSK_TI_FLAGS] // get flags - tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? - bl el1_preempt + tbnz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? + + ldr w24, [tsk, #TSK_TI_PREEMPT_LAZY] // get preempt lazy count + cbnz w24, 2f // preempt lazy count != 0 + tbz x0, #TIF_NEED_RESCHED_LAZY, 2f // needs rescheduling? 1: + bl el1_preempt +2: #endif #ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_on @@ -664,6 +669,7 @@ 1: bl preempt_schedule_irq // irq en/disable is done inside ldr x0, [tsk, #TSK_TI_FLAGS] // get new tasks TI_FLAGS tbnz x0, #TIF_NEED_RESCHED, 1b // needs rescheduling? + tbnz x0, #TIF_NEED_RESCHED_LAZY, 1b // needs rescheduling? ret x24 #endif diff --git a/kernel/arch/arm64/kernel/fpsimd.c b/kernel/arch/arm64/kernel/fpsimd.c index 89ab68c..481793a 100644 --- a/kernel/arch/arm64/kernel/fpsimd.c +++ b/kernel/arch/arm64/kernel/fpsimd.c @@ -159,6 +159,16 @@ __sve_free(task); } +static void *sve_free_atomic(struct task_struct *task) +{ + void *sve_state = task->thread.sve_state; + + WARN_ON(test_tsk_thread_flag(task, TIF_SVE)); + + task->thread.sve_state = NULL; + return sve_state; +} + /* * TIF_SVE controls whether a task can use SVE without trapping while * in userspace, and also the way a task's FPSIMD/SVE state is stored @@ -549,6 +559,7 @@ * non-SVE thread. */ if (task == current) { + preempt_disable(); local_bh_disable(); fpsimd_save(); @@ -559,8 +570,10 @@ if (test_and_clear_tsk_thread_flag(task, TIF_SVE)) sve_to_fpsimd(task); - if (task == current) + if (task == current) { local_bh_enable(); + preempt_enable(); + } /* * Force reallocation of task SVE state to the correct size @@ -815,6 +828,7 @@ sve_alloc(current); + preempt_disable(); local_bh_disable(); fpsimd_save(); @@ -828,6 +842,7 @@ WARN_ON(1); /* SVE access shouldn't have trapped */ local_bh_enable(); + preempt_enable(); } /* @@ -894,10 +909,12 @@ void fpsimd_flush_thread(void) { int vl, supported_vl; + void *mem = NULL; if (!system_supports_fpsimd()) return; + preempt_disable(); local_bh_disable(); memset(¤t->thread.uw.fpsimd_state, 0, @@ -906,7 +923,7 @@ if (system_supports_sve()) { clear_thread_flag(TIF_SVE); - sve_free(current); + mem = sve_free_atomic(current); /* * Reset the task vector length as required. @@ -942,6 +959,8 @@ set_thread_flag(TIF_FOREIGN_FPSTATE); local_bh_enable(); + preempt_enable(); + kfree(mem); } /* @@ -953,9 +972,11 @@ if (!system_supports_fpsimd()) return; + preempt_disable(); local_bh_disable(); fpsimd_save(); local_bh_enable(); + preempt_enable(); } /* @@ -1026,6 +1047,7 @@ return; } + preempt_disable(); local_bh_disable(); if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE)) { @@ -1034,6 +1056,7 @@ } local_bh_enable(); + preempt_enable(); } /* @@ -1046,6 +1069,7 @@ if (WARN_ON(!system_supports_fpsimd())) return; + preempt_disable(); local_bh_disable(); current->thread.uw.fpsimd_state = *state; @@ -1058,6 +1082,7 @@ clear_thread_flag(TIF_FOREIGN_FPSTATE); local_bh_enable(); + preempt_enable(); } /* @@ -1104,6 +1129,7 @@ BUG_ON(!may_use_simd()); + preempt_disable(); local_bh_disable(); __this_cpu_write(kernel_neon_busy, true); @@ -1117,6 +1143,7 @@ preempt_disable(); local_bh_enable(); + preempt_enable(); } EXPORT_SYMBOL(kernel_neon_begin); diff --git a/kernel/arch/arm64/kernel/process.c b/kernel/arch/arm64/kernel/process.c index 1e86ef0..4338838 100644 --- a/kernel/arch/arm64/kernel/process.c +++ b/kernel/arch/arm64/kernel/process.c @@ -232,7 +232,7 @@ * don't attempt to dump non-kernel addresses or * values that are probably just small negative numbers */ - if (addr < PAGE_OFFSET || addr > -4096UL) + if (addr < VA_START || addr > -4096UL) return; printk("\n%s: %#lx:\n", name, addr + nbytes / 2); diff --git a/kernel/arch/arm64/kernel/signal.c b/kernel/arch/arm64/kernel/signal.c index ca56585..3f321da 100644 --- a/kernel/arch/arm64/kernel/signal.c +++ b/kernel/arch/arm64/kernel/signal.c @@ -919,7 +919,7 @@ /* Check valid user FS if needed */ addr_limit_user_check(); - if (thread_flags & _TIF_NEED_RESCHED) { + if (thread_flags & _TIF_NEED_RESCHED_MASK) { /* Unmask Debug and SError for the next task */ local_daif_restore(DAIF_PROCCTX_NOIRQ); diff --git a/kernel/arch/arm64/kvm/va_layout.c b/kernel/arch/arm64/kvm/va_layout.c index c712a73..792da0e 100644 --- a/kernel/arch/arm64/kvm/va_layout.c +++ b/kernel/arch/arm64/kvm/va_layout.c @@ -33,7 +33,7 @@ static u64 tag_val; static u64 va_mask; -static void compute_layout(void) +__init void kvm_compute_layout(void) { phys_addr_t idmap_addr = __pa_symbol(__hyp_idmap_text_start); u64 hyp_va_msb; @@ -121,8 +121,6 @@ BUG_ON(nr_inst != 5); - if (!has_vhe() && !va_mask) - compute_layout(); for (i = 0; i < nr_inst; i++) { u32 rd, rn, insn, oinsn; @@ -166,9 +164,6 @@ WARN_ON_ONCE(cpus_have_const_cap(ARM64_HARDEN_EL2_VECTORS)); return; } - - if (!va_mask) - compute_layout(); /* * Compute HYP VA by using the same computation as kern_hyp_va() diff --git a/kernel/arch/hexagon/include/asm/spinlock_types.h b/kernel/arch/hexagon/include/asm/spinlock_types.h index 7a906b5..d8f596f 100644 --- a/kernel/arch/hexagon/include/asm/spinlock_types.h +++ b/kernel/arch/hexagon/include/asm/spinlock_types.h @@ -21,10 +21,6 @@ #ifndef _ASM_SPINLOCK_TYPES_H #define _ASM_SPINLOCK_TYPES_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - typedef struct { volatile unsigned int lock; } arch_spinlock_t; diff --git a/kernel/arch/ia64/include/asm/spinlock_types.h b/kernel/arch/ia64/include/asm/spinlock_types.h index 6e345fe..681408d 100644 --- a/kernel/arch/ia64/include/asm/spinlock_types.h +++ b/kernel/arch/ia64/include/asm/spinlock_types.h @@ -2,10 +2,6 @@ #ifndef _ASM_IA64_SPINLOCK_TYPES_H #define _ASM_IA64_SPINLOCK_TYPES_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - typedef struct { volatile unsigned int lock; } arch_spinlock_t; diff --git a/kernel/arch/ia64/kernel/mca.c b/kernel/arch/ia64/kernel/mca.c index d7400b2..40abc24 100644 --- a/kernel/arch/ia64/kernel/mca.c +++ b/kernel/arch/ia64/kernel/mca.c @@ -1824,7 +1824,7 @@ ti->cpu = cpu; p->stack = ti; p->state = TASK_UNINTERRUPTIBLE; - cpumask_set_cpu(cpu, &p->cpus_allowed); + cpumask_set_cpu(cpu, &p->cpus_mask); INIT_LIST_HEAD(&p->tasks); p->parent = p->real_parent = p->group_leader = p; INIT_LIST_HEAD(&p->children); diff --git a/kernel/arch/mips/Kconfig b/kernel/arch/mips/Kconfig index 5913065..a5b3027 100644 --- a/kernel/arch/mips/Kconfig +++ b/kernel/arch/mips/Kconfig @@ -2525,7 +2525,7 @@ # config HIGHMEM bool "High Memory Support" - depends on 32BIT && CPU_SUPPORTS_HIGHMEM && SYS_SUPPORTS_HIGHMEM && !CPU_MIPS32_3_5_EVA + depends on 32BIT && CPU_SUPPORTS_HIGHMEM && SYS_SUPPORTS_HIGHMEM && !CPU_MIPS32_3_5_EVA && !PREEMPT_RT_FULL config CPU_SUPPORTS_HIGHMEM bool diff --git a/kernel/arch/mips/include/asm/switch_to.h b/kernel/arch/mips/include/asm/switch_to.h index e610473..1428b4f 100644 --- a/kernel/arch/mips/include/asm/switch_to.h +++ b/kernel/arch/mips/include/asm/switch_to.h @@ -42,7 +42,7 @@ * inline to try to keep the overhead down. If we have been forced to run on * a "CPU" with an FPU because of a previous high level of FP computation, * but did not actually use the FPU during the most recent time-slice (CU1 - * isn't set), we undo the restriction on cpus_allowed. + * isn't set), we undo the restriction on cpus_mask. * * We're not calling set_cpus_allowed() here, because we have no need to * force prompt migration - we're already switching the current CPU to a @@ -57,7 +57,7 @@ test_ti_thread_flag(__prev_ti, TIF_FPUBOUND) && \ (!(KSTK_STATUS(prev) & ST0_CU1))) { \ clear_ti_thread_flag(__prev_ti, TIF_FPUBOUND); \ - prev->cpus_allowed = prev->thread.user_cpus_allowed; \ + prev->cpus_mask = prev->thread.user_cpus_allowed; \ } \ next->thread.emulated_fp = 0; \ } while(0) diff --git a/kernel/arch/mips/kernel/mips-mt-fpaff.c b/kernel/arch/mips/kernel/mips-mt-fpaff.c index a7c0f97..1a08428 100644 --- a/kernel/arch/mips/kernel/mips-mt-fpaff.c +++ b/kernel/arch/mips/kernel/mips-mt-fpaff.c @@ -177,7 +177,7 @@ if (retval) goto out_unlock; - cpumask_or(&allowed, &p->thread.user_cpus_allowed, &p->cpus_allowed); + cpumask_or(&allowed, &p->thread.user_cpus_allowed, p->cpus_ptr); cpumask_and(&mask, &allowed, cpu_active_mask); out_unlock: diff --git a/kernel/arch/mips/kernel/traps.c b/kernel/arch/mips/kernel/traps.c index b9da2ce..f3e1242 100644 --- a/kernel/arch/mips/kernel/traps.c +++ b/kernel/arch/mips/kernel/traps.c @@ -1174,12 +1174,12 @@ * restricted the allowed set to exclude any CPUs with FPUs, * we'll skip the procedure. */ - if (cpumask_intersects(¤t->cpus_allowed, &mt_fpu_cpumask)) { + if (cpumask_intersects(¤t->cpus_mask, &mt_fpu_cpumask)) { cpumask_t tmask; current->thread.user_cpus_allowed - = current->cpus_allowed; - cpumask_and(&tmask, ¤t->cpus_allowed, + = current->cpus_mask; + cpumask_and(&tmask, ¤t->cpus_mask, &mt_fpu_cpumask); set_cpus_allowed_ptr(current, &tmask); set_thread_flag(TIF_FPUBOUND); diff --git a/kernel/arch/powerpc/Kconfig b/kernel/arch/powerpc/Kconfig index f0e09d5..4536d04 100644 --- a/kernel/arch/powerpc/Kconfig +++ b/kernel/arch/powerpc/Kconfig @@ -105,10 +105,11 @@ config RWSEM_GENERIC_SPINLOCK bool + default y if PREEMPT_RT_FULL config RWSEM_XCHGADD_ALGORITHM bool - default y + default y if !PREEMPT_RT_FULL config GENERIC_LOCKBREAK bool @@ -216,6 +217,7 @@ select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH select HAVE_PERF_REGS select HAVE_PERF_USER_STACK_DUMP + select HAVE_PREEMPT_LAZY select HAVE_RCU_TABLE_FREE if SMP select HAVE_REGS_AND_STACK_ACCESS_API select HAVE_RELIABLE_STACKTRACE if PPC64 && CPU_LITTLE_ENDIAN @@ -399,7 +401,7 @@ config HIGHMEM bool "High memory support" - depends on PPC32 + depends on PPC32 && !PREEMPT_RT_FULL source kernel/Kconfig.hz diff --git a/kernel/arch/powerpc/include/asm/spinlock_types.h b/kernel/arch/powerpc/include/asm/spinlock_types.h index 87adaf1..7305cb6 100644 --- a/kernel/arch/powerpc/include/asm/spinlock_types.h +++ b/kernel/arch/powerpc/include/asm/spinlock_types.h @@ -2,10 +2,6 @@ #ifndef _ASM_POWERPC_SPINLOCK_TYPES_H #define _ASM_POWERPC_SPINLOCK_TYPES_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - typedef struct { volatile unsigned int slock; } arch_spinlock_t; diff --git a/kernel/arch/powerpc/include/asm/thread_info.h b/kernel/arch/powerpc/include/asm/thread_info.h index 3c00020..64c3d1a 100644 --- a/kernel/arch/powerpc/include/asm/thread_info.h +++ b/kernel/arch/powerpc/include/asm/thread_info.h @@ -37,6 +37,8 @@ int cpu; /* cpu we're on */ int preempt_count; /* 0 => preemptable, <0 => BUG */ + int preempt_lazy_count; /* 0 => preemptable, + <0 => BUG */ unsigned long local_flags; /* private flags for thread */ #ifdef CONFIG_LIVEPATCH unsigned long *livepatch_sp; @@ -81,18 +83,18 @@ #define TIF_SIGPENDING 1 /* signal pending */ #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ #define TIF_FSCHECK 3 /* Check FS is USER_DS on return */ -#define TIF_32BIT 4 /* 32 bit binary */ #define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */ #define TIF_PATCH_PENDING 6 /* pending live patching update */ #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ #define TIF_SINGLESTEP 8 /* singlestepping active */ #define TIF_NOHZ 9 /* in adaptive nohz mode */ #define TIF_SECCOMP 10 /* secure computing */ -#define TIF_RESTOREALL 11 /* Restore all regs (implies NOERROR) */ -#define TIF_NOERROR 12 /* Force successful syscall return */ + +#define TIF_NEED_RESCHED_LAZY 11 /* lazy rescheduling necessary */ +#define TIF_SYSCALL_TRACEPOINT 12 /* syscall tracepoint instrumentation */ + #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ #define TIF_UPROBE 14 /* breakpointed or single-stepping */ -#define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation for stack store? */ #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ @@ -100,6 +102,10 @@ #define TIF_ELF2ABI 18 /* function descriptors must die! */ #endif #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ +#define TIF_32BIT 20 /* 32 bit binary */ +#define TIF_RESTOREALL 21 /* Restore all regs (implies NOERROR) */ +#define TIF_NOERROR 22 /* Force successful syscall return */ + /* as above, but as bit values */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) @@ -119,6 +125,7 @@ #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) #define _TIF_EMULATE_STACK_STORE (1<<TIF_EMULATE_STACK_STORE) #define _TIF_NOHZ (1<<TIF_NOHZ) +#define _TIF_NEED_RESCHED_LAZY (1<<TIF_NEED_RESCHED_LAZY) #define _TIF_FSCHECK (1<<TIF_FSCHECK) #define _TIF_SYSCALL_DOTRACE (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \ @@ -127,8 +134,9 @@ #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ _TIF_RESTORE_TM | _TIF_PATCH_PENDING | \ - _TIF_FSCHECK) + _TIF_FSCHECK | _TIF_NEED_RESCHED_LAZY) #define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR) +#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) /* Bits in local_flags */ /* Don't move TLF_NAPPING without adjusting the code in entry_32.S */ diff --git a/kernel/arch/powerpc/kernel/asm-offsets.c b/kernel/arch/powerpc/kernel/asm-offsets.c index 50400f2..1bb82c5 100644 --- a/kernel/arch/powerpc/kernel/asm-offsets.c +++ b/kernel/arch/powerpc/kernel/asm-offsets.c @@ -156,6 +156,7 @@ OFFSET(TI_FLAGS, thread_info, flags); OFFSET(TI_LOCAL_FLAGS, thread_info, local_flags); OFFSET(TI_PREEMPT, thread_info, preempt_count); + OFFSET(TI_PREEMPT_LAZY, thread_info, preempt_lazy_count); OFFSET(TI_TASK, thread_info, task); OFFSET(TI_CPU, thread_info, cpu); diff --git a/kernel/arch/powerpc/kernel/entry_32.S b/kernel/arch/powerpc/kernel/entry_32.S index 26b3f85..44bcf15 100644 --- a/kernel/arch/powerpc/kernel/entry_32.S +++ b/kernel/arch/powerpc/kernel/entry_32.S @@ -393,7 +393,9 @@ MTMSRD(r10) lwz r9,TI_FLAGS(r12) li r8,-MAX_ERRNO - andi. r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK) + lis r0,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@h + ori r0,r0, (_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@l + and. r0,r9,r0 bne- syscall_exit_work cmplw 0,r3,r8 blt+ syscall_exit_cont @@ -511,13 +513,13 @@ b syscall_dotrace_cont syscall_exit_work: - andi. r0,r9,_TIF_RESTOREALL + andis. r0,r9,_TIF_RESTOREALL@h beq+ 0f REST_NVGPRS(r1) b 2f 0: cmplw 0,r3,r8 blt+ 1f - andi. r0,r9,_TIF_NOERROR + andis. r0,r9,_TIF_NOERROR@h bne- 1f lwz r11,_CCR(r1) /* Load CR */ neg r3,r3 @@ -526,12 +528,12 @@ 1: stw r6,RESULT(r1) /* Save result */ stw r3,GPR3(r1) /* Update return value */ -2: andi. r0,r9,(_TIF_PERSYSCALL_MASK) +2: andis. r0,r9,(_TIF_PERSYSCALL_MASK)@h beq 4f /* Clear per-syscall TIF flags if any are set. */ - li r11,_TIF_PERSYSCALL_MASK + lis r11,_TIF_PERSYSCALL_MASK@h addi r12,r12,TI_FLAGS 3: lwarx r8,0,r12 andc r8,r8,r11 @@ -888,7 +890,14 @@ cmpwi 0,r0,0 /* if non-zero, just restore regs and return */ bne restore andi. r8,r8,_TIF_NEED_RESCHED + bne+ 1f + lwz r0,TI_PREEMPT_LAZY(r9) + cmpwi 0,r0,0 /* if non-zero, just restore regs and return */ + bne restore + lwz r0,TI_FLAGS(r9) + andi. r0,r0,_TIF_NEED_RESCHED_LAZY beq+ restore +1: lwz r3,_MSR(r1) andi. r0,r3,MSR_EE /* interrupts off? */ beq restore /* don't schedule if so */ @@ -899,11 +908,11 @@ */ bl trace_hardirqs_off #endif -1: bl preempt_schedule_irq +2: bl preempt_schedule_irq CURRENT_THREAD_INFO(r9, r1) lwz r3,TI_FLAGS(r9) - andi. r0,r3,_TIF_NEED_RESCHED - bne- 1b + andi. r0,r3,_TIF_NEED_RESCHED_MASK + bne- 2b #ifdef CONFIG_TRACE_IRQFLAGS /* And now, to properly rebalance the above, we tell lockdep they * are being turned back on, which will happen when we return @@ -1232,7 +1241,7 @@ #endif /* !(CONFIG_4xx || CONFIG_BOOKE) */ do_work: /* r10 contains MSR_KERNEL here */ - andi. r0,r9,_TIF_NEED_RESCHED + andi. r0,r9,_TIF_NEED_RESCHED_MASK beq do_user_signal do_resched: /* r10 contains MSR_KERNEL here */ @@ -1253,7 +1262,7 @@ MTMSRD(r10) /* disable interrupts */ CURRENT_THREAD_INFO(r9, r1) lwz r9,TI_FLAGS(r9) - andi. r0,r9,_TIF_NEED_RESCHED + andi. r0,r9,_TIF_NEED_RESCHED_MASK bne- do_resched andi. r0,r9,_TIF_USER_WORK_MASK beq restore_user diff --git a/kernel/arch/powerpc/kernel/entry_64.S b/kernel/arch/powerpc/kernel/entry_64.S index 58b5096..229cdb0 100644 --- a/kernel/arch/powerpc/kernel/entry_64.S +++ b/kernel/arch/powerpc/kernel/entry_64.S @@ -176,7 +176,7 @@ * based on caller's run-mode / personality. */ ld r11,SYS_CALL_TABLE@toc(2) - andi. r10,r10,_TIF_32BIT + andis. r10,r10,_TIF_32BIT@h beq 15f addi r11,r11,8 /* use 32-bit syscall entries */ clrldi r3,r3,32 @@ -250,7 +250,9 @@ ld r9,TI_FLAGS(r12) li r11,-MAX_ERRNO - andi. r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK) + lis r0,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@h + ori r0,r0,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@l + and. r0,r9,r0 bne- .Lsyscall_exit_work andi. r0,r8,MSR_FP @@ -363,25 +365,25 @@ /* If TIF_RESTOREALL is set, don't scribble on either r3 or ccr. If TIF_NOERROR is set, just save r3 as it is. */ - andi. r0,r9,_TIF_RESTOREALL + andis. r0,r9,_TIF_RESTOREALL@h beq+ 0f REST_NVGPRS(r1) b 2f 0: cmpld r3,r11 /* r11 is -MAX_ERRNO */ blt+ 1f - andi. r0,r9,_TIF_NOERROR + andis. r0,r9,_TIF_NOERROR@h bne- 1f ld r5,_CCR(r1) neg r3,r3 oris r5,r5,0x1000 /* Set SO bit in CR */ std r5,_CCR(r1) 1: std r3,GPR3(r1) -2: andi. r0,r9,(_TIF_PERSYSCALL_MASK) +2: andis. r0,r9,(_TIF_PERSYSCALL_MASK)@h beq 4f /* Clear per-syscall TIF flags if any are set. */ - li r11,_TIF_PERSYSCALL_MASK + lis r11,(_TIF_PERSYSCALL_MASK)@h addi r12,r12,TI_FLAGS 3: ldarx r10,0,r12 andc r10,r10,r11 @@ -774,7 +776,7 @@ bl restore_math b restore #endif -1: andi. r0,r4,_TIF_NEED_RESCHED +1: andi. r0,r4,_TIF_NEED_RESCHED_MASK beq 2f bl restore_interrupts SCHEDULE_USER @@ -836,10 +838,18 @@ #ifdef CONFIG_PREEMPT /* Check if we need to preempt */ - andi. r0,r4,_TIF_NEED_RESCHED - beq+ restore - /* Check that preempt_count() == 0 and interrupts are enabled */ lwz r8,TI_PREEMPT(r9) + cmpwi 0,r8,0 /* if non-zero, just restore regs and return */ + bne restore + andi. r0,r4,_TIF_NEED_RESCHED + bne+ check_count + + andi. r0,r4,_TIF_NEED_RESCHED_LAZY + beq+ restore + lwz r8,TI_PREEMPT_LAZY(r9) + + /* Check that preempt_count() == 0 and interrupts are enabled */ +check_count: cmpwi cr0,r8,0 bne restore ld r0,SOFTE(r1) @@ -856,7 +866,7 @@ /* Re-test flags and eventually loop */ CURRENT_THREAD_INFO(r9, r1) ld r4,TI_FLAGS(r9) - andi. r0,r4,_TIF_NEED_RESCHED + andi. r0,r4,_TIF_NEED_RESCHED_MASK bne 1b /* diff --git a/kernel/arch/powerpc/kernel/irq.c b/kernel/arch/powerpc/kernel/irq.c index d37704e..b45a984 100644 --- a/kernel/arch/powerpc/kernel/irq.c +++ b/kernel/arch/powerpc/kernel/irq.c @@ -766,6 +766,7 @@ } } +#ifndef CONFIG_PREEMPT_RT_FULL void do_softirq_own_stack(void) { struct thread_info *curtp, *irqtp; @@ -783,6 +784,7 @@ if (irqtp->flags) set_bits(irqtp->flags, &curtp->flags); } +#endif irq_hw_number_t virq_to_hw(unsigned int virq) { diff --git a/kernel/arch/powerpc/kernel/misc_32.S b/kernel/arch/powerpc/kernel/misc_32.S index 695b24a..032ada2 100644 --- a/kernel/arch/powerpc/kernel/misc_32.S +++ b/kernel/arch/powerpc/kernel/misc_32.S @@ -42,6 +42,7 @@ * We store the saved ksp_limit in the unused part * of the STACK_FRAME_OVERHEAD */ +#ifndef CONFIG_PREEMPT_RT_FULL _GLOBAL(call_do_softirq) mflr r0 stw r0,4(r1) @@ -58,6 +59,7 @@ stw r10,THREAD+KSP_LIMIT(r2) mtlr r0 blr +#endif /* * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp); diff --git a/kernel/arch/powerpc/kernel/misc_64.S b/kernel/arch/powerpc/kernel/misc_64.S index facc029..8b17741 100644 --- a/kernel/arch/powerpc/kernel/misc_64.S +++ b/kernel/arch/powerpc/kernel/misc_64.S @@ -32,6 +32,7 @@ .text +#ifndef CONFIG_PREEMPT_RT_FULL _GLOBAL(call_do_softirq) mflr r0 std r0,16(r1) @@ -42,6 +43,7 @@ ld r0,16(r1) mtlr r0 blr +#endif _GLOBAL(call_do_irq) mflr r0 diff --git a/kernel/arch/powerpc/kvm/Kconfig b/kernel/arch/powerpc/kvm/Kconfig index e058d02..19a283f 100644 --- a/kernel/arch/powerpc/kvm/Kconfig +++ b/kernel/arch/powerpc/kvm/Kconfig @@ -177,6 +177,7 @@ config KVM_MPIC bool "KVM in-kernel MPIC emulation" depends on KVM && E500 + depends on !PREEMPT_RT_FULL select HAVE_KVM_IRQCHIP select HAVE_KVM_IRQFD select HAVE_KVM_IRQ_ROUTING diff --git a/kernel/arch/powerpc/platforms/cell/spufs/sched.c b/kernel/arch/powerpc/platforms/cell/spufs/sched.c index 9fcccb4..a24010d 100644 --- a/kernel/arch/powerpc/platforms/cell/spufs/sched.c +++ b/kernel/arch/powerpc/platforms/cell/spufs/sched.c @@ -141,7 +141,7 @@ * runqueue. The context will be rescheduled on the proper node * if it is timesliced or preempted. */ - cpumask_copy(&ctx->cpus_allowed, ¤t->cpus_allowed); + cpumask_copy(&ctx->cpus_allowed, current->cpus_ptr); /* Save the current cpu id for spu interrupt routing. */ ctx->last_ran = raw_smp_processor_id(); diff --git a/kernel/arch/powerpc/platforms/ps3/device-init.c b/kernel/arch/powerpc/platforms/ps3/device-init.c index e7075aa..1580464 100644 --- a/kernel/arch/powerpc/platforms/ps3/device-init.c +++ b/kernel/arch/powerpc/platforms/ps3/device-init.c @@ -752,8 +752,8 @@ } pr_debug("%s:%u: notification %s issued\n", __func__, __LINE__, op); - res = wait_event_interruptible(dev->done.wait, - dev->done.done || kthread_should_stop()); + res = swait_event_interruptible_exclusive(dev->done.wait, + dev->done.done || kthread_should_stop()); if (kthread_should_stop()) res = -EINTR; if (res) { diff --git a/kernel/arch/powerpc/platforms/pseries/iommu.c b/kernel/arch/powerpc/platforms/pseries/iommu.c index b1a08cb..8ef818a 100644 --- a/kernel/arch/powerpc/platforms/pseries/iommu.c +++ b/kernel/arch/powerpc/platforms/pseries/iommu.c @@ -38,6 +38,7 @@ #include <linux/of.h> #include <linux/iommu.h> #include <linux/rculist.h> +#include <linux/locallock.h> #include <asm/io.h> #include <asm/prom.h> #include <asm/rtas.h> @@ -212,6 +213,7 @@ } static DEFINE_PER_CPU(__be64 *, tce_page); +static DEFINE_LOCAL_IRQ_LOCK(tcp_page_lock); static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages, unsigned long uaddr, @@ -233,7 +235,8 @@ direction, attrs); } - local_irq_save(flags); /* to protect tcep and the page behind it */ + /* to protect tcep and the page behind it */ + local_lock_irqsave(tcp_page_lock, flags); tcep = __this_cpu_read(tce_page); @@ -244,7 +247,7 @@ tcep = (__be64 *)__get_free_page(GFP_ATOMIC); /* If allocation fails, fall back to the loop implementation */ if (!tcep) { - local_irq_restore(flags); + local_unlock_irqrestore(tcp_page_lock, flags); return tce_build_pSeriesLP(tbl->it_index, tcenum, tbl->it_page_shift, npages, uaddr, direction, attrs); @@ -279,7 +282,7 @@ tcenum += limit; } while (npages > 0 && !rc); - local_irq_restore(flags); + local_unlock_irqrestore(tcp_page_lock, flags); if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) { ret = (int)rc; @@ -450,13 +453,14 @@ DMA_BIDIRECTIONAL, 0); } - local_irq_disable(); /* to protect tcep and the page behind it */ + /* to protect tcep and the page behind it */ + local_lock_irq(tcp_page_lock); tcep = __this_cpu_read(tce_page); if (!tcep) { tcep = (__be64 *)__get_free_page(GFP_ATOMIC); if (!tcep) { - local_irq_enable(); + local_unlock_irq(tcp_page_lock); return -ENOMEM; } __this_cpu_write(tce_page, tcep); @@ -502,7 +506,7 @@ /* error cleanup: caller will clear whole range */ - local_irq_enable(); + local_unlock_irq(tcp_page_lock); return rc; } diff --git a/kernel/arch/s390/include/asm/spinlock_types.h b/kernel/arch/s390/include/asm/spinlock_types.h index cfed272..8e28e81 100644 --- a/kernel/arch/s390/include/asm/spinlock_types.h +++ b/kernel/arch/s390/include/asm/spinlock_types.h @@ -2,10 +2,6 @@ #ifndef __ASM_SPINLOCK_TYPES_H #define __ASM_SPINLOCK_TYPES_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - typedef struct { int lock; } __attribute__ ((aligned (4))) arch_spinlock_t; diff --git a/kernel/arch/sh/include/asm/spinlock_types.h b/kernel/arch/sh/include/asm/spinlock_types.h index e82369f..22ca9a9 100644 --- a/kernel/arch/sh/include/asm/spinlock_types.h +++ b/kernel/arch/sh/include/asm/spinlock_types.h @@ -2,10 +2,6 @@ #ifndef __ASM_SH_SPINLOCK_TYPES_H #define __ASM_SH_SPINLOCK_TYPES_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - typedef struct { volatile unsigned int lock; } arch_spinlock_t; diff --git a/kernel/arch/sh/kernel/irq.c b/kernel/arch/sh/kernel/irq.c index 5717c7c..66dd399 100644 --- a/kernel/arch/sh/kernel/irq.c +++ b/kernel/arch/sh/kernel/irq.c @@ -148,6 +148,7 @@ hardirq_ctx[cpu] = NULL; } +#ifndef CONFIG_PREEMPT_RT_FULL void do_softirq_own_stack(void) { struct thread_info *curctx; @@ -175,6 +176,7 @@ "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr" ); } +#endif #else static inline void handle_one_irq(unsigned int irq) { diff --git a/kernel/arch/sparc/kernel/irq_64.c b/kernel/arch/sparc/kernel/irq_64.c index 713670e..5dfc715 100644 --- a/kernel/arch/sparc/kernel/irq_64.c +++ b/kernel/arch/sparc/kernel/irq_64.c @@ -854,6 +854,7 @@ set_irq_regs(old_regs); } +#ifndef CONFIG_PREEMPT_RT_FULL void do_softirq_own_stack(void) { void *orig_sp, *sp = softirq_stack[smp_processor_id()]; @@ -868,6 +869,7 @@ __asm__ __volatile__("mov %0, %%sp" : : "r" (orig_sp)); } +#endif #ifdef CONFIG_HOTPLUG_CPU void fixup_irqs(void) diff --git a/kernel/arch/x86/Kconfig b/kernel/arch/x86/Kconfig index a12dc21..1a51b69 100644 --- a/kernel/arch/x86/Kconfig +++ b/kernel/arch/x86/Kconfig @@ -182,6 +182,7 @@ select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI select HAVE_PERF_REGS select HAVE_PERF_USER_STACK_DUMP + select HAVE_PREEMPT_LAZY select HAVE_RCU_TABLE_FREE if PARAVIRT select HAVE_RCU_TABLE_INVALIDATE if HAVE_RCU_TABLE_FREE select HAVE_REGS_AND_STACK_ACCESS_API @@ -267,8 +268,11 @@ def_bool y depends on ISA_DMA_API +config RWSEM_GENERIC_SPINLOCK + def_bool PREEMPT_RT_FULL + config RWSEM_XCHGADD_ALGORITHM - def_bool y + def_bool !RWSEM_GENERIC_SPINLOCK && !PREEMPT_RT_FULL config GENERIC_CALIBRATE_DELAY def_bool y @@ -938,7 +942,7 @@ config MAXSMP bool "Enable Maximum number of SMP Processors and NUMA Nodes" depends on X86_64 && SMP && DEBUG_KERNEL - select CPUMASK_OFFSTACK + select CPUMASK_OFFSTACK if !PREEMPT_RT_FULL ---help--- Enable maximum number of CPUS and NUMA Nodes for this architecture. If unsure, say N. diff --git a/kernel/arch/x86/crypto/aesni-intel_glue.c b/kernel/arch/x86/crypto/aesni-intel_glue.c index 917f25e..58d8c03 100644 --- a/kernel/arch/x86/crypto/aesni-intel_glue.c +++ b/kernel/arch/x86/crypto/aesni-intel_glue.c @@ -434,14 +434,14 @@ err = skcipher_walk_virt(&walk, req, true); - kernel_fpu_begin(); while ((nbytes = walk.nbytes)) { + kernel_fpu_begin(); aesni_ecb_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, nbytes & AES_BLOCK_MASK); + kernel_fpu_end(); nbytes &= AES_BLOCK_SIZE - 1; err = skcipher_walk_done(&walk, nbytes); } - kernel_fpu_end(); return err; } @@ -456,14 +456,14 @@ err = skcipher_walk_virt(&walk, req, true); - kernel_fpu_begin(); while ((nbytes = walk.nbytes)) { + kernel_fpu_begin(); aesni_ecb_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, nbytes & AES_BLOCK_MASK); + kernel_fpu_end(); nbytes &= AES_BLOCK_SIZE - 1; err = skcipher_walk_done(&walk, nbytes); } - kernel_fpu_end(); return err; } @@ -478,14 +478,14 @@ err = skcipher_walk_virt(&walk, req, true); - kernel_fpu_begin(); while ((nbytes = walk.nbytes)) { + kernel_fpu_begin(); aesni_cbc_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, nbytes & AES_BLOCK_MASK, walk.iv); + kernel_fpu_end(); nbytes &= AES_BLOCK_SIZE - 1; err = skcipher_walk_done(&walk, nbytes); } - kernel_fpu_end(); return err; } @@ -500,14 +500,14 @@ err = skcipher_walk_virt(&walk, req, true); - kernel_fpu_begin(); while ((nbytes = walk.nbytes)) { + kernel_fpu_begin(); aesni_cbc_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, nbytes & AES_BLOCK_MASK, walk.iv); + kernel_fpu_end(); nbytes &= AES_BLOCK_SIZE - 1; err = skcipher_walk_done(&walk, nbytes); } - kernel_fpu_end(); return err; } @@ -557,18 +557,20 @@ err = skcipher_walk_virt(&walk, req, true); - kernel_fpu_begin(); while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) { + kernel_fpu_begin(); aesni_ctr_enc_tfm(ctx, walk.dst.virt.addr, walk.src.virt.addr, nbytes & AES_BLOCK_MASK, walk.iv); + kernel_fpu_end(); nbytes &= AES_BLOCK_SIZE - 1; err = skcipher_walk_done(&walk, nbytes); } if (walk.nbytes) { + kernel_fpu_begin(); ctr_crypt_final(ctx, &walk); + kernel_fpu_end(); err = skcipher_walk_done(&walk, 0); } - kernel_fpu_end(); return err; } diff --git a/kernel/arch/x86/crypto/cast5_avx_glue.c b/kernel/arch/x86/crypto/cast5_avx_glue.c index 4103474..d4bf7fc 100644 --- a/kernel/arch/x86/crypto/cast5_avx_glue.c +++ b/kernel/arch/x86/crypto/cast5_avx_glue.c @@ -61,7 +61,7 @@ static int ecb_crypt(struct skcipher_request *req, bool enc) { - bool fpu_enabled = false; + bool fpu_enabled; struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); struct skcipher_walk walk; @@ -76,7 +76,7 @@ u8 *wsrc = walk.src.virt.addr; u8 *wdst = walk.dst.virt.addr; - fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); + fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); /* Process multi-block batch */ if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) { @@ -105,10 +105,9 @@ } while (nbytes >= bsize); done: + cast5_fpu_end(fpu_enabled); err = skcipher_walk_done(&walk, nbytes); } - - cast5_fpu_end(fpu_enabled); return err; } @@ -212,7 +211,7 @@ { struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); - bool fpu_enabled = false; + bool fpu_enabled; struct skcipher_walk walk; unsigned int nbytes; int err; @@ -220,12 +219,11 @@ err = skcipher_walk_virt(&walk, req, false); while ((nbytes = walk.nbytes)) { - fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); + fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); nbytes = __cbc_decrypt(ctx, &walk); + cast5_fpu_end(fpu_enabled); err = skcipher_walk_done(&walk, nbytes); } - - cast5_fpu_end(fpu_enabled); return err; } @@ -292,7 +290,7 @@ { struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); - bool fpu_enabled = false; + bool fpu_enabled; struct skcipher_walk walk; unsigned int nbytes; int err; @@ -300,12 +298,11 @@ err = skcipher_walk_virt(&walk, req, false); while ((nbytes = walk.nbytes) >= CAST5_BLOCK_SIZE) { - fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); + fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); nbytes = __ctr_crypt(&walk, ctx); + cast5_fpu_end(fpu_enabled); err = skcipher_walk_done(&walk, nbytes); } - - cast5_fpu_end(fpu_enabled); if (walk.nbytes) { ctr_crypt_final(&walk, ctx); diff --git a/kernel/arch/x86/crypto/glue_helper.c b/kernel/arch/x86/crypto/glue_helper.c index a78ef99..dac489a 100644 --- a/kernel/arch/x86/crypto/glue_helper.c +++ b/kernel/arch/x86/crypto/glue_helper.c @@ -38,7 +38,7 @@ void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); const unsigned int bsize = 128 / 8; struct skcipher_walk walk; - bool fpu_enabled = false; + bool fpu_enabled; unsigned int nbytes; int err; @@ -51,7 +51,7 @@ unsigned int i; fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, - &walk, fpu_enabled, nbytes); + &walk, false, nbytes); for (i = 0; i < gctx->num_funcs; i++) { func_bytes = bsize * gctx->funcs[i].num_blocks; @@ -69,10 +69,9 @@ if (nbytes < bsize) break; } + glue_fpu_end(fpu_enabled); err = skcipher_walk_done(&walk, nbytes); } - - glue_fpu_end(fpu_enabled); return err; } EXPORT_SYMBOL_GPL(glue_ecb_req_128bit); @@ -115,7 +114,7 @@ void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); const unsigned int bsize = 128 / 8; struct skcipher_walk walk; - bool fpu_enabled = false; + bool fpu_enabled; unsigned int nbytes; int err; @@ -129,7 +128,7 @@ u128 last_iv; fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, - &walk, fpu_enabled, nbytes); + &walk, false, nbytes); /* Start of the last block. */ src += nbytes / bsize - 1; dst += nbytes / bsize - 1; @@ -161,10 +160,10 @@ done: u128_xor(dst, dst, (u128 *)walk.iv); *(u128 *)walk.iv = last_iv; + glue_fpu_end(fpu_enabled); err = skcipher_walk_done(&walk, nbytes); } - glue_fpu_end(fpu_enabled); return err; } EXPORT_SYMBOL_GPL(glue_cbc_decrypt_req_128bit); @@ -175,7 +174,7 @@ void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); const unsigned int bsize = 128 / 8; struct skcipher_walk walk; - bool fpu_enabled = false; + bool fpu_enabled; unsigned int nbytes; int err; @@ -189,7 +188,7 @@ le128 ctrblk; fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, - &walk, fpu_enabled, nbytes); + &walk, false, nbytes); be128_to_le128(&ctrblk, (be128 *)walk.iv); @@ -213,10 +212,9 @@ } le128_to_be128((be128 *)walk.iv, &ctrblk); + glue_fpu_end(fpu_enabled); err = skcipher_walk_done(&walk, nbytes); } - - glue_fpu_end(fpu_enabled); if (nbytes) { le128 ctrblk; @@ -278,7 +276,7 @@ { const unsigned int bsize = 128 / 8; struct skcipher_walk walk; - bool fpu_enabled = false; + bool fpu_enabled; unsigned int nbytes; int err; @@ -289,20 +287,23 @@ /* set minimum length to bsize, for tweak_fn */ fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, - &walk, fpu_enabled, + &walk, false, nbytes < bsize ? bsize : nbytes); /* calculate first value of T */ tweak_fn(tweak_ctx, walk.iv, walk.iv); while (nbytes) { + fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, + &walk, fpu_enabled, + nbytes < bsize ? bsize : nbytes); nbytes = __glue_xts_req_128bit(gctx, crypt_ctx, &walk); + glue_fpu_end(fpu_enabled); + fpu_enabled = false; err = skcipher_walk_done(&walk, nbytes); nbytes = walk.nbytes; } - - glue_fpu_end(fpu_enabled); return err; } diff --git a/kernel/arch/x86/entry/common.c b/kernel/arch/x86/entry/common.c index 8353348..3b5e41d 100644 --- a/kernel/arch/x86/entry/common.c +++ b/kernel/arch/x86/entry/common.c @@ -134,7 +134,7 @@ #define EXIT_TO_USERMODE_LOOP_FLAGS \ (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ - _TIF_NEED_RESCHED | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING) + _TIF_NEED_RESCHED_MASK | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING) static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) { @@ -149,9 +149,16 @@ /* We have work to do. */ local_irq_enable(); - if (cached_flags & _TIF_NEED_RESCHED) + if (cached_flags & _TIF_NEED_RESCHED_MASK) schedule(); +#ifdef ARCH_RT_DELAYS_SIGNAL_SEND + if (unlikely(current->forced_info.si_signo)) { + struct task_struct *t = current; + force_sig_info(t->forced_info.si_signo, &t->forced_info, t); + t->forced_info.si_signo = 0; + } +#endif if (cached_flags & _TIF_UPROBE) uprobe_notify_resume(regs); diff --git a/kernel/arch/x86/entry/entry_32.S b/kernel/arch/x86/entry/entry_32.S index 37d9016..d8b4008 100644 --- a/kernel/arch/x86/entry/entry_32.S +++ b/kernel/arch/x86/entry/entry_32.S @@ -750,8 +750,25 @@ ENTRY(resume_kernel) DISABLE_INTERRUPTS(CLBR_ANY) .Lneed_resched: + # preempt count == 0 + NEED_RS set? cmpl $0, PER_CPU_VAR(__preempt_count) +#ifndef CONFIG_PREEMPT_LAZY jnz restore_all_kernel +#else + jz test_int_off + + # atleast preempt count == 0 ? + cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count) + jne restore_all_kernel + + movl PER_CPU_VAR(current_task), %ebp + cmpl $0,TASK_TI_preempt_lazy_count(%ebp) # non-zero preempt_lazy_count ? + jnz restore_all_kernel + + testl $_TIF_NEED_RESCHED_LAZY, TASK_TI_flags(%ebp) + jz restore_all_kernel +test_int_off: +#endif testl $X86_EFLAGS_IF, PT_EFLAGS(%esp) # interrupts off (exception path) ? jz restore_all_kernel call preempt_schedule_irq diff --git a/kernel/arch/x86/entry/entry_64.S b/kernel/arch/x86/entry/entry_64.S index dfe26f3..94fccaa 100644 --- a/kernel/arch/x86/entry/entry_64.S +++ b/kernel/arch/x86/entry/entry_64.S @@ -733,7 +733,23 @@ btl $9, EFLAGS(%rsp) /* were interrupts off? */ jnc 1f 0: cmpl $0, PER_CPU_VAR(__preempt_count) +#ifndef CONFIG_PREEMPT_LAZY jnz 1f +#else + jz do_preempt_schedule_irq + + # atleast preempt count == 0 ? + cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count) + jnz 1f + + movq PER_CPU_VAR(current_task), %rcx + cmpl $0, TASK_TI_preempt_lazy_count(%rcx) + jnz 1f + + btl $TIF_NEED_RESCHED_LAZY,TASK_TI_flags(%rcx) + jnc 1f +do_preempt_schedule_irq: +#endif call preempt_schedule_irq jmp 0b 1: @@ -1084,6 +1100,7 @@ jmp 2b .previous +#ifndef CONFIG_PREEMPT_RT_FULL /* Call softirq on interrupt stack. Interrupts are off. */ ENTRY(do_softirq_own_stack) pushq %rbp @@ -1094,6 +1111,7 @@ leaveq ret ENDPROC(do_softirq_own_stack) +#endif #ifdef CONFIG_XEN idtentry hypervisor_callback xen_do_hypervisor_callback has_error_code=0 diff --git a/kernel/arch/x86/include/asm/fpu/api.h b/kernel/arch/x86/include/asm/fpu/api.h index b56d504..e51c709 100644 --- a/kernel/arch/x86/include/asm/fpu/api.h +++ b/kernel/arch/x86/include/asm/fpu/api.h @@ -20,6 +20,7 @@ */ extern void kernel_fpu_begin(void); extern void kernel_fpu_end(void); +extern void kernel_fpu_resched(void); extern bool irq_fpu_usable(void); /* diff --git a/kernel/arch/x86/include/asm/preempt.h b/kernel/arch/x86/include/asm/preempt.h index 7f2dbd9..afa0e42 100644 --- a/kernel/arch/x86/include/asm/preempt.h +++ b/kernel/arch/x86/include/asm/preempt.h @@ -86,9 +86,24 @@ * a decrement which hits zero means we have no preempt_count and should * reschedule. */ -static __always_inline bool __preempt_count_dec_and_test(void) +static __always_inline bool ____preempt_count_dec_and_test(void) { GEN_UNARY_RMWcc("decl", __preempt_count, __percpu_arg(0), e); +} + +static __always_inline bool __preempt_count_dec_and_test(void) +{ + if (____preempt_count_dec_and_test()) + return true; +#ifdef CONFIG_PREEMPT_LAZY + if (preempt_count()) + return false; + if (current_thread_info()->preempt_lazy_count) + return false; + return test_thread_flag(TIF_NEED_RESCHED_LAZY); +#else + return false; +#endif } /* @@ -96,7 +111,23 @@ */ static __always_inline bool should_resched(int preempt_offset) { +#ifdef CONFIG_PREEMPT_LAZY + u32 tmp; + + tmp = raw_cpu_read_4(__preempt_count); + if (tmp == preempt_offset) + return true; + + /* preempt count == 0 ? */ + tmp &= ~PREEMPT_NEED_RESCHED; + if (tmp != preempt_offset) + return false; + if (current_thread_info()->preempt_lazy_count) + return false; + return test_thread_flag(TIF_NEED_RESCHED_LAZY); +#else return unlikely(raw_cpu_read_4(__preempt_count) == preempt_offset); +#endif } #ifdef CONFIG_PREEMPT diff --git a/kernel/arch/x86/include/asm/signal.h b/kernel/arch/x86/include/asm/signal.h index 33d3c88..c00e27a 100644 --- a/kernel/arch/x86/include/asm/signal.h +++ b/kernel/arch/x86/include/asm/signal.h @@ -28,6 +28,19 @@ #define SA_IA32_ABI 0x02000000u #define SA_X32_ABI 0x01000000u +/* + * Because some traps use the IST stack, we must keep preemption + * disabled while calling do_trap(), but do_trap() may call + * force_sig_info() which will grab the signal spin_locks for the + * task, which in PREEMPT_RT_FULL are mutexes. By defining + * ARCH_RT_DELAYS_SIGNAL_SEND the force_sig_info() will set + * TIF_NOTIFY_RESUME and set up the signal to be sent on exit of the + * trap. + */ +#if defined(CONFIG_PREEMPT_RT_FULL) +#define ARCH_RT_DELAYS_SIGNAL_SEND +#endif + #ifndef CONFIG_COMPAT typedef sigset_t compat_sigset_t; #endif diff --git a/kernel/arch/x86/include/asm/stackprotector.h b/kernel/arch/x86/include/asm/stackprotector.h index 9c556ea..b136992 100644 --- a/kernel/arch/x86/include/asm/stackprotector.h +++ b/kernel/arch/x86/include/asm/stackprotector.h @@ -65,7 +65,7 @@ */ static __always_inline void boot_init_stack_canary(void) { - u64 canary; + u64 uninitialized_var(canary); u64 tsc; #ifdef CONFIG_X86_64 @@ -76,8 +76,14 @@ * of randomness. The TSC only matters for very early init, * there it already has some randomness on most systems. Later * on during the bootup the random pool has true entropy too. + * For preempt-rt we need to weaken the randomness a bit, as + * we can't call into the random generator from atomic context + * due to locking constraints. We just leave canary + * uninitialized and use the TSC based randomness on top of it. */ +#ifndef CONFIG_PREEMPT_RT_FULL get_random_bytes(&canary, sizeof(canary)); +#endif tsc = rdtsc(); canary += tsc + (tsc << 32UL); canary &= CANARY_MASK; diff --git a/kernel/arch/x86/include/asm/thread_info.h b/kernel/arch/x86/include/asm/thread_info.h index b5e4c35..d311dc0 100644 --- a/kernel/arch/x86/include/asm/thread_info.h +++ b/kernel/arch/x86/include/asm/thread_info.h @@ -56,16 +56,23 @@ struct thread_info { unsigned long flags; /* low level flags */ u32 status; /* thread synchronous flags */ + int preempt_lazy_count; /* 0 => lazy preemptable + <0 => BUG */ }; #define INIT_THREAD_INFO(tsk) \ { \ .flags = 0, \ + .preempt_lazy_count = 0, \ } #else /* !__ASSEMBLY__ */ #include <asm/asm-offsets.h> + +#define GET_THREAD_INFO(reg) \ + _ASM_MOV PER_CPU_VAR(cpu_current_top_of_stack),reg ; \ + _ASM_SUB $(THREAD_SIZE),reg ; #endif @@ -91,6 +98,7 @@ #define TIF_NOCPUID 15 /* CPUID is not accessible in userland */ #define TIF_NOTSC 16 /* TSC is not accessible in userland */ #define TIF_IA32 17 /* IA32 compatibility process */ +#define TIF_NEED_RESCHED_LAZY 18 /* lazy rescheduling necessary */ #define TIF_NOHZ 19 /* in adaptive nohz mode */ #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ #define TIF_POLLING_NRFLAG 21 /* idle is polling for TIF_NEED_RESCHED */ @@ -120,6 +128,7 @@ #define _TIF_NOCPUID (1 << TIF_NOCPUID) #define _TIF_NOTSC (1 << TIF_NOTSC) #define _TIF_IA32 (1 << TIF_IA32) +#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) #define _TIF_NOHZ (1 << TIF_NOHZ) #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) @@ -165,6 +174,8 @@ #define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY) #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) +#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) + #define STACK_WARN (THREAD_SIZE/8) /* diff --git a/kernel/arch/x86/kernel/apic/io_apic.c b/kernel/arch/x86/kernel/apic/io_apic.c index 677508b..b1a7f45 100644 --- a/kernel/arch/x86/kernel/apic/io_apic.c +++ b/kernel/arch/x86/kernel/apic/io_apic.c @@ -1732,7 +1732,7 @@ return false; } -static inline bool ioapic_irqd_mask(struct irq_data *data) +static inline bool ioapic_prepare_move(struct irq_data *data) { /* If we are moving the IRQ we need to mask it */ if (unlikely(irqd_is_setaffinity_pending(data))) { @@ -1743,9 +1743,9 @@ return false; } -static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked) +static inline void ioapic_finish_move(struct irq_data *data, bool moveit) { - if (unlikely(masked)) { + if (unlikely(moveit)) { /* Only migrate the irq if the ack has been received. * * On rare occasions the broadcast level triggered ack gets @@ -1780,11 +1780,11 @@ } } #else -static inline bool ioapic_irqd_mask(struct irq_data *data) +static inline bool ioapic_prepare_move(struct irq_data *data) { return false; } -static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked) +static inline void ioapic_finish_move(struct irq_data *data, bool moveit) { } #endif @@ -1793,11 +1793,11 @@ { struct irq_cfg *cfg = irqd_cfg(irq_data); unsigned long v; - bool masked; + bool moveit; int i; irq_complete_move(cfg); - masked = ioapic_irqd_mask(irq_data); + moveit = ioapic_prepare_move(irq_data); /* * It appears there is an erratum which affects at least version 0x11 @@ -1852,7 +1852,7 @@ eoi_ioapic_pin(cfg->vector, irq_data->chip_data); } - ioapic_irqd_unmask(irq_data, masked); + ioapic_finish_move(irq_data, moveit); } static void ioapic_ir_ack_level(struct irq_data *irq_data) diff --git a/kernel/arch/x86/kernel/asm-offsets.c b/kernel/arch/x86/kernel/asm-offsets.c index 01de31d..ce1c5b9 100644 --- a/kernel/arch/x86/kernel/asm-offsets.c +++ b/kernel/arch/x86/kernel/asm-offsets.c @@ -38,6 +38,7 @@ BLANK(); OFFSET(TASK_TI_flags, task_struct, thread_info.flags); + OFFSET(TASK_TI_preempt_lazy_count, task_struct, thread_info.preempt_lazy_count); OFFSET(TASK_addr_limit, task_struct, thread.addr_limit); BLANK(); @@ -94,6 +95,7 @@ BLANK(); DEFINE(PTREGS_SIZE, sizeof(struct pt_regs)); + DEFINE(_PREEMPT_ENABLED, PREEMPT_ENABLED); /* TLB state for the entry code */ OFFSET(TLB_STATE_user_pcid_flush_mask, tlb_state, user_pcid_flush_mask); diff --git a/kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c b/kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c index a999a58..d6410d0 100644 --- a/kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c +++ b/kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c @@ -1445,7 +1445,7 @@ * may be scheduled elsewhere and invalidate entries in the * pseudo-locked region. */ - if (!cpumask_subset(¤t->cpus_allowed, &plr->d->cpu_mask)) { + if (!cpumask_subset(current->cpus_ptr, &plr->d->cpu_mask)) { mutex_unlock(&rdtgroup_mutex); return -EINVAL; } diff --git a/kernel/arch/x86/kernel/fpu/core.c b/kernel/arch/x86/kernel/fpu/core.c index 2e5003f..768c537 100644 --- a/kernel/arch/x86/kernel/fpu/core.c +++ b/kernel/arch/x86/kernel/fpu/core.c @@ -136,6 +136,18 @@ } EXPORT_SYMBOL_GPL(kernel_fpu_end); +void kernel_fpu_resched(void) +{ + WARN_ON_FPU(!this_cpu_read(in_kernel_fpu)); + + if (should_resched(PREEMPT_OFFSET)) { + kernel_fpu_end(); + cond_resched(); + kernel_fpu_begin(); + } +} +EXPORT_SYMBOL_GPL(kernel_fpu_resched); + /* * Save the FPU state (mark it for reload if necessary): * diff --git a/kernel/arch/x86/kernel/fpu/signal.c b/kernel/arch/x86/kernel/fpu/signal.c index 86a2313..e5c8d52 100644 --- a/kernel/arch/x86/kernel/fpu/signal.c +++ b/kernel/arch/x86/kernel/fpu/signal.c @@ -351,10 +351,12 @@ sanitize_restored_xstate(tsk, &env, xfeatures, fx_only); } + preempt_disable(); local_bh_disable(); fpu->initialized = 1; fpu__restore(fpu); local_bh_enable(); + preempt_enable(); /* Failure is already handled */ return err; diff --git a/kernel/arch/x86/kernel/irq_32.c b/kernel/arch/x86/kernel/irq_32.c index 95600a9..9192d76 100644 --- a/kernel/arch/x86/kernel/irq_32.c +++ b/kernel/arch/x86/kernel/irq_32.c @@ -130,6 +130,7 @@ cpu, per_cpu(hardirq_stack, cpu), per_cpu(softirq_stack, cpu)); } +#ifndef CONFIG_PREEMPT_RT_FULL void do_softirq_own_stack(void) { struct irq_stack *irqstk; @@ -146,6 +147,7 @@ call_on_stack(__do_softirq, isp); } +#endif bool handle_irq(struct irq_desc *desc, struct pt_regs *regs) { diff --git a/kernel/arch/x86/kernel/process_32.c b/kernel/arch/x86/kernel/process_32.c index 020efe0..5d0c975 100644 --- a/kernel/arch/x86/kernel/process_32.c +++ b/kernel/arch/x86/kernel/process_32.c @@ -38,6 +38,7 @@ #include <linux/io.h> #include <linux/kdebug.h> #include <linux/syscalls.h> +#include <linux/highmem.h> #include <asm/pgtable.h> #include <asm/ldt.h> @@ -205,6 +206,35 @@ } EXPORT_SYMBOL_GPL(start_thread); +#ifdef CONFIG_PREEMPT_RT_FULL +static void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) +{ + int i; + + /* + * Clear @prev's kmap_atomic mappings + */ + for (i = 0; i < prev_p->kmap_idx; i++) { + int idx = i + KM_TYPE_NR * smp_processor_id(); + pte_t *ptep = kmap_pte - idx; + + kpte_clear_flush(ptep, __fix_to_virt(FIX_KMAP_BEGIN + idx)); + } + /* + * Restore @next_p's kmap_atomic mappings + */ + for (i = 0; i < next_p->kmap_idx; i++) { + int idx = i + KM_TYPE_NR * smp_processor_id(); + + if (!pte_none(next_p->kmap_pte[i])) + set_pte(kmap_pte - idx, next_p->kmap_pte[i]); + } +} +#else +static inline void +switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { } +#endif + /* * switch_to(x,y) should switch tasks from x to y. @@ -274,6 +304,8 @@ switch_to_extra(prev_p, next_p); + switch_kmaps(prev_p, next_p); + /* * Leave lazy mode, flushing any hypercalls made here. * This must be done before restoring TLS segments so diff --git a/kernel/arch/x86/kvm/lapic.c b/kernel/arch/x86/kvm/lapic.c index 56a4b97..556c4b6 100644 --- a/kernel/arch/x86/kvm/lapic.c +++ b/kernel/arch/x86/kvm/lapic.c @@ -2261,7 +2261,7 @@ apic->vcpu = vcpu; hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC, - HRTIMER_MODE_ABS_PINNED); + HRTIMER_MODE_ABS_PINNED_HARD); apic->lapic_timer.timer.function = apic_timer_fn; /* diff --git a/kernel/arch/x86/kvm/x86.c b/kernel/arch/x86/kvm/x86.c index 417abc9..9829e0f 100644 --- a/kernel/arch/x86/kvm/x86.c +++ b/kernel/arch/x86/kvm/x86.c @@ -6875,6 +6875,13 @@ goto out; } +#ifdef CONFIG_PREEMPT_RT_FULL + if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) { + printk(KERN_ERR "RT requires X86_FEATURE_CONSTANT_TSC\n"); + return -EOPNOTSUPP; + } +#endif + r = kvm_mmu_module_init(); if (r) goto out_free_percpu; diff --git a/kernel/arch/x86/mm/highmem_32.c b/kernel/arch/x86/mm/highmem_32.c index 6d18b70..f752724 100644 --- a/kernel/arch/x86/mm/highmem_32.c +++ b/kernel/arch/x86/mm/highmem_32.c @@ -32,10 +32,11 @@ */ void *kmap_atomic_prot(struct page *page, pgprot_t prot) { + pte_t pte = mk_pte(page, prot); unsigned long vaddr; int idx, type; - preempt_disable(); + preempt_disable_nort(); pagefault_disable(); if (!PageHighMem(page)) @@ -45,7 +46,10 @@ idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); BUG_ON(!pte_none(*(kmap_pte-idx))); - set_pte(kmap_pte-idx, mk_pte(page, prot)); +#ifdef CONFIG_PREEMPT_RT_FULL + current->kmap_pte[type] = pte; +#endif + set_pte(kmap_pte-idx, pte); arch_flush_lazy_mmu_mode(); return (void *)vaddr; @@ -88,6 +92,9 @@ * is a bad idea also, in case the page changes cacheability * attributes or becomes a protected page in a hypervisor. */ +#ifdef CONFIG_PREEMPT_RT_FULL + current->kmap_pte[type] = __pte(0); +#endif kpte_clear_flush(kmap_pte-idx, vaddr); kmap_atomic_idx_pop(); arch_flush_lazy_mmu_mode(); @@ -100,7 +107,7 @@ #endif pagefault_enable(); - preempt_enable(); + preempt_enable_nort(); } EXPORT_SYMBOL(__kunmap_atomic); diff --git a/kernel/arch/x86/mm/iomap_32.c b/kernel/arch/x86/mm/iomap_32.c index b3294d3..c0ec8d4 100644 --- a/kernel/arch/x86/mm/iomap_32.c +++ b/kernel/arch/x86/mm/iomap_32.c @@ -59,6 +59,7 @@ void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) { + pte_t pte = pfn_pte(pfn, prot); unsigned long vaddr; int idx, type; @@ -68,7 +69,12 @@ type = kmap_atomic_idx_push(); idx = type + KM_TYPE_NR * smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); - set_pte(kmap_pte - idx, pfn_pte(pfn, prot)); + WARN_ON(!pte_none(*(kmap_pte - idx))); + +#ifdef CONFIG_PREEMPT_RT_FULL + current->kmap_pte[type] = pte; +#endif + set_pte(kmap_pte - idx, pte); arch_flush_lazy_mmu_mode(); return (void *)vaddr; @@ -119,6 +125,9 @@ * is a bad idea also, in case the page changes cacheability * attributes or becomes a protected page in a hypervisor. */ +#ifdef CONFIG_PREEMPT_RT_FULL + current->kmap_pte[type] = __pte(0); +#endif kpte_clear_flush(kmap_pte-idx, vaddr); kmap_atomic_idx_pop(); } diff --git a/kernel/arch/x86/mm/pageattr.c b/kernel/arch/x86/mm/pageattr.c index 101f3ad..0b03962 100644 --- a/kernel/arch/x86/mm/pageattr.c +++ b/kernel/arch/x86/mm/pageattr.c @@ -688,11 +688,17 @@ spin_lock(&pgd_lock); /* + * Keep preemption disabled after __flush_tlb_all() which expects not be + * preempted during the flush of the local TLB. + */ + preempt_disable(); + /* * Check for races, another CPU might have split this page * up for us already: */ tmp = _lookup_address_cpa(cpa, address, &level); if (tmp != kpte) { + preempt_enable(); spin_unlock(&pgd_lock); return 1; } @@ -726,6 +732,7 @@ break; default: + preempt_enable(); spin_unlock(&pgd_lock); return 1; } @@ -764,6 +771,7 @@ * going on. */ __flush_tlb_all(); + preempt_enable(); spin_unlock(&pgd_lock); return 0; diff --git a/kernel/arch/x86/platform/efi/efi_64.c b/kernel/arch/x86/platform/efi/efi_64.c index 77d05b5..cd7e4bf 100644 --- a/kernel/arch/x86/platform/efi/efi_64.c +++ b/kernel/arch/x86/platform/efi/efi_64.c @@ -619,18 +619,16 @@ /* * Makes the calling thread switch to/from efi_mm context. Can be used - * for SetVirtualAddressMap() i.e. current->active_mm == init_mm as well - * as during efi runtime calls i.e current->active_mm == current_mm. - * We are not mm_dropping()/mm_grabbing() any mm, because we are not - * losing/creating any references. + * in a kernel thread and user context. Preemption needs to remain disabled + * while the EFI-mm is borrowed. mmgrab()/mmdrop() is not used because the mm + * can not change under us. + * It should be ensured that there are no concurent calls to this function. */ void efi_switch_mm(struct mm_struct *mm) { - task_lock(current); efi_scratch.prev_mm = current->active_mm; current->active_mm = mm; switch_mm(efi_scratch.prev_mm, mm, NULL); - task_unlock(current); } #ifdef CONFIG_EFI_MIXED diff --git a/kernel/arch/xtensa/include/asm/spinlock_types.h b/kernel/arch/xtensa/include/asm/spinlock_types.h index bb1fe6c..8a22f1e 100644 --- a/kernel/arch/xtensa/include/asm/spinlock_types.h +++ b/kernel/arch/xtensa/include/asm/spinlock_types.h @@ -2,10 +2,6 @@ #ifndef __ASM_SPINLOCK_TYPES_H #define __ASM_SPINLOCK_TYPES_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - typedef struct { volatile unsigned int slock; } arch_spinlock_t; diff --git a/kernel/block/blk-core.c b/kernel/block/blk-core.c index a33775c..0c0eeb3 100644 --- a/kernel/block/blk-core.c +++ b/kernel/block/blk-core.c @@ -191,6 +191,9 @@ INIT_LIST_HEAD(&rq->queuelist); INIT_LIST_HEAD(&rq->timeout_list); +#ifdef CONFIG_PREEMPT_RT_FULL + INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work); +#endif rq->cpu = -1; rq->q = q; rq->__sector = (sector_t) -1; @@ -972,12 +975,21 @@ percpu_ref_put(&q->q_usage_counter); } +static void blk_queue_usage_counter_release_wrk(struct work_struct *work) +{ + struct request_queue *q = + container_of(work, struct request_queue, mq_pcpu_wake); + + wake_up_all(&q->mq_freeze_wq); +} + static void blk_queue_usage_counter_release(struct percpu_ref *ref) { struct request_queue *q = container_of(ref, struct request_queue, q_usage_counter); - wake_up_all(&q->mq_freeze_wq); + if (wq_has_sleeper(&q->mq_freeze_wq)) + schedule_work(&q->mq_pcpu_wake); } static void blk_rq_timed_out_timer(struct timer_list *t) @@ -1076,6 +1088,7 @@ queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); init_waitqueue_head(&q->mq_freeze_wq); + INIT_WORK(&q->mq_pcpu_wake, blk_queue_usage_counter_release_wrk); /* * Init percpu_ref in atomic mode so that it's faster to shutdown. diff --git a/kernel/block/blk-ioc.c b/kernel/block/blk-ioc.c index 4c81096..48089f5 100644 --- a/kernel/block/blk-ioc.c +++ b/kernel/block/blk-ioc.c @@ -9,6 +9,7 @@ #include <linux/blkdev.h> #include <linux/slab.h> #include <linux/sched/task.h> +#include <linux/delay.h> #include "blk.h" @@ -119,7 +120,7 @@ spin_unlock(q->queue_lock); } else { spin_unlock_irqrestore(&ioc->lock, flags); - cpu_relax(); + cpu_chill(); spin_lock_irqsave_nested(&ioc->lock, flags, 1); } } @@ -203,7 +204,7 @@ spin_unlock(icq->q->queue_lock); } else { spin_unlock_irqrestore(&ioc->lock, flags); - cpu_relax(); + cpu_chill(); goto retry; } } diff --git a/kernel/block/blk-mq.c b/kernel/block/blk-mq.c index ae70b48..0f8dcb6 100644 --- a/kernel/block/blk-mq.c +++ b/kernel/block/blk-mq.c @@ -320,6 +320,9 @@ rq->extra_len = 0; rq->__deadline = 0; +#ifdef CONFIG_PREEMPT_RT_FULL + INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work); +#endif INIT_LIST_HEAD(&rq->timeout_list); rq->timeout = 0; @@ -547,12 +550,24 @@ } EXPORT_SYMBOL(blk_mq_end_request); +#ifdef CONFIG_PREEMPT_RT_FULL + +void __blk_mq_complete_request_remote_work(struct work_struct *work) +{ + struct request *rq = container_of(work, struct request, work); + + rq->q->softirq_done_fn(rq); +} + +#else + static void __blk_mq_complete_request_remote(void *data) { struct request *rq = data; rq->q->softirq_done_fn(rq); } +#endif static void __blk_mq_complete_request(struct request *rq) { @@ -570,19 +585,27 @@ return; } - cpu = get_cpu(); + cpu = get_cpu_light(); if (!test_bit(QUEUE_FLAG_SAME_FORCE, &rq->q->queue_flags)) shared = cpus_share_cache(cpu, ctx->cpu); if (cpu != ctx->cpu && !shared && cpu_online(ctx->cpu)) { +#ifdef CONFIG_PREEMPT_RT_FULL + /* + * We could force QUEUE_FLAG_SAME_FORCE then we would not get in + * here. But we could try to invoke it one the CPU like this. + */ + schedule_work_on(ctx->cpu, &rq->work); +#else rq->csd.func = __blk_mq_complete_request_remote; rq->csd.info = rq; rq->csd.flags = 0; smp_call_function_single_async(ctx->cpu, &rq->csd); +#endif } else { rq->q->softirq_done_fn(rq); } - put_cpu(); + put_cpu_light(); } static void hctx_unlock(struct blk_mq_hw_ctx *hctx, int srcu_idx) @@ -1387,14 +1410,14 @@ return; if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) { - int cpu = get_cpu(); + int cpu = get_cpu_light(); if (cpumask_test_cpu(cpu, hctx->cpumask)) { __blk_mq_run_hw_queue(hctx); - put_cpu(); + put_cpu_light(); return; } - put_cpu(); + put_cpu_light(); } kblockd_mod_delayed_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work, @@ -3139,10 +3162,9 @@ kt = nsecs; mode = HRTIMER_MODE_REL; - hrtimer_init_on_stack(&hs.timer, CLOCK_MONOTONIC, mode); + hrtimer_init_sleeper_on_stack(&hs, CLOCK_MONOTONIC, mode, current); hrtimer_set_expires(&hs.timer, kt); - hrtimer_init_sleeper(&hs, current); do { if (blk_mq_rq_state(rq) == MQ_RQ_COMPLETE) break; diff --git a/kernel/block/blk-mq.h b/kernel/block/blk-mq.h index 5ad9251..5a96c97 100644 --- a/kernel/block/blk-mq.h +++ b/kernel/block/blk-mq.h @@ -113,12 +113,12 @@ */ static inline struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q) { - return __blk_mq_get_ctx(q, get_cpu()); + return __blk_mq_get_ctx(q, get_cpu_light()); } static inline void blk_mq_put_ctx(struct blk_mq_ctx *ctx) { - put_cpu(); + put_cpu_light(); } struct blk_mq_alloc_data { diff --git a/kernel/block/blk-softirq.c b/kernel/block/blk-softirq.c index 15c1f5e..1628277 100644 --- a/kernel/block/blk-softirq.c +++ b/kernel/block/blk-softirq.c @@ -53,6 +53,7 @@ raise_softirq_irqoff(BLOCK_SOFTIRQ); local_irq_restore(flags); + preempt_check_resched_rt(); } /* @@ -91,6 +92,7 @@ this_cpu_ptr(&blk_cpu_done)); raise_softirq_irqoff(BLOCK_SOFTIRQ); local_irq_enable(); + preempt_check_resched_rt(); return 0; } @@ -143,6 +145,7 @@ goto do_local; local_irq_restore(flags); + preempt_check_resched_rt(); } EXPORT_SYMBOL(__blk_complete_request); diff --git a/kernel/crypto/cryptd.c b/kernel/crypto/cryptd.c index e0c8e90..e079f9a 100644 --- a/kernel/crypto/cryptd.c +++ b/kernel/crypto/cryptd.c @@ -39,6 +39,7 @@ struct cryptd_cpu_queue { struct crypto_queue queue; struct work_struct work; + spinlock_t qlock; }; struct cryptd_queue { @@ -117,6 +118,7 @@ cpu_queue = per_cpu_ptr(queue->cpu_queue, cpu); crypto_init_queue(&cpu_queue->queue, max_cpu_qlen); INIT_WORK(&cpu_queue->work, cryptd_queue_worker); + spin_lock_init(&cpu_queue->qlock); } pr_info("cryptd: max_cpu_qlen set to %d\n", max_cpu_qlen); return 0; @@ -141,8 +143,10 @@ struct cryptd_cpu_queue *cpu_queue; atomic_t *refcnt; - cpu = get_cpu(); - cpu_queue = this_cpu_ptr(queue->cpu_queue); + cpu_queue = raw_cpu_ptr(queue->cpu_queue); + spin_lock_bh(&cpu_queue->qlock); + cpu = smp_processor_id(); + err = crypto_enqueue_request(&cpu_queue->queue, request); refcnt = crypto_tfm_ctx(request->tfm); @@ -158,7 +162,7 @@ atomic_inc(refcnt); out_put_cpu: - put_cpu(); + spin_unlock_bh(&cpu_queue->qlock); return err; } @@ -174,16 +178,11 @@ cpu_queue = container_of(work, struct cryptd_cpu_queue, work); /* * Only handle one request at a time to avoid hogging crypto workqueue. - * preempt_disable/enable is used to prevent being preempted by - * cryptd_enqueue_request(). local_bh_disable/enable is used to prevent - * cryptd_enqueue_request() being accessed from software interrupts. */ - local_bh_disable(); - preempt_disable(); + spin_lock_bh(&cpu_queue->qlock); backlog = crypto_get_backlog(&cpu_queue->queue); req = crypto_dequeue_request(&cpu_queue->queue); - preempt_enable(); - local_bh_enable(); + spin_unlock_bh(&cpu_queue->qlock); if (!req) return; diff --git a/kernel/crypto/scompress.c b/kernel/crypto/scompress.c index 968bbcf..c2f0077 100644 --- a/kernel/crypto/scompress.c +++ b/kernel/crypto/scompress.c @@ -24,6 +24,7 @@ #include <linux/cryptouser.h> #include <net/netlink.h> #include <linux/scatterlist.h> +#include <linux/locallock.h> #include <crypto/scatterwalk.h> #include <crypto/internal/acompress.h> #include <crypto/internal/scompress.h> @@ -34,6 +35,7 @@ static void * __percpu *scomp_dst_scratches; static int scomp_scratch_users; static DEFINE_MUTEX(scomp_lock); +static DEFINE_LOCAL_IRQ_LOCK(scomp_scratches_lock); #ifdef CONFIG_NET static int crypto_scomp_report(struct sk_buff *skb, struct crypto_alg *alg) @@ -146,7 +148,7 @@ void **tfm_ctx = acomp_tfm_ctx(tfm); struct crypto_scomp *scomp = *tfm_ctx; void **ctx = acomp_request_ctx(req); - const int cpu = get_cpu(); + const int cpu = local_lock_cpu(scomp_scratches_lock); u8 *scratch_src = *per_cpu_ptr(scomp_src_scratches, cpu); u8 *scratch_dst = *per_cpu_ptr(scomp_dst_scratches, cpu); int ret; @@ -181,7 +183,7 @@ 1); } out: - put_cpu(); + local_unlock_cpu(scomp_scratches_lock); return ret; } diff --git a/kernel/drivers/block/zram/zcomp.c b/kernel/drivers/block/zram/zcomp.c index 4ed0a78..eece022 100644 --- a/kernel/drivers/block/zram/zcomp.c +++ b/kernel/drivers/block/zram/zcomp.c @@ -116,12 +116,20 @@ struct zcomp_strm *zcomp_stream_get(struct zcomp *comp) { - return *get_cpu_ptr(comp->stream); + struct zcomp_strm *zstrm; + + zstrm = *get_local_ptr(comp->stream); + spin_lock(&zstrm->zcomp_lock); + return zstrm; } void zcomp_stream_put(struct zcomp *comp) { - put_cpu_ptr(comp->stream); + struct zcomp_strm *zstrm; + + zstrm = *this_cpu_ptr(comp->stream); + spin_unlock(&zstrm->zcomp_lock); + put_local_ptr(zstrm); } int zcomp_compress(struct zcomp_strm *zstrm, @@ -171,6 +179,7 @@ pr_err("Can't allocate a compression stream\n"); return -ENOMEM; } + spin_lock_init(&zstrm->zcomp_lock); *per_cpu_ptr(comp->stream, cpu) = zstrm; return 0; } diff --git a/kernel/drivers/block/zram/zcomp.h b/kernel/drivers/block/zram/zcomp.h index 41c1002..d424eaf 100644 --- a/kernel/drivers/block/zram/zcomp.h +++ b/kernel/drivers/block/zram/zcomp.h @@ -14,6 +14,7 @@ /* compression/decompression buffer */ void *buffer; struct crypto_comp *tfm; + spinlock_t zcomp_lock; }; /* dynamic per-device compression frontend */ diff --git a/kernel/drivers/block/zram/zram_drv.c b/kernel/drivers/block/zram/zram_drv.c index 70fe119..6d17aee 100644 --- a/kernel/drivers/block/zram/zram_drv.c +++ b/kernel/drivers/block/zram/zram_drv.c @@ -56,6 +56,40 @@ u32 index, int offset, struct bio *bio); +#ifdef CONFIG_PREEMPT_RT_BASE +static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) +{ + size_t index; + + for (index = 0; index < num_pages; index++) + spin_lock_init(&zram->table[index].lock); +} + +static int zram_slot_trylock(struct zram *zram, u32 index) +{ + int ret; + + ret = spin_trylock(&zram->table[index].lock); + if (ret) + __set_bit(ZRAM_LOCK, &zram->table[index].value); + return ret; +} + +static void zram_slot_lock(struct zram *zram, u32 index) +{ + spin_lock(&zram->table[index].lock); + __set_bit(ZRAM_LOCK, &zram->table[index].value); +} + +static void zram_slot_unlock(struct zram *zram, u32 index) +{ + __clear_bit(ZRAM_LOCK, &zram->table[index].value); + spin_unlock(&zram->table[index].lock); +} + +#else +static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) { } + static int zram_slot_trylock(struct zram *zram, u32 index) { return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].flags); @@ -70,6 +104,7 @@ { bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags); } +#endif static inline bool init_done(struct zram *zram) { @@ -1145,6 +1180,8 @@ #endif static DEVICE_ATTR_RO(debug_stat); + + static void zram_meta_free(struct zram *zram, u64 disksize) { size_t num_pages = disksize >> PAGE_SHIFT; @@ -1175,6 +1212,7 @@ if (!huge_class_size) huge_class_size = zs_huge_class_size(zram->mem_pool); + zram_meta_init_table_locks(zram, num_pages); return true; } @@ -1237,6 +1275,7 @@ unsigned long handle; unsigned int size; void *src, *dst; + struct zcomp_strm *zstrm; zram_slot_lock(zram, index); if (zram_test_flag(zram, index, ZRAM_WB)) { @@ -1267,6 +1306,7 @@ size = zram_get_obj_size(zram, index); + zstrm = zcomp_stream_get(zram->comp); src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); if (size == PAGE_SIZE) { dst = kmap_atomic(page); @@ -1274,14 +1314,13 @@ kunmap_atomic(dst); ret = 0; } else { - struct zcomp_strm *zstrm = zcomp_stream_get(zram->comp); dst = kmap_atomic(page); ret = zcomp_decompress(zstrm, src, size, dst); kunmap_atomic(dst); - zcomp_stream_put(zram->comp); } zs_unmap_object(zram->mem_pool, handle); + zcomp_stream_put(zram->comp); zram_slot_unlock(zram, index); /* Should NEVER happen. Return bio error if it does. */ diff --git a/kernel/drivers/block/zram/zram_drv.h b/kernel/drivers/block/zram/zram_drv.h index f2fd46d..be1fd12 100644 --- a/kernel/drivers/block/zram/zram_drv.h +++ b/kernel/drivers/block/zram/zram_drv.h @@ -63,6 +63,9 @@ unsigned long element; }; unsigned long flags; +#ifdef CONFIG_PREEMPT_RT_BASE + spinlock_t lock; +#endif #ifdef CONFIG_ZRAM_MEMORY_TRACKING ktime_t ac_time; #endif diff --git a/kernel/drivers/char/hw_random/rockchip-rng.c b/kernel/drivers/char/hw_random/rockchip-rng.c index 08ad081..93c7068 100644 --- a/kernel/drivers/char/hw_random/rockchip-rng.c +++ b/kernel/drivers/char/hw_random/rockchip-rng.c @@ -87,6 +87,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 */ + struct rk_rng_soc_data { u32 default_offset; @@ -178,7 +199,7 @@ *(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i)); } -static int rk_crypto_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) +static int crypto_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) { int ret = 0; u32 reg_ctrl = 0; @@ -211,7 +232,7 @@ return ret; } -static int rk_crypto_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait) +static int crypto_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait) { int ret = 0; u32 reg_ctrl = 0; @@ -246,18 +267,12 @@ return ret; } -static int rk_trng_v1_init(struct hwrng *rng) +static int trng_v1_init(struct hwrng *rng) { int ret; uint32_t auto_reseed_cnt = 1000; uint32_t reg_ctrl, status, version; struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); - - ret = pm_runtime_get_sync(rk_rng->dev); - if (ret < 0) { - pm_runtime_put_noidle(rk_rng->dev); - return ret; - } version = rk_rng_readl(rk_rng, TRNG_V1_VERSION); if (version != TRNG_v1_VERSION_CODE) { @@ -296,13 +311,11 @@ ret = 0; exit: - pm_runtime_mark_last_busy(rk_rng->dev); - pm_runtime_put_sync_autosuspend(rk_rng->dev); return ret; } -static int rk_trng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) +static int trng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) { int ret = 0; u32 reg_ctrl = 0; @@ -345,37 +358,92 @@ return ret; } -static const struct rk_rng_soc_data rk_crypto_v1_soc_data = { +static int rkrng_init(struct hwrng *rng) +{ + struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); + u32 reg = 0; + + rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), RKRNG_CTRL); + + reg = rk_rng_readl(rk_rng, RKRNG_STATE); + rk_rng_writel(rk_rng, reg, RKRNG_STATE); + + return 0; +} + +static int rkrng_read(struct hwrng *rng, void *buf, size_t max, bool wait) +{ + struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); + u32 reg_ctrl = 0; + int ret; + + reg_ctrl = RKRNG_CTRL_SW_DRNG_REQ; + + rk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0), RKRNG_CTRL); + + ret = readl_poll_timeout(rk_rng->mem + RKRNG_STATE, reg_ctrl, + (reg_ctrl & RKRNG_STATE_SW_DRNG_ACK), + ROCKCHIP_POLL_PERIOD_US, + ROCKCHIP_POLL_TIMEOUT_US); + + if (ret) + goto exit; + + rk_rng_writel(rk_rng, reg_ctrl, RKRNG_STATE); + + ret = min_t(size_t, max, RK_MAX_RNG_BYTE); + + rk_rng_read_regs(rk_rng, RKRNG_DRNG_DATA_0, buf, ret); + +exit: + /* close TRNG */ + rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), RKRNG_CTRL); + + return ret; +} + +static const struct rk_rng_soc_data crypto_v1_soc_data = { .default_offset = 0, - .rk_rng_read = rk_crypto_v1_read, + .rk_rng_read = crypto_v1_read, }; -static const struct rk_rng_soc_data rk_crypto_v2_soc_data = { +static const struct rk_rng_soc_data crypto_v2_soc_data = { .default_offset = CRYPTO_V2_RNG_DEFAULT_OFFSET, - .rk_rng_read = rk_crypto_v2_read, + .rk_rng_read = crypto_v2_read, }; -static const struct rk_rng_soc_data rk_trng_v1_soc_data = { +static const struct rk_rng_soc_data trng_v1_soc_data = { .default_offset = 0, - .rk_rng_init = rk_trng_v1_init, - .rk_rng_read = rk_trng_v1_read, + .rk_rng_init = trng_v1_init, + .rk_rng_read = trng_v1_read, +}; + +static const struct rk_rng_soc_data rkrng_soc_data = { + .default_offset = 0, + + .rk_rng_init = rkrng_init, + .rk_rng_read = rkrng_read, }; static const struct of_device_id rk_rng_dt_match[] = { { .compatible = "rockchip,cryptov1-rng", - .data = (void *)&rk_crypto_v1_soc_data, + .data = (void *)&crypto_v1_soc_data, }, { .compatible = "rockchip,cryptov2-rng", - .data = (void *)&rk_crypto_v2_soc_data, + .data = (void *)&crypto_v2_soc_data, }, { .compatible = "rockchip,trngv1", - .data = (void *)&rk_trng_v1_soc_data, + .data = (void *)&trng_v1_soc_data, + }, + { + .compatible = "rockchip,rkrng", + .data = (void *)&rkrng_soc_data, }, { }, }; @@ -445,9 +513,15 @@ } /* for some platform need hardware operation when probe */ - if (rk_rng->soc_data->rk_rng_init) + if (rk_rng->soc_data->rk_rng_init) { + pm_runtime_get_sync(rk_rng->dev); + ret = rk_rng->soc_data->rk_rng_init(&rk_rng->rng); + pm_runtime_mark_last_busy(rk_rng->dev); + pm_runtime_put_sync_autosuspend(rk_rng->dev); + } + return ret; } diff --git a/kernel/drivers/char/random.c b/kernel/drivers/char/random.c index 6e1cbc5..8aaa816 100644 --- a/kernel/drivers/char/random.c +++ b/kernel/drivers/char/random.c @@ -1229,28 +1229,27 @@ return *ptr; } -void add_interrupt_randomness(int irq, int irq_flags) +void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) { struct entropy_store *r; struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness); - struct pt_regs *regs = get_irq_regs(); unsigned long now = jiffies; cycles_t cycles = random_get_entropy(); __u32 c_high, j_high; - __u64 ip; unsigned long seed; int credit = 0; if (cycles == 0) - cycles = get_reg(fast_pool, regs); + cycles = get_reg(fast_pool, NULL); c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0; j_high = (sizeof(now) > 4) ? now >> 32 : 0; fast_pool->pool[0] ^= cycles ^ j_high ^ irq; fast_pool->pool[1] ^= now ^ c_high; - ip = regs ? instruction_pointer(regs) : _RET_IP_; + if (!ip) + ip = _RET_IP_; fast_pool->pool[2] ^= ip; fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 : - get_reg(fast_pool, regs); + get_reg(fast_pool, NULL); fast_mix(fast_pool); add_interrupt_bench(cycles); diff --git a/kernel/drivers/char/tpm/tpm_tis.c b/kernel/drivers/char/tpm/tpm_tis.c index 5a3a4f0..5ecca65 100644 --- a/kernel/drivers/char/tpm/tpm_tis.c +++ b/kernel/drivers/char/tpm/tpm_tis.c @@ -54,6 +54,31 @@ return container_of(data, struct tpm_tis_tcg_phy, priv); } +#ifdef CONFIG_PREEMPT_RT_FULL +/* + * Flushes previous write operations to chip so that a subsequent + * ioread*()s won't stall a cpu. + */ +static inline void tpm_tis_flush(void __iomem *iobase) +{ + ioread8(iobase + TPM_ACCESS(0)); +} +#else +#define tpm_tis_flush(iobase) do { } while (0) +#endif + +static inline void tpm_tis_iowrite8(u8 b, void __iomem *iobase, u32 addr) +{ + iowrite8(b, iobase + addr); + tpm_tis_flush(iobase); +} + +static inline void tpm_tis_iowrite32(u32 b, void __iomem *iobase, u32 addr) +{ + iowrite32(b, iobase + addr); + tpm_tis_flush(iobase); +} + static int interrupts = -1; module_param(interrupts, int, 0444); MODULE_PARM_DESC(interrupts, "Enable interrupts"); @@ -173,7 +198,7 @@ struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); while (len--) - iowrite8(*value++, phy->iobase + addr); + tpm_tis_iowrite8(*value++, phy->iobase, addr); return 0; } @@ -200,7 +225,7 @@ { struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); - iowrite32(value, phy->iobase + addr); + tpm_tis_iowrite32(value, phy->iobase, addr); return 0; } diff --git a/kernel/drivers/clk/rockchip/Kconfig b/kernel/drivers/clk/rockchip/Kconfig index ad828ef..cacc74e 100644 --- a/kernel/drivers/clk/rockchip/Kconfig +++ b/kernel/drivers/clk/rockchip/Kconfig @@ -26,6 +26,12 @@ help Say y here to enable clk Inverter. +config ROCKCHIP_CLK_OUT + tristate "Rockchip Clk Out / Input Switch" + default y if !CPU_RV1126 + help + Say y here to enable clk out / input switch. + config ROCKCHIP_CLK_PVTM bool "Rockchip Clk Pvtm" default y if !CPU_RV1126 diff --git a/kernel/drivers/clk/rockchip/Makefile b/kernel/drivers/clk/rockchip/Makefile index 92a8de5..3737b80 100644 --- a/kernel/drivers/clk/rockchip/Makefile +++ b/kernel/drivers/clk/rockchip/Makefile @@ -27,7 +27,10 @@ obj-$(CONFIG_CPU_RK3308) += clk-rk3308.o obj-$(CONFIG_CPU_RK3328) += clk-rk3328.o obj-$(CONFIG_CPU_RK3368) += clk-rk3368.o +obj-$(CONFIG_CPU_RK3528) += clk-rk3528.o obj-$(CONFIG_CPU_RK3568) += clk-rk3568.o obj-$(CONFIG_CPU_RK3399) += clk-rk3399.o obj-$(CONFIG_COMMON_CLK_ROCKCHIP_REGMAP) += regmap/ + +obj-$(CONFIG_ROCKCHIP_CLK_OUT) += clk-out.o diff --git a/kernel/drivers/clk/rockchip/clk-out.c b/kernel/drivers/clk/rockchip/clk-out.c new file mode 100644 index 0000000..22dcd98 --- /dev/null +++ b/kernel/drivers/clk/rockchip/clk-out.c @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2023 Rockchip Electronics Co., Ltd + */ + +#include <linux/clk-provider.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of_address.h> +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> + +static DEFINE_SPINLOCK(clk_out_lock); + +static int rockchip_clk_out_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *node = pdev->dev.of_node; + struct clk_hw *hw; + struct resource *res; + const char *clk_name = node->name; + const char *parent_name; + void __iomem *reg; + u32 shift = 0; + u8 clk_gate_flags = CLK_GATE_HIWORD_MASK; + int ret; + + ret = device_property_read_string(dev, "clock-output-names", &clk_name); + if (ret) + return ret; + + ret = device_property_read_u32(dev, "rockchip,bit-shift", &shift); + if (ret) + return ret; + + if (device_property_read_bool(dev, "rockchip,bit-set-to-disable")) + clk_gate_flags |= CLK_GATE_SET_TO_DISABLE; + + ret = of_clk_parent_fill(node, &parent_name, 1); + if (ret != 1) + return -EINVAL; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENOMEM; + + reg = devm_ioremap(dev, res->start, resource_size(res)); + if (!reg) + return -ENOMEM; + + pm_runtime_enable(dev); + + hw = clk_hw_register_gate(dev, clk_name, parent_name, CLK_SET_RATE_PARENT, + reg, shift, clk_gate_flags, &clk_out_lock); + if (IS_ERR(hw)) { + ret = -EINVAL; + goto err_disable_pm_runtime; + } + + of_clk_add_hw_provider(node, of_clk_hw_simple_get, hw); + + return 0; + +err_disable_pm_runtime: + pm_runtime_disable(dev); + + return ret; +} + +static int rockchip_clk_out_remove(struct platform_device *pdev) +{ + struct device_node *node = pdev->dev.of_node; + + of_clk_del_provider(node); + pm_runtime_disable(&pdev->dev); + + return 0; +} + +static const struct of_device_id rockchip_clk_out_match[] = { + { .compatible = "rockchip,clk-out", }, + {}, +}; + +static struct platform_driver rockchip_clk_out_driver = { + .driver = { + .name = "rockchip-clk-out", + .of_match_table = rockchip_clk_out_match, + }, + .probe = rockchip_clk_out_probe, + .remove = rockchip_clk_out_remove, +}; + +module_platform_driver(rockchip_clk_out_driver); + +MODULE_DESCRIPTION("Rockchip Clock Input-Output-Switch"); +MODULE_AUTHOR("Sugar Zhang <sugar.zhang@rock-chips.com>"); +MODULE_LICENSE("GPL"); +MODULE_DEVICE_TABLE(of, rockchip_clk_out_match); diff --git a/kernel/drivers/clk/rockchip/clk-pvtm.c b/kernel/drivers/clk/rockchip/clk-pvtm.c index 23c108e..e5da301 100644 --- a/kernel/drivers/clk/rockchip/clk-pvtm.c +++ b/kernel/drivers/clk/rockchip/clk-pvtm.c @@ -106,11 +106,12 @@ rockchip_clock_pvtm_delay(time_us); check_cnt = 100; - while (check_cnt--) { + while (check_cnt) { regmap_read(pvtm->grf, info->sta, &sta); if (sta & 0x1) break; udelay(4); + check_cnt--; } if (check_cnt) { diff --git a/kernel/drivers/clk/rockchip/clk-rk3399.c b/kernel/drivers/clk/rockchip/clk-rk3399.c index a14ece7..a8f46c7 100644 --- a/kernel/drivers/clk/rockchip/clk-rk3399.c +++ b/kernel/drivers/clk/rockchip/clk-rk3399.c @@ -671,9 +671,9 @@ MUX(SCLK_RMII_SRC, "clk_rmii_src", mux_rmii_p, CLK_SET_RATE_PARENT, RK3399_CLKSEL_CON(19), 4, 1, MFLAGS), GATE(SCLK_MACREF_OUT, "clk_mac_refout", "clk_rmii_src", 0, - RK3399_CLKGATE_CON(5), 6, GFLAGS), - GATE(SCLK_MACREF, "clk_mac_ref", "clk_rmii_src", 0, RK3399_CLKGATE_CON(5), 7, GFLAGS), + GATE(SCLK_MACREF, "clk_mac_ref", "clk_rmii_src", 0, + RK3399_CLKGATE_CON(5), 6, GFLAGS), GATE(SCLK_MAC_RX, "clk_rmii_rx", "clk_rmii_src", 0, RK3399_CLKGATE_CON(5), 8, GFLAGS), GATE(SCLK_MAC_TX, "clk_rmii_tx", "clk_rmii_src", 0, diff --git a/kernel/drivers/clk/rockchip/clk-rk3528.c b/kernel/drivers/clk/rockchip/clk-rk3528.c new file mode 100644 index 0000000..3e1143b --- /dev/null +++ b/kernel/drivers/clk/rockchip/clk-rk3528.c @@ -0,0 +1,1175 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2022 Rockchip Electronics Co. Ltd. + * Author: Joseph Chen <chenjh@rock-chips.com> + */ + +#include <linux/clk-provider.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/of_address.h> +#include <linux/syscore_ops.h> +#include <dt-bindings/clock/rk3528-cru.h> +#include "clk.h" + +/* A placeholder for rk3066 pll type. We are rk3328 pll type */ +#define RK3528_GRF_SOC_STATUS0 0x1a0 + +enum rk3528_plls { + apll, cpll, gpll, ppll, dpll, +}; + +/* + * ## 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. + * + * + * ## CRU access attention. + * + * pclk_cru => pclk_vo_root => aclk_vo_root + * pclk_cru_pcie => pclk_vpu_root => aclk_vpu_root + * pclk_cru_ddrphy => hclk_rkvdec_root => aclk_rkvdec_root + */ +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 */ }, +}; + +#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 + +#define RK3528_CLKSEL39(_aclk_m_core) \ +{ \ + .reg = RK3528_CLKSEL_CON(39), \ + .val = HIWORD_UPDATE(_aclk_m_core, RK3528_DIV_ACLK_M_CORE_MASK, \ + RK3528_DIV_ACLK_M_CORE_SHIFT), \ +} + +#define RK3528_CLKSEL40(_pclk_dbg) \ +{ \ + .reg = RK3528_CLKSEL_CON(40), \ + .val = HIWORD_UPDATE(_pclk_dbg, RK3528_DIV_PCLK_DBG_MASK, \ + RK3528_DIV_PCLK_DBG_SHIFT), \ +} + +/* SIGN-OFF: _aclk_m_core: 550M, _pclk_dbg: 137.5M, */ +#define RK3528_CPUCLK_RATE(_prate, _aclk_m_core, _pclk_dbg) \ +{ \ + .prate = _prate, \ + .divs = { \ + RK3528_CLKSEL39(_aclk_m_core), \ + RK3528_CLKSEL40(_pclk_dbg), \ + }, \ +} + +static struct rockchip_cpuclk_rate_table rk3528_cpuclk_rates[] __initdata = { + /* APLL(CPU) rate <= 1900M, due to APLL VCO limit */ + 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), +}; + +static const struct rockchip_cpuclk_reg_data rk3528_cpuclk_data = { + .core_reg[0] = RK3528_CLKSEL_CON(39), + .div_core_shift[0] = 5, + .div_core_mask[0] = 0x1f, + .num_cores = 1, + .mux_core_alt = 1, + .mux_core_main = 0, + .mux_core_shift = 10, + .mux_core_mask = 0x1, +}; + +PNAME(mux_pll_p) = { "xin24m" }; +PNAME(mux_24m_32k_p) = { "xin24m", "clk_32k" }; +PNAME(mux_apll_gpll_p) = { "apll", "gpll" }; +PNAME(mux_gpll_cpll_p) = { "gpll", "cpll" }; +PNAME(mux_gpll_cpll_xin24m_p) = { "gpll", "cpll", "xin24m" }; +PNAME(mux_100m_50m_24m_p) = { "clk_100m_src", "clk_50m_src", "xin24m" }; +PNAME(mux_150m_100m_24m_p) = { "clk_150m_src", "clk_100m_src", "xin24m" }; +PNAME(mux_200m_100m_24m_p) = { "clk_200m_src", "clk_100m_src", "xin24m" }; +PNAME(mux_200m_100m_50m_24m_p) = { "clk_200m_src", "clk_100m_src", "clk_50m_src", "xin24m" }; +PNAME(mux_300m_200m_100m_24m_p) = { "clk_300m_src", "clk_200m_src", "clk_100m_src", "xin24m" }; +PNAME(mux_339m_200m_100m_24m_p) = { "clk_339m_src", "clk_200m_src", "clk_100m_src", "xin24m" }; +PNAME(mux_500m_200m_100m_24m_p) = { "clk_500m_src", "clk_200m_src", "clk_100m_src", "xin24m" }; +PNAME(mux_500m_300m_100m_24m_p) = { "clk_500m_src", "clk_300m_src", "clk_100m_src", "xin24m" }; +PNAME(mux_600m_300m_200m_24m_p) = { "clk_600m_src", "clk_300m_src", "clk_200m_src", "xin24m" }; +PNAME(aclk_gpu_p) = { "aclk_gpu_root", "clk_gpu_pvtpll_src" }; +PNAME(aclk_rkvdec_pvtmux_root_p) = { "aclk_rkvdec_root", "clk_rkvdec_pvtpll_src" }; +PNAME(clk_i2c2_p) = { "clk_200m_src", "clk_100m_src", "xin24m", "clk_32k" }; +PNAME(clk_ref_pcie_inner_phy_p) = { "clk_ppll_100m_src", "xin24m" }; +PNAME(dclk_vop0_p) = { "dclk_vop_src0", "clk_hdmiphy_pixel_io" }; +PNAME(mclk_i2s0_2ch_sai_src_p) = { "clk_i2s0_2ch_src", "clk_i2s0_2ch_frac", "xin12m" }; +PNAME(mclk_i2s1_8ch_sai_src_p) = { "clk_i2s1_8ch_src", "clk_i2s1_8ch_frac", "xin12m" }; +PNAME(mclk_i2s2_2ch_sai_src_p) = { "clk_i2s2_2ch_src", "clk_i2s2_2ch_frac", "xin12m" }; +PNAME(mclk_i2s3_8ch_sai_src_p) = { "clk_i2s3_8ch_src", "clk_i2s3_8ch_frac", "xin12m" }; +PNAME(mclk_sai_i2s0_p) = { "mclk_i2s0_2ch_sai_src", "i2s0_mclkin" }; +PNAME(mclk_sai_i2s1_p) = { "mclk_i2s1_8ch_sai_src", "i2s1_mclkin" }; +PNAME(mclk_spdif_src_p) = { "clk_spdif_src", "clk_spdif_frac", "xin12m" }; +PNAME(sclk_uart0_src_p) = { "clk_uart0_src", "clk_uart0_frac", "xin24m" }; +PNAME(sclk_uart1_src_p) = { "clk_uart1_src", "clk_uart1_frac", "xin24m" }; +PNAME(sclk_uart2_src_p) = { "clk_uart2_src", "clk_uart2_frac", "xin24m" }; +PNAME(sclk_uart3_src_p) = { "clk_uart3_src", "clk_uart3_frac", "xin24m" }; +PNAME(sclk_uart4_src_p) = { "clk_uart4_src", "clk_uart4_frac", "xin24m" }; +PNAME(sclk_uart5_src_p) = { "clk_uart5_src", "clk_uart5_frac", "xin24m" }; +PNAME(sclk_uart6_src_p) = { "clk_uart6_src", "clk_uart6_frac", "xin24m" }; +PNAME(sclk_uart7_src_p) = { "clk_uart7_src", "clk_uart7_frac", "xin24m" }; +PNAME(clk_32k_p) = { "xin_osc0_div", "clk_pvtm_32k" }; + +/* Pass 0 to PLL() '_lshift' as a placeholder for rk3066 pll type. We are rk3328 pll type */ +static struct rockchip_pll_clock rk3528_pll_clks[] __initdata = { + [apll] = PLL(pll_rk3328, PLL_APLL, "apll", mux_pll_p, + CLK_IS_CRITICAL, RK3528_PLL_CON(0), + RK3528_MODE_CON, 0, 0, 0, rk3528_pll_rates), + + [cpll] = PLL(pll_rk3328, PLL_CPLL, "cpll", mux_pll_p, + CLK_IS_CRITICAL, RK3528_PLL_CON(8), + RK3528_MODE_CON, 2, 0, 0, rk3528_pll_rates), + + [gpll] = PLL(pll_rk3328, PLL_GPLL, "gpll", mux_pll_p, + CLK_IS_CRITICAL, RK3528_PLL_CON(24), + RK3528_MODE_CON, 4, 0, 0, rk3528_pll_rates), + + [ppll] = PLL(pll_rk3328, PLL_PPLL, "ppll", mux_pll_p, + CLK_IS_CRITICAL, RK3528_PCIE_PLL_CON(32), + RK3528_MODE_CON, 6, 0, + ROCKCHIP_PLL_FIXED_MODE, rk3528_pll_rates), + + [dpll] = PLL(pll_rk3328, PLL_DPLL, "dpll", mux_pll_p, + CLK_IGNORE_UNUSED, RK3528_DDRPHY_PLL_CON(16), + RK3528_DDRPHY_MODE_CON, 0, 0, 0, rk3528_pll_rates), +}; + +#define MFLAGS CLK_MUX_HIWORD_MASK +#define DFLAGS CLK_DIVIDER_HIWORD_MASK +#define GFLAGS (CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE) + +#define RK3528_FRAC_MAX_PRATE 1188000000 + +static struct rockchip_clk_branch rk3528_uart0_fracmux __initdata = + MUX(CLK_UART0, "clk_uart0", sclk_uart0_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(6), 0, 2, MFLAGS); + +static struct rockchip_clk_branch rk3528_uart1_fracmux __initdata = + MUX(CLK_UART1, "clk_uart1", sclk_uart1_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(8), 0, 2, MFLAGS); + +static struct rockchip_clk_branch rk3528_uart2_fracmux __initdata = + MUX(CLK_UART2, "clk_uart2", sclk_uart2_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(10), 0, 2, MFLAGS); + +static struct rockchip_clk_branch rk3528_uart3_fracmux __initdata = + MUX(CLK_UART3, "clk_uart3", sclk_uart3_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(12), 0, 2, MFLAGS); + +static struct rockchip_clk_branch rk3528_uart4_fracmux __initdata = + MUX(CLK_UART4, "clk_uart4", sclk_uart4_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(14), 0, 2, MFLAGS); + +static struct rockchip_clk_branch rk3528_uart5_fracmux __initdata = + MUX(CLK_UART5, "clk_uart5", sclk_uart5_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(16), 0, 2, MFLAGS); + +static struct rockchip_clk_branch rk3528_uart6_fracmux __initdata = + MUX(CLK_UART6, "clk_uart6", sclk_uart6_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(18), 0, 2, MFLAGS); + +static struct rockchip_clk_branch rk3528_uart7_fracmux __initdata = + MUX(CLK_UART7, "clk_uart7", sclk_uart7_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(20), 0, 2, MFLAGS); + +static struct rockchip_clk_branch mclk_i2s0_2ch_sai_src_fracmux __initdata = + MUX(MCLK_I2S0_2CH_SAI_SRC_PRE, "mclk_i2s0_2ch_sai_src_pre", mclk_i2s0_2ch_sai_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(22), 0, 2, MFLAGS); + +static struct rockchip_clk_branch mclk_i2s1_8ch_sai_src_fracmux __initdata = + MUX(MCLK_I2S1_8CH_SAI_SRC_PRE, "mclk_i2s1_8ch_sai_src_pre", mclk_i2s1_8ch_sai_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(26), 0, 2, MFLAGS); + +static struct rockchip_clk_branch mclk_i2s2_2ch_sai_src_fracmux __initdata = + MUX(MCLK_I2S2_2CH_SAI_SRC_PRE, "mclk_i2s2_2ch_sai_src_pre", mclk_i2s2_2ch_sai_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(28), 0, 2, MFLAGS); + +static struct rockchip_clk_branch mclk_i2s3_8ch_sai_src_fracmux __initdata = + MUX(MCLK_I2S3_8CH_SAI_SRC_PRE, "mclk_i2s3_8ch_sai_src_pre", mclk_i2s3_8ch_sai_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(24), 0, 2, MFLAGS); + +static struct rockchip_clk_branch mclk_spdif_src_fracmux __initdata = + MUX(MCLK_SDPDIF_SRC_PRE, "mclk_spdif_src_pre", mclk_spdif_src_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(32), 0, 2, MFLAGS); + +/* + * CRU Clock-Architecture + */ +static struct rockchip_clk_branch rk3528_clk_branches[] __initdata = { + /* top */ + FACTOR(0, "xin12m", "xin24m", 0, 1, 2), + + COMPOSITE(CLK_MATRIX_250M_SRC, "clk_250m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(1), 15, 1, MFLAGS, 10, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 5, GFLAGS), + COMPOSITE(CLK_MATRIX_500M_SRC, "clk_500m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(3), 11, 1, MFLAGS, 6, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 10, GFLAGS), + COMPOSITE_NOMUX(CLK_MATRIX_50M_SRC, "clk_50m_src", "cpll", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(0), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 1, GFLAGS), + COMPOSITE_NOMUX(CLK_MATRIX_100M_SRC, "clk_100m_src", "cpll", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(0), 7, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 2, GFLAGS), + COMPOSITE_NOMUX(CLK_MATRIX_150M_SRC, "clk_150m_src", "gpll", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(1), 0, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 3, GFLAGS), + COMPOSITE_NOMUX(CLK_MATRIX_200M_SRC, "clk_200m_src", "gpll", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(1), 5, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 4, GFLAGS), + COMPOSITE_NOMUX(CLK_MATRIX_300M_SRC, "clk_300m_src", "gpll", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(2), 0, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 6, GFLAGS), + COMPOSITE_NOMUX_HALFDIV(CLK_MATRIX_339M_SRC, "clk_339m_src", "gpll", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(2), 5, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 7, GFLAGS), + COMPOSITE_NOMUX(CLK_MATRIX_400M_SRC, "clk_400m_src", "gpll", CLK_IGNORE_UNUSED, + RK3528_CLKSEL_CON(2), 10, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 8, GFLAGS), + COMPOSITE_NOMUX(CLK_MATRIX_600M_SRC, "clk_600m_src", "gpll", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(4), 0, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 11, GFLAGS), + COMPOSITE(DCLK_VOP_SRC0, "dclk_vop_src0", mux_gpll_cpll_p, 0, + RK3528_CLKSEL_CON(32), 10, 1, MFLAGS, 2, 8, DFLAGS, + RK3528_CLKGATE_CON(3), 7, GFLAGS), + COMPOSITE(DCLK_VOP_SRC1, "dclk_vop_src1", mux_gpll_cpll_p, 0, + RK3528_CLKSEL_CON(33), 8, 1, MFLAGS, 0, 8, DFLAGS, + RK3528_CLKGATE_CON(3), 8, GFLAGS), + COMPOSITE_NOMUX(CLK_HSM, "clk_hsm", "xin24m", 0, + RK3528_CLKSEL_CON(36), 5, 5, DFLAGS, + RK3528_CLKGATE_CON(3), 13, GFLAGS), + + COMPOSITE_NOMUX(CLK_UART0_SRC, "clk_uart0_src", "gpll", 0, + RK3528_CLKSEL_CON(4), 5, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 12, GFLAGS), + COMPOSITE_FRACMUX(CLK_UART0_FRAC, "clk_uart0_frac", "clk_uart0_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(5), 0, + RK3528_CLKGATE_CON(0), 13, GFLAGS, &rk3528_uart0_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(SCLK_UART0, "sclk_uart0", "clk_uart0", 0, + RK3528_CLKGATE_CON(0), 14, GFLAGS), + + COMPOSITE_NOMUX(CLK_UART1_SRC, "clk_uart1_src", "gpll", 0, + RK3528_CLKSEL_CON(6), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(0), 15, GFLAGS), + COMPOSITE_FRACMUX(CLK_UART1_FRAC, "clk_uart1_frac", "clk_uart1_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(7), 0, + RK3528_CLKGATE_CON(1), 0, GFLAGS, &rk3528_uart1_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(SCLK_UART1, "sclk_uart1", "clk_uart1", 0, + RK3528_CLKGATE_CON(1), 1, GFLAGS), + + COMPOSITE_NOMUX(CLK_UART2_SRC, "clk_uart2_src", "gpll", 0, + RK3528_CLKSEL_CON(8), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(1), 2, GFLAGS), + COMPOSITE_FRACMUX(CLK_UART2_FRAC, "clk_uart2_frac", "clk_uart2_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(9), 0, + RK3528_CLKGATE_CON(1), 3, GFLAGS, &rk3528_uart2_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(SCLK_UART2, "sclk_uart2", "clk_uart2", 0, + RK3528_CLKGATE_CON(1), 4, GFLAGS), + + COMPOSITE_NOMUX(CLK_UART3_SRC, "clk_uart3_src", "gpll", 0, + RK3528_CLKSEL_CON(10), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(1), 5, GFLAGS), + COMPOSITE_FRACMUX(CLK_UART3_FRAC, "clk_uart3_frac", "clk_uart3_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(11), 0, + RK3528_CLKGATE_CON(1), 6, GFLAGS, &rk3528_uart3_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(SCLK_UART3, "sclk_uart3", "clk_uart3", 0, + RK3528_CLKGATE_CON(1), 7, GFLAGS), + + COMPOSITE_NOMUX(CLK_UART4_SRC, "clk_uart4_src", "gpll", 0, + RK3528_CLKSEL_CON(12), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(1), 8, GFLAGS), + COMPOSITE_FRACMUX(CLK_UART4_FRAC, "clk_uart4_frac", "clk_uart4_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(13), 0, + RK3528_CLKGATE_CON(1), 9, GFLAGS, &rk3528_uart4_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(SCLK_UART4, "sclk_uart4", "clk_uart4", 0, + RK3528_CLKGATE_CON(1), 10, GFLAGS), + + COMPOSITE_NOMUX(CLK_UART5_SRC, "clk_uart5_src", "gpll", 0, + RK3528_CLKSEL_CON(14), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(1), 11, GFLAGS), + COMPOSITE_FRACMUX(CLK_UART5_FRAC, "clk_uart5_frac", "clk_uart5_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(15), 0, + RK3528_CLKGATE_CON(1), 12, GFLAGS, &rk3528_uart5_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(SCLK_UART5, "sclk_uart5", "clk_uart5", 0, + RK3528_CLKGATE_CON(1), 13, GFLAGS), + + COMPOSITE_NOMUX(CLK_UART6_SRC, "clk_uart6_src", "gpll", 0, + RK3528_CLKSEL_CON(16), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(1), 14, GFLAGS), + COMPOSITE_FRACMUX(CLK_UART6_FRAC, "clk_uart6_frac", "clk_uart6_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(17), 0, + RK3528_CLKGATE_CON(1), 15, GFLAGS, &rk3528_uart6_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(SCLK_UART6, "sclk_uart6", "clk_uart6", 0, + RK3528_CLKGATE_CON(2), 0, GFLAGS), + + COMPOSITE_NOMUX(CLK_UART7_SRC, "clk_uart7_src", "gpll", 0, + RK3528_CLKSEL_CON(18), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(2), 1, GFLAGS), + COMPOSITE_FRACMUX(CLK_UART7_FRAC, "clk_uart7_frac", "clk_uart7_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(19), 0, + RK3528_CLKGATE_CON(2), 2, GFLAGS, &rk3528_uart7_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(SCLK_UART7, "sclk_uart7", "clk_uart7", 0, + RK3528_CLKGATE_CON(2), 3, GFLAGS), + + COMPOSITE_NOMUX(CLK_I2S0_2CH_SRC, "clk_i2s0_2ch_src", "gpll", 0, + RK3528_CLKSEL_CON(20), 8, 5, DFLAGS, + RK3528_CLKGATE_CON(2), 5, GFLAGS), + COMPOSITE_FRACMUX(CLK_I2S0_2CH_FRAC, "clk_i2s0_2ch_frac", "clk_i2s0_2ch_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(21), 0, + RK3528_CLKGATE_CON(2), 6, GFLAGS, &mclk_i2s0_2ch_sai_src_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(MCLK_I2S0_2CH_SAI_SRC, "mclk_i2s0_2ch_sai_src", "mclk_i2s0_2ch_sai_src_pre", 0, + RK3528_CLKGATE_CON(2), 7, GFLAGS), + + COMPOSITE_NOMUX(CLK_I2S1_8CH_SRC, "clk_i2s1_8ch_src", "gpll", 0, + RK3528_CLKSEL_CON(24), 3, 5, DFLAGS, + RK3528_CLKGATE_CON(2), 11, GFLAGS), + COMPOSITE_FRACMUX(CLK_I2S1_8CH_FRAC, "clk_i2s1_8ch_frac", "clk_i2s1_8ch_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(25), 0, + RK3528_CLKGATE_CON(2), 12, GFLAGS, &mclk_i2s1_8ch_sai_src_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(MCLK_I2S1_8CH_SAI_SRC, "mclk_i2s1_8ch_sai_src", "mclk_i2s1_8ch_sai_src_pre", 0, + RK3528_CLKGATE_CON(2), 13, GFLAGS), + + COMPOSITE_NOMUX(CLK_I2S2_2CH_SRC, "clk_i2s2_2ch_src", "gpll", 0, + RK3528_CLKSEL_CON(26), 3, 5, DFLAGS, + RK3528_CLKGATE_CON(2), 14, GFLAGS), + COMPOSITE_FRACMUX(CLK_I2S2_2CH_FRAC, "clk_i2s2_2ch_frac", "clk_i2s2_2ch_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(27), 0, + RK3528_CLKGATE_CON(2), 15, GFLAGS, &mclk_i2s2_2ch_sai_src_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(MCLK_I2S2_2CH_SAI_SRC, "mclk_i2s2_2ch_sai_src", "mclk_i2s2_2ch_sai_src_pre", 0, + RK3528_CLKGATE_CON(3), 0, GFLAGS), + + COMPOSITE_NOMUX(CLK_I2S3_8CH_SRC, "clk_i2s3_8ch_src", "gpll", 0, + RK3528_CLKSEL_CON(22), 3, 5, DFLAGS, + RK3528_CLKGATE_CON(2), 8, GFLAGS), + COMPOSITE_FRACMUX(CLK_I2S3_8CH_FRAC, "clk_i2s3_8ch_frac", "clk_i2s3_8ch_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(23), 0, + RK3528_CLKGATE_CON(2), 9, GFLAGS, &mclk_i2s3_8ch_sai_src_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(MCLK_I2S3_8CH_SAI_SRC, "mclk_i2s3_8ch_sai_src", "mclk_i2s3_8ch_sai_src_pre", 0, + RK3528_CLKGATE_CON(2), 10, GFLAGS), + + COMPOSITE_NOMUX(CLK_SPDIF_SRC, "clk_spdif_src", "gpll", 0, + RK3528_CLKSEL_CON(30), 2, 5, DFLAGS, + RK3528_CLKGATE_CON(3), 4, GFLAGS), + COMPOSITE_FRACMUX(CLK_SPDIF_FRAC, "clk_spdif_frac", "clk_spdif_src", CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(31), 0, + RK3528_CLKGATE_CON(3), 5, GFLAGS, &mclk_spdif_src_fracmux, RK3528_FRAC_MAX_PRATE), + GATE(MCLK_SPDIF_SRC, "mclk_spdif_src", "mclk_spdif_src_pre", 0, + RK3528_CLKGATE_CON(3), 6, GFLAGS), + + /* bus */ + COMPOSITE_NODIV(ACLK_BUS_M_ROOT, "aclk_bus_m_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(43), 12, 2, MFLAGS, + RK3528_CLKGATE_CON(8), 7, GFLAGS), + GATE(ACLK_GIC, "aclk_gic", "aclk_bus_m_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(9), 1, GFLAGS), + + COMPOSITE_NODIV(ACLK_BUS_ROOT, "aclk_bus_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(43), 6, 2, MFLAGS, + RK3528_CLKGATE_CON(8), 4, GFLAGS), + GATE(ACLK_SPINLOCK, "aclk_spinlock", "aclk_bus_root", 0, + RK3528_CLKGATE_CON(9), 2, GFLAGS), + GATE(ACLK_DMAC, "aclk_dmac", "aclk_bus_root", 0, + RK3528_CLKGATE_CON(9), 4, GFLAGS), + GATE(ACLK_DCF, "aclk_dcf", "aclk_bus_root", 0, + RK3528_CLKGATE_CON(11), 11, GFLAGS), + COMPOSITE(ACLK_BUS_VOPGL_ROOT, "aclk_bus_vopgl_root", mux_gpll_cpll_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(43), 3, 1, MFLAGS, 0, 3, DFLAGS, + RK3528_CLKGATE_CON(8), 0, GFLAGS), + COMPOSITE_NODIV(ACLK_BUS_H_ROOT, "aclk_bus_h_root", mux_500m_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(43), 4, 2, MFLAGS, + RK3528_CLKGATE_CON(8), 2, GFLAGS), + GATE(ACLK_DMA2DDR, "aclk_dma2ddr", "aclk_bus_h_root", 0, + RK3528_CLKGATE_CON(10), 14, GFLAGS), + + COMPOSITE_NODIV(HCLK_BUS_ROOT, "hclk_bus_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(43), 8, 2, MFLAGS, + RK3528_CLKGATE_CON(8), 5, GFLAGS), + + COMPOSITE_NODIV(PCLK_BUS_ROOT, "pclk_bus_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(43), 10, 2, MFLAGS, + RK3528_CLKGATE_CON(8), 6, GFLAGS), + GATE(PCLK_DFT2APB, "pclk_dft2apb", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(8), 13, GFLAGS), + GATE(PCLK_BUS_GRF, "pclk_bus_grf", "pclk_bus_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(8), 15, GFLAGS), + GATE(PCLK_TIMER, "pclk_timer", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(9), 5, GFLAGS), + GATE(PCLK_JDBCK_DAP, "pclk_jdbck_dap", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(9), 12, GFLAGS), + GATE(PCLK_WDT_NS, "pclk_wdt_ns", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(9), 15, GFLAGS), + GATE(PCLK_UART0, "pclk_uart0", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(10), 7, GFLAGS), + GATE(PCLK_PWM0, "pclk_pwm0", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(11), 4, GFLAGS), + GATE(PCLK_PWM1, "pclk_pwm1", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(11), 7, GFLAGS), + GATE(PCLK_DMA2DDR, "pclk_dma2ddr", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(10), 13, GFLAGS), + GATE(PCLK_SCR, "pclk_scr", "pclk_bus_root", 0, + RK3528_CLKGATE_CON(11), 10, GFLAGS), + GATE(PCLK_INTMUX, "pclk_intmux", "pclk_bus_root", CLK_IGNORE_UNUSED, + RK3528_CLKGATE_CON(11), 12, GFLAGS), + + COMPOSITE_NODIV(CLK_PWM0, "clk_pwm0", mux_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(44), 6, 2, MFLAGS, + RK3528_CLKGATE_CON(11), 5, GFLAGS), + COMPOSITE_NODIV(CLK_PWM1, "clk_pwm1", mux_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(44), 8, 2, MFLAGS, + RK3528_CLKGATE_CON(11), 8, GFLAGS), + + GATE(CLK_CAPTURE_PWM1, "clk_capture_pwm1", "xin24m", 0, + RK3528_CLKGATE_CON(11), 9, GFLAGS), + GATE(CLK_CAPTURE_PWM0, "clk_capture_pwm0", "xin24m", 0, + RK3528_CLKGATE_CON(11), 6, GFLAGS), + GATE(CLK_JDBCK_DAP, "clk_jdbck_dap", "xin24m", 0, + RK3528_CLKGATE_CON(9), 13, GFLAGS), + GATE(TCLK_WDT_NS, "tclk_wdt_ns", "xin24m", 0, + RK3528_CLKGATE_CON(10), 0, GFLAGS), + + GATE(CLK_TIMER_ROOT, "clk_timer_root", "xin24m", 0, + RK3528_CLKGATE_CON(8), 9, GFLAGS), + GATE(CLK_TIMER0, "clk_timer0", "clk_timer_root", 0, + RK3528_CLKGATE_CON(9), 6, GFLAGS), + GATE(CLK_TIMER1, "clk_timer1", "clk_timer_root", 0, + RK3528_CLKGATE_CON(9), 7, GFLAGS), + GATE(CLK_TIMER2, "clk_timer2", "clk_timer_root", 0, + RK3528_CLKGATE_CON(9), 8, GFLAGS), + GATE(CLK_TIMER3, "clk_timer3", "clk_timer_root", 0, + RK3528_CLKGATE_CON(9), 9, GFLAGS), + GATE(CLK_TIMER4, "clk_timer4", "clk_timer_root", 0, + RK3528_CLKGATE_CON(9), 10, GFLAGS), + GATE(CLK_TIMER5, "clk_timer5", "clk_timer_root", 0, + RK3528_CLKGATE_CON(9), 11, GFLAGS), + + /* pmu */ + GATE(HCLK_PMU_ROOT, "hclk_pmu_root", "clk_100m_src", CLK_IGNORE_UNUSED, + RK3528_PMU_CLKGATE_CON(0), 1, GFLAGS), + GATE(PCLK_PMU_ROOT, "pclk_pmu_root", "clk_100m_src", CLK_IGNORE_UNUSED, + RK3528_PMU_CLKGATE_CON(0), 0, GFLAGS), + + GATE(FCLK_MCU, "fclk_mcu", "hclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(0), 7, GFLAGS), + GATE(HCLK_PMU_SRAM, "hclk_pmu_sram", "hclk_pmu_root", CLK_IS_CRITICAL, + RK3528_PMU_CLKGATE_CON(5), 4, GFLAGS), + + GATE(PCLK_I2C2, "pclk_i2c2", "pclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(0), 2, GFLAGS), + GATE(PCLK_PMU_HP_TIMER, "pclk_pmu_hp_timer", "pclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(1), 2, GFLAGS), + GATE(PCLK_PMU_IOC, "pclk_pmu_ioc", "pclk_pmu_root", CLK_IS_CRITICAL, + RK3528_PMU_CLKGATE_CON(1), 5, GFLAGS), + GATE(PCLK_PMU_CRU, "pclk_pmu_cru", "pclk_pmu_root", CLK_IS_CRITICAL, + RK3528_PMU_CLKGATE_CON(1), 6, GFLAGS), + GATE(PCLK_PMU_GRF, "pclk_pmu_grf", "pclk_pmu_root", CLK_IS_CRITICAL, + RK3528_PMU_CLKGATE_CON(1), 7, GFLAGS), + GATE(PCLK_PMU_WDT, "pclk_pmu_wdt", "pclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(1), 10, GFLAGS), + GATE(PCLK_PMU, "pclk_pmu", "pclk_pmu_root", CLK_IS_CRITICAL, + RK3528_PMU_CLKGATE_CON(0), 13, GFLAGS), + GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(0), 14, GFLAGS), + GATE(PCLK_OSCCHK, "pclk_oscchk", "pclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(0), 9, GFLAGS), + GATE(PCLK_PMU_MAILBOX, "pclk_pmu_mailbox", "pclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(1), 12, GFLAGS), + GATE(PCLK_SCRKEYGEN, "pclk_scrkeygen", "pclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(1), 15, GFLAGS), + GATE(PCLK_PVTM_PMU, "pclk_pvtm_pmu", "pclk_pmu_root", 0, + RK3528_PMU_CLKGATE_CON(5), 1, GFLAGS), + + COMPOSITE_NODIV(CLK_I2C2, "clk_i2c2", clk_i2c2_p, 0, + RK3528_PMU_CLKSEL_CON(0), 0, 2, MFLAGS, + RK3528_PMU_CLKGATE_CON(0), 3, GFLAGS), + + GATE(CLK_REFOUT, "clk_refout", "xin24m", 0, + RK3528_PMU_CLKGATE_CON(2), 4, GFLAGS), + COMPOSITE_NOMUX(CLK_PVTM_PMU, "clk_pvtm_pmu", "xin24m", 0, + RK3528_PMU_CLKSEL_CON(5), 0, 5, DFLAGS, + RK3528_PMU_CLKGATE_CON(5), 0, GFLAGS), + + COMPOSITE_FRAC(XIN_OSC0_DIV, "xin_osc0_div", "xin24m", 0, + RK3528_PMU_CLKSEL_CON(1), 0, + RK3528_PMU_CLKGATE_CON(1), 0, GFLAGS, 0), + /* clk_32k: internal! No path from external osc 32k */ + MUX(CLK_DEEPSLOW, "clk_32k", clk_32k_p, CLK_IS_CRITICAL, + RK3528_PMU_CLKSEL_CON(2), 0, 1, MFLAGS), + GATE(RTC_CLK_MCU, "rtc_clk_mcu", "clk_32k", 0, + RK3528_PMU_CLKGATE_CON(0), 8, GFLAGS), + GATE(CLK_DDR_FAIL_SAFE, "clk_ddr_fail_safe", "xin24m", CLK_IGNORE_UNUSED, + RK3528_PMU_CLKGATE_CON(1), 1, GFLAGS), + + COMPOSITE_NODIV(DBCLK_GPIO0, "dbclk_gpio0", mux_24m_32k_p, 0, + RK3528_PMU_CLKSEL_CON(0), 2, 1, MFLAGS, + RK3528_PMU_CLKGATE_CON(0), 15, GFLAGS), + COMPOSITE_NODIV(TCLK_PMU_WDT, "tclk_pmu_wdt", mux_24m_32k_p, 0, + RK3528_PMU_CLKSEL_CON(2), 1, 1, MFLAGS, + RK3528_PMU_CLKGATE_CON(1), 11, GFLAGS), + + /* core */ + COMPOSITE_NOMUX(ACLK_M_CORE_BIU, "aclk_m_core", "armclk", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(39), 11, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, + RK3528_CLKGATE_CON(5), 12, GFLAGS), + COMPOSITE_NOMUX(PCLK_DBG, "pclk_dbg", "armclk", CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(40), 1, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, + RK3528_CLKGATE_CON(5), 13, GFLAGS), + GATE(PCLK_CPU_ROOT, "pclk_cpu_root", "pclk_dbg", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(6), 1, GFLAGS), + GATE(PCLK_CORE_GRF, "pclk_core_grf", "pclk_cpu_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(6), 2, GFLAGS), + + /* ddr */ + GATE(CLK_DDRC_SRC, "clk_ddrc_src", "dpll", CLK_IS_CRITICAL, + RK3528_DDRPHY_CLKGATE_CON(0), 0, GFLAGS), + GATE(CLK_DDR_PHY, "clk_ddr_phy", "dpll", CLK_IS_CRITICAL, + RK3528_DDRPHY_CLKGATE_CON(0), 1, GFLAGS), + + COMPOSITE_NODIV(PCLK_DDR_ROOT, "pclk_ddr_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(90), 0, 2, MFLAGS, + RK3528_CLKGATE_CON(45), 0, GFLAGS), + GATE(PCLK_DDRMON, "pclk_ddrmon", "pclk_ddr_root", CLK_IGNORE_UNUSED, + RK3528_CLKGATE_CON(45), 3, GFLAGS), + GATE(PCLK_DDR_HWLP, "pclk_ddr_hwlp", "pclk_ddr_root", CLK_IGNORE_UNUSED, + RK3528_CLKGATE_CON(45), 8, GFLAGS), + GATE(CLK_TIMER_DDRMON, "clk_timer_ddrmon", "xin24m", CLK_IGNORE_UNUSED, + RK3528_CLKGATE_CON(45), 4, GFLAGS), + + GATE(PCLK_DDRC, "pclk_ddrc", "pclk_ddr_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(45), 2, GFLAGS), + GATE(PCLK_DDR_GRF, "pclk_ddr_grf", "pclk_ddr_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(45), 6, GFLAGS), + GATE(PCLK_DDRPHY, "pclk_ddrphy", "pclk_ddr_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(45), 9, GFLAGS), + + GATE(ACLK_DDR_UPCTL, "aclk_ddr_upctl", "clk_ddrc_src", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(45), 11, GFLAGS), + GATE(CLK_DDR_UPCTL, "clk_ddr_upctl", "clk_ddrc_src", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(45), 12, GFLAGS), + GATE(CLK_DDRMON, "clk_ddrmon", "clk_ddrc_src", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(45), 13, GFLAGS), + GATE(ACLK_DDR_SCRAMBLE, "aclk_ddr_scramble", "clk_ddrc_src", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(45), 14, GFLAGS), + GATE(ACLK_SPLIT, "aclk_split", "clk_ddrc_src", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(45), 15, GFLAGS), + + /* gpu */ + COMPOSITE_NODIV(ACLK_GPU_ROOT, "aclk_gpu_root", mux_500m_300m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(76), 0, 2, MFLAGS, + RK3528_CLKGATE_CON(34), 0, GFLAGS), + COMPOSITE_NODIV(ACLK_GPU, "aclk_gpu", aclk_gpu_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(76), 6, 1, MFLAGS, + RK3528_CLKGATE_CON(34), 7, GFLAGS), + GATE(ACLK_GPU_MALI, "aclk_gpu_mali", "aclk_gpu", 0, + RK3528_CLKGATE_CON(34), 8, GFLAGS), + COMPOSITE_NODIV(PCLK_GPU_ROOT, "pclk_gpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(76), 4, 2, MFLAGS, + RK3528_CLKGATE_CON(34), 2, GFLAGS), + + /* rkvdec */ + COMPOSITE_NODIV(ACLK_RKVDEC_ROOT_NDFT, "aclk_rkvdec_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(88), 6, 2, MFLAGS, + RK3528_CLKGATE_CON(44), 3, GFLAGS), + COMPOSITE_NODIV(HCLK_RKVDEC_ROOT, "hclk_rkvdec_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(88), 4, 2, MFLAGS, + RK3528_CLKGATE_CON(44), 2, GFLAGS), + GATE(PCLK_DDRPHY_CRU, "pclk_ddrphy_cru", "hclk_rkvdec_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(44), 4, GFLAGS), + GATE(HCLK_RKVDEC, "hclk_rkvdec", "hclk_rkvdec_root", 0, + RK3528_CLKGATE_CON(44), 9, GFLAGS), + COMPOSITE_NODIV(CLK_HEVC_CA_RKVDEC, "clk_hevc_ca_rkvdec", mux_600m_300m_200m_24m_p, 0, + RK3528_CLKSEL_CON(88), 11, 2, MFLAGS, + RK3528_CLKGATE_CON(44), 11, GFLAGS), + MUX(ACLK_RKVDEC_PVTMUX_ROOT, "aclk_rkvdec_pvtmux_root", aclk_rkvdec_pvtmux_root_p, CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(88), 13, 1, MFLAGS), + GATE(ACLK_RKVDEC, "aclk_rkvdec", "aclk_rkvdec_pvtmux_root", 0, + RK3528_CLKGATE_CON(44), 8, GFLAGS), + + /* rkvenc */ + COMPOSITE_NODIV(ACLK_RKVENC_ROOT, "aclk_rkvenc_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(79), 2, 2, MFLAGS, + RK3528_CLKGATE_CON(36), 1, GFLAGS), + GATE(ACLK_RKVENC, "aclk_rkvenc", "aclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(36), 7, GFLAGS), + + COMPOSITE_NODIV(PCLK_RKVENC_ROOT, "pclk_rkvenc_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(79), 4, 2, MFLAGS, + RK3528_CLKGATE_CON(36), 2, GFLAGS), + GATE(PCLK_RKVENC_IOC, "pclk_rkvenc_ioc", "pclk_rkvenc_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(37), 10, GFLAGS), + GATE(PCLK_RKVENC_GRF, "pclk_rkvenc_grf", "pclk_rkvenc_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(38), 6, GFLAGS), + GATE(PCLK_I2C1, "pclk_i2c1", "pclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(36), 11, GFLAGS), + GATE(PCLK_I2C0, "pclk_i2c0", "pclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(36), 13, GFLAGS), + GATE(PCLK_SPI0, "pclk_spi0", "pclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(37), 2, GFLAGS), + GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(37), 8, GFLAGS), + GATE(PCLK_UART1, "pclk_uart1", "pclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(38), 2, GFLAGS), + GATE(PCLK_UART3, "pclk_uart3", "pclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(38), 4, GFLAGS), + GATE(PCLK_CAN0, "pclk_can0", "pclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(38), 7, GFLAGS), + GATE(PCLK_CAN1, "pclk_can1", "pclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(38), 9, GFLAGS), + + COMPOSITE_NODIV(MCLK_PDM, "mclk_pdm", mux_150m_100m_24m_p, 0, + RK3528_CLKSEL_CON(80), 12, 2, MFLAGS, + RK3528_CLKGATE_CON(38), 1, GFLAGS), + COMPOSITE(CLK_CAN0, "clk_can0", mux_gpll_cpll_p, 0, + RK3528_CLKSEL_CON(81), 6, 1, MFLAGS, 0, 6, DFLAGS, + RK3528_CLKGATE_CON(38), 8, GFLAGS), + COMPOSITE(CLK_CAN1, "clk_can1", mux_gpll_cpll_p, 0, + RK3528_CLKSEL_CON(81), 13, 1, MFLAGS, 7, 6, DFLAGS, + RK3528_CLKGATE_CON(38), 10, GFLAGS), + + COMPOSITE_NODIV(HCLK_RKVENC_ROOT, "hclk_rkvenc_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(79), 0, 2, MFLAGS, + RK3528_CLKGATE_CON(36), 0, GFLAGS), + GATE(HCLK_SAI_I2S1, "hclk_sai_i2s1", "hclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(36), 9, GFLAGS), + GATE(HCLK_SPDIF, "hclk_spdif", "hclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(37), 14, GFLAGS), + GATE(HCLK_PDM, "hclk_pdm", "hclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(38), 0, GFLAGS), + GATE(HCLK_RKVENC, "hclk_rkvenc", "hclk_rkvenc_root", 0, + RK3528_CLKGATE_CON(36), 6, GFLAGS), + + COMPOSITE_NODIV(CLK_CORE_RKVENC, "clk_core_rkvenc", mux_300m_200m_100m_24m_p, 0, + RK3528_CLKSEL_CON(79), 6, 2, MFLAGS, + RK3528_CLKGATE_CON(36), 8, GFLAGS), + COMPOSITE_NODIV(CLK_I2C0, "clk_i2c0", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(79), 11, 2, MFLAGS, + RK3528_CLKGATE_CON(36), 14, GFLAGS), + COMPOSITE_NODIV(CLK_I2C1, "clk_i2c1", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(79), 9, 2, MFLAGS, + RK3528_CLKGATE_CON(36), 12, GFLAGS), +#if 0 + GATE(SCLK_IN_SPI0, "sclk_in_spi0", "sclk_in_spi0_io", 0, + RK3528_CLKGATE_CON(37), 4, GFLAGS), + GATE(CLK_UART_JTAG, "clk_uart_jtag", "xin24m", 0, + RK3528_CLKGATE_CON(37), 0, GFLAGS), +#endif + COMPOSITE_NODIV(CLK_SPI0, "clk_spi0", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(79), 13, 2, MFLAGS, + RK3528_CLKGATE_CON(37), 3, GFLAGS), + COMPOSITE_NODIV(MCLK_SAI_I2S1, "mclk_sai_i2s1", mclk_sai_i2s1_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(79), 8, 1, MFLAGS, + RK3528_CLKGATE_CON(36), 10, GFLAGS), + GATE(DBCLK_GPIO4, "dbclk_gpio4", "xin24m", 0, + RK3528_CLKGATE_CON(37), 9, GFLAGS), + + /* vo */ + COMPOSITE_NODIV(HCLK_VO_ROOT, "hclk_vo_root", mux_150m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(83), 2, 2, MFLAGS, + RK3528_CLKGATE_CON(39), 1, GFLAGS), + GATE(HCLK_VOP, "hclk_vop", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(40), 2, GFLAGS), + GATE(HCLK_USBHOST, "hclk_usbhost", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(43), 3, GFLAGS), + GATE(HCLK_JPEG_DECODER, "hclk_jpeg_decoder", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(41), 7, GFLAGS), + GATE(HCLK_VDPP, "hclk_vdpp", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(39), 10, GFLAGS), + GATE(HCLK_CVBS, "hclk_cvbs", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(41), 3, GFLAGS), + GATE(HCLK_USBHOST_ARB, "hclk_usbhost_arb", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(43), 4, GFLAGS), + GATE(HCLK_SAI_I2S3, "hclk_sai_i2s3", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(42), 1, GFLAGS), + GATE(HCLK_HDCP, "hclk_hdcp", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(41), 1, GFLAGS), + GATE(HCLK_RGA2E, "hclk_rga2e", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(39), 7, GFLAGS), + GATE(HCLK_SDMMC0, "hclk_sdmmc0", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(42), 9, GFLAGS), + GATE(HCLK_HDCP_KEY, "hclk_hdcp_key", "hclk_vo_root", 0, + RK3528_CLKGATE_CON(40), 15, GFLAGS), + + COMPOSITE_NODIV(ACLK_VO_L_ROOT, "aclk_vo_l_root", mux_150m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(84), 1, 2, MFLAGS, + RK3528_CLKGATE_CON(41), 8, GFLAGS), + GATE(ACLK_MAC_VO, "aclk_gmac0", "aclk_vo_l_root", 0, + RK3528_CLKGATE_CON(41), 10, GFLAGS), + + COMPOSITE_NODIV(PCLK_VO_ROOT, "pclk_vo_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(83), 4, 2, MFLAGS, + RK3528_CLKGATE_CON(39), 2, GFLAGS), + GATE(PCLK_MAC_VO, "pclk_gmac0", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(41), 11, GFLAGS), + GATE(PCLK_VCDCPHY, "pclk_vcdcphy", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(42), 4, GFLAGS), + GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(42), 5, GFLAGS), + GATE(PCLK_VO_IOC, "pclk_vo_ioc", "pclk_vo_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(42), 7, GFLAGS), + GATE(PCLK_OTPC_NS, "pclk_otpc_ns", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(42), 11, GFLAGS), + GATE(PCLK_UART4, "pclk_uart4", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(43), 7, GFLAGS), + GATE(PCLK_I2C4, "pclk_i2c4", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(43), 9, GFLAGS), + GATE(PCLK_I2C7, "pclk_i2c7", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(43), 11, GFLAGS), + + GATE(PCLK_USBPHY, "pclk_usbphy", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(43), 13, GFLAGS), + + GATE(PCLK_VO_GRF, "pclk_vo_grf", "pclk_vo_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(39), 13, GFLAGS), + GATE(PCLK_CRU, "pclk_cru", "pclk_vo_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(39), 15, GFLAGS), + GATE(PCLK_HDMI, "pclk_hdmi", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(40), 6, GFLAGS), + GATE(PCLK_HDMIPHY, "pclk_hdmiphy", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(40), 14, GFLAGS), + GATE(PCLK_HDCP, "pclk_hdcp", "pclk_vo_root", 0, + RK3528_CLKGATE_CON(41), 2, GFLAGS), + + COMPOSITE_NODIV(CLK_CORE_VDPP, "clk_core_vdpp", mux_339m_200m_100m_24m_p, 0, + RK3528_CLKSEL_CON(83), 10, 2, MFLAGS, + RK3528_CLKGATE_CON(39), 12, GFLAGS), + COMPOSITE_NODIV(CLK_CORE_RGA2E, "clk_core_rga2e", mux_339m_200m_100m_24m_p, 0, + RK3528_CLKSEL_CON(83), 8, 2, MFLAGS, + RK3528_CLKGATE_CON(39), 9, GFLAGS), + COMPOSITE_NODIV(ACLK_JPEG_ROOT, "aclk_jpeg_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(84), 9, 2, MFLAGS, + RK3528_CLKGATE_CON(41), 15, GFLAGS), + GATE(ACLK_JPEG_DECODER, "aclk_jpeg_decoder", "aclk_jpeg_root", 0, + RK3528_CLKGATE_CON(41), 6, GFLAGS), + + COMPOSITE_NODIV(ACLK_VO_ROOT, "aclk_vo_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(83), 0, 2, MFLAGS, + RK3528_CLKGATE_CON(39), 0, GFLAGS), + GATE(ACLK_RGA2E, "aclk_rga2e", "aclk_vo_root", 0, + RK3528_CLKGATE_CON(39), 8, GFLAGS | CLK_GATE_NO_SET_RATE), + GATE(ACLK_VDPP, "aclk_vdpp", "aclk_vo_root", 0, + RK3528_CLKGATE_CON(39), 11, GFLAGS | CLK_GATE_NO_SET_RATE), + GATE(ACLK_HDCP, "aclk_hdcp", "aclk_vo_root", 0, + RK3528_CLKGATE_CON(41), 0, GFLAGS | CLK_GATE_NO_SET_RATE), + + COMPOSITE(CCLK_SRC_SDMMC0, "cclk_src_sdmmc0", mux_gpll_cpll_xin24m_p, 0, + RK3528_CLKSEL_CON(85), 6, 2, MFLAGS, 0, 6, DFLAGS, + RK3528_CLKGATE_CON(42), 8, GFLAGS), + + COMPOSITE(ACLK_VOP_ROOT, "aclk_vop_root", mux_gpll_cpll_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(83), 15, 1, MFLAGS, 12, 3, DFLAGS, + RK3528_CLKGATE_CON(40), 0, GFLAGS), + GATE(ACLK_VOP, "aclk_vop", "aclk_vop_root", 0, + RK3528_CLKGATE_CON(40), 5, GFLAGS), + + COMPOSITE_NODIV(CLK_I2C4, "clk_i2c4", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(85), 13, 2, MFLAGS, + RK3528_CLKGATE_CON(43), 10, GFLAGS), + COMPOSITE_NODIV(CLK_I2C7, "clk_i2c7", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(86), 0, 2, MFLAGS, + RK3528_CLKGATE_CON(43), 12, GFLAGS), + GATE(DBCLK_GPIO2, "dbclk_gpio2", "xin24m", 0, + RK3528_CLKGATE_CON(42), 6, GFLAGS), + + GATE(CLK_HDMIHDP0, "clk_hdmihdp0", "xin24m", 0, + RK3528_CLKGATE_CON(43), 2, GFLAGS), + GATE(CLK_MACPHY, "clk_macphy", "xin24m", 0, + RK3528_CLKGATE_CON(42), 3, GFLAGS), + GATE(CLK_REF_USBPHY, "clk_ref_usbphy", "xin24m", 0, + RK3528_CLKGATE_CON(43), 14, GFLAGS), + GATE(CLK_SBPI_OTPC_NS, "clk_sbpi_otpc_ns", "xin24m", 0, + RK3528_CLKGATE_CON(42), 12, GFLAGS), + FACTOR(CLK_USER_OTPC_NS, "clk_user_otpc_ns", "clk_sbpi_otpc_ns", 0, 1, 2), + + GATE(MCLK_SAI_I2S3, "mclk_sai_i2s3", "mclk_i2s3_8ch_sai_src", 0, + RK3528_CLKGATE_CON(42), 2, GFLAGS), + COMPOSITE_NODIV(DCLK_VOP0, "dclk_vop0", dclk_vop0_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, + RK3528_CLKSEL_CON(84), 0, 1, MFLAGS, + RK3528_CLKGATE_CON(40), 3, GFLAGS), + GATE(DCLK_VOP1, "dclk_vop1", "dclk_vop_src1", CLK_SET_RATE_PARENT, + RK3528_CLKGATE_CON(40), 4, GFLAGS), + FACTOR_GATE(DCLK_CVBS, "dclk_cvbs", "dclk_vop1", 0, 1, 4, + RK3528_CLKGATE_CON(41), 4, GFLAGS), + GATE(DCLK_4X_CVBS, "dclk_4x_cvbs", "dclk_vop1", 0, + RK3528_CLKGATE_CON(41), 5, GFLAGS), + + FACTOR_GATE(CLK_SFR_HDMI, "clk_sfr_hdmi", "dclk_vop_src1", 0, 1, 4, + RK3528_CLKGATE_CON(40), 7, GFLAGS), + + GATE(CLK_SPDIF_HDMI, "clk_spdif_hdmi", "mclk_spdif_src", 0, + RK3528_CLKGATE_CON(40), 10, GFLAGS), + GATE(MCLK_SPDIF, "mclk_spdif", "mclk_spdif_src", 0, + RK3528_CLKGATE_CON(37), 15, GFLAGS), + GATE(CLK_CEC_HDMI, "clk_cec_hdmi", "clk_32k", 0, + RK3528_CLKGATE_CON(40), 8, GFLAGS), +#if 0 + GATE(CLK_USBHOST_OHCI, "clk_usbhost_ohci", "clk_usbhost_ohci_io", 0, + RK3528_CLKGATE_CON(43), 5, GFLAGS), + GATE(CLK_USBHOST_UTMI, "clk_usbhost_utmi", "clk_usbhost_utmi_io", 0, + RK3528_CLKGATE_CON(43), 6, GFLAGS), + GATE(CLK_HDMIPHY_TMDSSRC, "clk_hdmiphy_tmdssrc", "clk_hdmiphy_tmdssrc_io", 0, + RK3528_CLKGATE_CON(40), 11, GFLAGS), + GATE(CLK_HDMIPHY_PREP, "clk_hdmiphy_prep", "clk_hdmiphy_prep_io", 0, + RK3528_CLKGATE_CON(40), 12, GFLAGS), +#endif + /* vpu */ + GATE(DBCLK_GPIO1, "dbclk_gpio1", "xin24m", 0, + RK3528_CLKGATE_CON(26), 5, GFLAGS), + GATE(DBCLK_GPIO3, "dbclk_gpio3", "xin24m", 0, + RK3528_CLKGATE_CON(27), 1, GFLAGS), + GATE(CLK_SUSPEND_USB3OTG, "clk_suspend_usb3otg", "xin24m", 0, + RK3528_CLKGATE_CON(33), 4, GFLAGS), + GATE(CLK_PCIE_AUX, "clk_pcie_aux", "xin24m", 0, + RK3528_CLKGATE_CON(30), 2, GFLAGS), + GATE(TCLK_EMMC, "tclk_emmc", "xin24m", 0, + RK3528_CLKGATE_CON(26), 3, GFLAGS), + GATE(CLK_REF_USB3OTG, "clk_ref_usb3otg", "xin24m", 0, + RK3528_CLKGATE_CON(33), 2, GFLAGS), + COMPOSITE(CCLK_SRC_SDIO0, "cclk_src_sdio0", mux_gpll_cpll_xin24m_p, 0, + RK3528_CLKSEL_CON(72), 6, 2, MFLAGS, 0, 6, DFLAGS, + RK3528_CLKGATE_CON(32), 1, GFLAGS), + + COMPOSITE_NODIV(PCLK_VPU_ROOT, "pclk_vpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(61), 4, 2, MFLAGS, + RK3528_CLKGATE_CON(25), 5, GFLAGS), + GATE(PCLK_VPU_GRF, "pclk_vpu_grf", "pclk_vpu_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(25), 12, GFLAGS), + GATE(PCLK_CRU_PCIE, "pclk_cru_pcie", "pclk_vpu_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(25), 11, GFLAGS), + GATE(PCLK_UART6, "pclk_uart6", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(27), 11, GFLAGS), + GATE(PCLK_CAN2, "pclk_can2", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(32), 7, GFLAGS), + GATE(PCLK_SPI1, "pclk_spi1", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(27), 4, GFLAGS), + GATE(PCLK_CAN3, "pclk_can3", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(32), 9, GFLAGS), + GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(27), 0, GFLAGS), + GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(26), 4, GFLAGS), + GATE(PCLK_SARADC, "pclk_saradc", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(32), 11, GFLAGS), + GATE(PCLK_ACODEC, "pclk_acodec", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(26), 13, GFLAGS), + GATE(PCLK_UART7, "pclk_uart7", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(27), 13, GFLAGS), + GATE(PCLK_UART5, "pclk_uart5", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(27), 9, GFLAGS), + GATE(PCLK_TSADC, "pclk_tsadc", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(32), 14, GFLAGS), + GATE(PCLK_PCIE, "pclk_pcie", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(30), 1, GFLAGS), + GATE(PCLK_UART2, "pclk_uart2", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(27), 7, GFLAGS), + GATE(PCLK_VPU_IOC, "pclk_vpu_ioc", "pclk_vpu_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(26), 8, GFLAGS), + GATE(PCLK_PIPE_GRF, "pclk_pipe_grf", "pclk_vpu_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(30), 7, GFLAGS), + GATE(PCLK_I2C5, "pclk_i2c5", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(28), 1, GFLAGS), + GATE(PCLK_PCIE_PHY, "pclk_pcie_phy", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(30), 6, GFLAGS), + GATE(PCLK_I2C3, "pclk_i2c3", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(27), 15, GFLAGS), + GATE(PCLK_MAC_VPU, "pclk_gmac1", "pclk_vpu_root", CLK_IS_CRITICAL, + RK3528_CLKGATE_CON(28), 6, GFLAGS), + GATE(PCLK_I2C6, "pclk_i2c6", "pclk_vpu_root", 0, + RK3528_CLKGATE_CON(28), 3, GFLAGS), + + COMPOSITE_NODIV(ACLK_VPU_L_ROOT, "aclk_vpu_l_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(60), 0, 2, MFLAGS, + RK3528_CLKGATE_CON(25), 0, GFLAGS), + GATE(ACLK_EMMC, "aclk_emmc", "aclk_vpu_l_root", 0, + RK3528_CLKGATE_CON(26), 1, GFLAGS | CLK_GATE_NO_SET_RATE), + GATE(ACLK_MAC_VPU, "aclk_gmac1", "aclk_vpu_l_root", 0, + RK3528_CLKGATE_CON(28), 5, GFLAGS | CLK_GATE_NO_SET_RATE), + GATE(ACLK_PCIE, "aclk_pcie", "aclk_vpu_l_root", 0, + RK3528_CLKGATE_CON(30), 3, GFLAGS | CLK_GATE_NO_SET_RATE), + + GATE(ACLK_USB3OTG, "aclk_usb3otg", "aclk_vpu_l_root", 0, + RK3528_CLKGATE_CON(33), 1, GFLAGS | CLK_GATE_NO_SET_RATE), + + COMPOSITE_NODIV(HCLK_VPU_ROOT, "hclk_vpu_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(61), 2, 2, MFLAGS, + RK3528_CLKGATE_CON(25), 4, GFLAGS), + GATE(HCLK_VPU, "hclk_vpu", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(25), 10, GFLAGS), + GATE(HCLK_SFC, "hclk_sfc", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(25), 13, GFLAGS), + GATE(HCLK_EMMC, "hclk_emmc", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(26), 0, GFLAGS), + GATE(HCLK_SAI_I2S0, "hclk_sai_i2s0", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(26), 9, GFLAGS), + GATE(HCLK_SAI_I2S2, "hclk_sai_i2s2", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(26), 11, GFLAGS), + + GATE(HCLK_PCIE_SLV, "hclk_pcie_slv", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(30), 4, GFLAGS), + GATE(HCLK_PCIE_DBI, "hclk_pcie_dbi", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(30), 5, GFLAGS), + GATE(HCLK_SDIO0, "hclk_sdio0", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(32), 2, GFLAGS), + GATE(HCLK_SDIO1, "hclk_sdio1", "hclk_vpu_root", 0, + RK3528_CLKGATE_CON(32), 4, GFLAGS), + + COMPOSITE_NOMUX(CLK_GMAC1_VPU_25M, "clk_gmac1_25m", "ppll", 0, + RK3528_CLKSEL_CON(60), 2, 8, DFLAGS, + RK3528_CLKGATE_CON(25), 1, GFLAGS), + COMPOSITE_NOMUX(CLK_PPLL_125M_MATRIX, "clk_ppll_125m_src", "ppll", 0, + RK3528_CLKSEL_CON(60), 10, 5, DFLAGS, + RK3528_CLKGATE_CON(25), 2, GFLAGS), + + COMPOSITE(CLK_CAN3, "clk_can3", mux_gpll_cpll_p, 0, + RK3528_CLKSEL_CON(73), 13, 1, MFLAGS, 7, 6, DFLAGS, + RK3528_CLKGATE_CON(32), 10, GFLAGS), + COMPOSITE_NODIV(CLK_I2C6, "clk_i2c6", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(64), 0, 2, MFLAGS, + RK3528_CLKGATE_CON(28), 4, GFLAGS), + + COMPOSITE(SCLK_SFC, "sclk_sfc", mux_gpll_cpll_xin24m_p, 0, + RK3528_CLKSEL_CON(61), 12, 2, MFLAGS, 6, 6, DFLAGS, + RK3528_CLKGATE_CON(25), 14, GFLAGS), + COMPOSITE(CCLK_SRC_EMMC, "cclk_src_emmc", mux_gpll_cpll_xin24m_p, 0, + RK3528_CLKSEL_CON(62), 6, 2, MFLAGS, 0, 6, DFLAGS, + RK3528_CLKGATE_CON(25), 15, GFLAGS), + + COMPOSITE_NODIV(ACLK_VPU_ROOT, "aclk_vpu_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL, + RK3528_CLKSEL_CON(61), 0, 2, MFLAGS, + RK3528_CLKGATE_CON(25), 3, GFLAGS), + GATE(ACLK_VPU, "aclk_vpu", "aclk_vpu_root", 0, + RK3528_CLKGATE_CON(25), 9, GFLAGS | CLK_GATE_NO_SET_RATE), + + COMPOSITE_NODIV(CLK_SPI1, "clk_spi1", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(63), 10, 2, MFLAGS, + RK3528_CLKGATE_CON(27), 5, GFLAGS), + COMPOSITE(CCLK_SRC_SDIO1, "cclk_src_sdio1", mux_gpll_cpll_xin24m_p, 0, + RK3528_CLKSEL_CON(72), 14, 2, MFLAGS, 8, 6, DFLAGS, + RK3528_CLKGATE_CON(32), 3, GFLAGS), + COMPOSITE(CLK_CAN2, "clk_can2", mux_gpll_cpll_p, 0, + RK3528_CLKSEL_CON(73), 6, 1, MFLAGS, 0, 6, DFLAGS, + RK3528_CLKGATE_CON(32), 8, GFLAGS), + COMPOSITE_NOMUX(CLK_TSADC, "clk_tsadc", "xin24m", 0, + RK3528_CLKSEL_CON(74), 3, 5, DFLAGS, + RK3528_CLKGATE_CON(32), 15, GFLAGS), + COMPOSITE_NOMUX(CLK_SARADC, "clk_saradc", "xin24m", 0, + RK3528_CLKSEL_CON(74), 0, 3, DFLAGS, + RK3528_CLKGATE_CON(32), 12, GFLAGS), + COMPOSITE_NOMUX(CLK_TSADC_TSEN, "clk_tsadc_tsen", "xin24m", 0, + RK3528_CLKSEL_CON(74), 8, 5, DFLAGS, + RK3528_CLKGATE_CON(33), 0, GFLAGS), + COMPOSITE_NODIV(BCLK_EMMC, "bclk_emmc", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(62), 8, 2, MFLAGS, + RK3528_CLKGATE_CON(26), 2, GFLAGS), + COMPOSITE_NOMUX(MCLK_ACODEC_TX, "mclk_acodec_tx", "mclk_i2s2_2ch_sai_src", 0, + RK3528_CLKSEL_CON(63), 0, 8, DFLAGS, + RK3528_CLKGATE_CON(26), 14, GFLAGS), + COMPOSITE_NODIV(CLK_I2C3, "clk_i2c3", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(63), 12, 2, MFLAGS, + RK3528_CLKGATE_CON(28), 0, GFLAGS), + COMPOSITE_NODIV(CLK_I2C5, "clk_i2c5", mux_200m_100m_50m_24m_p, 0, + RK3528_CLKSEL_CON(63), 14, 2, MFLAGS, + RK3528_CLKGATE_CON(28), 2, GFLAGS), + COMPOSITE_NODIV(MCLK_SAI_I2S0, "mclk_sai_i2s0", mclk_sai_i2s0_p, CLK_SET_RATE_PARENT, + RK3528_CLKSEL_CON(62), 10, 1, MFLAGS, + RK3528_CLKGATE_CON(26), 10, GFLAGS), + GATE(MCLK_SAI_I2S2, "mclk_sai_i2s2", "mclk_i2s2_2ch_sai_src", 0, + RK3528_CLKGATE_CON(26), 12, GFLAGS), +#if 0 + GATE(SCLK_IN_SPI1, "sclk_in_spi1", "sclk_in_spi1_io", 0, + RK3528_CLKGATE_CON(27), 6, GFLAGS), + + /* vpuphy */ + GATE(CLK_PIPE_USB3OTG_COMBO, "clk_pipe_usb3otg_combo", "clk_pipe_usb3otg_io", 0, + RK3528_CLKGATE_CON(31), 0, GFLAGS), + GATE(CLK_UTMI_USB3OTG, "clk_utmi_usb3otg", "clk_utmi_usb3otg_io", 0, + RK3528_CLKGATE_CON(31), 1, GFLAGS), + GATE(CLK_PCIE_PIPE_PHY, "clk_pcie_pipe_phy", "clk_pipe_usb3otg_io", 0, + RK3528_CLKGATE_CON(31), 2, GFLAGS), +#endif + /* pcie */ + COMPOSITE_NOMUX(CLK_PPLL_100M_MATRIX, "clk_ppll_100m_src", "ppll", CLK_IS_CRITICAL, + RK3528_PCIE_CLKSEL_CON(1), 2, 5, DFLAGS, + RK3528_PCIE_CLKGATE_CON(0), 1, GFLAGS), + COMPOSITE_NOMUX(CLK_PPLL_50M_MATRIX, "clk_ppll_50m_src", "ppll", CLK_IS_CRITICAL, + RK3528_PCIE_CLKSEL_CON(1), 7, 5, DFLAGS, + RK3528_PCIE_CLKGATE_CON(0), 2, GFLAGS), + MUX(CLK_REF_PCIE_INNER_PHY, "clk_ref_pcie_inner_phy", clk_ref_pcie_inner_phy_p, 0, + RK3528_PCIE_CLKSEL_CON(1), 13, 1, MFLAGS), + FACTOR(CLK_REF_PCIE_100M_PHY, "clk_ref_pcie_100m_phy", "clk_ppll_100m_src", 0, 1, 1), + + /* gmac */ + FACTOR(CLK_GMAC1_RMII_VPU, "clk_gmac1_50m", "clk_ppll_50m_src", 0, 1, 1), + FACTOR(CLK_GMAC1_SRC_VPU, "clk_gmac1_125m", "clk_ppll_125m_src", 0, 1, 1), + + /* they are orphans */ + DIV(CLK_GMAC0_SRC, "clk_gmac0_src", "clk_gmac0_io_i", 0, + RK3528_CLKSEL_CON(84), 3, 6, DFLAGS), + GATE(CLK_GMAC0_TX, "clk_gmac0_tx", "clk_gmac0_src", 0, + RK3528_CLKGATE_CON(41), 13, GFLAGS), + GATE(CLK_GMAC0_RX, "clk_gmac0_rx", "clk_gmac0_src", 0, + RK3528_CLKGATE_CON(41), 14, GFLAGS), + GATE(CLK_GMAC0_RMII_50M, "clk_gmac0_rmii_50m", "clk_gmac0_io_i", 0, + RK3528_CLKGATE_CON(41), 12, GFLAGS), + GATE(CLK_SCRKEYGEN, "clk_scrkeygen", "clk_pmupvtm_out", 0, + RK3528_PMU_CLKGATE_CON(2), 0, GFLAGS), + GATE(CLK_PVTM_OSCCHK, "clk_pvtm_oscchk", "clk_pmupvtm_out", 0, + RK3528_PMU_CLKGATE_CON(2), 1, GFLAGS), +}; + +static struct rockchip_clk_branch rk3528_grf_clk_branches[] __initdata = { + MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "cclk_src_sdmmc0", RK3528_SDMMC_CON0, 1), + MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "cclk_src_sdmmc0", RK3528_SDMMC_CON1, 1), + MMC(SCLK_SDIO0_DRV, "sdio0_drv", "cclk_src_sdio0", RK3528_SDIO0_CON0, 1), + MMC(SCLK_SDIO0_SAMPLE, "sdio0_sample", "cclk_src_sdio0", RK3528_SDIO0_CON1, 1), + MMC(SCLK_SDIO1_DRV, "sdio1_drv", "cclk_src_sdio1", RK3528_SDIO1_CON0, 1), + MMC(SCLK_SDIO1_SAMPLE, "sdio1_sample", "cclk_src_sdio1", RK3528_SDIO1_CON1, 1), +}; + +static void __iomem *rk3528_cru_base; + +static void rk3528_dump_cru(void) +{ + if (rk3528_cru_base) { + pr_warn("CRU:\n"); + print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, + 32, 4, rk3528_cru_base, + 0x8b8, false); + pr_warn("PCIE CRU:\n"); + print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, + 32, 4, rk3528_cru_base + RK3528_PCIE_CRU_BASE, + 0x804, false); + pr_warn("DDRPHY CRU:\n"); + print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, + 32, 4, rk3528_cru_base + RK3528_DDRPHY_CRU_BASE, + 0x804, false); + } +} + +static void __init rk3528_clk_init(struct device_node *np) +{ + struct rockchip_clk_provider *ctx; + void __iomem *reg_base; + + reg_base = of_iomap(np, 0); + if (!reg_base) { + pr_err("%s: could not map cru region\n", __func__); + return; + } + + rk3528_cru_base = reg_base; + + ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS); + if (IS_ERR(ctx)) { + pr_err("%s: rockchip clk init failed\n", __func__); + iounmap(reg_base); + return; + } + + rockchip_clk_register_plls(ctx, rk3528_pll_clks, + ARRAY_SIZE(rk3528_pll_clks), + RK3528_GRF_SOC_STATUS0); + + rockchip_clk_register_armclk(ctx, ARMCLK, "armclk", + mux_apll_gpll_p, ARRAY_SIZE(mux_apll_gpll_p), + &rk3528_cpuclk_data, rk3528_cpuclk_rates, + ARRAY_SIZE(rk3528_cpuclk_rates)); + rockchip_clk_register_branches(ctx, rk3528_clk_branches, + ARRAY_SIZE(rk3528_clk_branches)); + + rockchip_register_softrst(np, 47, reg_base + RK3528_SOFTRST_CON(0), + ROCKCHIP_SOFTRST_HIWORD_MASK); + rockchip_register_restart_notifier(ctx, RK3528_GLB_SRST_FST, NULL); + + rockchip_clk_of_add_provider(np, ctx); + + if (!rk_dump_cru) + rk_dump_cru = rk3528_dump_cru; + +} + +CLK_OF_DECLARE(rk3528_cru, "rockchip,rk3528-cru", rk3528_clk_init); + +static void __init rk3528_grf_clk_init(struct device_node *np) +{ + struct rockchip_clk_provider *ctx; + void __iomem *reg_base; + + reg_base = of_iomap(of_get_parent(np), 0); + if (!reg_base) { + pr_err("%s: could not map cru grf region\n", __func__); + return; + } + + ctx = rockchip_clk_init(np, reg_base, CLK_NR_GRF_CLKS); + if (IS_ERR(ctx)) { + pr_err("%s: rockchip grf clk init failed\n", __func__); + return; + } + + rockchip_clk_register_branches(ctx, rk3528_grf_clk_branches, + ARRAY_SIZE(rk3528_grf_clk_branches)); + + rockchip_clk_of_add_provider(np, ctx); +} + +CLK_OF_DECLARE(rk3528_grf_cru, "rockchip,rk3528-grf-cru", rk3528_grf_clk_init); + diff --git a/kernel/drivers/clk/rockchip/clk-rk3568.c b/kernel/drivers/clk/rockchip/clk-rk3568.c index 73dda8e..bf83b6d 100644 --- a/kernel/drivers/clk/rockchip/clk-rk3568.c +++ b/kernel/drivers/clk/rockchip/clk-rk3568.c @@ -1421,21 +1421,21 @@ RK3568_CLKSEL_CON(72), 6, 1, MFLAGS, RK3568_CLKGATE_CON(31), 1, GFLAGS), GATE(PCLK_PWM1, "pclk_pwm1", "pclk_bus", 0, RK3568_CLKGATE_CON(31), 10, GFLAGS), COMPOSITE_NODIV(CLK_PWM1, "clk_pwm1", gpll100_xin24m_cpll100_p, 0, - RK3568_CLKSEL_CON(72), 8, 1, MFLAGS, + RK3568_CLKSEL_CON(72), 8, 2, MFLAGS, RK3568_CLKGATE_CON(31), 11, GFLAGS), GATE(CLK_PWM1_CAPTURE, "clk_pwm1_capture", "xin24m", 0, RK3568_CLKGATE_CON(31), 12, GFLAGS), GATE(PCLK_PWM2, "pclk_pwm2", "pclk_bus", 0, RK3568_CLKGATE_CON(31), 13, GFLAGS), COMPOSITE_NODIV(CLK_PWM2, "clk_pwm2", gpll100_xin24m_cpll100_p, 0, - RK3568_CLKSEL_CON(72), 10, 1, MFLAGS, + RK3568_CLKSEL_CON(72), 10, 2, MFLAGS, RK3568_CLKGATE_CON(31), 14, GFLAGS), GATE(CLK_PWM2_CAPTURE, "clk_pwm2_capture", "xin24m", 0, RK3568_CLKGATE_CON(31), 15, GFLAGS), GATE(PCLK_PWM3, "pclk_pwm3", "pclk_bus", 0, RK3568_CLKGATE_CON(32), 0, GFLAGS), COMPOSITE_NODIV(CLK_PWM3, "clk_pwm3", gpll100_xin24m_cpll100_p, 0, - RK3568_CLKSEL_CON(72), 12, 1, MFLAGS, + RK3568_CLKSEL_CON(72), 12, 2, MFLAGS, RK3568_CLKGATE_CON(32), 1, GFLAGS), GATE(CLK_PWM3_CAPTURE, "clk_pwm3_capture", "xin24m", 0, RK3568_CLKGATE_CON(32), 2, GFLAGS), diff --git a/kernel/drivers/clk/rockchip/clk.h b/kernel/drivers/clk/rockchip/clk.h index 2c19e31..e47fb59 100644 --- a/kernel/drivers/clk/rockchip/clk.h +++ b/kernel/drivers/clk/rockchip/clk.h @@ -255,6 +255,34 @@ #define RK3399_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x100) #define RK3399_PMU_SOFTRST_CON(x) ((x) * 0x4 + 0x110) +#define RK3528_PMU_CRU_BASE 0x10000 +#define RK3528_PCIE_CRU_BASE 0x20000 +#define RK3528_DDRPHY_CRU_BASE 0x28000 +#define RK3528_VPU_GRF_BASE 0x40000 +#define RK3528_VO_GRF_BASE 0x60000 +#define RK3528_SDMMC_CON0 (RK3528_VO_GRF_BASE + 0x24) +#define RK3528_SDMMC_CON1 (RK3528_VO_GRF_BASE + 0x28) +#define RK3528_SDIO0_CON0 (RK3528_VPU_GRF_BASE + 0x4) +#define RK3528_SDIO0_CON1 (RK3528_VPU_GRF_BASE + 0x8) +#define RK3528_SDIO1_CON0 (RK3528_VPU_GRF_BASE + 0xc) +#define RK3528_SDIO1_CON1 (RK3528_VPU_GRF_BASE + 0x10) +#define RK3528_PLL_CON(x) RK2928_PLL_CON(x) +#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_CLKGATE_CON(x) ((x) * 0x4 + 0x800) +#define RK3528_SOFTRST_CON(x) ((x) * 0x4 + 0xa00) +#define RK3528_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3528_PMU_CRU_BASE) +#define RK3528_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3528_PMU_CRU_BASE) +#define RK3528_PCIE_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3528_PCIE_CRU_BASE) +#define RK3528_PCIE_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3528_PCIE_CRU_BASE) +#define RK3528_DDRPHY_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3528_DDRPHY_CRU_BASE) +#define RK3528_DDRPHY_MODE_CON (0x280 + RK3528_DDRPHY_CRU_BASE) +#define RK3528_GLB_CNT_TH 0xc00 +#define RK3528_GLB_SRST_FST 0xc08 +#define RK3528_GLB_SRST_SND 0xc0c + #define RK3568_PLL_CON(x) RK2928_PLL_CON(x) #define RK3568_MODE_CON0 0xc0 #define RK3568_MISC_CON0 0xc4 diff --git a/kernel/drivers/clocksource/Kconfig b/kernel/drivers/clocksource/Kconfig index 0650438..1dbd40f 100644 --- a/kernel/drivers/clocksource/Kconfig +++ b/kernel/drivers/clocksource/Kconfig @@ -405,8 +405,11 @@ This options enables support for the ARMv7M system timer unit config ATMEL_PIT + bool "Microchip ARM Periodic Interval Timer (PIT)" if COMPILE_TEST select TIMER_OF if OF - def_bool SOC_AT91SAM9 || SOC_SAMA5 + help + This enables build of clocksource and clockevent driver for + the integrated PIT in Microchip ARM SoCs. config ATMEL_ST bool "Atmel ST timer support" if COMPILE_TEST @@ -416,6 +419,14 @@ help Support for the Atmel ST timer. +config ATMEL_ARM_TCB_CLKSRC + bool "Microchip ARM TC Block" if COMPILE_TEST + select REGMAP_MMIO + depends on GENERIC_CLOCKEVENTS + help + This enables build of clocksource and clockevent driver for + the integrated Timer Counter Blocks in Microchip ARM SoCs. + config CLKSRC_EXYNOS_MCT bool "Exynos multi core timer driver" if COMPILE_TEST depends on ARM || ARM64 diff --git a/kernel/drivers/clocksource/Makefile b/kernel/drivers/clocksource/Makefile index db51b24..0df9384 100644 --- a/kernel/drivers/clocksource/Makefile +++ b/kernel/drivers/clocksource/Makefile @@ -3,7 +3,8 @@ obj-$(CONFIG_TIMER_PROBE) += timer-probe.o obj-$(CONFIG_ATMEL_PIT) += timer-atmel-pit.o obj-$(CONFIG_ATMEL_ST) += timer-atmel-st.o -obj-$(CONFIG_ATMEL_TCB_CLKSRC) += tcb_clksrc.o +obj-$(CONFIG_ATMEL_TCB_CLKSRC) += tcb_clksrc.o +obj-$(CONFIG_ATMEL_ARM_TCB_CLKSRC) += timer-atmel-tcb.o obj-$(CONFIG_X86_PM_TIMER) += acpi_pm.o obj-$(CONFIG_SCx200HR_TIMER) += scx200_hrt.o obj-$(CONFIG_CS5535_CLOCK_EVENT_SRC) += cs5535-clockevt.o diff --git a/kernel/drivers/clocksource/tcb_clksrc.c b/kernel/drivers/clocksource/tcb_clksrc.c index 43f4d5c..ba15242 100644 --- a/kernel/drivers/clocksource/tcb_clksrc.c +++ b/kernel/drivers/clocksource/tcb_clksrc.c @@ -25,8 +25,7 @@ * this 32 bit free-running counter. the second channel is not used. * * - The third channel may be used to provide a 16-bit clockevent - * source, used in either periodic or oneshot mode. This runs - * at 32 KiHZ, and can handle delays of up to two seconds. + * source, used in either periodic or oneshot mode. * * A boot clocksource and clockevent source are also currently needed, * unless the relevant platforms (ARM/AT91, AVR32/AT32) are changed so @@ -126,6 +125,8 @@ struct tc_clkevt_device { struct clock_event_device clkevt; struct clk *clk; + bool clk_enabled; + u32 freq; void __iomem *regs; }; @@ -134,14 +135,25 @@ return container_of(clkevt, struct tc_clkevt_device, clkevt); } -/* For now, we always use the 32K clock ... this optimizes for NO_HZ, - * because using one of the divided clocks would usually mean the - * tick rate can never be less than several dozen Hz (vs 0.5 Hz). - * - * A divided clock could be good for high resolution timers, since - * 30.5 usec resolution can seem "low". - */ static u32 timer_clock; + +static void tc_clk_disable(struct clock_event_device *d) +{ + struct tc_clkevt_device *tcd = to_tc_clkevt(d); + + clk_disable(tcd->clk); + tcd->clk_enabled = false; +} + +static void tc_clk_enable(struct clock_event_device *d) +{ + struct tc_clkevt_device *tcd = to_tc_clkevt(d); + + if (tcd->clk_enabled) + return; + clk_enable(tcd->clk); + tcd->clk_enabled = true; +} static int tc_shutdown(struct clock_event_device *d) { @@ -150,8 +162,14 @@ writel(0xff, regs + ATMEL_TC_REG(2, IDR)); writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR)); + return 0; +} + +static int tc_shutdown_clk_off(struct clock_event_device *d) +{ + tc_shutdown(d); if (!clockevent_state_detached(d)) - clk_disable(tcd->clk); + tc_clk_disable(d); return 0; } @@ -164,9 +182,9 @@ if (clockevent_state_oneshot(d) || clockevent_state_periodic(d)) tc_shutdown(d); - clk_enable(tcd->clk); + tc_clk_enable(d); - /* slow clock, count up to RC, then irq and stop */ + /* count up to RC, then irq and stop */ writel(timer_clock | ATMEL_TC_CPCSTOP | ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO, regs + ATMEL_TC_REG(2, CMR)); writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER)); @@ -186,12 +204,12 @@ /* By not making the gentime core emulate periodic mode on top * of oneshot, we get lower overhead and improved accuracy. */ - clk_enable(tcd->clk); + tc_clk_enable(d); - /* slow clock, count up to RC, then irq and restart */ + /* count up to RC, then irq and restart */ writel(timer_clock | ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO, regs + ATMEL_TC_REG(2, CMR)); - writel((32768 + HZ / 2) / HZ, tcaddr + ATMEL_TC_REG(2, RC)); + writel((tcd->freq + HZ / 2) / HZ, tcaddr + ATMEL_TC_REG(2, RC)); /* Enable clock and interrupts on RC compare */ writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER)); @@ -218,9 +236,13 @@ .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, /* Should be lower than at91rm9200's system timer */ +#ifdef CONFIG_ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK .rating = 125, +#else + .rating = 200, +#endif .set_next_event = tc_next_event, - .set_state_shutdown = tc_shutdown, + .set_state_shutdown = tc_shutdown_clk_off, .set_state_periodic = tc_set_periodic, .set_state_oneshot = tc_set_oneshot, }, @@ -240,8 +262,9 @@ return IRQ_NONE; } -static int __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx) +static int __init setup_clkevents(struct atmel_tc *tc, int divisor_idx) { + unsigned divisor = atmel_tc_divisors[divisor_idx]; int ret; struct clk *t2_clk = tc->clk[2]; int irq = tc->irq[2]; @@ -262,7 +285,11 @@ clkevt.regs = tc->regs; clkevt.clk = t2_clk; - timer_clock = clk32k_divisor_idx; + timer_clock = divisor_idx; + if (!divisor) + clkevt.freq = 32768; + else + clkevt.freq = clk_get_rate(t2_clk) / divisor; clkevt.clkevt.cpumask = cpumask_of(0); @@ -273,7 +300,7 @@ return ret; } - clockevents_config_and_register(&clkevt.clkevt, 32768, 1, 0xffff); + clockevents_config_and_register(&clkevt.clkevt, clkevt.freq, 1, 0xffff); return ret; } @@ -410,7 +437,11 @@ goto err_disable_t1; /* channel 2: periodic and oneshot timer support */ +#ifdef CONFIG_ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK ret = setup_clkevents(tc, clk32k_divisor_idx); +#else + ret = setup_clkevents(tc, best_divisor_idx); +#endif if (ret) goto err_unregister_clksrc; diff --git a/kernel/drivers/clocksource/timer-atmel-tcb.c b/kernel/drivers/clocksource/timer-atmel-tcb.c new file mode 100644 index 0000000..63ce3b6 --- /dev/null +++ b/kernel/drivers/clocksource/timer-atmel-tcb.c @@ -0,0 +1,617 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/clk.h> +#include <linux/clockchips.h> +#include <linux/clocksource.h> +#include <linux/interrupt.h> +#include <linux/kernel.h> +#include <linux/mfd/syscon.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/regmap.h> +#include <linux/sched_clock.h> +#include <soc/at91/atmel_tcb.h> + +struct atmel_tcb_clksrc { + struct clocksource clksrc; + struct clock_event_device clkevt; + struct regmap *regmap; + void __iomem *base; + struct clk *clk[2]; + char name[20]; + int channels[2]; + int bits; + int irq; + struct { + u32 cmr; + u32 imr; + u32 rc; + bool clken; + } cache[2]; + u32 bmr_cache; + bool registered; + bool clk_enabled; +}; + +static struct atmel_tcb_clksrc tc, tce; + +static struct clk *tcb_clk_get(struct device_node *node, int channel) +{ + struct clk *clk; + char clk_name[] = "t0_clk"; + + clk_name[1] += channel; + clk = of_clk_get_by_name(node->parent, clk_name); + if (!IS_ERR(clk)) + return clk; + + return of_clk_get_by_name(node->parent, "t0_clk"); +} + +/* + * Clockevent device using its own channel + */ + +static void tc_clkevt2_clk_disable(struct clock_event_device *d) +{ + clk_disable(tce.clk[0]); + tce.clk_enabled = false; +} + +static void tc_clkevt2_clk_enable(struct clock_event_device *d) +{ + if (tce.clk_enabled) + return; + clk_enable(tce.clk[0]); + tce.clk_enabled = true; +} + +static int tc_clkevt2_stop(struct clock_event_device *d) +{ + writel(0xff, tce.base + ATMEL_TC_IDR(tce.channels[0])); + writel(ATMEL_TC_CCR_CLKDIS, tce.base + ATMEL_TC_CCR(tce.channels[0])); + + return 0; +} + +static int tc_clkevt2_shutdown(struct clock_event_device *d) +{ + tc_clkevt2_stop(d); + if (!clockevent_state_detached(d)) + tc_clkevt2_clk_disable(d); + + return 0; +} + +/* For now, we always use the 32K clock ... this optimizes for NO_HZ, + * because using one of the divided clocks would usually mean the + * tick rate can never be less than several dozen Hz (vs 0.5 Hz). + * + * A divided clock could be good for high resolution timers, since + * 30.5 usec resolution can seem "low". + */ +static int tc_clkevt2_set_oneshot(struct clock_event_device *d) +{ + if (clockevent_state_oneshot(d) || clockevent_state_periodic(d)) + tc_clkevt2_stop(d); + + tc_clkevt2_clk_enable(d); + + /* slow clock, count up to RC, then irq and stop */ + writel(ATMEL_TC_CMR_TCLK(4) | ATMEL_TC_CMR_CPCSTOP | + ATMEL_TC_CMR_WAVE | ATMEL_TC_CMR_WAVESEL_UPRC, + tce.base + ATMEL_TC_CMR(tce.channels[0])); + writel(ATMEL_TC_CPCS, tce.base + ATMEL_TC_IER(tce.channels[0])); + + return 0; +} + +static int tc_clkevt2_set_periodic(struct clock_event_device *d) +{ + if (clockevent_state_oneshot(d) || clockevent_state_periodic(d)) + tc_clkevt2_stop(d); + + /* By not making the gentime core emulate periodic mode on top + * of oneshot, we get lower overhead and improved accuracy. + */ + tc_clkevt2_clk_enable(d); + + /* slow clock, count up to RC, then irq and restart */ + writel(ATMEL_TC_CMR_TCLK(4) | ATMEL_TC_CMR_WAVE | + ATMEL_TC_CMR_WAVESEL_UPRC, + tce.base + ATMEL_TC_CMR(tce.channels[0])); + writel((32768 + HZ / 2) / HZ, tce.base + ATMEL_TC_RC(tce.channels[0])); + + /* Enable clock and interrupts on RC compare */ + writel(ATMEL_TC_CPCS, tce.base + ATMEL_TC_IER(tce.channels[0])); + writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG, + tce.base + ATMEL_TC_CCR(tce.channels[0])); + + return 0; +} + +static int tc_clkevt2_next_event(unsigned long delta, + struct clock_event_device *d) +{ + writel(delta, tce.base + ATMEL_TC_RC(tce.channels[0])); + writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG, + tce.base + ATMEL_TC_CCR(tce.channels[0])); + + return 0; +} + +static irqreturn_t tc_clkevt2_irq(int irq, void *handle) +{ + unsigned int sr; + + sr = readl(tce.base + ATMEL_TC_SR(tce.channels[0])); + if (sr & ATMEL_TC_CPCS) { + tce.clkevt.event_handler(&tce.clkevt); + return IRQ_HANDLED; + } + + return IRQ_NONE; +} + +static void tc_clkevt2_suspend(struct clock_event_device *d) +{ + tce.cache[0].cmr = readl(tce.base + ATMEL_TC_CMR(tce.channels[0])); + tce.cache[0].imr = readl(tce.base + ATMEL_TC_IMR(tce.channels[0])); + tce.cache[0].rc = readl(tce.base + ATMEL_TC_RC(tce.channels[0])); + tce.cache[0].clken = !!(readl(tce.base + ATMEL_TC_SR(tce.channels[0])) & + ATMEL_TC_CLKSTA); +} + +static void tc_clkevt2_resume(struct clock_event_device *d) +{ + /* Restore registers for the channel, RA and RB are not used */ + writel(tce.cache[0].cmr, tc.base + ATMEL_TC_CMR(tce.channels[0])); + writel(tce.cache[0].rc, tc.base + ATMEL_TC_RC(tce.channels[0])); + writel(0, tc.base + ATMEL_TC_RA(tce.channels[0])); + writel(0, tc.base + ATMEL_TC_RB(tce.channels[0])); + /* Disable all the interrupts */ + writel(0xff, tc.base + ATMEL_TC_IDR(tce.channels[0])); + /* Reenable interrupts that were enabled before suspending */ + writel(tce.cache[0].imr, tc.base + ATMEL_TC_IER(tce.channels[0])); + + /* Start the clock if it was used */ + if (tce.cache[0].clken) + writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG, + tc.base + ATMEL_TC_CCR(tce.channels[0])); +} + +static int __init tc_clkevt_register(struct device_node *node, + struct regmap *regmap, void __iomem *base, + int channel, int irq, int bits) +{ + int ret; + struct clk *slow_clk; + + tce.regmap = regmap; + tce.base = base; + tce.channels[0] = channel; + tce.irq = irq; + + slow_clk = of_clk_get_by_name(node->parent, "slow_clk"); + if (IS_ERR(slow_clk)) + return PTR_ERR(slow_clk); + + ret = clk_prepare_enable(slow_clk); + if (ret) + return ret; + + tce.clk[0] = tcb_clk_get(node, tce.channels[0]); + if (IS_ERR(tce.clk[0])) { + ret = PTR_ERR(tce.clk[0]); + goto err_slow; + } + + snprintf(tce.name, sizeof(tce.name), "%s:%d", + kbasename(node->parent->full_name), channel); + tce.clkevt.cpumask = cpumask_of(0); + tce.clkevt.name = tce.name; + tce.clkevt.set_next_event = tc_clkevt2_next_event, + tce.clkevt.set_state_shutdown = tc_clkevt2_shutdown, + tce.clkevt.set_state_periodic = tc_clkevt2_set_periodic, + tce.clkevt.set_state_oneshot = tc_clkevt2_set_oneshot, + tce.clkevt.suspend = tc_clkevt2_suspend, + tce.clkevt.resume = tc_clkevt2_resume, + tce.clkevt.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; + tce.clkevt.rating = 140; + + /* try to enable clk to avoid future errors in mode change */ + ret = clk_prepare_enable(tce.clk[0]); + if (ret) + goto err_slow; + clk_disable(tce.clk[0]); + + clockevents_config_and_register(&tce.clkevt, 32768, 1, + CLOCKSOURCE_MASK(bits)); + + ret = request_irq(tce.irq, tc_clkevt2_irq, IRQF_TIMER | IRQF_SHARED, + tce.clkevt.name, &tce); + if (ret) + goto err_clk; + + tce.registered = true; + + return 0; + +err_clk: + clk_unprepare(tce.clk[0]); +err_slow: + clk_disable_unprepare(slow_clk); + + return ret; +} + +/* + * Clocksource and clockevent using the same channel(s) + */ +static u64 tc_get_cycles(struct clocksource *cs) +{ + u32 lower, upper; + + do { + upper = readl_relaxed(tc.base + ATMEL_TC_CV(tc.channels[1])); + lower = readl_relaxed(tc.base + ATMEL_TC_CV(tc.channels[0])); + } while (upper != readl_relaxed(tc.base + ATMEL_TC_CV(tc.channels[1]))); + + return (upper << 16) | lower; +} + +static u64 tc_get_cycles32(struct clocksource *cs) +{ + return readl_relaxed(tc.base + ATMEL_TC_CV(tc.channels[0])); +} + +static u64 notrace tc_sched_clock_read(void) +{ + return tc_get_cycles(&tc.clksrc); +} + +static u64 notrace tc_sched_clock_read32(void) +{ + return tc_get_cycles32(&tc.clksrc); +} + +static int tcb_clkevt_next_event(unsigned long delta, + struct clock_event_device *d) +{ + u32 old, next, cur; + + old = readl(tc.base + ATMEL_TC_CV(tc.channels[0])); + next = old + delta; + writel(next, tc.base + ATMEL_TC_RC(tc.channels[0])); + cur = readl(tc.base + ATMEL_TC_CV(tc.channels[0])); + + /* check whether the delta elapsed while setting the register */ + if ((next < old && cur < old && cur > next) || + (next > old && (cur < old || cur > next))) { + /* + * Clear the CPCS bit in the status register to avoid + * generating a spurious interrupt next time a valid + * timer event is configured. + */ + old = readl(tc.base + ATMEL_TC_SR(tc.channels[0])); + return -ETIME; + } + + writel(ATMEL_TC_CPCS, tc.base + ATMEL_TC_IER(tc.channels[0])); + + return 0; +} + +static irqreturn_t tc_clkevt_irq(int irq, void *handle) +{ + unsigned int sr; + + sr = readl(tc.base + ATMEL_TC_SR(tc.channels[0])); + if (sr & ATMEL_TC_CPCS) { + tc.clkevt.event_handler(&tc.clkevt); + return IRQ_HANDLED; + } + + return IRQ_NONE; +} + +static int tcb_clkevt_oneshot(struct clock_event_device *dev) +{ + if (clockevent_state_oneshot(dev)) + return 0; + + /* + * Because both clockevent devices may share the same IRQ, we don't want + * the less likely one to stay requested + */ + return request_irq(tc.irq, tc_clkevt_irq, IRQF_TIMER | IRQF_SHARED, + tc.name, &tc); +} + +static int tcb_clkevt_shutdown(struct clock_event_device *dev) +{ + writel(0xff, tc.base + ATMEL_TC_IDR(tc.channels[0])); + if (tc.bits == 16) + writel(0xff, tc.base + ATMEL_TC_IDR(tc.channels[1])); + + if (!clockevent_state_detached(dev)) + free_irq(tc.irq, &tc); + + return 0; +} + +static void __init tcb_setup_dual_chan(struct atmel_tcb_clksrc *tc, + int mck_divisor_idx) +{ + /* first channel: waveform mode, input mclk/8, clock TIOA on overflow */ + writel(mck_divisor_idx /* likely divide-by-8 */ + | ATMEL_TC_CMR_WAVE + | ATMEL_TC_CMR_WAVESEL_UP /* free-run */ + | ATMEL_TC_CMR_ACPA(SET) /* TIOA rises at 0 */ + | ATMEL_TC_CMR_ACPC(CLEAR), /* (duty cycle 50%) */ + tc->base + ATMEL_TC_CMR(tc->channels[0])); + writel(0x0000, tc->base + ATMEL_TC_RA(tc->channels[0])); + writel(0x8000, tc->base + ATMEL_TC_RC(tc->channels[0])); + writel(0xff, tc->base + ATMEL_TC_IDR(tc->channels[0])); /* no irqs */ + writel(ATMEL_TC_CCR_CLKEN, tc->base + ATMEL_TC_CCR(tc->channels[0])); + + /* second channel: waveform mode, input TIOA */ + writel(ATMEL_TC_CMR_XC(tc->channels[1]) /* input: TIOA */ + | ATMEL_TC_CMR_WAVE + | ATMEL_TC_CMR_WAVESEL_UP, /* free-run */ + tc->base + ATMEL_TC_CMR(tc->channels[1])); + writel(0xff, tc->base + ATMEL_TC_IDR(tc->channels[1])); /* no irqs */ + writel(ATMEL_TC_CCR_CLKEN, tc->base + ATMEL_TC_CCR(tc->channels[1])); + + /* chain both channel, we assume the previous channel */ + regmap_write(tc->regmap, ATMEL_TC_BMR, + ATMEL_TC_BMR_TCXC(1 + tc->channels[1], tc->channels[1])); + /* then reset all the timers */ + regmap_write(tc->regmap, ATMEL_TC_BCR, ATMEL_TC_BCR_SYNC); +} + +static void __init tcb_setup_single_chan(struct atmel_tcb_clksrc *tc, + int mck_divisor_idx) +{ + /* channel 0: waveform mode, input mclk/8 */ + writel(mck_divisor_idx /* likely divide-by-8 */ + | ATMEL_TC_CMR_WAVE + | ATMEL_TC_CMR_WAVESEL_UP, /* free-run */ + tc->base + ATMEL_TC_CMR(tc->channels[0])); + writel(0xff, tc->base + ATMEL_TC_IDR(tc->channels[0])); /* no irqs */ + writel(ATMEL_TC_CCR_CLKEN, tc->base + ATMEL_TC_CCR(tc->channels[0])); + + /* then reset all the timers */ + regmap_write(tc->regmap, ATMEL_TC_BCR, ATMEL_TC_BCR_SYNC); +} + +static void tc_clksrc_suspend(struct clocksource *cs) +{ + int i; + + for (i = 0; i < 1 + (tc.bits == 16); i++) { + tc.cache[i].cmr = readl(tc.base + ATMEL_TC_CMR(tc.channels[i])); + tc.cache[i].imr = readl(tc.base + ATMEL_TC_IMR(tc.channels[i])); + tc.cache[i].rc = readl(tc.base + ATMEL_TC_RC(tc.channels[i])); + tc.cache[i].clken = !!(readl(tc.base + + ATMEL_TC_SR(tc.channels[i])) & + ATMEL_TC_CLKSTA); + } + + if (tc.bits == 16) + regmap_read(tc.regmap, ATMEL_TC_BMR, &tc.bmr_cache); +} + +static void tc_clksrc_resume(struct clocksource *cs) +{ + int i; + + for (i = 0; i < 1 + (tc.bits == 16); i++) { + /* Restore registers for the channel, RA and RB are not used */ + writel(tc.cache[i].cmr, tc.base + ATMEL_TC_CMR(tc.channels[i])); + writel(tc.cache[i].rc, tc.base + ATMEL_TC_RC(tc.channels[i])); + writel(0, tc.base + ATMEL_TC_RA(tc.channels[i])); + writel(0, tc.base + ATMEL_TC_RB(tc.channels[i])); + /* Disable all the interrupts */ + writel(0xff, tc.base + ATMEL_TC_IDR(tc.channels[i])); + /* Reenable interrupts that were enabled before suspending */ + writel(tc.cache[i].imr, tc.base + ATMEL_TC_IER(tc.channels[i])); + + /* Start the clock if it was used */ + if (tc.cache[i].clken) + writel(ATMEL_TC_CCR_CLKEN, tc.base + + ATMEL_TC_CCR(tc.channels[i])); + } + + /* in case of dual channel, chain channels */ + if (tc.bits == 16) + regmap_write(tc.regmap, ATMEL_TC_BMR, tc.bmr_cache); + /* Finally, trigger all the channels*/ + regmap_write(tc.regmap, ATMEL_TC_BCR, ATMEL_TC_BCR_SYNC); +} + +static int __init tcb_clksrc_register(struct device_node *node, + struct regmap *regmap, void __iomem *base, + int channel, int channel1, int irq, + int bits) +{ + u32 rate, divided_rate = 0; + int best_divisor_idx = -1; + int i, err = -1; + u64 (*tc_sched_clock)(void); + + tc.regmap = regmap; + tc.base = base; + tc.channels[0] = channel; + tc.channels[1] = channel1; + tc.irq = irq; + tc.bits = bits; + + tc.clk[0] = tcb_clk_get(node, tc.channels[0]); + if (IS_ERR(tc.clk[0])) + return PTR_ERR(tc.clk[0]); + err = clk_prepare_enable(tc.clk[0]); + if (err) { + pr_debug("can't enable T0 clk\n"); + goto err_clk; + } + + /* How fast will we be counting? Pick something over 5 MHz. */ + rate = (u32)clk_get_rate(tc.clk[0]); + for (i = 0; i < 5; i++) { + unsigned int divisor = atmel_tc_divisors[i]; + unsigned int tmp; + + if (!divisor) + continue; + + tmp = rate / divisor; + pr_debug("TC: %u / %-3u [%d] --> %u\n", rate, divisor, i, tmp); + if (best_divisor_idx > 0) { + if (tmp < 5 * 1000 * 1000) + continue; + } + divided_rate = tmp; + best_divisor_idx = i; + } + + if (tc.bits == 32) { + tc.clksrc.read = tc_get_cycles32; + tcb_setup_single_chan(&tc, best_divisor_idx); + tc_sched_clock = tc_sched_clock_read32; + snprintf(tc.name, sizeof(tc.name), "%s:%d", + kbasename(node->parent->full_name), tc.channels[0]); + } else { + tc.clk[1] = tcb_clk_get(node, tc.channels[1]); + if (IS_ERR(tc.clk[1])) + goto err_disable_t0; + + err = clk_prepare_enable(tc.clk[1]); + if (err) { + pr_debug("can't enable T1 clk\n"); + goto err_clk1; + } + tc.clksrc.read = tc_get_cycles, + tcb_setup_dual_chan(&tc, best_divisor_idx); + tc_sched_clock = tc_sched_clock_read; + snprintf(tc.name, sizeof(tc.name), "%s:%d,%d", + kbasename(node->parent->full_name), tc.channels[0], + tc.channels[1]); + } + + pr_debug("%s at %d.%03d MHz\n", tc.name, + divided_rate / 1000000, + ((divided_rate + 500000) % 1000000) / 1000); + + tc.clksrc.name = tc.name; + tc.clksrc.suspend = tc_clksrc_suspend; + tc.clksrc.resume = tc_clksrc_resume; + tc.clksrc.rating = 200; + tc.clksrc.mask = CLOCKSOURCE_MASK(32); + tc.clksrc.flags = CLOCK_SOURCE_IS_CONTINUOUS; + + err = clocksource_register_hz(&tc.clksrc, divided_rate); + if (err) + goto err_disable_t1; + + sched_clock_register(tc_sched_clock, 32, divided_rate); + + tc.registered = true; + + /* Set up and register clockevents */ + tc.clkevt.name = tc.name; + tc.clkevt.cpumask = cpumask_of(0); + tc.clkevt.set_next_event = tcb_clkevt_next_event; + tc.clkevt.set_state_oneshot = tcb_clkevt_oneshot; + tc.clkevt.set_state_shutdown = tcb_clkevt_shutdown; + tc.clkevt.features = CLOCK_EVT_FEAT_ONESHOT; + tc.clkevt.rating = 125; + + clockevents_config_and_register(&tc.clkevt, divided_rate, 1, + BIT(tc.bits) - 1); + + return 0; + +err_disable_t1: + if (tc.bits == 16) + clk_disable_unprepare(tc.clk[1]); + +err_clk1: + if (tc.bits == 16) + clk_put(tc.clk[1]); + +err_disable_t0: + clk_disable_unprepare(tc.clk[0]); + +err_clk: + clk_put(tc.clk[0]); + + pr_err("%s: unable to register clocksource/clockevent\n", + tc.clksrc.name); + + return err; +} + +static int __init tcb_clksrc_init(struct device_node *node) +{ + const struct of_device_id *match; + struct regmap *regmap; + void __iomem *tcb_base; + u32 channel; + int irq, err, chan1 = -1; + unsigned bits; + + if (tc.registered && tce.registered) + return -ENODEV; + + /* + * The regmap has to be used to access registers that are shared + * between channels on the same TCB but we keep direct IO access for + * the counters to avoid the impact on performance + */ + regmap = syscon_node_to_regmap(node->parent); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + tcb_base = of_iomap(node->parent, 0); + if (!tcb_base) { + pr_err("%s +%d %s\n", __FILE__, __LINE__, __func__); + return -ENXIO; + } + + match = of_match_node(atmel_tcb_dt_ids, node->parent); + bits = (uintptr_t)match->data; + + err = of_property_read_u32_index(node, "reg", 0, &channel); + if (err) + return err; + + irq = of_irq_get(node->parent, channel); + if (irq < 0) { + irq = of_irq_get(node->parent, 0); + if (irq < 0) + return irq; + } + + if (tc.registered) + return tc_clkevt_register(node, regmap, tcb_base, channel, irq, + bits); + + if (bits == 16) { + of_property_read_u32_index(node, "reg", 1, &chan1); + if (chan1 == -1) { + if (tce.registered) { + pr_err("%s: clocksource needs two channels\n", + node->parent->full_name); + return -EINVAL; + } else { + return tc_clkevt_register(node, regmap, + tcb_base, channel, + irq, bits); + } + } + } + + return tcb_clksrc_register(node, regmap, tcb_base, channel, chan1, irq, + bits); +} +TIMER_OF_DECLARE(atmel_tcb_clksrc, "atmel,tcb-timer", tcb_clksrc_init); diff --git a/kernel/drivers/connector/cn_proc.c b/kernel/drivers/connector/cn_proc.c index ad48fd5..c5264b3 100644 --- a/kernel/drivers/connector/cn_proc.c +++ b/kernel/drivers/connector/cn_proc.c @@ -32,6 +32,7 @@ #include <linux/pid_namespace.h> #include <linux/cn_proc.h> +#include <linux/locallock.h> /* * Size of a cn_msg followed by a proc_event structure. Since the @@ -54,10 +55,11 @@ /* proc_event_counts is used as the sequence number of the netlink message */ static DEFINE_PER_CPU(__u32, proc_event_counts) = { 0 }; +static DEFINE_LOCAL_IRQ_LOCK(send_msg_lock); static inline void send_msg(struct cn_msg *msg) { - preempt_disable(); + local_lock(send_msg_lock); msg->seq = __this_cpu_inc_return(proc_event_counts) - 1; ((struct proc_event *)msg->data)->cpu = smp_processor_id(); @@ -70,7 +72,7 @@ */ cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_NOWAIT); - preempt_enable(); + local_unlock(send_msg_lock); } void proc_fork_connector(struct task_struct *task) diff --git a/kernel/drivers/cpufreq/Kconfig.x86 b/kernel/drivers/cpufreq/Kconfig.x86 index 35f7182..bb4a616 100644 --- a/kernel/drivers/cpufreq/Kconfig.x86 +++ b/kernel/drivers/cpufreq/Kconfig.x86 @@ -125,7 +125,7 @@ config X86_POWERNOW_K8 tristate "AMD Opteron/Athlon64 PowerNow!" - depends on ACPI && ACPI_PROCESSOR && X86_ACPI_CPUFREQ + depends on ACPI && ACPI_PROCESSOR && X86_ACPI_CPUFREQ && !PREEMPT_RT_BASE help This adds the CPUFreq driver for K8/early Opteron/Athlon64 processors. Support for K10 and newer processors is now in acpi-cpufreq. diff --git a/kernel/drivers/cpufreq/cpufreq_interactive.c b/kernel/drivers/cpufreq/cpufreq_interactive.c index 06f7679..d9c8c7d 100644 --- a/kernel/drivers/cpufreq/cpufreq_interactive.c +++ b/kernel/drivers/cpufreq/cpufreq_interactive.c @@ -37,6 +37,7 @@ #include <linux/slab.h> #include <uapi/linux/sched/types.h> #include <linux/sched/clock.h> +#include <soc/rockchip/rockchip_system_monitor.h> #define CREATE_TRACE_POINTS #include <trace/events/cpufreq_interactive.h> @@ -100,6 +101,7 @@ int touchboostpulse_duration_val; /* End time of touchboost pulse in ktime converted to usecs */ u64 touchboostpulse_endtime; + bool touchboost, is_touchboosted; #endif bool boosted; @@ -520,7 +522,8 @@ sampling_rate = icpu->ipolicy->tunables->sampling_rate; icpu->last_sample_time = local_clock(); icpu->next_sample_jiffies = usecs_to_jiffies(sampling_rate) + jiffies; - cpufreq_interactive_update(icpu); + icpu->work_in_progress = true; + irq_work_queue_on(&icpu->irq_work, icpu->cpu); } } @@ -606,7 +609,44 @@ for_each_cpu(cpu, &tmp_mask) { struct interactive_cpu *icpu = &per_cpu(interactive_cpu, cpu); struct cpufreq_policy *policy; +#ifdef CONFIG_ARCH_ROCKCHIP + struct interactive_tunables *tunables; + bool update_policy = false; + u64 now; + now = ktime_to_us(ktime_get()); + if (!down_read_trylock(&icpu->enable_sem)) + continue; + + if (!icpu->ipolicy) { + up_read(&icpu->enable_sem); + continue; + } + + tunables = icpu->ipolicy->tunables; + if (!tunables) { + up_read(&icpu->enable_sem); + continue; + } + + if (tunables->touchboost && + now > tunables->touchboostpulse_endtime) { + tunables->touchboost = false; + rockchip_monitor_clear_boosted(); + update_policy = true; + } + + if (!tunables->is_touchboosted && tunables->touchboost) { + rockchip_monitor_set_boosted(); + update_policy = true; + } + + tunables->is_touchboosted = tunables->touchboost; + + up_read(&icpu->enable_sem); + if (update_policy) + cpufreq_update_policy(cpu); +#endif policy = cpufreq_cpu_get(cpu); if (!policy) continue; @@ -1012,6 +1052,44 @@ return count; } +static ssize_t store_touchboost_freq(struct gov_attr_set *attr_set, + const char *buf, size_t count) +{ + struct interactive_tunables *tunables = to_tunables(attr_set); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret < 0) + return ret; + + tunables->touchboost_freq = val; + + return count; +} + +static ssize_t show_touchboost_duration(struct gov_attr_set *attr_set, char *buf) +{ + struct interactive_tunables *tunables = to_tunables(attr_set); + + return sprintf(buf, "%d\n", tunables->touchboostpulse_duration_val); +} + +static ssize_t store_touchboost_duration(struct gov_attr_set *attr_set, + const char *buf, size_t count) +{ + struct interactive_tunables *tunables = to_tunables(attr_set); + int val, ret; + + ret = kstrtoint(buf, 0, &val); + if (ret < 0) + return ret; + + tunables->touchboostpulse_duration_val = val; + + return count; +} + show_one(hispeed_freq, "%u"); show_one(go_hispeed_load, "%lu"); show_one(min_sample_time, "%lu"); @@ -1019,6 +1097,7 @@ show_one(boost, "%u"); show_one(boostpulse_duration, "%u"); show_one(io_is_busy, "%u"); +show_one(touchboost_freq, "%lu"); gov_attr_rw(target_loads); gov_attr_rw(above_hispeed_delay); @@ -1031,6 +1110,8 @@ gov_attr_wo(boostpulse); gov_attr_rw(boostpulse_duration); gov_attr_rw(io_is_busy); +gov_attr_rw(touchboost_freq); +gov_attr_rw(touchboost_duration); static struct attribute *interactive_attributes[] = { &target_loads.attr, @@ -1044,6 +1125,8 @@ &boostpulse.attr, &boostpulse_duration.attr, &io_is_busy.attr, + &touchboost_freq.attr, + &touchboost_duration.attr, NULL }; @@ -1245,6 +1328,7 @@ cpumask_set_cpu(i, &speedchange_cpumask); pcpu->loc_hispeed_val_time = ktime_to_us(ktime_get()); + tunables->touchboost = true; anyboost = 1; } @@ -1555,6 +1639,10 @@ idle_notifier_unregister(&cpufreq_interactive_idle_nb); #ifdef CONFIG_ARCH_ROCKCHIP input_unregister_handler(&cpufreq_interactive_input_handler); + if (tunables->touchboost) { + tunables->touchboost = false; + rockchip_monitor_clear_boosted(); + } #endif } diff --git a/kernel/drivers/crypto/caam/qi.c b/kernel/drivers/crypto/caam/qi.c index 67f7f8c..b84e6c8 100644 --- a/kernel/drivers/crypto/caam/qi.c +++ b/kernel/drivers/crypto/caam/qi.c @@ -84,13 +84,6 @@ #endif /* - * CPU from where the module initialised. This is required because QMan driver - * requires CGRs to be removed from same CPU from where they were originally - * allocated. - */ -static int mod_init_cpu; - -/* * This is a a cache of buffers, from which the users of CAAM QI driver * can allocate short (CAAM_QI_MEMCACHE_SIZE) buffers. It's faster than * doing malloc on the hotpath. @@ -492,12 +485,11 @@ } EXPORT_SYMBOL(caam_drv_ctx_rel); -int caam_qi_shutdown(struct device *qidev) +void caam_qi_shutdown(struct device *qidev) { - int i, ret; + int i; struct caam_qi_priv *priv = dev_get_drvdata(qidev); const cpumask_t *cpus = qman_affine_cpus(); - struct cpumask old_cpumask = current->cpus_allowed; for_each_cpu(i, cpus) { struct napi_struct *irqtask; @@ -510,26 +502,12 @@ dev_err(qidev, "Rsp FQ kill failed, cpu: %d\n", i); } - /* - * QMan driver requires CGRs to be deleted from same CPU from where they - * were instantiated. Hence we get the module removal execute from the - * same CPU from where it was originally inserted. - */ - set_cpus_allowed_ptr(current, get_cpu_mask(mod_init_cpu)); - - ret = qman_delete_cgr(&priv->cgr); - if (ret) - dev_err(qidev, "Deletion of CGR failed: %d\n", ret); - else - qman_release_cgrid(priv->cgr.cgrid); + qman_delete_cgr_safe(&priv->cgr); + qman_release_cgrid(priv->cgr.cgrid); kmem_cache_destroy(qi_cache); - /* Now that we're done with the CGRs, restore the cpus allowed mask */ - set_cpus_allowed_ptr(current, &old_cpumask); - platform_device_unregister(priv->qi_pdev); - return ret; } static void cgr_cb(struct qman_portal *qm, struct qman_cgr *cgr, int congested) @@ -718,21 +696,10 @@ struct device *ctrldev = &caam_pdev->dev, *qidev; struct caam_drv_private *ctrlpriv; const cpumask_t *cpus = qman_affine_cpus(); - struct cpumask old_cpumask = current->cpus_allowed; static struct platform_device_info qi_pdev_info = { .name = "caam_qi", .id = PLATFORM_DEVID_NONE }; - - /* - * QMAN requires CGRs to be removed from same CPU+portal from where it - * was originally allocated. Hence we need to note down the - * initialisation CPU and use the same CPU for module exit. - * We select the first CPU to from the list of portal owning CPUs. - * Then we pin module init to this CPU. - */ - mod_init_cpu = cpumask_first(cpus); - set_cpus_allowed_ptr(current, get_cpu_mask(mod_init_cpu)); qi_pdev_info.parent = ctrldev; qi_pdev_info.dma_mask = dma_get_mask(ctrldev); @@ -795,8 +762,6 @@ return -ENOMEM; } - /* Done with the CGRs; restore the cpus allowed mask */ - set_cpus_allowed_ptr(current, &old_cpumask); #ifdef CONFIG_DEBUG_FS debugfs_create_file("qi_congested", 0444, ctrlpriv->ctl, ×_congested, &caam_fops_u64_ro); diff --git a/kernel/drivers/crypto/caam/qi.h b/kernel/drivers/crypto/caam/qi.h index 357b69f..b6c8acc 100644 --- a/kernel/drivers/crypto/caam/qi.h +++ b/kernel/drivers/crypto/caam/qi.h @@ -174,7 +174,7 @@ void caam_drv_ctx_rel(struct caam_drv_ctx *drv_ctx); int caam_qi_init(struct platform_device *pdev); -int caam_qi_shutdown(struct device *dev); +void caam_qi_shutdown(struct device *dev); /** * qi_cache_alloc - Allocate buffers from CAAM-QI cache diff --git a/kernel/drivers/crypto/rockchip/Kconfig b/kernel/drivers/crypto/rockchip/Kconfig index a25fbb0..b7402e8 100644 --- a/kernel/drivers/crypto/rockchip/Kconfig +++ b/kernel/drivers/crypto/rockchip/Kconfig @@ -10,8 +10,8 @@ default y if CPU_RV1126 || CPU_RK1808 || CPU_RK3308 || CPU_PX30 || CPU_RK3568 || CPU_RK3588 config CRYPTO_DEV_ROCKCHIP_V3 - bool "crypto v3 for RV1106" - default y if CPU_RV1106 + bool "crypto v3/v4 for RV1106/RK3528/RK3562" + default y if CPU_RV1106 || CPU_RK3528 || CPU_RK3562 endif diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c b/kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c index 4e6cc9a..495c554 100644 --- a/kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c +++ b/kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c @@ -286,7 +286,6 @@ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); struct rk_crypto_algt *algt = rk_ahash_get_algt(tfm); struct scatterlist *src_sg; - unsigned long flags; unsigned int nbytes; int ret = 0; @@ -378,14 +377,12 @@ ctx->hash_tmp_len, ctx->lastc_len, nbytes); if (nbytes) { - spin_lock_irqsave(&rk_dev->lock, flags); if (ctx->calc_cnt == 0) alg_ctx->ops.hw_init(rk_dev, algt->algo, algt->type); /* flush all 64byte key buffer for hmac */ alg_ctx->ops.hw_write_key(ctx->rk_dev, ctx->authkey, sizeof(ctx->authkey)); ret = rk_ahash_set_data_start(rk_dev, rctx->flag); - spin_unlock_irqrestore(&rk_dev->lock, flags); } exit: return ret; diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_core.c b/kernel/drivers/crypto/rockchip/rk_crypto_core.c index f25d722..56a50d5 100644 --- a/kernel/drivers/crypto/rockchip/rk_crypto_core.c +++ b/kernel/drivers/crypto/rockchip/rk_crypto_core.c @@ -281,9 +281,11 @@ static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id) { struct rk_crypto_dev *rk_dev = platform_get_drvdata(dev_id); - struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev->async_req); + struct rk_alg_ctx *alg_ctx; spin_lock(&rk_dev->lock); + + alg_ctx = rk_alg_ctx_cast(rk_dev->async_req); rk_dev->stat.irq_cnt++; @@ -390,23 +392,22 @@ struct crypto_async_request *async_req, *backlog; unsigned long flags; + spin_lock_irqsave(&rk_dev->lock, flags); if (rk_dev->async_req) { dev_err(rk_dev->dev, "%s: Unexpected crypto paths.\n", __func__); - return; + goto exit; } rk_dev->err = 0; - spin_lock_irqsave(&rk_dev->lock, flags); + backlog = crypto_get_backlog(&rk_dev->queue); async_req = crypto_dequeue_request(&rk_dev->queue); if (!async_req) { rk_dev->busy = false; - spin_unlock_irqrestore(&rk_dev->lock, flags); - return; + goto exit; } rk_dev->stat.dequeue_cnt++; - spin_unlock_irqrestore(&rk_dev->lock, flags); if (backlog) { backlog->complete(backlog, -EINPROGRESS); @@ -417,12 +418,26 @@ rk_dev->err = rk_start_op(rk_dev); if (rk_dev->err) rk_complete_op(rk_dev, rk_dev->err); + +exit: + spin_unlock_irqrestore(&rk_dev->lock, flags); } static void rk_crypto_done_task_cb(unsigned long data) { struct rk_crypto_dev *rk_dev = (struct rk_crypto_dev *)data; - struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev->async_req); + struct rk_alg_ctx *alg_ctx; + unsigned long flags; + + spin_lock_irqsave(&rk_dev->lock, flags); + + if (!rk_dev->async_req) { + dev_err(rk_dev->dev, "done task receive invalid async_req\n"); + spin_unlock_irqrestore(&rk_dev->lock, flags); + return; + } + + alg_ctx = rk_alg_ctx_cast(rk_dev->async_req); rk_dev->stat.done_cnt++; @@ -440,9 +455,12 @@ if (rk_dev->err) goto exit; + spin_unlock_irqrestore(&rk_dev->lock, flags); + return; exit: rk_complete_op(rk_dev, rk_dev->err); + spin_unlock_irqrestore(&rk_dev->lock, flags); } static struct rk_crypto_algt *rk_crypto_find_algs(struct rk_crypto_dev *rk_dev, @@ -663,6 +681,12 @@ static const struct of_device_id crypto_of_id_table[] = { #if IS_ENABLED(CONFIG_CRYPTO_DEV_ROCKCHIP_V3) + /* crypto v4 in belows same with crypto-v3*/ + { + .compatible = "rockchip,crypto-v4", + .data = (void *)&cryto_v3_soc_data, + }, + /* crypto v3 in belows */ { .compatible = "rockchip,crypto-v3", diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c b/kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c index dff8cc1..eb6a8ac 100644 --- a/kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c +++ b/kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c @@ -331,7 +331,6 @@ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); struct rk_crypto_algt *algt = rk_cipher_get_algt(tfm); struct rk_alg_ctx *alg_ctx = rk_cipher_alg_ctx(rk_dev); - unsigned long flags; int err = 0; alg_ctx->left_bytes = req->cryptlen; @@ -345,10 +344,9 @@ CRYPTO_TRACE("total = %u", alg_ctx->total); - spin_lock_irqsave(&rk_dev->lock, flags); alg_ctx->ops.hw_init(rk_dev, algt->algo, algt->mode); err = rk_set_data_start(rk_dev); - spin_unlock_irqrestore(&rk_dev->lock, flags); + return err; } @@ -443,7 +441,6 @@ struct rk_crypto_algt *algt = rk_aead_get_algt(tfm); struct rk_alg_ctx *alg_ctx = rk_cipher_alg_ctx(rk_dev); unsigned int total = 0, authsize; - unsigned long flags; int err = 0; total = req->cryptlen + req->assoclen; @@ -464,10 +461,9 @@ CRYPTO_TRACE("is_enc = %d, authsize = %u, cryptlen = %u, total = %u, assoclen = %u", ctx->is_enc, authsize, req->cryptlen, alg_ctx->total, alg_ctx->assoclen); - spin_lock_irqsave(&rk_dev->lock, flags); alg_ctx->ops.hw_init(rk_dev, algt->algo, algt->mode); err = rk_set_data_start(rk_dev); - spin_unlock_irqrestore(&rk_dev->lock, flags); + return err; } diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c b/kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c index a4c4a9a..0cd270f 100644 --- a/kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c +++ b/kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c @@ -269,7 +269,6 @@ struct skcipher_request *req = skcipher_request_cast(rk_dev->async_req); struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev); - unsigned long flags; int err = 0; alg_ctx->left_bytes = req->cryptlen; @@ -281,10 +280,9 @@ alg_ctx->req_dst = req->dst; alg_ctx->dst_nents = sg_nents_for_len(req->dst, req->cryptlen); - spin_lock_irqsave(&rk_dev->lock, flags); rk_ablk_hw_init(rk_dev); err = rk_set_data_start(rk_dev); - spin_unlock_irqrestore(&rk_dev->lock, flags); + return err; } diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c b/kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c index fa92b07..397c62f 100644 --- a/kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c +++ b/kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c @@ -160,7 +160,7 @@ goto exit; out = rk_bn_alloc(key_byte_size); - if (!in) + if (!out) goto exit; tmp_buf = kzalloc(key_byte_size, GFP_KERNEL); diff --git a/kernel/drivers/devfreq/event/rockchip-dfi.c b/kernel/drivers/devfreq/event/rockchip-dfi.c index a5ccecb..d407f45 100644 --- a/kernel/drivers/devfreq/event/rockchip-dfi.c +++ b/kernel/drivers/devfreq/event/rockchip-dfi.c @@ -56,6 +56,10 @@ #define RK3368_DFI_EN (0x30003 << 5) #define RK3368_DFI_DIS (0x30000 << 5) +#define RK3528_PMUGRF_OFFSET 0x70000 +#define RK3528_PMUGRF_OS_REG18 0x248 +#define RK3528_PMUGRF_OS_REG19 0x24c + #define MAX_DMC_NUM_CH 2 #define READ_DRAMTYPE_INFO(n) (((n) >> 13) & 0x7) #define READ_CH_INFO(n) (((n) >> 28) & 0x3) @@ -111,6 +115,7 @@ struct regmap *regmap_pmugrf; struct clk *clk; u32 dram_type; + u32 count_rate; /* * available mask, 1: available, 0: not available * each bit represent a channel @@ -377,8 +382,12 @@ u32 tmp, max = 0; u32 i, busier_ch = 0; void __iomem *dfi_regs = info->regs; + u32 count_rate = 1; rockchip_dfi_stop_hardware_counter(edev); + + if (info->count_rate) + count_rate = info->count_rate; /* Find out which channel is busier */ for (i = 0; i < MAX_DMC_NUM_CH; i++) { @@ -386,7 +395,7 @@ continue; info->ch_usage[i].total = readl_relaxed(dfi_regs + - DDRMON_CH0_COUNT_NUM + i * 20); + DDRMON_CH0_COUNT_NUM + i * 20) * count_rate; /* LPDDR4 and LPDDR4X BL = 16,other DDR type BL = 8 */ tmp = readl_relaxed(dfi_regs + @@ -639,6 +648,41 @@ return 0; } +static __maybe_unused __init int rk3528_dfi_init(struct platform_device *pdev, + struct rockchip_dfi *data, + struct devfreq_event_desc *desc) +{ + struct device_node *np = pdev->dev.of_node, *node; + struct resource *res; + u32 val_18, val_19; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + data->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(data->regs)) + return PTR_ERR(data->regs); + + node = of_parse_phandle(np, "rockchip,grf", 0); + if (node) { + data->regmap_grf = syscon_node_to_regmap(node); + if (IS_ERR(data->regmap_grf)) + return PTR_ERR(data->regmap_grf); + } + + regmap_read(data->regmap_grf, RK3528_PMUGRF_OFFSET + RK3528_PMUGRF_OS_REG18, &val_18); + regmap_read(data->regmap_grf, RK3528_PMUGRF_OFFSET + RK3528_PMUGRF_OS_REG19, &val_19); + if (READ_SYSREG_VERSION(val_19) >= 0x3) + data->dram_type = READ_DRAMTYPE_INFO_V3(val_18, val_19); + else + data->dram_type = READ_DRAMTYPE_INFO(val_18); + data->count_rate = 2; + data->ch_msk = 1; + data->clk = NULL; + + desc->ops = &rockchip_dfi_ops; + + return 0; +} + static const struct of_device_id rockchip_dfi_id_match[] = { #ifdef CONFIG_CPU_PX30 { .compatible = "rockchip,px30-dfi", .data = px30_dfi_init }, @@ -661,6 +705,9 @@ #ifdef CONFIG_CPU_RK3399 { .compatible = "rockchip,rk3399-dfi", .data = rockchip_dfi_init }, #endif +#ifdef CONFIG_CPU_RK3528 + { .compatible = "rockchip,rk3528-dfi", .data = rk3528_dfi_init }, +#endif #ifdef CONFIG_CPU_RK3568 { .compatible = "rockchip,rk3568-dfi", .data = px30_dfi_init }, #endif diff --git a/kernel/drivers/devfreq/rockchip_bus.c b/kernel/drivers/devfreq/rockchip_bus.c index 4d4206e..8409ce3 100644 --- a/kernel/drivers/devfreq/rockchip_bus.c +++ b/kernel/drivers/devfreq/rockchip_bus.c @@ -447,6 +447,7 @@ { .compatible = "rockchip,rk3288-bus", }, { .compatible = "rockchip,rk3368-bus", }, { .compatible = "rockchip,rk3399-bus", }, + { .compatible = "rockchip,rk3528-bus", }, { .compatible = "rockchip,rk3568-bus", }, { .compatible = "rockchip,rv1126-bus", }, { }, diff --git a/kernel/drivers/devfreq/rockchip_dmc.c b/kernel/drivers/devfreq/rockchip_dmc.c index d75c21e..d9a9dca 100644 --- a/kernel/drivers/devfreq/rockchip_dmc.c +++ b/kernel/drivers/devfreq/rockchip_dmc.c @@ -156,6 +156,7 @@ unsigned long video_1080p_rate; unsigned long video_4k_rate; unsigned long video_4k_10b_rate; + unsigned long video_4k_60p_rate; unsigned long performance_rate; unsigned long hdmi_rate; unsigned long idle_rate; @@ -1765,6 +1766,79 @@ return 0; } +static __maybe_unused int rk3528_dmc_init(struct platform_device *pdev, + struct rockchip_dmcfreq *dmcfreq) +{ + struct arm_smccc_res res; + int ret; + int complt_irq; + u32 complt_hwirq; + struct irq_data *complt_irq_data; + + res = sip_smc_dram(0, 0, ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION); + dev_notice(&pdev->dev, "current ATF version 0x%lx\n", res.a1); + if (res.a0 || res.a1 < 0x100) { + dev_err(&pdev->dev, "trusted firmware need update to V1.00 and above.\n"); + return -ENXIO; + } + + /* + * first 4KB is used for interface parameters + * after 4KB is dts parameters + * request share memory size 4KB * 2 + */ + res = sip_smc_request_share_mem(2, SHARE_PAGE_TYPE_DDR); + if (res.a0 != 0) { + dev_err(&pdev->dev, "no ATF memory for init\n"); + return -ENOMEM; + } + ddr_psci_param = (struct share_params *)res.a1; + /* Clear ddr_psci_param, size is 4KB * 2 */ + memset_io(ddr_psci_param, 0x0, 4096 * 2); + + wait_ctrl.dcf_en = 0; + + init_waitqueue_head(&wait_ctrl.wait_wq); + wait_ctrl.wait_en = 1; + wait_ctrl.wait_time_out_ms = 17 * 5; + + complt_irq = platform_get_irq_byname(pdev, "complete"); + if (complt_irq < 0) { + dev_err(&pdev->dev, "no IRQ for complt_irq: %d\n", complt_irq); + return complt_irq; + } + wait_ctrl.complt_irq = complt_irq; + + ret = devm_request_irq(&pdev->dev, complt_irq, wait_dcf_complete_irq, + 0, dev_name(&pdev->dev), &wait_ctrl); + if (ret < 0) { + dev_err(&pdev->dev, "cannot request complt_irq\n"); + return ret; + } + disable_irq(complt_irq); + + complt_irq_data = irq_get_irq_data(complt_irq); + complt_hwirq = irqd_to_hwirq(complt_irq_data); + ddr_psci_param->complt_hwirq = complt_hwirq; + + res = sip_smc_dram(SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_INIT); + if (res.a0) { + dev_err(&pdev->dev, "rockchip_sip_config_dram_init error:%lx\n", res.a0); + return -ENOMEM; + } + + ret = rockchip_get_freq_info(dmcfreq); + if (ret < 0) { + dev_err(&pdev->dev, "cannot get frequency info\n"); + return ret; + } + dmcfreq->is_set_rate_direct = true; + + dmcfreq->set_auto_self_refresh = rockchip_ddr_set_auto_self_refresh; + + return 0; +} + static __maybe_unused int rk3568_dmc_init(struct platform_device *pdev, struct rockchip_dmcfreq *dmcfreq) { @@ -1945,6 +2019,9 @@ #endif #ifdef CONFIG_CPU_RK3399 { .compatible = "rockchip,rk3399-dmc", .data = rk3399_dmc_init }, +#endif +#ifdef CONFIG_CPU_RK3528 + { .compatible = "rockchip,rk3528-dmc", .data = rk3528_dmc_init }, #endif #ifdef CONFIG_CPU_RK3568 { .compatible = "rockchip,rk3568-dmc", .data = rk3568_dmc_init }, @@ -2222,6 +2299,11 @@ dev_info(dmcfreq->dev, "video_4k_10b_rate = %ld\n", dmcfreq->video_4k_10b_rate); break; + case SYS_STATUS_VIDEO_4K_60P: + dmcfreq->video_4k_60p_rate = rockchip_freq_level_2_rate(dmcfreq, level); + dev_info(dmcfreq->dev, "video_4k_60p_rate = %ld\n", + dmcfreq->video_4k_60p_rate); + break; case SYS_STATUS_PERFORMANCE: dmcfreq->performance_rate = rockchip_freq_level_2_rate(dmcfreq, level); dev_info(dmcfreq->dev, "performance_rate = %ld\n", @@ -2337,6 +2419,11 @@ if (dmcfreq->video_4k_10b_rate && (status & SYS_STATUS_VIDEO_4K_10B)) { if (dmcfreq->video_4k_10b_rate > target_rate) target_rate = dmcfreq->video_4k_10b_rate; + } + + if (dmcfreq->video_4k_60p_rate && (status & SYS_STATUS_VIDEO_4K_60P)) { + if (dmcfreq->video_4k_60p_rate > target_rate) + target_rate = dmcfreq->video_4k_60p_rate; } if (dmcfreq->video_1080p_rate && (status & SYS_STATUS_VIDEO_1080P)) { @@ -2978,8 +3065,16 @@ return 0; } +static int rockchip_dmcfreq_low_temp_adjust_volt(struct monitor_dev_info *mdev_info) +{ + struct rockchip_dmcfreq *dmcfreq = dev_get_drvdata(mdev_info->dev); + + return rockchip_dmcfreq_set_volt_only(dmcfreq); +} + static struct monitor_dev_profile dmc_mdevp = { .type = MONITOR_TPYE_DEV, + .low_temp_adjust_volt = rockchip_dmcfreq_low_temp_adjust_volt, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, }; @@ -2988,14 +3083,15 @@ { int ret; - if (vop_register_dmc()) - dev_err(dmcfreq->dev, "fail to register notify to vop.\n"); + if (dmcfreq->system_status_en || dmcfreq->auto_freq_en) { + if (vop_register_dmc()) + dev_err(dmcfreq->dev, "fail to register notify to vop.\n"); - dmcfreq->status_nb.notifier_call = - rockchip_dmcfreq_system_status_notifier; - ret = rockchip_register_system_status_notifier(&dmcfreq->status_nb); - if (ret) - dev_err(dmcfreq->dev, "failed to register system_status nb\n"); + dmcfreq->status_nb.notifier_call = rockchip_dmcfreq_system_status_notifier; + ret = rockchip_register_system_status_notifier(&dmcfreq->status_nb); + if (ret) + dev_err(dmcfreq->dev, "failed to register system_status nb\n"); + } dmc_mdevp.data = dmcfreq->devfreq; dmcfreq->mdev_info = rockchip_system_monitor_register(dmcfreq->dev, @@ -3279,14 +3375,15 @@ return ret; rockchip_dmcfreq_parse_dt(data); + platform_set_drvdata(pdev, data); if (!data->system_status_en && !data->auto_freq_en) { dev_info(dev, "don't add devfreq feature\n"); + rockchip_dmcfreq_register_notifier(data); return rockchip_dmcfreq_set_volt_only(data); } pm_qos_add_request(&pm_qos, PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE); - platform_set_drvdata(pdev, data); ret = devfreq_add_governor(&devfreq_dmc_ondemand); if (ret) @@ -3323,10 +3420,12 @@ if (ret) return ret; - ret = devfreq_suspend_device(dmcfreq->devfreq); - if (ret < 0) { - dev_err(dev, "failed to suspend the devfreq devices\n"); - return ret; + if (dmcfreq->devfreq) { + ret = devfreq_suspend_device(dmcfreq->devfreq); + if (ret < 0) { + dev_err(dev, "failed to suspend the devfreq devices\n"); + return ret; + } } return 0; @@ -3344,11 +3443,14 @@ if (ret) return ret; - ret = devfreq_resume_device(dmcfreq->devfreq); - if (ret < 0) { - dev_err(dev, "failed to resume the devfreq devices\n"); - return ret; + if (dmcfreq->devfreq) { + ret = devfreq_resume_device(dmcfreq->devfreq); + if (ret < 0) { + dev_err(dev, "failed to resume the devfreq devices\n"); + return ret; + } } + return ret; } diff --git a/kernel/drivers/devfreq/rockchip_dmc_dbg.c b/kernel/drivers/devfreq/rockchip_dmc_dbg.c index c0b9bae..ec9fa3f 100644 --- a/kernel/drivers/devfreq/rockchip_dmc_dbg.c +++ b/kernel/drivers/devfreq/rockchip_dmc_dbg.c @@ -81,54 +81,6 @@ unsigned int dramid[3]; }; -struct lpddrx_id { - unsigned int dramid; - char *name; -}; - -static const struct lpddrx_id lp23_manuf_id[] = { - { 0x1, "Samsung" }, - { 0x2, "Qimonda" }, - { 0x3, "Elpida" }, - { 0x4, "Etron" }, - { 0x5, "Nanya" }, - { 0x6, "SK hynix" }, - { 0x7, "Mosel" }, - { 0x8, "Winbond" }, - { 0x9, "ESMT" }, - { 0xa, "Zentel" }, - { 0xb, "Spansion" }, - { 0xc, "SST" }, - { 0xd, "ZMOS" }, - { 0xe, "Intel" }, - { 0x12, "Being Advanced Memory Corp" }, - { 0x1a, "Xi'an UniIC Semiconductors Co., Ltd" }, - { 0x1b, "ISSI" }, - { 0x1c, "JSC" }, - { 0xaa, "Tezzaron" }, - { 0xc2, "Macronix" }, - { 0xf8, "Fidelix" }, - { 0xfc, "eveRAM" }, - { 0xfd, "AP Memory" }, - { 0xfe, "Numonyx" }, - { 0xff, "Micron" } -}; - -static const struct lpddrx_id lp4_manuf_id[] = { - { 0x1, "Samsung" }, - { 0x5, "Nanya" }, - { 0x6, "SK hynix" }, - { 0x8, "Winbond" }, - { 0x9, "ESMT" }, - { 0x13, "CXMT" }, - { 0x1a, "Xi'an UniIC Semiconductors Co., Ltd" }, - { 0x1c, "JSC" }, - { 0xf8, "Fidelix" }, - { 0xf9, "Ultra Memory" }, - { 0xfd, "AP Memory" }, - { 0xff, "Micron" } -}; - static const char * const power_save_msg[] = { "auto power down enable", "auto power down idle cycle", @@ -270,46 +222,16 @@ seq_printf(m, "DramType: %s\n", p_dram_info->dramtype); if (p_dram_info->version >= 0x2) { if ((strcmp(p_dram_info->dramtype, "LPDDR2") == 0) || - (strcmp(p_dram_info->dramtype, "LPDDR3") == 0)) { - for (i = 0; i < ARRAY_SIZE(lp23_manuf_id); i++) { - if (lp23_manuf_id[i].dramid == p_dram_info->dramid[0]) { - seq_printf(m, - "Dram ID: %s(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n", - lp23_manuf_id[i].name, - p_dram_info->dramid[0], - p_dram_info->dramid[1], - p_dram_info->dramid[2]); - break; - } - } - if (i == ARRAY_SIZE(lp23_manuf_id)) - seq_printf(m, - "Dram ID: Unknown(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n", - p_dram_info->dramid[0], - p_dram_info->dramid[1], - p_dram_info->dramid[2]); - } else if ((strcmp(p_dram_info->dramtype, "LPDDR4") == 0) || - (strcmp(p_dram_info->dramtype, "LPDDR4X") == 0)) { - for (i = 0; i < ARRAY_SIZE(lp4_manuf_id); i++) { - if (lp4_manuf_id[i].dramid == p_dram_info->dramid[0]) { - seq_printf(m, - "Dram ID: %s(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n", - lp4_manuf_id[i].name, - p_dram_info->dramid[0], - p_dram_info->dramid[1], - p_dram_info->dramid[2]); - break; - } - } - if (i == ARRAY_SIZE(lp4_manuf_id)) - seq_printf(m, - "Dram ID: Unknown(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n", - p_dram_info->dramid[0], - p_dram_info->dramid[1], - p_dram_info->dramid[2]); - } else { + (strcmp(p_dram_info->dramtype, "LPDDR3") == 0) || + (strcmp(p_dram_info->dramtype, "LPDDR4") == 0) || + (strcmp(p_dram_info->dramtype, "LPDDR4X") == 0)) + seq_printf(m, + "Dram ID: MR5=0x%x,MR6=0x%x,MR7=0x%x\n", + p_dram_info->dramid[0], + p_dram_info->dramid[1], + p_dram_info->dramid[2]); + else seq_printf(m, "Dram ID: None\n"); - } } /* dram capacity information */ seq_printf(m, "\n" diff --git a/kernel/drivers/dma-buf/dma-buf.c b/kernel/drivers/dma-buf/dma-buf.c index 20a7524..0d36aef 100644 --- a/kernel/drivers/dma-buf/dma-buf.c +++ b/kernel/drivers/dma-buf/dma-buf.c @@ -266,7 +266,7 @@ return 0; retry: - seq = read_seqcount_begin(&resv->seq); + seq = read_seqbegin(&resv->seq); rcu_read_lock(); fobj = rcu_dereference(resv->fence); @@ -275,7 +275,7 @@ else shared_count = 0; fence_excl = rcu_dereference(resv->fence_excl); - if (read_seqcount_retry(&resv->seq, seq)) { + if (read_seqretry(&resv->seq, seq)) { rcu_read_unlock(); goto retry; } @@ -1432,12 +1432,12 @@ robj = buf_obj->resv; while (true) { - seq = read_seqcount_begin(&robj->seq); + seq = read_seqbegin(&robj->seq); rcu_read_lock(); fobj = rcu_dereference(robj->fence); shared_count = fobj ? fobj->shared_count : 0; fence = rcu_dereference(robj->fence_excl); - if (!read_seqcount_retry(&robj->seq, seq)) + if (!read_seqretry(&robj->seq, seq)) break; rcu_read_unlock(); } diff --git a/kernel/drivers/dma-buf/heaps/Makefile b/kernel/drivers/dma-buf/heaps/Makefile index c565022..4e134a2 100644 --- a/kernel/drivers/dma-buf/heaps/Makefile +++ b/kernel/drivers/dma-buf/heaps/Makefile @@ -2,4 +2,4 @@ obj-$(CONFIG_DMABUF_HEAPS_DEFERRED_FREE) += deferred-free-helper.o obj-$(CONFIG_DMABUF_HEAPS_PAGE_POOL) += page_pool.o obj-$(CONFIG_DMABUF_HEAPS_SYSTEM) += rk_system_heap.o -obj-$(CONFIG_DMABUF_HEAPS_CMA) += cma_heap.o +obj-$(CONFIG_DMABUF_HEAPS_CMA) += rk_cma_heap.o diff --git a/kernel/drivers/dma-buf/heaps/rk_cma_heap.c b/kernel/drivers/dma-buf/heaps/rk_cma_heap.c new file mode 100644 index 0000000..12557dc --- /dev/null +++ b/kernel/drivers/dma-buf/heaps/rk_cma_heap.c @@ -0,0 +1,616 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * DMABUF CMA heap exporter + * + * Copyright (C) 2012, 2019, 2020 Linaro Ltd. + * Author: <benjamin.gaignard@linaro.org> for ST-Ericsson. + * + * Also utilizing parts of Andrew Davis' SRAM heap: + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Andrew F. Davis <afd@ti.com> + * + * Copyright (C) 2021, 2022 Rockchip Electronics Co. Ltd. + */ + +#include <linux/cma.h> +#include <linux/dma-buf.h> +#include <linux/dma-heap.h> +#include <linux/dma-contiguous.h> +#include <linux/err.h> +#include <linux/highmem.h> +#include <linux/io.h> +#include <linux/mm.h> +#include <linux/module.h> +#include <linux/scatterlist.h> +#include <linux/slab.h> +#include <linux/vmalloc.h> +#include <uapi/linux/dma-heap.h> + +struct cma_heap { + struct dma_heap *heap; + struct cma *cma; +}; + +struct cma_heap_buffer { + struct cma_heap *heap; + struct list_head attachments; + struct mutex lock; + unsigned long len; + struct page *cma_pages; + struct page **pages; + pgoff_t pagecount; + int vmap_cnt; + void *vaddr; + + bool uncached; +}; + +struct dma_heap_attachment { + struct device *dev; + struct sg_table table; + struct list_head list; + bool mapped; + + bool uncached; +}; + +static int cma_heap_attach(struct dma_buf *dmabuf, + struct dma_buf_attachment *attachment) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + struct dma_heap_attachment *a; + int ret; + + a = kzalloc(sizeof(*a), GFP_KERNEL); + if (!a) + return -ENOMEM; + + ret = sg_alloc_table_from_pages(&a->table, buffer->pages, + buffer->pagecount, 0, + buffer->pagecount << PAGE_SHIFT, + GFP_KERNEL); + if (ret) { + kfree(a); + return ret; + } + + a->dev = attachment->dev; + INIT_LIST_HEAD(&a->list); + a->mapped = false; + + a->uncached = buffer->uncached; + attachment->priv = a; + + mutex_lock(&buffer->lock); + list_add(&a->list, &buffer->attachments); + mutex_unlock(&buffer->lock); + + return 0; +} + +static void cma_heap_detach(struct dma_buf *dmabuf, + struct dma_buf_attachment *attachment) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + struct dma_heap_attachment *a = attachment->priv; + + mutex_lock(&buffer->lock); + list_del(&a->list); + mutex_unlock(&buffer->lock); + + sg_free_table(&a->table); + kfree(a); +} + +static struct sg_table *cma_heap_map_dma_buf(struct dma_buf_attachment *attachment, + enum dma_data_direction direction) +{ + struct dma_heap_attachment *a = attachment->priv; + struct sg_table *table = &a->table; + int attrs = attachment->dma_map_attrs; + int ret; + + if (a->uncached) + attrs |= DMA_ATTR_SKIP_CPU_SYNC; + + ret = dma_map_sgtable(attachment->dev, table, direction, attrs); + if (ret) + return ERR_PTR(-ENOMEM); + a->mapped = true; + return table; +} + +static void cma_heap_unmap_dma_buf(struct dma_buf_attachment *attachment, + struct sg_table *table, + enum dma_data_direction direction) +{ + struct dma_heap_attachment *a = attachment->priv; + int attrs = attachment->dma_map_attrs; + + a->mapped = false; + + if (a->uncached) + attrs |= DMA_ATTR_SKIP_CPU_SYNC; + + dma_unmap_sgtable(attachment->dev, table, direction, attrs); +} + +static int +cma_heap_dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf, + enum dma_data_direction direction, + unsigned int offset, + unsigned int len) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + phys_addr_t phys = page_to_phys(buffer->cma_pages); + + if (buffer->vmap_cnt) + invalidate_kernel_vmap_range(buffer->vaddr, buffer->len); + + if (buffer->uncached) + return 0; + + mutex_lock(&buffer->lock); + dma_sync_single_for_cpu(dma_heap_get_dev(buffer->heap->heap), + phys + offset, + len, + direction); + mutex_unlock(&buffer->lock); + + return 0; +} + +static int +cma_heap_dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf, + enum dma_data_direction direction, + unsigned int offset, + unsigned int len) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + phys_addr_t phys = page_to_phys(buffer->cma_pages); + + if (buffer->vmap_cnt) + flush_kernel_vmap_range(buffer->vaddr, buffer->len); + + if (buffer->uncached) + return 0; + + mutex_lock(&buffer->lock); + dma_sync_single_for_device(dma_heap_get_dev(buffer->heap->heap), + phys + offset, + len, + direction); + mutex_unlock(&buffer->lock); + + return 0; +} + +static int cma_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf, + enum dma_data_direction direction) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + struct dma_heap_attachment *a; + + if (buffer->vmap_cnt) + invalidate_kernel_vmap_range(buffer->vaddr, buffer->len); + + mutex_lock(&buffer->lock); + list_for_each_entry(a, &buffer->attachments, list) { + if (!a->mapped) + continue; + dma_sync_sgtable_for_cpu(a->dev, &a->table, direction); + } + mutex_unlock(&buffer->lock); + + return 0; +} + +static int cma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf, + enum dma_data_direction direction) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + struct dma_heap_attachment *a; + + if (buffer->vmap_cnt) + flush_kernel_vmap_range(buffer->vaddr, buffer->len); + + mutex_lock(&buffer->lock); + list_for_each_entry(a, &buffer->attachments, list) { + if (!a->mapped) + continue; + dma_sync_sgtable_for_device(a->dev, &a->table, direction); + } + mutex_unlock(&buffer->lock); + + return 0; +} + +static vm_fault_t cma_heap_vm_fault(struct vm_fault *vmf) +{ + struct vm_area_struct *vma = vmf->vma; + struct cma_heap_buffer *buffer = vma->vm_private_data; + + if (vmf->pgoff > buffer->pagecount) + return VM_FAULT_SIGBUS; + + vmf->page = buffer->pages[vmf->pgoff]; + get_page(vmf->page); + + return 0; +} + +static const struct vm_operations_struct dma_heap_vm_ops = { + .fault = cma_heap_vm_fault, +}; + +static int cma_heap_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + + if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) == 0) + return -EINVAL; + + if (buffer->uncached) + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); + + vma->vm_ops = &dma_heap_vm_ops; + vma->vm_private_data = buffer; + + return 0; +} + +static void *cma_heap_do_vmap(struct cma_heap_buffer *buffer) +{ + void *vaddr; + pgprot_t pgprot = PAGE_KERNEL; + + if (buffer->uncached) + pgprot = pgprot_writecombine(PAGE_KERNEL); + + vaddr = vmap(buffer->pages, buffer->pagecount, VM_MAP, pgprot); + if (!vaddr) + return ERR_PTR(-ENOMEM); + + return vaddr; +} + +static void *cma_heap_vmap(struct dma_buf *dmabuf) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + void *vaddr; + + mutex_lock(&buffer->lock); + if (buffer->vmap_cnt) { + buffer->vmap_cnt++; + vaddr = buffer->vaddr; + goto out; + } + + vaddr = cma_heap_do_vmap(buffer); + if (IS_ERR(vaddr)) + goto out; + + buffer->vaddr = vaddr; + buffer->vmap_cnt++; +out: + mutex_unlock(&buffer->lock); + + return vaddr; +} + +static void cma_heap_vunmap(struct dma_buf *dmabuf, void *vaddr) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + + mutex_lock(&buffer->lock); + if (!--buffer->vmap_cnt) { + vunmap(buffer->vaddr); + buffer->vaddr = NULL; + } + mutex_unlock(&buffer->lock); +} + +static void cma_heap_dma_buf_release(struct dma_buf *dmabuf) +{ + struct cma_heap_buffer *buffer = dmabuf->priv; + struct cma_heap *cma_heap = buffer->heap; + + if (buffer->vmap_cnt > 0) { + WARN(1, "%s: buffer still mapped in the kernel\n", __func__); + vunmap(buffer->vaddr); + } + + /* free page list */ + kfree(buffer->pages); + /* release memory */ + cma_release(cma_heap->cma, buffer->cma_pages, buffer->pagecount); + kfree(buffer); +} + +static const struct dma_buf_ops cma_heap_buf_ops = { + .attach = cma_heap_attach, + .detach = cma_heap_detach, + .map_dma_buf = cma_heap_map_dma_buf, + .unmap_dma_buf = cma_heap_unmap_dma_buf, + .begin_cpu_access = cma_heap_dma_buf_begin_cpu_access, + .end_cpu_access = cma_heap_dma_buf_end_cpu_access, + .begin_cpu_access_partial = cma_heap_dma_buf_begin_cpu_access_partial, + .end_cpu_access_partial = cma_heap_dma_buf_end_cpu_access_partial, + .mmap = cma_heap_mmap, + .vmap = cma_heap_vmap, + .vunmap = cma_heap_vunmap, + .release = cma_heap_dma_buf_release, +}; + +static struct dma_buf *cma_heap_do_allocate(struct dma_heap *heap, + unsigned long len, + unsigned long fd_flags, + unsigned long heap_flags, bool uncached) +{ + struct cma_heap *cma_heap = dma_heap_get_drvdata(heap); + struct cma_heap_buffer *buffer; + DEFINE_DMA_BUF_EXPORT_INFO(exp_info); + size_t size = PAGE_ALIGN(len); + pgoff_t pagecount = size >> PAGE_SHIFT; + unsigned long align = get_order(size); + struct page *cma_pages; + struct dma_buf *dmabuf; + int ret = -ENOMEM; + pgoff_t pg; + dma_addr_t dma; + + buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); + if (!buffer) + return ERR_PTR(-ENOMEM); + + buffer->uncached = uncached; + + INIT_LIST_HEAD(&buffer->attachments); + mutex_init(&buffer->lock); + buffer->len = size; + + if (align > CONFIG_CMA_ALIGNMENT) + align = CONFIG_CMA_ALIGNMENT; + + cma_pages = cma_alloc(cma_heap->cma, pagecount, align, GFP_KERNEL); + if (!cma_pages) + goto free_buffer; + + /* Clear the cma pages */ + if (PageHighMem(cma_pages)) { + unsigned long nr_clear_pages = pagecount; + struct page *page = cma_pages; + + while (nr_clear_pages > 0) { + void *vaddr = kmap_atomic(page); + + memset(vaddr, 0, PAGE_SIZE); + kunmap_atomic(vaddr); + /* + * Avoid wasting time zeroing memory if the process + * has been killed by SIGKILL + */ + if (fatal_signal_pending(current)) + goto free_cma; + page++; + nr_clear_pages--; + } + } else { + memset(page_address(cma_pages), 0, size); + } + + buffer->pages = kmalloc_array(pagecount, sizeof(*buffer->pages), GFP_KERNEL); + if (!buffer->pages) { + ret = -ENOMEM; + goto free_cma; + } + + for (pg = 0; pg < pagecount; pg++) + buffer->pages[pg] = &cma_pages[pg]; + + buffer->cma_pages = cma_pages; + buffer->heap = cma_heap; + buffer->pagecount = pagecount; + + /* create the dmabuf */ + exp_info.exp_name = dma_heap_get_name(heap); + exp_info.ops = &cma_heap_buf_ops; + exp_info.size = buffer->len; + exp_info.flags = fd_flags; + exp_info.priv = buffer; + dmabuf = dma_buf_export(&exp_info); + if (IS_ERR(dmabuf)) { + ret = PTR_ERR(dmabuf); + goto free_pages; + } + + if (buffer->uncached) { + dma = dma_map_page(dma_heap_get_dev(heap), buffer->cma_pages, 0, + buffer->pagecount * PAGE_SIZE, DMA_FROM_DEVICE); + dma_unmap_page(dma_heap_get_dev(heap), dma, + buffer->pagecount * PAGE_SIZE, DMA_FROM_DEVICE); + } + + return dmabuf; + +free_pages: + kfree(buffer->pages); +free_cma: + cma_release(cma_heap->cma, cma_pages, pagecount); +free_buffer: + kfree(buffer); + + return ERR_PTR(ret); +} + +static struct dma_buf *cma_heap_allocate(struct dma_heap *heap, + unsigned long len, + unsigned long fd_flags, + unsigned long heap_flags) +{ + return cma_heap_do_allocate(heap, len, fd_flags, heap_flags, false); +} + +#if IS_ENABLED(CONFIG_NO_GKI) +static int cma_heap_get_phys(struct dma_heap *heap, + struct dma_heap_phys_data *phys) +{ + struct cma_heap *cma_heap = dma_heap_get_drvdata(heap); + struct cma_heap_buffer *buffer; + struct dma_buf *dmabuf; + + phys->paddr = (__u64)-1; + + if (IS_ERR_OR_NULL(phys)) + return -EINVAL; + + dmabuf = dma_buf_get(phys->fd); + if (IS_ERR_OR_NULL(dmabuf)) + return -EBADFD; + + buffer = dmabuf->priv; + if (IS_ERR_OR_NULL(buffer)) + goto err; + + if (buffer->heap != cma_heap) + goto err; + + phys->paddr = page_to_phys(buffer->cma_pages); + +err: + dma_buf_put(dmabuf); + + return (phys->paddr == (__u64)-1) ? -EINVAL : 0; +} +#endif + +static const struct dma_heap_ops cma_heap_ops = { + .allocate = cma_heap_allocate, +#if IS_ENABLED(CONFIG_NO_GKI) + .get_phys = cma_heap_get_phys, +#endif +}; + +static struct dma_buf *cma_uncached_heap_allocate(struct dma_heap *heap, + unsigned long len, + unsigned long fd_flags, + unsigned long heap_flags) +{ + return cma_heap_do_allocate(heap, len, fd_flags, heap_flags, true); +} + +static struct dma_buf *cma_uncached_heap_not_initialized(struct dma_heap *heap, + unsigned long len, + unsigned long fd_flags, + unsigned long heap_flags) +{ + pr_info("heap %s not initialized\n", dma_heap_get_name(heap)); + return ERR_PTR(-EBUSY); +} + +static struct dma_heap_ops cma_uncached_heap_ops = { + .allocate = cma_uncached_heap_not_initialized, +}; + +static int set_heap_dev_dma(struct device *heap_dev) +{ + int err = 0; + + if (!heap_dev) + return -EINVAL; + + arch_setup_dma_ops(heap_dev, 0, 0, NULL, 0); + + dma_coerce_mask_and_coherent(heap_dev, DMA_BIT_MASK(64)); + + if (!heap_dev->dma_parms) { + heap_dev->dma_parms = devm_kzalloc(heap_dev, + sizeof(*heap_dev->dma_parms), + GFP_KERNEL); + if (!heap_dev->dma_parms) + return -ENOMEM; + + err = dma_set_max_seg_size(heap_dev, (unsigned int)DMA_BIT_MASK(64)); + if (err) { + devm_kfree(heap_dev, heap_dev->dma_parms); + dev_err(heap_dev, "Failed to set DMA segment size, err:%d\n", err); + return err; + } + } + + return 0; +} + +static int __add_cma_heap(struct cma *cma, void *data) +{ + struct cma_heap *cma_heap, *cma_uncached_heap; + struct dma_heap_export_info exp_info; + int ret; + + cma_heap = kzalloc(sizeof(*cma_heap), GFP_KERNEL); + if (!cma_heap) + return -ENOMEM; + cma_heap->cma = cma; + + exp_info.name = "cma"; + exp_info.ops = &cma_heap_ops; + exp_info.priv = cma_heap; + + cma_heap->heap = dma_heap_add(&exp_info); + if (IS_ERR(cma_heap->heap)) { + ret = PTR_ERR(cma_heap->heap); + goto free_cma_heap; + } + + cma_uncached_heap = kzalloc(sizeof(*cma_heap), GFP_KERNEL); + if (!cma_uncached_heap) { + ret = -ENOMEM; + goto put_cma_heap; + } + + cma_uncached_heap->cma = cma; + + exp_info.name = "cma-uncached"; + exp_info.ops = &cma_uncached_heap_ops; + exp_info.priv = cma_uncached_heap; + + cma_uncached_heap->heap = dma_heap_add(&exp_info); + if (IS_ERR(cma_uncached_heap->heap)) { + ret = PTR_ERR(cma_uncached_heap->heap); + goto free_uncached_cma_heap; + } + + ret = set_heap_dev_dma(dma_heap_get_dev(cma_uncached_heap->heap)); + if (ret) + goto put_uncached_cma_heap; + + mb(); /* make sure we only set allocate after dma_mask is set */ + cma_uncached_heap_ops.allocate = cma_uncached_heap_allocate; + + return 0; + +put_uncached_cma_heap: + dma_heap_put(cma_uncached_heap->heap); +free_uncached_cma_heap: + kfree(cma_uncached_heap); +put_cma_heap: + dma_heap_put(cma_heap->heap); +free_cma_heap: + kfree(cma_heap); + + return ret; +} + +static int add_default_cma_heap(void) +{ + struct cma *default_cma = dev_get_cma_area(NULL); + int ret = 0; + + if (default_cma) + ret = __add_cma_heap(default_cma, NULL); + + return ret; +} +module_init(add_default_cma_heap); +MODULE_DESCRIPTION("DMA-BUF CMA Heap"); +MODULE_LICENSE("GPL"); diff --git a/kernel/drivers/dma-buf/reservation.c b/kernel/drivers/dma-buf/reservation.c index 49ab094..f11d584 100644 --- a/kernel/drivers/dma-buf/reservation.c +++ b/kernel/drivers/dma-buf/reservation.c @@ -109,8 +109,7 @@ dma_fence_get(fence); - preempt_disable(); - write_seqcount_begin(&obj->seq); + write_seqlock(&obj->seq); for (i = 0; i < fobj->shared_count; ++i) { struct dma_fence *old_fence; @@ -121,8 +120,7 @@ if (old_fence->context == fence->context) { /* memory barrier is added by write_seqcount_begin */ RCU_INIT_POINTER(fobj->shared[i], fence); - write_seqcount_end(&obj->seq); - preempt_enable(); + write_sequnlock(&obj->seq); dma_fence_put(old_fence); return; @@ -146,8 +144,7 @@ fobj->shared_count++; } - write_seqcount_end(&obj->seq); - preempt_enable(); + write_sequnlock(&obj->seq); dma_fence_put(signaled); } @@ -191,15 +188,13 @@ fobj->shared_count++; done: - preempt_disable(); - write_seqcount_begin(&obj->seq); + write_seqlock(&obj->seq); /* * RCU_INIT_POINTER can be used here, * seqcount provides the necessary barriers */ RCU_INIT_POINTER(obj->fence, fobj); - write_seqcount_end(&obj->seq); - preempt_enable(); + write_sequnlock(&obj->seq); if (!old) return; @@ -259,14 +254,11 @@ if (fence) dma_fence_get(fence); - preempt_disable(); - write_seqcount_begin(&obj->seq); - /* write_seqcount_begin provides the necessary memory barrier */ + write_seqlock(&obj->seq); RCU_INIT_POINTER(obj->fence_excl, fence); if (old) old->shared_count = 0; - write_seqcount_end(&obj->seq); - preempt_enable(); + write_sequnlock(&obj->seq); /* inplace update, no shared fences */ while (i--) @@ -349,13 +341,10 @@ src_list = reservation_object_get_list(dst); old = reservation_object_get_excl(dst); - preempt_disable(); - write_seqcount_begin(&dst->seq); - /* write_seqcount_begin provides the necessary memory barrier */ + write_seqlock(&dst->seq); RCU_INIT_POINTER(dst->fence_excl, new); RCU_INIT_POINTER(dst->fence, dst_list); - write_seqcount_end(&dst->seq); - preempt_enable(); + write_sequnlock(&dst->seq); if (src_list) kfree_rcu(src_list, rcu); @@ -396,7 +385,7 @@ shared_count = i = 0; rcu_read_lock(); - seq = read_seqcount_begin(&obj->seq); + seq = read_seqbegin(&obj->seq); fence_excl = rcu_dereference(obj->fence_excl); if (fence_excl && !dma_fence_get_rcu(fence_excl)) @@ -445,7 +434,7 @@ } } - if (i != shared_count || read_seqcount_retry(&obj->seq, seq)) { + if (i != shared_count || read_seqretry(&obj->seq, seq)) { while (i--) dma_fence_put(shared[i]); dma_fence_put(fence_excl); @@ -494,7 +483,7 @@ retry: shared_count = 0; - seq = read_seqcount_begin(&obj->seq); + seq = read_seqbegin(&obj->seq); rcu_read_lock(); i = -1; @@ -541,7 +530,7 @@ rcu_read_unlock(); if (fence) { - if (read_seqcount_retry(&obj->seq, seq)) { + if (read_seqretry(&obj->seq, seq)) { dma_fence_put(fence); goto retry; } @@ -597,7 +586,7 @@ retry: ret = true; shared_count = 0; - seq = read_seqcount_begin(&obj->seq); + seq = read_seqbegin(&obj->seq); if (test_all) { unsigned i; @@ -618,7 +607,7 @@ break; } - if (read_seqcount_retry(&obj->seq, seq)) + if (read_seqretry(&obj->seq, seq)) goto retry; } @@ -631,7 +620,7 @@ if (ret < 0) goto retry; - if (read_seqcount_retry(&obj->seq, seq)) + if (read_seqretry(&obj->seq, seq)) goto retry; } } diff --git a/kernel/drivers/extcon/extcon.c b/kernel/drivers/extcon/extcon.c index def0649..148c07a 100644 --- a/kernel/drivers/extcon/extcon.c +++ b/kernel/drivers/extcon/extcon.c @@ -158,6 +158,11 @@ .id = EXTCON_DISP_HDMI, .name = "HDMI", }, + [EXTCON_DISP_HDMI_AUDIO] = { + .type = EXTCON_TYPE_DISP, + .id = EXTCON_DISP_HDMI_AUDIO, + .name = "HDMI-AUDIO", + }, [EXTCON_DISP_MHL] = { .type = EXTCON_TYPE_DISP, .id = EXTCON_DISP_MHL, diff --git a/kernel/drivers/firmware/arm_sdei.c b/kernel/drivers/firmware/arm_sdei.c index 08e8286..63b17b6 100644 --- a/kernel/drivers/firmware/arm_sdei.c +++ b/kernel/drivers/firmware/arm_sdei.c @@ -924,6 +924,47 @@ return err; } + +static int sdei_api_interrupt_bind(u32 intr_num, u64 *result) +{ + return invoke_sdei_fn(SDEI_1_0_FN_SDEI_INTERRUPT_BIND, intr_num, 0, 0, 0, + 0, result); +} + +int sdei_interrupt_bind(u32 intr_num, u32 *event_num) +{ + int err; + u64 result; + + err = sdei_api_interrupt_bind(intr_num, &result); + if (!err) + *event_num = (u32)result; + + return err; +} + +static int sdei_api_interrupt_release(u32 event_num) +{ + return invoke_sdei_fn(SDEI_1_0_FN_SDEI_INTERRUPT_RELEASE, event_num, 0, 0, 0, + 0, NULL); +} + +int sdei_interrupt_release(u32 event_num) +{ + struct sdei_event *event; + + mutex_lock(&sdei_events_lock); + event = sdei_event_find(event_num); + mutex_unlock(&sdei_events_lock); + + if (event) { + pr_err("%s: need unregister event:%d before release\n", + __func__, event_num); + return SDEI_DENIED; + } + + return sdei_api_interrupt_release(event_num); +} #endif static int sdei_get_conduit(struct platform_device *pdev) diff --git a/kernel/drivers/firmware/efi/efi.c b/kernel/drivers/firmware/efi/efi.c index a8180f9..e03e37a 100644 --- a/kernel/drivers/firmware/efi/efi.c +++ b/kernel/drivers/firmware/efi/efi.c @@ -87,7 +87,7 @@ struct workqueue_struct *efi_rts_wq; -static bool disable_runtime; +static bool disable_runtime = IS_ENABLED(CONFIG_PREEMPT_RT_BASE); static int __init setup_noefi(char *arg) { disable_runtime = true; @@ -113,6 +113,9 @@ if (parse_option_str(str, "noruntime")) disable_runtime = true; + if (parse_option_str(str, "runtime")) + disable_runtime = false; + return 0; } early_param("efi", parse_efi_cmdline); diff --git a/kernel/drivers/firmware/rockchip_sip.c b/kernel/drivers/firmware/rockchip_sip.c index 8658fa6..7f2073c 100644 --- a/kernel/drivers/firmware/rockchip_sip.c +++ b/kernel/drivers/firmware/rockchip_sip.c @@ -291,17 +291,20 @@ */ #ifdef CONFIG_ARM64 #define SIP_UARTDBG_FN SIP_UARTDBG_CFG64 +#define SIP_FIQ_DBG_STACK_SIZE IRQ_STACK_SIZE #else #define SIP_UARTDBG_FN SIP_UARTDBG_CFG +#define SIP_FIQ_DBG_STACK_SIZE SZ_8K + static int firmware_64_32bit; #endif static int fiq_sip_enabled; static int fiq_target_cpu; +static unsigned long fiq_stack_top; static phys_addr_t ft_fiq_mem_phy; static void __iomem *ft_fiq_mem_base; -static void (*sip_fiq_debugger_uart_irq_tf)(struct pt_regs *_pt_regs, - uint32_t cpu); +static sip_fiq_debugger_uart_irq_tf_cb_t sip_fiq_debugger_uart_irq_tf; static struct pt_regs fiq_pt_regs; int sip_fiq_debugger_is_enabled(void) @@ -388,7 +391,7 @@ static void sip_fiq_debugger_uart_irq_tf_cb(unsigned long sp_el1, unsigned long offset, - uint32_t cpu) + unsigned long cpu) { char *cpu_context; @@ -403,15 +406,30 @@ __invoke_sip_fn_smc(SIP_UARTDBG_FN, 0, 0, UARTDBG_CFG_OSHDL_TO_OS); } -int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, void *callback_fn) +int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, sip_fiq_debugger_uart_irq_tf_cb_t callback_fn) { struct arm_smccc_res res; + /* Alloc a page for fiq_debugger's stack */ + if (fiq_stack_top == 0) { + fiq_stack_top = __get_free_pages(GFP_KERNEL | __GFP_ZERO, + get_order(SIP_FIQ_DBG_STACK_SIZE)); + if (fiq_stack_top) { + fiq_stack_top += SIP_FIQ_DBG_STACK_SIZE; + } else { + pr_err("%s: alloc stack failed\n", __func__); + return -ENOMEM; + } + } + /* init fiq debugger callback */ sip_fiq_debugger_uart_irq_tf = callback_fn; - res = __invoke_sip_fn_smc(SIP_UARTDBG_FN, irq_id, - (unsigned long)sip_fiq_debugger_uart_irq_tf_cb, - UARTDBG_CFG_INIT); + arm_smccc_smc(SIP_UARTDBG_FN, + irq_id, + (unsigned long)sip_fiq_debugger_uart_irq_tf_cb, + UARTDBG_CFG_INIT, + fiq_stack_top, 0, 0, 0, &res); + if (IS_SIP_ERROR(res.a0)) { pr_err("%s error: %d\n", __func__, (int)res.a0); return res.a0; diff --git a/kernel/drivers/gpio/gpiolib-sysfs.c b/kernel/drivers/gpio/gpiolib-sysfs.c index 1c2a983..e0ccc79 100644 --- a/kernel/drivers/gpio/gpiolib-sysfs.c +++ b/kernel/drivers/gpio/gpiolib-sysfs.c @@ -80,18 +80,13 @@ struct gpiod_data *data = dev_get_drvdata(dev); struct gpio_desc *desc = data->desc; ssize_t status; - int offset; mutex_lock(&data->mutex); - offset = gpio_chip_hwgpio(desc); if (sysfs_streq(buf, "high")) status = gpiod_direction_output_raw(desc, 1); else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low")) - if (( offset == 26 ) || ( offset == 25 ) || ( offset == 27 )) - status = gpiod_direction_output_raw(desc, 1); - else - status = gpiod_direction_output_raw(desc, 0); + status = gpiod_direction_output_raw(desc, 0); else if (sysfs_streq(buf, "in")) status = gpiod_direction_input(desc); else diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c b/kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c index 5bed27a..90f14f2 100755 --- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c +++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c @@ -19,7 +19,7 @@ static u64 period_start_time = 0; /** .KP : mali_control_timer */ -static _mali_osk_timer_t *mali_control_timer = NULL; +static _mali_osk_timer_t mali_control_timer; static mali_bool timer_running = MALI_FALSE; /** @@ -30,12 +30,12 @@ void mali_control_timer_add(u32 timeout)/* 'timeout' : 以 ms 为单位. */ { - _mali_osk_timer_add(mali_control_timer, _mali_osk_time_mstoticks(timeout)); + _mali_osk_timer_add(&mali_control_timer, _mali_osk_time_mstoticks(timeout)); } void mali_control_timer_mod(u32 timeout_in_ms) { - _mali_osk_timer_mod(mali_control_timer, _mali_osk_time_mstoticks(timeout_in_ms)); + _mali_osk_timer_mod(&mali_control_timer, _mali_osk_time_mstoticks(timeout_in_ms)); } static void mali_control_timer_callback(void *arg) @@ -76,23 +76,15 @@ } } - mali_control_timer = _mali_osk_timer_init(mali_control_timer_callback); - if (NULL == mali_control_timer) { - return _MALI_OSK_ERR_FAULT; - } - _mali_osk_timer_setcallback(mali_control_timer, mali_control_timer_callback, NULL); + _mali_osk_timer_init(&mali_control_timer, mali_control_timer_callback); return _MALI_OSK_ERR_OK; } void mali_control_timer_term(void) { - if (NULL != mali_control_timer) { - _mali_osk_timer_del(mali_control_timer); - timer_running = MALI_FALSE; - _mali_osk_timer_term(mali_control_timer); - mali_control_timer = NULL; - } + _mali_osk_timer_del(&mali_control_timer); + timer_running = MALI_FALSE; } mali_bool mali_control_timer_resume(u64 time_now) @@ -130,7 +122,7 @@ mali_utilization_data_unlock(); if (suspend == MALI_TRUE) { - _mali_osk_timer_del(mali_control_timer); + _mali_osk_timer_del(&mali_control_timer); mali_utilization_reset(); } } else { diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c b/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c index 47979a2..3e76c54 100755 --- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c +++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c @@ -65,27 +65,23 @@ group = _mali_osk_calloc(1, sizeof(struct mali_group)); if (NULL != group) { - group->timeout_timer = _mali_osk_timer_init(mali_group_timeout); - if (NULL != group->timeout_timer) { - _mali_osk_timer_setcallback(group->timeout_timer, mali_group_timeout, (void *)group); + _mali_osk_timer_init(&group->timeout_timer, mali_group_timeout); - group->l2_cache_core[0] = core; - _mali_osk_list_init(&group->group_list); - _mali_osk_list_init(&group->executor_list); - _mali_osk_list_init(&group->pm_domain_list); - group->bcast_core = bcast; - group->dlbu_core = dlbu; + group->l2_cache_core[0] = core; + _mali_osk_list_init(&group->group_list); + _mali_osk_list_init(&group->executor_list); + _mali_osk_list_init(&group->pm_domain_list); + group->bcast_core = bcast; + group->dlbu_core = dlbu; - /* register this object as a part of the correct power domain */ - if ((NULL != core) || (NULL != dlbu) || (NULL != bcast)) - group->pm_domain = mali_pm_register_group(domain_index, group); + /* register this object as a part of the correct power domain */ + if ((NULL != core) || (NULL != dlbu) || (NULL != bcast)) + group->pm_domain = mali_pm_register_group(domain_index, group); - mali_global_groups[mali_global_num_groups] = group; - mali_global_num_groups++; + mali_global_groups[mali_global_num_groups] = group; + mali_global_num_groups++; - return group; - } - _mali_osk_free(group); + return group; } return NULL; @@ -147,10 +143,7 @@ } } - if (NULL != group->timeout_timer) { - _mali_osk_timer_del(group->timeout_timer); - _mali_osk_timer_term(group->timeout_timer); - } + _mali_osk_timer_del(&group->timeout_timer); if (NULL != group->bottom_half_work_mmu) { _mali_osk_wq_delete_work(group->bottom_half_work_mmu); @@ -879,7 +872,7 @@ /* Setup SW timer and record start time */ group->start_time = _mali_osk_time_tickcount(); - _mali_osk_timer_mod(group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime)); + _mali_osk_timer_mod(&group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime)); MALI_DEBUG_PRINT(4, ("Group: Started GP job 0x%08X on group %s at %u\n", job, @@ -1034,7 +1027,7 @@ /* Setup SW timer and record start time */ group->start_time = _mali_osk_time_tickcount(); - _mali_osk_timer_mod(group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime)); + _mali_osk_timer_mod(&group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime)); MALI_DEBUG_PRINT(4, ("Group: Started PP job 0x%08X part %u/%u on group %s at %u\n", job, sub_job + 1, @@ -1124,7 +1117,7 @@ MALI_DEBUG_ASSERT(MALI_TRUE == group->is_working); /* Stop/clear the timeout timer. */ - _mali_osk_timer_del_async(group->timeout_timer); + _mali_osk_timer_del_async(&group->timeout_timer); if (NULL != group->pp_running_job) { @@ -1237,7 +1230,7 @@ MALI_DEBUG_ASSERT(MALI_TRUE == group->is_working); /* Stop/clear the timeout timer. */ - _mali_osk_timer_del_async(group->timeout_timer); + _mali_osk_timer_del_async(&group->timeout_timer); if (NULL != group->gp_running_job) { mali_gp_update_performance_counters(group->gp_core, group->gp_running_job); @@ -1780,7 +1773,8 @@ static void mali_group_timeout(void *data) { - struct mali_group *group = (struct mali_group *)data; + _mali_osk_timer_t *timer = (_mali_osk_timer_t *)data; + struct mali_group *group = container_of(timer, struct mali_group, timeout_timer); MALI_DEBUG_ASSERT_POINTER(group); MALI_DEBUG_PRINT(2, ("Group: timeout handler for %s at %u\n", diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h b/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h index 32481e4..0e3202b 100755 --- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h +++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h @@ -84,7 +84,7 @@ _mali_osk_wq_work_t *bottom_half_work_gp; _mali_osk_wq_work_t *bottom_half_work_pp; - _mali_osk_timer_t *timeout_timer; + _mali_osk_timer_t timeout_timer; }; /** @brief Create a new Mali group object diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h index 9ade362..5a180e5 100755 --- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h +++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h @@ -950,23 +950,24 @@ /** @brief Initialize a timer * - * Allocates resources for a new timer, and initializes them. This does not - * start the timer. - * - * @return a pointer to the allocated timer object, or NULL on failure. + * Initializes a given timer instance. + * This does not start the timer. + + * @param tim the timer to init. + * @param callback the callback that would be called when 'tim' times out. */ -_mali_osk_timer_t *_mali_osk_timer_init(_mali_osk_timer_callback_t callback); +void _mali_osk_timer_init(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback); /** @brief Start a timer * * It is an error to start a timer without setting the callback via - * _mali_osk_timer_setcallback(). + * _mali_osk_timer_init(). * * It is an error to use this to start an already started timer. * * The timer will expire in \a ticks_to_expire ticks, at which point, the * callback function will be invoked with the callback-specific data, - * as registered by _mali_osk_timer_setcallback(). + * as registered by _mali_osk_timer_init(). * * @param tim the timer to start * @param ticks_to_expire the amount of time in ticks for the timer to run @@ -980,11 +981,11 @@ * stopped. If \a ticks_to_expire 0 the timer fires immediately. * * It is an error to modify a timer without setting the callback via - * _mali_osk_timer_setcallback(). + * _mali_osk_timer_init(). * * The timer will expire at \a ticks_to_expire from the time of the call, at * which point, the callback function will be invoked with the - * callback-specific data, as set by _mali_osk_timer_setcallback(). + * callback-specific data, as set by _mali_osk_timer_init(). * * @param tim the timer to modify, and start if necessary * @param ticks_to_expire the \em absolute time in ticks at which this timer @@ -1033,34 +1034,6 @@ * @return MALI_TRUE if time is active, MALI_FALSE if it is not active */ mali_bool _mali_osk_timer_pending(_mali_osk_timer_t *tim); - -/** @brief Set a timer's callback parameters. - * - * This must be called at least once before a timer is started/modified. - * - * After a timer has been stopped or expires, the callback remains set. This - * means that restarting the timer will call the same function with the same - * parameters on expiry. - * - * @param tim the timer to set callback on. - * @param callback Function to call when timer expires - * @param data Function-specific data to supply to the function on expiry. - */ -void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data); - -/** @brief Terminate a timer, and deallocate resources. - * - * The timer must first be stopped by calling _mali_osk_timer_del(). - * - * It is a programming error for _mali_osk_timer_term() to be called on: - * - timer that is currently running - * - a timer that is currently executing its callback. - * - * @param tim the timer to deallocate. - */ -void _mali_osk_timer_term(_mali_osk_timer_t *tim); -/** @} */ /* end group _mali_osk_timer */ - /** @defgroup _mali_osk_time OSK Time functions * diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h index bf69925..a4c1618 100755 --- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h +++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h @@ -28,9 +28,12 @@ struct device *dev; #ifdef CONFIG_HAVE_CLK struct clk *clock; + struct clk_bulk_data *clks; + int num_clks; #endif #ifdef CONFIG_REGULATOR struct regulator *regulator; + struct opp_table *opp_table; #endif #ifdef CONFIG_PM_DEVFREQ struct devfreq_dev_profile devfreq_profile; diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h index b6fa94c..60ae190 100755 --- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h +++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h @@ -20,6 +20,8 @@ extern "C" { #endif +#include <linux/timer.h> + /** * @addtogroup uddapi Unified Device Driver (UDD) APIs * @@ -394,11 +396,11 @@ * the callback. Therefore, the callback may not obtain any mutexes also held * by any callers of _mali_osk_timer_del(). Otherwise, a deadlock may occur. * - * @param arg Function-specific data */ + * @param arg the pointer to current _mali_osk_timer_t(timer_list) instance. */ typedef void (*_mali_osk_timer_callback_t)(void *arg); /** @brief Private type for Timer Callback Objects */ -typedef struct _mali_osk_timer_t_struct _mali_osk_timer_t; +typedef struct timer_list _mali_osk_timer_t; /** @} */ /* end group _mali_osk_timer */ diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c index 260c2a8..6023495 100644 --- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c +++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c @@ -12,6 +12,7 @@ #include "mali_kernel_common.h" #include <linux/clk.h> +#include <linux/clk-provider.h> #include <linux/devfreq.h> #include <linux/regulator/consumer.h> #include <linux/regulator/driver.h> @@ -87,13 +88,17 @@ return 0; } + err = clk_bulk_enable(mdev->num_clks, mdev->clks); + if (err) + return err; + #ifdef CONFIG_REGULATOR if (mdev->regulator && mdev->current_voltage != voltage && old_freq < freq) { err = regulator_set_voltage(mdev->regulator, voltage, INT_MAX); if (err) { MALI_PRINT_ERROR(("Failed to increase voltage (%d)\n", err)); - return err; + goto err; } } #endif @@ -101,8 +106,9 @@ err = clk_set_rate(mdev->clock, freq); if (err) { MALI_PRINT_ERROR(("Failed to set clock %lu (target %lu)\n", freq, *target_freq)); - return err; + goto err; } + *target_freq = freq; mdev->current_freq = freq; if (mdev->devfreq) @@ -114,7 +120,7 @@ err = regulator_set_voltage(mdev->regulator, voltage, INT_MAX); if (err) { MALI_PRINT_ERROR(("Failed to decrease voltage (%d)\n", err)); - return err; + goto err; } } #endif @@ -122,6 +128,8 @@ mdev->current_voltage = voltage; mali_pm_reset_dvfs_utilisation(mdev); +err: + clk_bulk_disable(mdev->num_clks, mdev->clks); return err; } diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c index e13cbad..831a476 100644 --- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c +++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c @@ -77,7 +77,7 @@ struct mali_internal_sync_fence_waiter *waiter; #endif struct mali_internal_sync_fence *sync_fence; - int ret; + int ret = 0; MALI_DEBUG_ASSERT_POINTER(cb); MALI_IGNORE(fence); #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0) @@ -92,7 +92,11 @@ if (ret) wake_up_all(&sync_fence->wq); #else - ret = sync_fence->fence->ops->signaled(sync_fence->fence); + if (!sync_fence) + return; + + if ((sync_fence->fence) && (sync_fence->fence->ops) && (sync_fence->fence->ops->signaled)) + ret = sync_fence->fence->ops->signaled(sync_fence->fence); if (0 > ret) MALI_PRINT_ERROR(("Mali internal sync:Failed to wait fence 0x%x for sync_fence 0x%x.\n", fence, sync_fence)); @@ -682,7 +686,7 @@ spin_lock_irqsave(fence->lock, flags); - if (WARN_ON_ONCE(!list_empty(&sync_pt->sync_pt_list))) + if (!list_empty(&sync_pt->sync_pt_list)) list_del(&sync_pt->sync_pt_list); spin_unlock_irqrestore(fence->lock, flags); diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c index 08df33d..6e003c2 100755 --- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c +++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c @@ -31,6 +31,7 @@ #include <linux/clk.h> #include <linux/regulator/consumer.h> #include <linux/mali/mali_utgard.h> +#include <linux/pm_runtime.h> #include <soc/rockchip/rockchip_opp_select.h> #include "mali_kernel_common.h" @@ -521,6 +522,7 @@ int err; #ifdef CONFIG_MALI_DEVFREQ struct mali_device *mdev; + const char *name = "mali"; #endif MALI_DEBUG_PRINT(2, ("mali_probe(): Called for platform device %s\n", pdev->name)); @@ -575,25 +577,38 @@ mdev->regulator = NULL; /* Allow probe to continue without regulator */ } + if (mdev->regulator) { + mdev->opp_table = dev_pm_opp_set_regulators(mdev->dev, &name, 1); + if (IS_ERR(mdev->opp_table)) { + mdev->opp_table = NULL; + MALI_DEBUG_PRINT(2, ("Continuing without opp regulator\n")); + } + } #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */ + + mdev->num_clks = devm_clk_bulk_get_all(mdev->dev, &mdev->clks); + if (mdev->num_clks < 1) { + MALI_DEBUG_PRINT(2, ("Continuing without Mali clock control\n")); + mdev->num_clks = 0; + mdev->clock = NULL; + } else { + /* Get "clk_mali" in the device tree for gpu dvfs */ + mdev->clock = clk_get(mdev->dev, "clk_mali"); + if (IS_ERR_OR_NULL(mdev->clock)) { + MALI_DEBUG_PRINT(2, ("Continuing without Mali dvfs clock\n")); + /* Allow probe to continue without clock. */ + mdev->clock = NULL; + } + } + err = clk_bulk_prepare_enable(mdev->num_clks, mdev->clks); + if (err) { + MALI_PRINT_ERROR(("Failed to prepare clock (%d)\n", err)); + goto clock_prepare_failed; + } err = rk_platform_init_opp_table(mdev->dev); if (err) MALI_DEBUG_PRINT(3, ("Failed to init_opp_table\n")); - - /* Need to name the gpu clock "clk_mali" in the device tree */ - mdev->clock = clk_get(mdev->dev, "clk_mali"); - if (IS_ERR_OR_NULL(mdev->clock)) { - MALI_DEBUG_PRINT(2, ("Continuing without Mali clock control\n")); - mdev->clock = NULL; - /* Allow probe to continue without clock. */ - } else { - err = clk_prepare(mdev->clock); - if (err) { - MALI_PRINT_ERROR(("Failed to prepare clock (%d)\n", err)); - goto clock_prepare_failed; - } - } /* initilize pm metrics related */ if (mali_pm_metrics_init(mdev) < 0) { @@ -605,6 +620,7 @@ MALI_DEBUG_PRINT(2, ("mali devfreq init failed\n")); goto devfreq_init_failed; } + clk_bulk_disable(mdev->num_clks, mdev->clks); #endif @@ -640,8 +656,9 @@ devfreq_init_failed: mali_pm_metrics_term(mdev); pm_metrics_init_failed: - clk_unprepare(mdev->clock); + clk_bulk_disable_unprepare(mdev->num_clks, mdev->clks); clock_prepare_failed: + clk_bulk_put(mdev->num_clks, mdev->clks); clk_put(mdev->clock); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_OF) \ && defined(CONFIG_PM_OPP) @@ -651,6 +668,7 @@ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \ && defined(CONFIG_REGULATOR) regulator_put(mdev->regulator); + dev_pm_opp_put_regulators(mdev->opp_table); #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */ mali_device_free(mdev); #endif @@ -680,10 +698,12 @@ mali_pm_metrics_term(mdev); if (mdev->clock) { - clk_unprepare(mdev->clock); clk_put(mdev->clock); mdev->clock = NULL; } + clk_bulk_unprepare(mdev->num_clks, mdev->clks); + clk_bulk_put(mdev->num_clks, mdev->clks); + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_OF) \ && defined(CONFIG_PM_OPP) dev_pm_opp_of_remove_table(mdev->dev); @@ -692,6 +712,7 @@ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \ && defined(CONFIG_REGULATOR) regulator_put(mdev->regulator); + dev_pm_opp_put_regulators(mdev->opp_table); #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */ mali_device_free(mdev); #endif @@ -733,6 +754,7 @@ return -ENODEV; #endif + pm_runtime_force_suspend(dev); #if defined(CONFIG_MALI_DEVFREQ) && \ (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) devfreq_suspend_device(mdev->devfreq); @@ -777,6 +799,7 @@ (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) devfreq_resume_device(mdev->devfreq); #endif + pm_runtime_force_resume(dev); return 0; } diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c index d01c114..72d3980 100755 --- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c +++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c @@ -18,59 +18,44 @@ #include "mali_osk.h" #include "mali_kernel_common.h" -struct _mali_osk_timer_t_struct { - struct timer_list timer; -}; - typedef void (*timer_timeout_function_t)(unsigned long); -_mali_osk_timer_t *_mali_osk_timer_init(_mali_osk_timer_callback_t callback) +void _mali_osk_timer_init(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback) { - _mali_osk_timer_t *t = (_mali_osk_timer_t *)kmalloc(sizeof(_mali_osk_timer_t), GFP_KERNEL); + _mali_osk_timer_t *t = tim; if (NULL != t) - timer_setup(&t->timer, + timer_setup(t, (void (*)(struct timer_list *))callback, 0); - return t; } void _mali_osk_timer_add(_mali_osk_timer_t *tim, unsigned long ticks_to_expire) { MALI_DEBUG_ASSERT_POINTER(tim); - tim->timer.expires = jiffies + ticks_to_expire; - add_timer(&(tim->timer)); + tim->expires = jiffies + ticks_to_expire; + add_timer(tim); } void _mali_osk_timer_mod(_mali_osk_timer_t *tim, unsigned long ticks_to_expire) { MALI_DEBUG_ASSERT_POINTER(tim); - mod_timer(&(tim->timer), jiffies + ticks_to_expire); + mod_timer(tim, jiffies + ticks_to_expire); } void _mali_osk_timer_del(_mali_osk_timer_t *tim) { MALI_DEBUG_ASSERT_POINTER(tim); - del_timer_sync(&(tim->timer)); + del_timer_sync(tim); } void _mali_osk_timer_del_async(_mali_osk_timer_t *tim) { MALI_DEBUG_ASSERT_POINTER(tim); - del_timer(&(tim->timer)); + del_timer(tim); } mali_bool _mali_osk_timer_pending(_mali_osk_timer_t *tim) { MALI_DEBUG_ASSERT_POINTER(tim); - return 1 == timer_pending(&(tim->timer)); + return 1 == timer_pending(tim); } -void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data) -{ - MALI_DEBUG_ASSERT_POINTER(tim); -} - -void _mali_osk_timer_term(_mali_osk_timer_t *tim) -{ - MALI_DEBUG_ASSERT_POINTER(tim); - kfree(tim); -} diff --git a/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c b/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c index 9a012fd..4c6e7f9 100644 --- a/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c +++ b/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c @@ -34,7 +34,10 @@ #include <linux/dma-mapping.h> #include <linux/pm_runtime.h> #include <linux/delay.h> +#include <linux/regmap.h> +#include <linux/mfd/syscon.h> #include <linux/rockchip/cpu.h> +#include <soc/rockchip/rockchip_ipa.h> #include <soc/rockchip/rockchip_opp_select.h> #include <linux/mali/mali_utgard.h> @@ -47,6 +50,7 @@ /*---------------------------------------------------------------------------*/ +#define RK3528_GPU_SD_SLP_HAST 0x10024 #define DEFAULT_UTILISATION_PERIOD_IN_MS (100) /* @@ -55,6 +59,7 @@ struct rk_context { /* mali device. */ struct device *dev; + struct regmap *grf; /* is the GPU powered on? */ bool is_powered; /* debug only, the period in ms to count gpu_utilisation. */ @@ -183,6 +188,10 @@ } platform->dev = dev; + platform->grf = syscon_regmap_lookup_by_phandle(dev->of_node, + "rockchip,grf"); + if (IS_ERR(platform->grf)) + platform->grf = NULL; platform->is_powered = false; platform->utilisation_period = DEFAULT_UTILISATION_PERIOD_IN_MS; @@ -232,73 +241,7 @@ static u32 static_coefficient; static s32 ts[4]; static struct thermal_zone_device *gpu_tz; - -static int power_model_simple_init(struct platform_device *pdev) -{ - struct device_node *power_model_node; - const char *tz_name; - u32 static_power, dynamic_power; - u32 voltage, voltage_squared, voltage_cubed, frequency; - - power_model_node = of_get_child_by_name(pdev->dev.of_node, - "power_model"); - if (!power_model_node) { - dev_err(&pdev->dev, "could not find power_model node\n"); - return -ENODEV; - } - if (!of_device_is_compatible(power_model_node, - "arm,mali-simple-power-model")) { - dev_err(&pdev->dev, "power_model incompatible with simple power model\n"); - return -ENODEV; - } - - if (of_property_read_string(power_model_node, "thermal-zone", - &tz_name)) { - dev_err(&pdev->dev, "ts in power_model not available\n"); - return -EINVAL; - } - - gpu_tz = thermal_zone_get_zone_by_name(tz_name); - if (IS_ERR(gpu_tz)) { - pr_warn_ratelimited("Error getting gpu thermal zone '%s'(%ld), not yet ready?\n", - tz_name, - PTR_ERR(gpu_tz)); - gpu_tz = NULL; - } - - if (of_property_read_u32(power_model_node, "static-power", - &static_power)) { - dev_err(&pdev->dev, "static-power in power_model not available\n"); - return -EINVAL; - } - if (of_property_read_u32(power_model_node, "dynamic-power", - &dynamic_power)) { - dev_err(&pdev->dev, "dynamic-power in power_model not available\n"); - return -EINVAL; - } - if (of_property_read_u32(power_model_node, "voltage", - &voltage)) { - dev_err(&pdev->dev, "voltage in power_model not available\n"); - return -EINVAL; - } - if (of_property_read_u32(power_model_node, "frequency", - &frequency)) { - dev_err(&pdev->dev, "frequency in power_model not available\n"); - return -EINVAL; - } - voltage_squared = (voltage * voltage) / 1000; - voltage_cubed = voltage * voltage * voltage; - static_coefficient = (static_power << 20) / (voltage_cubed >> 10); - dynamic_coefficient = (((dynamic_power * 1000) / voltage_squared) - * 1000) / frequency; - - if (of_property_read_u32_array(power_model_node, "ts", (u32 *)ts, 4)) { - dev_err(&pdev->dev, "ts in power_model not available\n"); - return -EINVAL; - } - - return 0; -} +static struct ipa_power_model_data *model_data; /* Calculate gpu static power example for reference */ static unsigned long rk_model_static_power(struct devfreq *devfreq, @@ -360,10 +303,107 @@ return dynamic_power; } -struct devfreq_cooling_power rk_cooling_ops = { +static struct devfreq_cooling_power rk_cooling_ops = { .get_static_power = rk_model_static_power, .get_dynamic_power = rk_model_dynamic_power, }; + +static unsigned long mali_devfreq_get_static_power(struct devfreq *devfreq, + unsigned long voltage) +{ + return rockchip_ipa_get_static_power(model_data, voltage); +} + +static int power_model_simple_init(struct platform_device *pdev) +{ + struct device_node *power_model_node; + const char *tz_name; + u32 static_power, dynamic_power; + u32 voltage, voltage_squared, voltage_cubed, frequency; + + if (of_find_compatible_node(pdev->dev.of_node, NULL, "simple-power-model")) { + of_property_read_u32(pdev->dev.of_node, + "dynamic-power-coefficient", + (u32 *)&rk_cooling_ops.dyn_power_coeff); + model_data = rockchip_ipa_power_model_init(&pdev->dev, + "gpu_leakage"); + if (IS_ERR_OR_NULL(model_data)) { + model_data = NULL; + dev_err(&pdev->dev, "failed to initialize power model\n"); + } else if (model_data->dynamic_coefficient) { + rk_cooling_ops.dyn_power_coeff = + model_data->dynamic_coefficient; + rk_cooling_ops.get_dynamic_power = NULL; + rk_cooling_ops.get_static_power = mali_devfreq_get_static_power; + } + if (!rk_cooling_ops.dyn_power_coeff) { + dev_err(&pdev->dev, "failed to get dynamic-coefficient\n"); + return -EINVAL; + } + + return 0; + } + + power_model_node = of_get_child_by_name(pdev->dev.of_node, + "power_model"); + if (!power_model_node) { + dev_err(&pdev->dev, "could not find power_model node\n"); + return -ENODEV; + } + if (!of_device_is_compatible(power_model_node, + "arm,mali-simple-power-model")) { + dev_err(&pdev->dev, "power_model incompatible with simple power model\n"); + return -ENODEV; + } + + if (of_property_read_string(power_model_node, "thermal-zone", + &tz_name)) { + dev_err(&pdev->dev, "ts in power_model not available\n"); + return -EINVAL; + } + + gpu_tz = thermal_zone_get_zone_by_name(tz_name); + if (IS_ERR(gpu_tz)) { + pr_warn_ratelimited("Error getting gpu thermal zone '%s'(%ld), not yet ready?\n", + tz_name, + PTR_ERR(gpu_tz)); + gpu_tz = NULL; + } + + if (of_property_read_u32(power_model_node, "static-power", + &static_power)) { + dev_err(&pdev->dev, "static-power in power_model not available\n"); + return -EINVAL; + } + if (of_property_read_u32(power_model_node, "dynamic-power", + &dynamic_power)) { + dev_err(&pdev->dev, "dynamic-power in power_model not available\n"); + return -EINVAL; + } + if (of_property_read_u32(power_model_node, "voltage", + &voltage)) { + dev_err(&pdev->dev, "voltage in power_model not available\n"); + return -EINVAL; + } + if (of_property_read_u32(power_model_node, "frequency", + &frequency)) { + dev_err(&pdev->dev, "frequency in power_model not available\n"); + return -EINVAL; + } + voltage_squared = (voltage * voltage) / 1000; + voltage_cubed = voltage * voltage * voltage; + static_coefficient = (static_power << 20) / (voltage_cubed >> 10); + dynamic_coefficient = (((dynamic_power * 1000) / voltage_squared) + * 1000) / frequency; + + if (of_property_read_u32_array(power_model_node, "ts", (u32 *)ts, 4)) { + dev_err(&pdev->dev, "ts in power_model not available\n"); + return -EINVAL; + } + + return 0; +} + #endif /*---------------------------------------------------------------------------*/ @@ -376,8 +416,7 @@ #if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK) struct mali_device *mdev = dev_get_drvdata(dev); - if (mdev->clock) - ret = clk_enable(mdev->clock); + ret = clk_bulk_enable(mdev->num_clks, mdev->clks); #endif return ret; } @@ -387,8 +426,7 @@ #if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK) struct mali_device *mdev = dev_get_drvdata(dev); - if (mdev->clock) - clk_disable(mdev->clock); + clk_bulk_disable(mdev->num_clks, mdev->clks); #endif } @@ -432,6 +470,18 @@ goto fail_to_enable_regulator; } + if (cpu_is_rk3528()) { +#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK) + struct mali_device *mdev = dev_get_drvdata(dev); + + clk_set_rate(mdev->clock, mdev->current_freq); +#endif + if (platform->grf) + regmap_write(platform->grf, + RK3528_GPU_SD_SLP_HAST, + 0xffff0000); + } + platform->is_powered = true; } @@ -449,6 +499,18 @@ struct rk_context *platform = s_rk_context; if (platform->is_powered) { + if (cpu_is_rk3528()) { +#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK) + struct mali_device *mdev = dev_get_drvdata(dev); + + //use normal pll 200M for gpu when suspend + clk_set_rate(mdev->clock, 200000000); +#endif + if (platform->grf) + regmap_write(platform->grf, + RK3528_GPU_SD_SLP_HAST, + 0xfffffffd); + } rk_platform_disable_clk_gpu(dev); rk_platform_disable_gpu_regulator(dev); diff --git a/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 40339d0..5fef2ba 100644 --- a/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -261,11 +261,9 @@ } /* Install the new fence list, seqcount provides the barriers */ - preempt_disable(); - write_seqcount_begin(&resv->seq); + write_seqlock(&resv->seq); RCU_INIT_POINTER(resv->fence, new); - write_seqcount_end(&resv->seq); - preempt_enable(); + write_sequnlock(&resv->seq); /* Drop the references to the removed fences or move them to ef_list */ for (i = j, k = 0; i < old->shared_count; ++i) { diff --git a/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index ed20d49..8f05fac 100644 --- a/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -47,8 +47,16 @@ const struct drm_display_mode *mode, unsigned int rate, unsigned int lanes) { + const struct drm_display_info *info; u32 max_bw, req_bw, bpp = 24; + if (dp->plat_data->skip_connector) + return true; + + info = &dp->connector.display_info; + if (info->bpc) + bpp = 3 * info->bpc; + req_bw = mode->clock * bpp / 8; max_bw = lanes * rate; if (req_bw > max_bw) diff --git a/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c index 5e966d5..7ea8132 100644 --- a/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c @@ -117,8 +117,6 @@ reg = CH3_AMP_400_MV | CH2_AMP_400_MV | CH1_AMP_400_MV | CH0_AMP_400_MV; analogix_dp_write(dp, ANALOGIX_DP_TX_AMP_TUNING_CTL, reg); - - analogix_dp_write(dp, ANALOGIX_DP_AUX, 0x4); } void analogix_dp_init_interrupt(struct analogix_dp_device *dp) diff --git a/kernel/drivers/gpu/drm/bridge/icn6211.c b/kernel/drivers/gpu/drm/bridge/icn6211.c deleted file mode 100644 index 9696376..0000000 --- a/kernel/drivers/gpu/drm/bridge/icn6211.c +++ /dev/null @@ -1,597 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (c) 2018 Rockchip Electronics Co. Ltd. - * - * Author: Wyon Bi <bivvy.bi@rock-chips.com> - */ - -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/clk.h> -#include <linux/gpio/consumer.h> -#include <linux/regulator/consumer.h> -#include <linux/i2c.h> -#include <linux/module.h> -#include <linux/of.h> -#include <linux/of_gpio.h> -#include <linux/regmap.h> - -#include <drm/drmP.h> -#include <drm/drm_of.h> -#include <drm/drm_atomic.h> -#include <drm/drm_crtc_helper.h> -#include <drm/drm_atomic_helper.h> -#include <drm/drm_panel.h> -#include <drm/drm_mipi_dsi.h> - -#define VENDOR_ID 0x0000 -#define DEVICE_ID_H 0x0001 -#define DEVICE_ID_L 0x0002 -#define VERSION_ID 0x0003 -#define FIRMWARE_VERSION 0x0008 -#define CONFIG_FINISH 0x0009 -#define PD_CTRL_0 0x000a -#define PD_CTRL_1 0x000b -#define PD_CTRL_2 0x000c -#define PD_CTRL_3 0x000d -#define RST_CTRL_0 0x000e -#define RST_CTRL_1 0x000f -#define SYS_CTRL_0 0x0010 -#define SYS_CTRL_1 0x0011 -#define SYS_CTRL_2 0x0012 -#define SYS_CTRL_3 0x0013 -#define SYS_CTRL_4 0x0014 -#define RGB_DRV_0 0x0018 -#define RGB_DRV_1 0x0019 -#define RGB_DRV_2 0x001a -#define RGB_DRV_3 0x001b -#define RGB_DLY_0 0x001c -#define RGB_DLY_1 0x001d -#define RGB_TEST_CTRL 0x001e -#define ATE_PLL_EN 0x001f -#define HACTIVE_L 0x0020 -#define VACTIVE_L 0x0021 -#define VACTIVE_HACTIVE_H 0x0022 -#define HFP_L 0x0023 -#define HSW_L 0x0024 -#define HBP_L 0x0025 -#define HFP_HSW_HBP_H 0x0026 -#define VFP 0x0027 -#define VSW 0x0028 -#define VBP 0x0029 -#define BIST_POL 0x002a -#define BIST_RED 0x002b -#define BIST_GREEN 0x002c -#define BIST_BLUE 0x002d -#define BIST_CHESS_X 0x002e -#define BIST_CHESS_Y 0x002f -#define BIST_CHESS_XY_H 0x0030 -#define BIST_FRAME_TIME_L 0x0031 -#define BIST_FRAME_TIME_H 0x0032 -#define FIFO_MAX_ADDR_LOW 0x0033 -#define SYNC_EVENT_DLY_LOW 0x0034 -#define HSW_MIN 0x0035 -#define HFP_MIN 0x0036 -#define LOGIC_RST_NUM 0x0037 -#define OSC_CTRL_0 0x0048 -#define OSC_CTRL_1 0x0049 -#define OSC_CTRL_2 0x004a -#define OSC_CTRL_3 0x004b -#define OSC_CTRL_4 0x004c -#define OSC_CTRL_5 0x004d -#define BG_CTRL 0x004e -#define LDO_PLL 0x004f -#define PLL_CTRL_0 0x0050 -#define PLL_CTRL_1 0x0051 -#define PLL_CTRL_2 0x0052 -#define PLL_CTRL_3 0x0053 -#define PLL_CTRL_4 0x0054 -#define PLL_CTRL_5 0x0055 -#define PLL_CTRL_6 0x0056 -#define PLL_CTRL_7 0x0057 -#define PLL_CTRL_8 0x0058 -#define PLL_CTRL_9 0x0059 -#define PLL_CTRL_A 0x005a -#define PLL_CTRL_B 0x005b -#define PLL_CTRL_C 0x005c -#define PLL_CTRL_D 0x005d -#define PLL_CTRL_E 0x005e -#define PLL_CTRL_F 0x005f -#define PLL_REM_0 0x0060 -#define PLL_REM_1 0x0061 -#define PLL_REM_2 0x0062 -#define PLL_DIV_0 0x0063 -#define PLL_DIV_1 0x0064 -#define PLL_DIV_2 0x0065 -#define PLL_FRAC_0 0x0066 -#define PLL_FRAC_1 0x0067 -#define PLL_FRAC_2 0x0068 -#define PLL_INT_0 0x0069 -#define PLL_INT_1 0x006a -#define PLL_REF_DIV 0x006b -#define PLL_SSC_P0 0x006c -#define PLL_SSC_P1 0x006d -#define PLL_SSC_P2 0x006e -#define PLL_SSC_STEP0 0x006f -#define PLL_SSC_STEP1 0x0070 -#define PLL_SSC_STEP2 0x0071 -#define PLL_SSC_OFFSET0 0x0072 -#define PLL_SSC_OFFSET1 0x0073 -#define PLL_SSC_OFFSET2 0x0074 -#define PLL_SSC_OFFSET3 0x0075 -#define GPIO_OEN 0x0079 -#define MIPI_CFG_PW 0x007a -#define GPIO_0_SEL 0x007b -#define GPIO_1_SEL 0x007c -#define IRQ_SEL 0x007d -#define DBG_SEL 0x007e -#define DBG_SIGNAL 0x007f -#define MIPI_ERR_VECTOR_L 0x0080 -#define MIPI_ERR_VECTOR_H 0x0081 -#define MIPI_ERR_VECTOR_EN_L 0x0082 -#define MIPI_ERR_VECTOR_EN_H 0x0083 -#define MIPI_MAX_SIZE_L 0x0084 -#define MIPI_MAX_SIZE_H 0x0085 -#define DSI_CTRL 0x0086 -#define MIPI_PN_SWAP 0x0087 -#define MIPI_SOT_SYNC_BIT_0 0x0088 -#define MIPI_SOT_SYNC_BIT_1 0x0089 -#define MIPI_ULPS_CTRL 0x008a -#define MIPI_CLK_CHK_VAR 0x008e -#define MIPI_CLK_CHK_INI 0x008f -#define MIPI_T_TERM_EN 0x0090 -#define MIPI_T_HS_SETTLE 0x0091 -#define MIPI_T_TA_SURE_PRE 0x0092 -#define MIPI_T_LPX_SET 0x0094 -#define MIPI_T_CLK_MISS 0x0095 -#define MIPI_INIT_TIME_L 0x0096 -#define MIPI_INIT_TIME_H 0x0097 -#define MIPI_T_CLK_TERM_EN 0x0099 -#define MIPI_T_CLK_SETTLE 0x009a -#define MIPI_TO_HS_RX_L 0x009e -#define MIPI_TO_HS_RX_H 0x009f -#define MIPI_PHY_0 0x00a0 -#define MIPI_PHY_1 0x00a1 -#define MIPI_PHY_2 0x00a2 -#define MIPI_PHY_3 0x00a3 -#define MIPI_PHY_4 0x00a4 -#define MIPI_PHY_5 0x00a5 -#define MIPI_PD_RX 0x00b0 -#define MIPI_PD_TERM 0x00b1 -#define MIPI_PD_HSRX 0x00b2 -#define MIPI_PD_LPTX 0x00b3 -#define MIPI_PD_LPRX 0x00b4 -#define MIPI_PD_CK_LANE 0x00b5 -#define MIPI_FORCE_0 0x00b6 -#define MIPI_RST_CTRL 0x00b7 -#define MIPI_RST_NUM 0x00b8 -#define MIPI_DBG_SET_0 0x00c0 -#define MIPI_DBG_SET_1 0x00c1 -#define MIPI_DBG_SET_2 0x00c2 -#define MIPI_DBG_SET_3 0x00c3 -#define MIPI_DBG_SET_4 0x00c4 -#define MIPI_DBG_SET_5 0x00c5 -#define MIPI_DBG_SET_6 0x00c6 -#define MIPI_DBG_SET_7 0x00c7 -#define MIPI_DBG_SET_8 0x00c8 -#define MIPI_DBG_SET_9 0x00c9 -#define MIPI_DBG_SEL 0x00e0 -#define MIPI_DBG_DATA 0x00e1 -#define MIPI_ATE_TEST_SEL 0x00e2 -#define MIPI_ATE_STATUS_0 0x00e3 -#define MIPI_ATE_STATUS_1 0x00e4 -#define ICN6211_MAX_REGISTER MIPI_ATE_STATUS_1 - -struct icn6211 { - struct drm_bridge base; - struct drm_connector connector; - struct drm_panel *panel; - struct drm_bridge *bridge; - struct drm_display_mode mode; - - struct device *dev; - struct i2c_client *client; - struct mipi_dsi_device dsi; - struct regmap *regmap; - struct clk *refclk; /* reference clock for RGB output clock */ - struct regulator *vdd1; /* MIPI RX power supply, can be 1.8V-3.3V */ - struct regulator *vdd2; /* PLL power supply, can be 1.8V-3.3V */ - struct regulator *vdd3; /* RGB output power supply, can be 1.8V-3.3V */ - struct gpio_desc *enable_gpio; /* When EN is low, this chip is reset */ -}; - -static inline struct icn6211 *bridge_to_icn6211(struct drm_bridge *b) -{ - return container_of(b, struct icn6211, base); -} - -static inline struct icn6211 *connector_to_icn6211(struct drm_connector *c) -{ - return container_of(c, struct icn6211, connector); -} - -static enum drm_connector_status -icn6211_connector_detect(struct drm_connector *connector, bool force) -{ - return connector_status_connected; -} - -static const struct drm_connector_funcs icn6211_connector_funcs = { - .dpms = drm_atomic_helper_connector_dpms, - .detect = icn6211_connector_detect, - .fill_modes = drm_helper_probe_single_connector_modes, - .destroy = drm_connector_cleanup, - .reset = drm_atomic_helper_connector_reset, - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, -}; - -static struct drm_encoder * -icn6211_connector_best_encoder(struct drm_connector *connector) -{ - struct icn6211 *icn6211 = connector_to_icn6211(connector); - - return icn6211->base.encoder; -} - -static int icn6211_connector_get_modes(struct drm_connector *connector) -{ - struct icn6211 *icn6211 = connector_to_icn6211(connector); - - return drm_panel_get_modes(icn6211->panel); -} - -static const struct drm_connector_helper_funcs -icn6211_connector_helper_funcs = { - .get_modes = icn6211_connector_get_modes, - .best_encoder = icn6211_connector_best_encoder, -}; - -static void icn6211_bridge_disable(struct drm_bridge *bridge) -{ - struct icn6211 *icn6211 = bridge_to_icn6211(bridge); - - if (icn6211->panel) - drm_panel_disable(icn6211->panel); -} - -static void icn6211_bridge_enable(struct drm_bridge *bridge) -{ - struct icn6211 *icn6211 = bridge_to_icn6211(bridge); - - if (icn6211->panel) - drm_panel_enable(icn6211->panel); -} - -static void icn6211_bridge_post_disable(struct drm_bridge *bridge) -{ - struct icn6211 *icn6211 = bridge_to_icn6211(bridge); - - if (icn6211->panel) - drm_panel_unprepare(icn6211->panel); - - if (icn6211->enable_gpio) - gpiod_direction_output(icn6211->enable_gpio, 0); - - regulator_disable(icn6211->vdd3); - regulator_disable(icn6211->vdd2); - regulator_disable(icn6211->vdd1); - - clk_disable_unprepare(icn6211->refclk); -} - -static void icn6211_bridge_pre_enable(struct drm_bridge *bridge) -{ - struct icn6211 *icn6211 = bridge_to_icn6211(bridge); - const struct drm_display_mode *mode = &icn6211->mode; - u32 hactive, hfp, hsw, hbp, vactive, vfp, vsw, vbp; - u8 hactive_l, hactive_h, hfp_l, hfp_h, hbp_l, hbp_h, hsw_l, hsw_h; - u8 vactive_l, vactive_h; - u32 device_id_h, device_id_l; - u32 pll_refdiv, pll_extra_div, pll_dv, pll_int; - unsigned long refclk = clk_get_rate(icn6211->refclk); - int ret; - - clk_prepare_enable(icn6211->refclk); - - ret = regulator_enable(icn6211->vdd1); - if (ret) - dev_err(icn6211->dev, - "failed to enable vdd1 supply: %d\n", ret); - - ret = regulator_enable(icn6211->vdd2); - if (ret) - dev_err(icn6211->dev, - "failed to enable vdd2 supply: %d\n", ret); - - ret = regulator_enable(icn6211->vdd3); - if (ret) - dev_err(icn6211->dev, - "failed to enable vdd3 supply: %d\n", ret); - - if (icn6211->enable_gpio) - gpiod_direction_output(icn6211->enable_gpio, 1); - - usleep_range(10000, 11000); - - regmap_read(icn6211->regmap, DEVICE_ID_H, &device_id_h); - regmap_read(icn6211->regmap, DEVICE_ID_L, &device_id_l); - dev_info(icn6211->dev, "The ID of device: 0x%04x\n", - (device_id_h << 8) | device_id_l); - - hactive = mode->hdisplay; - hfp = mode->hsync_start - mode->hdisplay; - hsw = mode->hsync_end - mode->hsync_start; - hbp = mode->htotal - mode->hsync_end; - vactive = mode->vdisplay; - vfp = mode->vsync_start - mode->vdisplay; - vsw = mode->vsync_end - mode->vsync_start; - vbp = mode->vtotal - mode->vsync_end; - - hactive_l = hactive & 0xff; - hactive_h = (hactive >> 8) & 0xf; - vactive_l = vactive & 0xff; - vactive_h = (vactive >> 8) & 0xf; - hfp_l = hfp & 0xff; - hfp_h = (hfp >> 8) & 0x3; - hsw_l = hsw & 0xff; - hsw_h = (hsw >> 8) & 0x3; - hbp_l = hbp & 0xff; - hbp_h = (hbp >> 8) & 0x3; - - regmap_write(icn6211->regmap, HACTIVE_L, hactive_l); - regmap_write(icn6211->regmap, VACTIVE_L, vactive_l); - regmap_write(icn6211->regmap, VACTIVE_HACTIVE_H, - (vactive_h << 4) | hactive_h); - regmap_write(icn6211->regmap, HFP_L, hfp_l); - regmap_write(icn6211->regmap, HSW_L, hsw_l); - regmap_write(icn6211->regmap, HBP_L, hbp_l); - regmap_write(icn6211->regmap, HFP_HSW_HBP_H, - (hfp_h << 4) | (hsw_h << 2) | hbp_h); - regmap_write(icn6211->regmap, VFP, vfp); - regmap_write(icn6211->regmap, VSW, vsw); - regmap_write(icn6211->regmap, VBP, vbp); - regmap_write(icn6211->regmap, SYNC_EVENT_DLY_LOW, 0x80); - regmap_write(icn6211->regmap, HFP_MIN, hfp); - regmap_write(icn6211->regmap, MIPI_PD_CK_LANE, 0xa0); - regmap_write(icn6211->regmap, PLL_CTRL_C, 0xff); - regmap_write(icn6211->regmap, BIST_POL, 0x01); - regmap_write(icn6211->regmap, PLL_CTRL_6, 0x90); - - /* - * FIXME: - * fout = fin / pll_refdiv / pll_extra_div * pll_int / pll_dv / 2 - */ - pll_refdiv = 1; - pll_extra_div = 2; - - if (mode->clock <= 44000) { - pll_dv = 8; - regmap_write(icn6211->regmap, PLL_REF_DIV, 0x71); - } else if (mode->clock <= 88000) { - pll_dv = 4; - regmap_write(icn6211->regmap, PLL_REF_DIV, 0x51); - } else { - pll_dv = 2; - regmap_write(icn6211->regmap, PLL_REF_DIV, 0x31); - } - - pll_int = DIV_ROUND_UP(mode->clock * 1000 * 2 * pll_dv, - refclk / pll_refdiv / pll_extra_div); - regmap_write(icn6211->regmap, PLL_INT_0, pll_int); - - dev_dbg(icn6211->dev, - "pll_refdiv=%d, pll_extra_div=%d, pll_int=%d, pll_dv=%d\n", - pll_refdiv, pll_extra_div, pll_int, pll_dv); - dev_dbg(icn6211->dev, "fin=%ld, fout=%ld\n", refclk, - refclk / pll_refdiv / pll_extra_div * pll_int / pll_dv / 2); - - /* - * TODO: - * RGB color swap mode - * RGB_SWAP 000 001 010 011 100 101 - * Group_0 Red Red Green Green Blue Blue - * Group_1 Green Blue Red Blue Red Green - * Group_2 Blue Green Blue Red Green Red - * - * Data bit order mode - * BIT_ORDER 000 001 010 011 100 101 - * Group_X[7] invalid invalid Color[5] Color[0] Color[7] Color[0] - * Group_X[6] invalid invalid Color[4] Color[1] Color[6] Color[1] - * Group_X[5] Color[5] Color[0] Color[3] Color[2] Color[5] Color[2] - * Group_X[4] Color[4] Color[1] Color[2] Color[3] Color[4] Color[3] - * Group_X[3] Color[3] Color[2] Color[1] Color[4] Color[3] Color[4] - * Group_X[2] Color[2] Color[3] Color[0] Color[5] Color[2] Color[5] - * Group_X[1] Color[1] Color[4] invaild invaild Color[1] Color[6] - * Group_X[0] Color[0] Color[5] invaild invaild Color[0] Color[7] - * - * Note: Group_0[7:0] = DATA[7:0] - * Group_1[7:0] = DATA[15:8] - * Group_2[7:0] = DATA[23:16] - */ - regmap_write(icn6211->regmap, SYS_CTRL_0, 0x45); - regmap_write(icn6211->regmap, SYS_CTRL_1, 0x88); - regmap_write(icn6211->regmap, MIPI_FORCE_0, 0x20); - regmap_write(icn6211->regmap, PLL_CTRL_1, 0x20); - regmap_write(icn6211->regmap, CONFIG_FINISH, 0x10); - - if (icn6211->panel) - drm_panel_prepare(icn6211->panel); -} - -static void icn6211_bridge_mode_set(struct drm_bridge *bridge, - struct drm_display_mode *mode, - struct drm_display_mode *adj) -{ - struct icn6211 *icn6211 = bridge_to_icn6211(bridge); - - drm_mode_copy(&icn6211->mode, adj); -} - -static int icn6211_bridge_attach(struct drm_bridge *bridge) -{ - struct icn6211 *icn6211 = bridge_to_icn6211(bridge); - struct drm_connector *connector = &icn6211->connector; - struct drm_device *drm = bridge->dev; - struct mipi_dsi_host *host = bridge->driver_private; - struct mipi_dsi_device *dsi = &icn6211->dsi; - int ret; - - dsi->lanes = 4; - dsi->channel = 0; - dsi->format = MIPI_DSI_FMT_RGB888; - dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | - MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET; - dsi->host = host; - - ret = mipi_dsi_attach(dsi); - if (ret) { - dev_err(icn6211->dev, "failed to attach dsi host: %d\n", ret); - return ret; - } - - if (icn6211->bridge) { - icn6211->bridge->encoder = bridge->encoder; - - ret = drm_bridge_attach(drm, icn6211->bridge); - if (ret) { - dev_err(icn6211->dev, - "failed to attach bridge: %d\n", ret); - return ret; - } - - bridge->next = icn6211->bridge; - } else { - ret = drm_connector_init(drm, connector, - &icn6211_connector_funcs, - DRM_MODE_CONNECTOR_DPI); - if (ret) { - dev_err(icn6211->dev, - "failed to initialize connector\n"); - return ret; - } - - drm_connector_helper_add(connector, - &icn6211_connector_helper_funcs); - drm_mode_connector_attach_encoder(connector, bridge->encoder); - drm_panel_attach(icn6211->panel, connector); - } - - return 0; -} - -static const struct drm_bridge_funcs icn6211_bridge_funcs = { - .attach = icn6211_bridge_attach, - .mode_set = icn6211_bridge_mode_set, - .pre_enable = icn6211_bridge_pre_enable, - .enable = icn6211_bridge_enable, - .disable = icn6211_bridge_disable, - .post_disable = icn6211_bridge_post_disable, -}; - -static const struct regmap_config icn6211_regmap_config = { - .name = "icn6211", - .reg_bits = 8, - .val_bits = 8, - .max_register = ICN6211_MAX_REGISTER, -}; - -static int icn6211_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct device *dev = &client->dev; - struct icn6211 *icn6211; - int ret; - - icn6211 = devm_kzalloc(dev, sizeof(*icn6211), GFP_KERNEL); - if (!icn6211) - return -ENOMEM; - - icn6211->dev = dev; - icn6211->client = client; - i2c_set_clientdata(client, icn6211); - - ret = drm_of_find_panel_or_bridge(dev->of_node, 1, -1, - &icn6211->panel, &icn6211->bridge); - if (ret) - return ret; - - icn6211->refclk = devm_clk_get(dev, "refclk"); - if (IS_ERR(icn6211->refclk)) { - ret = PTR_ERR(icn6211->refclk); - dev_err(dev, "failed to get ref clk: %d\n", ret); - return ret; - } - - icn6211->vdd1 = devm_regulator_get(dev, "vdd1"); - if (IS_ERR(icn6211->vdd1)) - return PTR_ERR(icn6211->vdd1); - - icn6211->vdd2 = devm_regulator_get(dev, "vdd2"); - if (IS_ERR(icn6211->vdd2)) - return PTR_ERR(icn6211->vdd2); - - icn6211->vdd3 = devm_regulator_get(dev, "vdd3"); - if (IS_ERR(icn6211->vdd3)) - return PTR_ERR(icn6211->vdd3); - - icn6211->enable_gpio = devm_gpiod_get_optional(dev, "enable", 0); - if (IS_ERR(icn6211->enable_gpio)) { - ret = PTR_ERR(icn6211->enable_gpio); - dev_err(dev, "failed to request enable GPIO: %d\n", ret); - return ret; - } - - icn6211->regmap = devm_regmap_init_i2c(client, &icn6211_regmap_config); - if (IS_ERR(icn6211->regmap)) { - ret = PTR_ERR(icn6211->regmap); - dev_err(dev, "failed to initialize regmap: %d\n", ret); - return ret; - } - - icn6211->base.funcs = &icn6211_bridge_funcs; - icn6211->base.of_node = dev->of_node; - ret = drm_bridge_add(&icn6211->base); - if (ret) { - dev_err(dev, "failed to add drm_bridge: %d\n", ret); - return ret; - } - - return 0; -} - -static int icn6211_i2c_remove(struct i2c_client *client) -{ - struct icn6211 *icn6211 = i2c_get_clientdata(client); - - drm_bridge_remove(&icn6211->base); - - return 0; -} - -static const struct i2c_device_id icn6211_i2c_table[] = { - { "icn6211", 0 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, icn6211_i2c_table); - -static const struct of_device_id icn6211_of_match[] = { - { .compatible = "chipone,icn6211" }, - {} -}; -MODULE_DEVICE_TABLE(of, icn6211_of_match); - -static struct i2c_driver icn6211_i2c_driver = { - .driver = { - .name = "icn6211", - .of_match_table = icn6211_of_match, - }, - .probe = icn6211_i2c_probe, - .remove = icn6211_i2c_remove, - .id_table = icn6211_i2c_table, -}; -module_i2c_driver(icn6211_i2c_driver); - -MODULE_AUTHOR("Wyon Bi <bivvy.bi@rock-chips.com>"); -MODULE_DESCRIPTION("Chipone ICN6211 MIPI-DSI to RGB bridge chip driver"); -MODULE_LICENSE("GPL v2"); diff --git a/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c b/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c index 8ae33c6..1908080 100644 --- a/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c +++ b/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c @@ -93,6 +93,8 @@ { 1920, 1080, 60, 4, 1 }, /* 1080P 24bit 60Hz 4lane 1port */ { 1920, 1080, 30, 3, 1 }, /* 1080P 24bit 30Hz 3lane 1port */ { 1920, 1080, 24, 3, 1 }, + { 1280, 720, 60, 4, 1 }, + { 1280, 720, 30, 4, 1 }, { 720, 480, 60, 4, 1 }, { 720, 576, 50, 2, 1 }, { 640, 480, 60, 2, 1 }, @@ -228,8 +230,14 @@ case 640: regmap_write(lt9611->regmap, 0x8326, 0x14); break; + case 1280: + regmap_write(lt9611->regmap, 0x8326, 0x1c); + break; case 1920: - regmap_write(lt9611->regmap, 0x8326, 0x37); + if (drm_mode_vrefresh(mode) == 30) + regmap_write(lt9611->regmap, 0x8326, 0x1c); + else + regmap_write(lt9611->regmap, 0x8326, 0x37); break; case 3840: regmap_multi_reg_write(lt9611->regmap, reg_cfg2, ARRAY_SIZE(reg_cfg2)); diff --git a/kernel/drivers/gpu/drm/bridge/lt8912.c b/kernel/drivers/gpu/drm/bridge/lt8912.c deleted file mode 100644 index db33c81..0000000 --- a/kernel/drivers/gpu/drm/bridge/lt8912.c +++ /dev/null @@ -1,484 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (c) 2018 Rockchip Electronics Co. Ltd. - */ - -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/gpio.h> -#include <linux/gpio/consumer.h> -#include <linux/i2c.h> -#include <linux/module.h> -#include <linux/of.h> -#include <linux/of_irq.h> -#include <linux/of_graph.h> -#include <linux/regmap.h> -#include <video/of_display_timing.h> - -#include <drm/drmP.h> -#include <drm/drm_of.h> -#include <drm/drm_atomic.h> -#include <drm/drm_crtc_helper.h> -#include <drm/drm_atomic_helper.h> -#include <drm/drm_panel.h> -#include <drm/drm_mipi_dsi.h> - -struct lt8912 { - struct drm_bridge bridge; - struct drm_connector connector; - struct drm_display_mode mode; - struct device *dev; - struct mipi_dsi_device *dsi; - struct regmap *regmap[3]; - struct gpio_desc *reset_n; -}; - -static inline struct lt8912 *bridge_to_lt8912(struct drm_bridge *b) -{ - return container_of(b, struct lt8912, bridge); -} - -static inline struct lt8912 *connector_to_lt8912(struct drm_connector *c) -{ - return container_of(c, struct lt8912, connector); -} - -/* LT8912 MIPI to HDMI & LVDS REG setting - 20180115.txt */ -static void lt8912_init(struct lt8912 *lt8912) -{ - u8 lanes = lt8912->dsi->lanes; - const struct drm_display_mode *mode = <8912->mode; - u32 hactive, hfp, hsync, hbp, vfp, vsync, vbp, htotal, vtotal; - unsigned int version[2]; - - /* TODO: lvds output init */ - - hactive = mode->hdisplay; - hfp = mode->hsync_start - mode->hdisplay; - hsync = mode->hsync_end - mode->hsync_start; - hbp = mode->htotal - mode->hsync_end; - vfp = mode->vsync_start - mode->vdisplay; - vsync = mode->vsync_end - mode->vsync_start; - vbp = mode->vtotal - mode->vsync_end; - htotal = mode->htotal; - vtotal = mode->vtotal; - - regmap_read(lt8912->regmap[0], 0x00, &version[0]); - regmap_read(lt8912->regmap[0], 0x01, &version[1]); - - dev_info(lt8912->dev, "LT8912 ID: %02x, %02x\n", - version[0], version[1]); - - /* DigitalClockEn */ - regmap_write(lt8912->regmap[0], 0x08, 0xff); - regmap_write(lt8912->regmap[0], 0x09, 0x81); - regmap_write(lt8912->regmap[0], 0x0a, 0xff); - regmap_write(lt8912->regmap[0], 0x0b, 0x64); - regmap_write(lt8912->regmap[0], 0x0c, 0xff); - - regmap_write(lt8912->regmap[0], 0x44, 0x31); - regmap_write(lt8912->regmap[0], 0x51, 0x1f); - - /* TxAnalog */ - regmap_write(lt8912->regmap[0], 0x31, 0xa1); - regmap_write(lt8912->regmap[0], 0x32, 0xa1); - regmap_write(lt8912->regmap[0], 0x33, 0x03); - regmap_write(lt8912->regmap[0], 0x37, 0x00); - regmap_write(lt8912->regmap[0], 0x38, 0x22); - regmap_write(lt8912->regmap[0], 0x60, 0x82); - - /* CbusAnalog */ - regmap_write(lt8912->regmap[0], 0x39, 0x45); - regmap_write(lt8912->regmap[0], 0x3b, 0x00); - - /* HDMIPllAnalog */ - regmap_write(lt8912->regmap[0], 0x44, 0x31); - regmap_write(lt8912->regmap[0], 0x55, 0x44); - regmap_write(lt8912->regmap[0], 0x57, 0x01); - regmap_write(lt8912->regmap[0], 0x5a, 0x02); - - /* MipiBasicSet */ - regmap_write(lt8912->regmap[1], 0x10, 0x01); - regmap_write(lt8912->regmap[1], 0x11, 0x08); - regmap_write(lt8912->regmap[1], 0x12, 0x04); - regmap_write(lt8912->regmap[1], 0x13, lanes % 4); - regmap_write(lt8912->regmap[1], 0x14, 0x00); - - regmap_write(lt8912->regmap[1], 0x15, 0x00); - regmap_write(lt8912->regmap[1], 0x1a, 0x03); - regmap_write(lt8912->regmap[1], 0x1b, 0x03); - - /* MIPIDig */ - regmap_write(lt8912->regmap[1], 0x18, hsync); - regmap_write(lt8912->regmap[1], 0x19, vsync); - regmap_write(lt8912->regmap[1], 0x1c, hactive); - regmap_write(lt8912->regmap[1], 0x1d, hactive >> 8); - - regmap_write(lt8912->regmap[1], 0x1e, 0x67); - regmap_write(lt8912->regmap[1], 0x2f, 0x0c); - - regmap_write(lt8912->regmap[1], 0x34, htotal); - regmap_write(lt8912->regmap[1], 0x35, htotal >> 8); - regmap_write(lt8912->regmap[1], 0x36, vtotal); - regmap_write(lt8912->regmap[1], 0x37, vtotal >> 8); - regmap_write(lt8912->regmap[1], 0x38, vbp); - regmap_write(lt8912->regmap[1], 0x39, vbp >> 8); - regmap_write(lt8912->regmap[1], 0x3a, vfp); - regmap_write(lt8912->regmap[1], 0x3b, vfp >> 8); - regmap_write(lt8912->regmap[1], 0x3c, hbp); - regmap_write(lt8912->regmap[1], 0x3d, hbp >> 8); - regmap_write(lt8912->regmap[1], 0x3e, hfp); - regmap_write(lt8912->regmap[1], 0x3f, hfp >> 8); - - /* DDSConfig */ - regmap_write(lt8912->regmap[1], 0x4e, 0x52); - regmap_write(lt8912->regmap[1], 0x4f, 0xde); - regmap_write(lt8912->regmap[1], 0x50, 0xc0); - regmap_write(lt8912->regmap[1], 0x51, 0x80); - regmap_write(lt8912->regmap[1], 0x51, 0x00); - - regmap_write(lt8912->regmap[1], 0x1f, 0x5e); - regmap_write(lt8912->regmap[1], 0x20, 0x01); - regmap_write(lt8912->regmap[1], 0x21, 0x2c); - regmap_write(lt8912->regmap[1], 0x22, 0x01); - regmap_write(lt8912->regmap[1], 0x23, 0xfa); - regmap_write(lt8912->regmap[1], 0x24, 0x00); - regmap_write(lt8912->regmap[1], 0x25, 0xc8); - regmap_write(lt8912->regmap[1], 0x26, 0x00); - regmap_write(lt8912->regmap[1], 0x27, 0x5e); - regmap_write(lt8912->regmap[1], 0x28, 0x01); - regmap_write(lt8912->regmap[1], 0x29, 0x2c); - regmap_write(lt8912->regmap[1], 0x2a, 0x01); - regmap_write(lt8912->regmap[1], 0x2b, 0xfa); - regmap_write(lt8912->regmap[1], 0x2c, 0x00); - regmap_write(lt8912->regmap[1], 0x2d, 0xc8); - regmap_write(lt8912->regmap[1], 0x2e, 0x00); - - regmap_write(lt8912->regmap[0], 0x03, 0x7f); - usleep_range(10000, 20000); - regmap_write(lt8912->regmap[0], 0x03, 0xff); - - regmap_write(lt8912->regmap[1], 0x42, 0x64); - regmap_write(lt8912->regmap[1], 0x43, 0x00); - regmap_write(lt8912->regmap[1], 0x44, 0x04); - regmap_write(lt8912->regmap[1], 0x45, 0x00); - regmap_write(lt8912->regmap[1], 0x46, 0x59); - regmap_write(lt8912->regmap[1], 0x47, 0x00); - regmap_write(lt8912->regmap[1], 0x48, 0xf2); - regmap_write(lt8912->regmap[1], 0x49, 0x06); - regmap_write(lt8912->regmap[1], 0x4a, 0x00); - regmap_write(lt8912->regmap[1], 0x4b, 0x72); - regmap_write(lt8912->regmap[1], 0x4c, 0x45); - regmap_write(lt8912->regmap[1], 0x4d, 0x00); - regmap_write(lt8912->regmap[1], 0x52, 0x08); - regmap_write(lt8912->regmap[1], 0x53, 0x00); - regmap_write(lt8912->regmap[1], 0x54, 0xb2); - regmap_write(lt8912->regmap[1], 0x55, 0x00); - regmap_write(lt8912->regmap[1], 0x56, 0xe4); - regmap_write(lt8912->regmap[1], 0x57, 0x0d); - regmap_write(lt8912->regmap[1], 0x58, 0x00); - regmap_write(lt8912->regmap[1], 0x59, 0xe4); - regmap_write(lt8912->regmap[1], 0x5a, 0x8a); - regmap_write(lt8912->regmap[1], 0x5b, 0x00); - regmap_write(lt8912->regmap[1], 0x5c, 0x34); - regmap_write(lt8912->regmap[1], 0x1e, 0x4f); - regmap_write(lt8912->regmap[1], 0x51, 0x00); - - regmap_write(lt8912->regmap[0], 0xb2, 0x01); - - /* AudioIIsEn */ - regmap_write(lt8912->regmap[2], 0x06, 0x08); - regmap_write(lt8912->regmap[2], 0x07, 0xf0); - - regmap_write(lt8912->regmap[2], 0x34, 0xd2); - - regmap_write(lt8912->regmap[2], 0x3c, 0x41); - - /* MIPIRxLogicRes */ - regmap_write(lt8912->regmap[0], 0x03, 0x7f); - usleep_range(10000, 20000); - regmap_write(lt8912->regmap[0], 0x03, 0xff); - - regmap_write(lt8912->regmap[1], 0x51, 0x80); - usleep_range(10000, 20000); - regmap_write(lt8912->regmap[1], 0x51, 0x00); -} - -static void lt8912_exit(struct lt8912 *lt8912) -{ - regmap_write(lt8912->regmap[0], 0x08, 0x00); - regmap_write(lt8912->regmap[0], 0x09, 0x81); - regmap_write(lt8912->regmap[0], 0x0a, 0x00); - regmap_write(lt8912->regmap[0], 0x0b, 0x20); - regmap_write(lt8912->regmap[0], 0x0c, 0x00); - - regmap_write(lt8912->regmap[0], 0x54, 0x1d); - regmap_write(lt8912->regmap[0], 0x51, 0x15); - - regmap_write(lt8912->regmap[0], 0x44, 0x31); - regmap_write(lt8912->regmap[0], 0x41, 0xbd); - regmap_write(lt8912->regmap[0], 0x5c, 0x11); - - regmap_write(lt8912->regmap[0], 0x30, 0x08); - regmap_write(lt8912->regmap[0], 0x31, 0x00); - regmap_write(lt8912->regmap[0], 0x32, 0x00); - regmap_write(lt8912->regmap[0], 0x33, 0x00); - regmap_write(lt8912->regmap[0], 0x34, 0x00); - regmap_write(lt8912->regmap[0], 0x35, 0x00); - regmap_write(lt8912->regmap[0], 0x36, 0x00); - regmap_write(lt8912->regmap[0], 0x37, 0x00); - regmap_write(lt8912->regmap[0], 0x38, 0x00); -} - -static void lt8912_power_on(struct lt8912 *lt8912) -{ - gpiod_direction_output(lt8912->reset_n, 1); - msleep(120); - gpiod_direction_output(lt8912->reset_n, 0); -} - -static void lt8912_power_off(struct lt8912 *lt8912) -{ - gpiod_direction_output(lt8912->reset_n, 1); -} - -static enum drm_connector_status -lt8912_connector_detect(struct drm_connector *connector, bool force) -{ - /* TODO: HPD handing (reg[0xc1] - bit[7]) */ - return connector_status_connected; -} - -static const struct drm_connector_funcs lt8912_connector_funcs = { - .dpms = drm_atomic_helper_connector_dpms, - .detect = lt8912_connector_detect, - .fill_modes = drm_helper_probe_single_connector_modes, - .destroy = drm_connector_cleanup, - .reset = drm_atomic_helper_connector_reset, - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, -}; - -static struct drm_encoder * -lt8912_connector_best_encoder(struct drm_connector *connector) -{ - struct lt8912 *lt8912 = connector_to_lt8912(connector); - - return lt8912->bridge.encoder; -} - -static int lt8912_connector_get_modes(struct drm_connector *connector) -{ - int num_modes = 0; - - num_modes = drm_add_modes_noedid(connector, 1920, 1080); - drm_set_preferred_mode(connector, 1920, 1080); - - return num_modes; -} - -static const struct drm_connector_helper_funcs lt8912_connector_helper_funcs = { - .get_modes = lt8912_connector_get_modes, - .best_encoder = lt8912_connector_best_encoder, -}; - -static void lt8912_bridge_post_disable(struct drm_bridge *bridge) -{ - struct lt8912 *lt8912 = bridge_to_lt8912(bridge); - - lt8912_power_off(lt8912); -} - -static void lt8912_bridge_disable(struct drm_bridge *bridge) -{ - struct lt8912 *lt8912 = bridge_to_lt8912(bridge); - - lt8912_exit(lt8912); -} - -static void lt8912_bridge_enable(struct drm_bridge *bridge) -{ - struct lt8912 *lt8912 = bridge_to_lt8912(bridge); - - lt8912_init(lt8912); -} - -static void lt8912_bridge_pre_enable(struct drm_bridge *bridge) -{ - struct lt8912 *lt8912 = bridge_to_lt8912(bridge); - - lt8912_power_on(lt8912); -} - -static void lt8912_bridge_mode_set(struct drm_bridge *bridge, - struct drm_display_mode *mode, - struct drm_display_mode *adj) -{ - struct lt8912 *lt8912 = bridge_to_lt8912(bridge); - - drm_mode_copy(<8912->mode, adj); -} - -static int lt8912_bridge_attach(struct drm_bridge *bridge) -{ - struct lt8912 *lt8912 = bridge_to_lt8912(bridge); - struct drm_connector *connector = <8912->connector; - int ret; - - ret = drm_connector_init(bridge->dev, connector, - <8912_connector_funcs, - DRM_MODE_CONNECTOR_HDMIA); - if (ret) { - dev_err(lt8912->dev, "failed to initialize connector\n"); - return ret; - } - - drm_connector_helper_add(connector, <8912_connector_helper_funcs); - drm_mode_connector_attach_encoder(connector, bridge->encoder); - - return 0; -} - -static const struct drm_bridge_funcs lt8912_bridge_funcs = { - .attach = lt8912_bridge_attach, - .mode_set = lt8912_bridge_mode_set, - .pre_enable = lt8912_bridge_pre_enable, - .enable = lt8912_bridge_enable, - .disable = lt8912_bridge_disable, - .post_disable = lt8912_bridge_post_disable, -}; - -static const struct regmap_config lt8912_regmap_config = { - .reg_bits = 8, - .val_bits = 8, - .max_register = 0xff, -}; - -static int lt8912_i2c_init(struct lt8912 *lt8912, - struct i2c_adapter *adapter) -{ - struct i2c_board_info info[] = { - { I2C_BOARD_INFO("lt8912p0", 0x48), }, - { I2C_BOARD_INFO("lt8912p1", 0x49), }, - { I2C_BOARD_INFO("lt8912p2", 0x4a), } - }; - struct regmap *regmap; - unsigned int i; - int ret; - - for (i = 0; i < ARRAY_SIZE(info); i++) { - struct i2c_client *client; - - client = i2c_new_device(adapter, &info[i]); - if (!client) - return -ENODEV; - - regmap = devm_regmap_init_i2c(client, <8912_regmap_config); - if (IS_ERR(regmap)) { - ret = PTR_ERR(regmap); - dev_err(lt8912->dev, - "Failed to initialize regmap: %d\n", ret); - return ret; - } - - lt8912->regmap[i] = regmap; - } - - return 0; -} - -static int lt8912_probe(struct mipi_dsi_device *dsi) -{ - struct device *dev = &dsi->dev; - struct lt8912 *lt8912; - struct device_node *node; - struct i2c_adapter *adapter; - int ret; - - lt8912 = devm_kzalloc(dev, sizeof(*lt8912), GFP_KERNEL); - if (!lt8912) - return -ENOMEM; - - lt8912->dev = dev; - lt8912->dsi = dsi; - mipi_dsi_set_drvdata(dsi, lt8912); - - lt8912->reset_n = devm_gpiod_get(dev, "reset", GPIOD_ASIS); - if (IS_ERR(lt8912->reset_n)) { - ret = PTR_ERR(lt8912->reset_n); - dev_err(dev, "failed to request reset GPIO: %d\n", ret); - return ret; - } - - node = of_parse_phandle(dev->of_node, "i2c-bus", 0); - if (!node) { - dev_err(dev, "No i2c-bus found\n"); - return -ENODEV; - } - - adapter = of_find_i2c_adapter_by_node(node); - of_node_put(node); - if (!adapter) { - dev_err(dev, "No i2c adapter found\n"); - return -EPROBE_DEFER; - } - - ret = lt8912_i2c_init(lt8912, adapter); - if (ret) - return ret; - - /* TODO: interrupt handing */ - - lt8912->bridge.funcs = <8912_bridge_funcs; - lt8912->bridge.of_node = dev->of_node; - ret = drm_bridge_add(<8912->bridge); - if (ret) { - dev_err(dev, "failed to add bridge: %d\n", ret); - return ret; - } - - dsi->lanes = 4; - dsi->format = MIPI_DSI_FMT_RGB888; - dsi->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; - - ret = mipi_dsi_attach(dsi); - if (ret) { - drm_bridge_remove(<8912->bridge); - dev_err(dev, "failed to attach dsi to host: %d\n", ret); - return ret; - } - - return 0; -} - -static int lt8912_remove(struct mipi_dsi_device *dsi) -{ - struct lt8912 *lt8912 = mipi_dsi_get_drvdata(dsi); - - mipi_dsi_detach(dsi); - drm_bridge_remove(<8912->bridge); - - return 0; -} - -static const struct of_device_id lt8912_of_match[] = { - { .compatible = "lontium,lt8912" }, - {} -}; -MODULE_DEVICE_TABLE(of, lt8912_of_match); - -static struct mipi_dsi_driver lt8912_driver = { - .driver = { - .name = "lt8912", - .of_match_table = lt8912_of_match, - }, - .probe = lt8912_probe, - .remove = lt8912_remove, -}; -module_mipi_dsi_driver(lt8912_driver); - -MODULE_AUTHOR("Wyon Bi <bivvy.bi@rock-chips.com>"); -MODULE_DESCRIPTION("Lontium LT8912 MIPI-DSI to LVDS and HDMI/MHL bridge"); -MODULE_LICENSE("GPL v2"); diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c index 6c32351..993f525 100644 --- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c +++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c @@ -7,8 +7,10 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#include <linux/input.h> #include <linux/interrupt.h> #include <linux/io.h> +#include <linux/miscdevice.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/sched.h> @@ -24,8 +26,11 @@ enum { HDMI_IH_CEC_STAT0 = 0x0106, HDMI_IH_MUTE_CEC_STAT0 = 0x0186, + HDMI_IH_MUTE = 0x01ff, HDMI_CEC_CTRL = 0x7d00, + CEC_TRANS_MASK = 0x7, + CEC_CTRL_STANDBY = BIT(4), CEC_CTRL_START = BIT(0), CEC_CTRL_FRAME_TYP = 3 << 1, CEC_CTRL_RETRY = 0 << 1, @@ -50,12 +55,15 @@ HDMI_CEC_RX_CNT = 0x7d08, HDMI_CEC_TX_DATA0 = 0x7d10, HDMI_CEC_RX_DATA0 = 0x7d20, + HDMI_CEC_RX_DATA1 = 0x7d21, HDMI_CEC_LOCK = 0x7d30, HDMI_CEC_WKUPCTRL = 0x7d31, }; struct dw_hdmi_cec { + struct device *dev; struct dw_hdmi *hdmi; + struct miscdevice misc_dev; const struct dw_hdmi_cec_ops *ops; u32 addresses; struct cec_adapter *adap; @@ -64,7 +72,12 @@ bool tx_done; bool rx_done; struct cec_notifier *notify; + struct input_dev *devinput; int irq; + int wake_irq; + bool wake_en; + bool standby_en; + struct mutex wake_lock; }; static void dw_hdmi_write(struct dw_hdmi_cec *cec, u8 val, int offset) @@ -75,6 +88,11 @@ static u8 dw_hdmi_read(struct dw_hdmi_cec *cec, int offset) { return cec->ops->read(cec->hdmi, offset); +} + +static void dw_hdmi_mod(struct dw_hdmi_cec *cec, unsigned int offset, u8 mask, u8 val) +{ + cec->ops->mod(cec->hdmi, val, mask, offset); } static int dw_hdmi_cec_log_addr(struct cec_adapter *adap, u8 logical_addr) @@ -115,7 +133,7 @@ dw_hdmi_write(cec, msg->msg[i], HDMI_CEC_TX_DATA0 + i); dw_hdmi_write(cec, msg->len, HDMI_CEC_TX_CNT); - dw_hdmi_write(cec, ctrl | CEC_CTRL_START, HDMI_CEC_CTRL); + dw_hdmi_mod(cec, HDMI_CEC_CTRL, CEC_TRANS_MASK, ctrl | CEC_CTRL_START); return 0; } @@ -191,19 +209,27 @@ struct dw_hdmi_cec *cec = cec_get_drvdata(adap); if (!enable) { - dw_hdmi_write(cec, ~0, HDMI_CEC_MASK); - dw_hdmi_write(cec, ~0, HDMI_IH_MUTE_CEC_STAT0); dw_hdmi_write(cec, 0, HDMI_CEC_POLARITY); - cec->ops->disable(cec->hdmi); + if (cec->wake_en && cec->standby_en) { + dw_hdmi_write(cec, 0xff, HDMI_IH_CEC_STAT0); + dw_hdmi_mod(cec, HDMI_CEC_CTRL, CEC_CTRL_STANDBY, CEC_CTRL_STANDBY); + dw_hdmi_write(cec, 0, HDMI_CEC_LOCK); + dw_hdmi_write(cec, 0xff, HDMI_CEC_WKUPCTRL); + dw_hdmi_write(cec, ~(1 << 6), HDMI_CEC_MASK); + dw_hdmi_write(cec, ~(1 << 6), HDMI_IH_MUTE_CEC_STAT0); + dw_hdmi_write(cec, 0x01, HDMI_IH_MUTE); + } else { + cec->ops->disable(cec->hdmi); + } } else { unsigned int irqs; - dw_hdmi_write(cec, 0, HDMI_CEC_CTRL); + dw_hdmi_cec_log_addr(cec->adap, CEC_LOG_ADDR_INVALID); + dw_hdmi_mod(cec, HDMI_CEC_CTRL, CEC_CTRL_STANDBY, 0); + dw_hdmi_write(cec, 0x02, HDMI_IH_MUTE); dw_hdmi_write(cec, ~0, HDMI_IH_CEC_STAT0); dw_hdmi_write(cec, 0, HDMI_CEC_LOCK); - - dw_hdmi_cec_log_addr(cec->adap, CEC_LOG_ADDR_INVALID); cec->ops->enable(cec->hdmi); @@ -229,6 +255,170 @@ cec_delete_adapter(cec->adap); } +static irqreturn_t dw_hdmi_cec_wake_irq(int irq, void *data) +{ + struct cec_adapter *adap = data; + struct dw_hdmi_cec *cec = cec_get_drvdata(adap); + u8 cec_int; + + cec_int = dw_hdmi_read(cec, HDMI_IH_CEC_STAT0); + if (!cec_int) + return IRQ_NONE; + + dw_hdmi_write(cec, 0x02, HDMI_IH_MUTE); + dw_hdmi_write(cec, cec_int, HDMI_IH_CEC_STAT0); + dw_hdmi_write(cec, 0x00, HDMI_CEC_WKUPCTRL); + + if (!cec->wake_en) + return IRQ_HANDLED; + + return IRQ_WAKE_THREAD; +} + +static irqreturn_t dw_hdmi_cec_wake_thread(int irq, void *data) +{ + struct cec_adapter *adap = data; + struct dw_hdmi_cec *cec = cec_get_drvdata(adap); + + mutex_lock(&cec->wake_lock); + + if (!cec->standby_en) { + mutex_unlock(&cec->wake_lock); + return IRQ_HANDLED; + } + cec->standby_en = false; + + dev_dbg(cec->dev, "wakeup opcode:0x%x\n", dw_hdmi_read(cec, HDMI_CEC_RX_DATA1)); + input_event(cec->devinput, EV_KEY, KEY_POWER, 1); + input_sync(cec->devinput); + input_event(cec->devinput, EV_KEY, KEY_POWER, 0); + input_sync(cec->devinput); + mutex_unlock(&cec->wake_lock); + + return IRQ_HANDLED; +} + +static int rockchip_hdmi_cec_input_init(struct dw_hdmi_cec *cec) +{ + int err; + + cec->devinput = devm_input_allocate_device(cec->dev); + if (!cec->devinput) + return -EPERM; + + cec->devinput->name = "hdmi_cec_key"; + cec->devinput->phys = "hdmi_cec_key/input0"; + cec->devinput->id.bustype = BUS_HOST; + cec->devinput->id.vendor = 0x0001; + cec->devinput->id.product = 0x0001; + cec->devinput->id.version = 0x0100; + + err = input_register_device(cec->devinput); + if (err < 0) { + input_free_device(cec->devinput); + return err; + } + input_set_capability(cec->devinput, EV_KEY, KEY_POWER); + + return 0; +} + +static long cec_standby(struct cec_adapter *adap, __u8 __user *parg) +{ + u8 en; + int ret; + struct dw_hdmi_cec *cec = cec_get_drvdata(adap); + + mutex_lock(&cec->wake_lock); + if (copy_from_user(&en, parg, sizeof(en))) { + mutex_unlock(&cec->wake_lock); + return -EFAULT; + } + + cec->standby_en = !en; + ret = adap->ops->adap_enable(adap, en); + mutex_unlock(&cec->wake_lock); + + return ret; +} + +static long cec_func_en(struct dw_hdmi_cec *cec, int __user *parg) +{ + int en_mask; + + if (copy_from_user(&en_mask, parg, sizeof(en_mask))) + return -EFAULT; + + cec->wake_en = (en_mask & CEC_EN) && (en_mask & CEC_WAKE); + + return 0; +} + +static long dw_hdmi_cec_ioctl(struct file *f, unsigned int cmd, unsigned long arg) +{ + struct dw_hdmi_cec *cec; + struct miscdevice *misc_dev; + void __user *data; + + if (!f) + return -EFAULT; + + misc_dev = f->private_data; + cec = container_of(misc_dev, struct dw_hdmi_cec, misc_dev); + data = (void __user *)arg; + + switch (cmd) { + case CEC_STANDBY: + return cec_standby(cec->adap, data); + case CEC_FUNC_EN: + return cec_func_en(cec, data); + default: + return -EINVAL; + } + + return -ENOTTY; +} + +static int dw_hdmi_cec_open(struct inode *inode, struct file *f) +{ + return 0; +} + +static int dw_hdmi_cec_release(struct inode *inode, struct file *f) +{ + return 0; +} + +static const struct file_operations dw_hdmi_cec_file_operations = { + .compat_ioctl = dw_hdmi_cec_ioctl, + .unlocked_ioctl = dw_hdmi_cec_ioctl, + .open = dw_hdmi_cec_open, + .release = dw_hdmi_cec_release, + .owner = THIS_MODULE, +}; + +void dw_hdmi_hpd_wake_up(struct platform_device *pdev) +{ + struct dw_hdmi_cec *cec = platform_get_drvdata(pdev); + + mutex_lock(&cec->wake_lock); + + if (!cec->standby_en) { + mutex_unlock(&cec->wake_lock); + return; + } + cec->standby_en = false; + + dw_hdmi_write(cec, 0x02, HDMI_IH_MUTE); + + input_event(cec->devinput, EV_KEY, KEY_POWER, 1); + input_sync(cec->devinput); + input_event(cec->devinput, EV_KEY, KEY_POWER, 0); + input_sync(cec->devinput); + mutex_unlock(&cec->wake_lock); +} +EXPORT_SYMBOL_GPL(dw_hdmi_hpd_wake_up); + static int dw_hdmi_cec_probe(struct platform_device *pdev) { struct dw_hdmi_cec_data *data = dev_get_platdata(&pdev->dev); @@ -247,9 +437,13 @@ if (!cec) return -ENOMEM; + cec->dev = &pdev->dev; cec->irq = data->irq; + cec->wake_irq = data->wake_irq; cec->ops = data->ops; cec->hdmi = data->hdmi; + + mutex_init(&cec->wake_lock); platform_set_drvdata(pdev, cec); @@ -276,10 +470,26 @@ ret = devm_request_threaded_irq(&pdev->dev, cec->irq, dw_hdmi_cec_hardirq, - dw_hdmi_cec_thread, IRQF_SHARED, + dw_hdmi_cec_thread, IRQF_SHARED | IRQF_ONESHOT, "dw-hdmi-cec", cec->adap); if (ret < 0) return ret; + + if (cec->wake_irq > 0) { + ret = devm_request_threaded_irq(&pdev->dev, cec->wake_irq, + dw_hdmi_cec_wake_irq, + dw_hdmi_cec_wake_thread, + IRQF_TRIGGER_HIGH | IRQF_ONESHOT, + "cec-wakeup", cec->adap); + if (ret) { + dev_err(&pdev->dev, + "hdmi_cec request_irq failed (%d).\n", + ret); + return ret; + } + device_init_wakeup(&pdev->dev, 1); + enable_irq_wake(cec->wake_irq); + } cec->notify = cec_notifier_get(pdev->dev.parent); if (!cec->notify) @@ -298,8 +508,18 @@ devm_remove_action(&pdev->dev, dw_hdmi_cec_del, cec); cec_register_cec_notifier(cec->adap, cec->notify); + rockchip_hdmi_cec_input_init(cec); - return 0; + cec->misc_dev.name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "rk_cec"); + if (!cec->misc_dev.name) + return -ENOMEM; + cec->misc_dev.minor = MISC_DYNAMIC_MINOR; + cec->misc_dev.fops = &dw_hdmi_cec_file_operations; + cec->misc_dev.mode = 0666; + + ret = misc_register(&cec->misc_dev); + + return ret; } static int dw_hdmi_cec_remove(struct platform_device *pdev) @@ -308,6 +528,7 @@ cec_unregister_adapter(cec->adap); cec_notifier_put(cec->notify); + misc_deregister(&cec->misc_dev); return 0; } diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h index cf4dc12..ec10660 100644 --- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h +++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h @@ -3,17 +3,24 @@ struct dw_hdmi; +#define CEC_EN BIT(0) +#define CEC_WAKE BIT(1) + struct dw_hdmi_cec_ops { void (*write)(struct dw_hdmi *hdmi, u8 val, int offset); u8 (*read)(struct dw_hdmi *hdmi, int offset); void (*enable)(struct dw_hdmi *hdmi); void (*disable)(struct dw_hdmi *hdmi); + void (*mod)(struct dw_hdmi *hdmi, u8 data, u8 mask, unsigned int reg); }; struct dw_hdmi_cec_data { struct dw_hdmi *hdmi; const struct dw_hdmi_cec_ops *ops; int irq; + int wake_irq; }; +void dw_hdmi_hpd_wake_up(struct platform_device *pdev); + #endif diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c index 507cb76..6127d19 100644 --- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c +++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c @@ -51,6 +51,8 @@ u8 inputclkfs = 0; u8 val; + dw_hdmi_audio_disable(hdmi); + /* it cares I2S only */ if ((fmt->fmt != HDMI_I2S) || (fmt->bit_clk_master | fmt->frame_clk_master)) { @@ -202,21 +204,6 @@ return 0; } -static void dw_hdmi_i2s_audio_shutdown(struct device *dev, void *data) -{ - struct dw_hdmi_i2s_audio_data *audio = data; - struct dw_hdmi *hdmi = audio->hdmi; - - dw_hdmi_audio_disable(hdmi); - - hdmi_update_bits(audio, - HDMI_AUD_CONF0_SW_RESET, - HDMI_AUD_CONF0_SW_RESET | - (HDMI_AUD_CONF0_I2S_ALL_ENABLE ^ - HDMI_AUD_CONF0_I2S_SELECT_MASK), - HDMI_AUD_CONF0); -} - static int dw_hdmi_i2s_get_dai_id(struct snd_soc_component *component, struct device_node *endpoint) { @@ -249,7 +236,6 @@ static struct hdmi_codec_ops dw_hdmi_i2s_ops = { .hw_params = dw_hdmi_i2s_hw_params, - .audio_shutdown = dw_hdmi_i2s_audio_shutdown, .get_dai_id = dw_hdmi_i2s_get_dai_id, .hook_plugged_cb = dw_hdmi_i2s_hook_plugged_cb, }; diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index ee7f83a..7ba60fb 100644 --- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -49,6 +49,7 @@ #define DDC_SEGMENT_ADDR 0x30 #define HDMI_EDID_LEN 512 +#define HDMI_EDID_BLOCK_LEN 128 /* DW-HDMI Controller >= 0x200a are at least compliant with SCDC version 1 */ #define SCDC_MIN_SOURCE_VERSION 0x1 @@ -320,6 +321,7 @@ struct drm_display_mode previous_mode; struct i2c_adapter *ddc; + struct cec_adapter *cec_adap; void __iomem *regs; bool sink_is_hdmi; bool sink_has_audio; @@ -358,10 +360,13 @@ struct cec_notifier *cec_notifier; bool initialized; /* hdmi is enabled before bind */ + bool logo_plug_out; /* hdmi is plug out when kernel logo */ hdmi_codec_plugged_cb plugged_cb; struct device *codec_dev; enum drm_connector_status last_connector_result; bool rgb_quant_range_selectable; + bool update; + bool hdr2sdr; /* from hdr to sdr */ }; #define HDMI_IH_PHY_STAT0_RX_SENSE \ @@ -456,10 +461,11 @@ change = drm_helper_hpd_irq_event(hdmi->bridge.dev); #ifdef CONFIG_CEC_NOTIFIER - if (change) + if (change) { cec_notifier_repo_cec_hpd(hdmi->cec_notifier, hdmi->hpd_state, ktime_get()); + } #endif } } @@ -568,7 +574,8 @@ unsigned char *buf, unsigned int length) { struct dw_hdmi_i2c *i2c = hdmi->i2c; - int stat; + int stat, retry, i; + bool read_edid = false; if (!i2c->is_regaddr) { dev_dbg(hdmi->dev, "set read register address to 0\n"); @@ -576,27 +583,81 @@ i2c->is_regaddr = true; } - while (length--) { - reinit_completion(&i2c->cmp); + /* edid reads are in 128 bytes. scdc reads are in 1 byte */ + if (length == HDMI_EDID_BLOCK_LEN) + read_edid = true; - 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); + while (length > 0) { + retry = 100; + hdmi_writeb(hdmi, i2c->slave_reg, HDMI_I2CM_ADDRESS); - stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10); - if (!stat) - return -EAGAIN; + if (read_edid) { + i2c->slave_reg += 8; + length -= 8; + } else { + i2c->slave_reg++; + length--; + } - /* Check for error condition on the bus */ - if (i2c->stat & HDMI_IH_I2CM_STAT0_ERROR) + while (retry > 0) { + if (!(hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD)) { + void *data = hdmi->plat_data->phy_data; + + dev_dbg(hdmi->dev, "hdmi disconnect, stop ddc read\n"); + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(data, false); + return -EPERM; + } + reinit_completion(&i2c->cmp); + 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); + } + stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10); + if (!stat) { + dev_dbg(hdmi->dev, "ddc read time out\n"); + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, + HDMI_I2CM_OPERATION); + retry -= 10; + continue; + } + /* Check for error condition on the bus */ + if (i2c->stat & HDMI_IH_I2CM_STAT0_ERROR) { + dev_dbg(hdmi->dev, "ddc read err\n"); + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, + HDMI_I2CM_OPERATION); + retry--; + usleep_range(10000, 11000); + continue; + } + /* read success */ + break; + } + if (retry <= 0) { + dev_err(hdmi->dev, "ddc read failed\n"); return -EIO; + } - *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; return 0; @@ -606,7 +667,7 @@ unsigned char *buf, unsigned int length) { struct dw_hdmi_i2c *i2c = hdmi->i2c; - int stat; + int stat, retry; if (!i2c->is_regaddr) { /* Use the first write byte as register address */ @@ -617,20 +678,53 @@ } while (length--) { - reinit_completion(&i2c->cmp); + retry = 100; hdmi_writeb(hdmi, *buf++, HDMI_I2CM_DATAO); hdmi_writeb(hdmi, i2c->slave_reg++, HDMI_I2CM_ADDRESS); - hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_WRITE, - HDMI_I2CM_OPERATION); - stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10); - if (!stat) - return -EAGAIN; + while (retry > 0) { + if (!(hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD)) { + void *data = hdmi->plat_data->phy_data; - /* Check for error condition on the bus */ - if (i2c->stat & HDMI_IH_I2CM_STAT0_ERROR) + dev_dbg(hdmi->dev, "hdmi disconnect, stop ddc write\n"); + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(data, false); + return -EPERM; + } + reinit_completion(&i2c->cmp); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_WRITE, + HDMI_I2CM_OPERATION); + + stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10); + if (!stat) { + dev_dbg(hdmi->dev, "ddc write time out\n"); + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, + HDMI_I2CM_OPERATION); + retry -= 10; + continue; + } + + /* Check for error condition on the bus */ + if (i2c->stat & HDMI_IH_I2CM_STAT0_ERROR) { + dev_dbg(hdmi->dev, "ddc write err\n"); + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, + HDMI_I2CM_OPERATION); + retry--; + usleep_range(10000, 11000); + continue; + } + + /* write success */ + break; + } + + if (retry <= 0) { + dev_err(hdmi->dev, "ddc write failed\n"); return -EIO; + } } return 0; @@ -642,6 +736,7 @@ struct dw_hdmi *hdmi = i2c_get_adapdata(adap); struct dw_hdmi_i2c *i2c = hdmi->i2c; u8 addr = msgs[0].addr; + void *data = hdmi->plat_data->phy_data; int i, ret = 0; if (addr == DDC_CI_ADDR) @@ -665,6 +760,12 @@ } mutex_lock(&i2c->lock); + + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(data, true); + + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + udelay(100); /* Unmute DONE and ERROR interrupts */ hdmi_writeb(hdmi, 0x00, HDMI_IH_MUTE_I2CM_STAT0); @@ -1378,14 +1479,7 @@ 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); if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_PP) { @@ -1943,10 +2037,22 @@ HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; break; } + frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED; } else { - frame.colorimetry = HDMI_COLORIMETRY_NONE; - frame.extended_colorimetry = - HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; + if (hdmi->hdmi_data.enc_out_encoding == V4L2_YCBCR_ENC_BT2020) { + frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; + frame.extended_colorimetry = + HDMI_EXTENDED_COLORIMETRY_BT2020; + } else { + frame.colorimetry = HDMI_COLORIMETRY_NONE; + frame.extended_colorimetry = + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; + } + + if (is_hdmi2 && frame.quantization_range == HDMI_QUANTIZATION_RANGE_FULL) + frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_FULL; + else + frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED; } frame.scan_mode = HDMI_SCAN_MODE_NONE; @@ -1986,7 +2092,11 @@ hdmi_writeb(hdmi, val, HDMI_FC_AVICONF2); /* AVI data byte 4 differences: none */ - val = frame.video_code & 0x7f; + if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format) || + hdmi->connector.display_info.hdmi.scdc.supported) + val = hdmi->vic; + else + val = frame.video_code & 0x7f; hdmi_writeb(hdmi, val, HDMI_FC_AVIVID); /* AVI Data Byte 5- set up input and output pixel repetition */ @@ -2023,6 +2133,14 @@ struct hdmi_vendor_infoframe frame; u8 buffer[10]; ssize_t err; + + /* if sink support hdmi2.0, don't send vsi */ + if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format) || + hdmi->connector.display_info.hdmi.scdc.supported) { + hdmi_mask_writeb(hdmi, 0, HDMI_FC_DATAUTO0, HDMI_FC_DATAUTO0_VSD_OFFSET, + HDMI_FC_DATAUTO0_VSD_MASK); + return; + } err = drm_hdmi_vendor_infoframe_from_display_mode(&frame, &hdmi->connector, @@ -2188,6 +2306,11 @@ hdmi_writeb(hdmi, HDR_LSB(frame.max_fall), HDMI_FC_DRM_PB24); hdmi_writeb(hdmi, HDR_MSB(frame.max_fall), HDMI_FC_DRM_PB25); hdmi_writeb(hdmi, 1, HDMI_FC_DRM_UP); + /* + * avi and hdr infoframe cannot be sent at the same time + * for compatibility with Huawei TV + */ + msleep(300); hdmi_modb(hdmi, HDMI_FC_PACKET_DRM_TX_EN, HDMI_FC_PACKET_DRM_TX_EN_MASK, HDMI_FC_PACKET_TX_EN); @@ -2215,6 +2338,9 @@ vmode->mtmdsclock = hdmi_get_tmdsclock(hdmi, vmode->mpixelclock); if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) vmode->mtmdsclock /= 2; + + if (hdmi->update) + return; /* Set up HDMI_FC_INVIDCONF * Some display equipments require that the interval @@ -2373,11 +2499,13 @@ hdmi_writeb(hdmi, 0x21, HDMI_FC_CH2PREAM); /* Enable pixel clock and tmds data path */ - hdmi->mc_clkdis |= HDMI_MC_CLKDIS_HDCPCLK_DISABLE | - HDMI_MC_CLKDIS_CSCCLK_DISABLE | - HDMI_MC_CLKDIS_AUDCLK_DISABLE | - HDMI_MC_CLKDIS_PREPCLK_DISABLE | - HDMI_MC_CLKDIS_TMDSCLK_DISABLE; + + if (!hdmi->update) + hdmi->mc_clkdis |= HDMI_MC_CLKDIS_HDCPCLK_DISABLE | + HDMI_MC_CLKDIS_CSCCLK_DISABLE | + HDMI_MC_CLKDIS_AUDCLK_DISABLE | + HDMI_MC_CLKDIS_PREPCLK_DISABLE | + HDMI_MC_CLKDIS_TMDSCLK_DISABLE; hdmi->mc_clkdis &= ~HDMI_MC_CLKDIS_PIXELCLK_DISABLE; hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS); @@ -2455,11 +2583,42 @@ HDMI_IH_MUTE_FC_STAT2); } +static void dw_hdmi_force_output_pattern(struct dw_hdmi *hdmi, struct drm_display_mode *mode) +{ + /* force output black */ + if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) { + enum hdmi_quantization_range rgb_quant_range = drm_default_rgb_quant_range(mode); + + if (hdmi->hdmi_data.quant_range == HDMI_QUANTIZATION_RANGE_FULL) { + hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS2); /*R*/ + hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS1); /*G*/ + hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS0); /*B*/ + } else if (hdmi->hdmi_data.quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) { + hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS2); /*R*/ + hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS1); /*G*/ + hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS0); /*B*/ + } else if (hdmi->hdmi_data.quant_range == HDMI_QUANTIZATION_RANGE_DEFAULT) { + if (rgb_quant_range == HDMI_QUANTIZATION_RANGE_FULL) { + hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS2); /*R*/ + hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS1); /*G*/ + hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS0); /*B*/ + } else if (rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) { + hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS2); /*R*/ + hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS1); /*G*/ + hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS0); /*B*/ + } + } + } else { + hdmi_writeb(hdmi, 0x80, HDMI_FC_DBGTMDS2); /*Cr*/ + hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS1); /*Y*/ + hdmi_writeb(hdmi, 0x80, HDMI_FC_DBGTMDS0); /*Cb*/ + } +} + static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) { int ret; void *data = hdmi->plat_data->phy_data; - bool need_delay = false; hdmi_disable_overflow_interrupts(hdmi); @@ -2508,6 +2667,9 @@ hdmi->hdmi_data.enc_out_bus_format = MEDIA_BUS_FMT_RGB888_1X24; + if (hdmi->plat_data->set_prev_bus_format) + hdmi->plat_data->set_prev_bus_format(data, hdmi->hdmi_data.enc_out_bus_format); + /* TOFIX: Get input encoding from plat data or fallback to none */ if (hdmi->plat_data->get_enc_in_encoding) hdmi->hdmi_data.enc_in_encoding = @@ -2537,23 +2699,11 @@ (mode->flags & DRM_MODE_FLAG_DBLCLK) ? 1 : 0; hdmi->hdmi_data.video_mode.mdataenablepolarity = true; + dw_hdmi_force_output_pattern(hdmi, mode); + /* HDMI Initialization Step B.1 */ hdmi_av_composer(hdmi, mode); - /* HDMI Initializateion Step B.2 */ - if (!hdmi->phy.enabled || - hdmi->hdmi_data.video_mode.previous_pixelclock != - hdmi->hdmi_data.video_mode.mpixelclock || - hdmi->hdmi_data.video_mode.previous_tmdsclock != - hdmi->hdmi_data.video_mode.mtmdsclock) { - ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data, - &hdmi->previous_mode); - if (ret) - return ret; - hdmi->phy.enabled = true; - } else { - need_delay = true; - } /* HDMI Initialization Step B.3 */ dw_hdmi_enable_video_path(hdmi); @@ -2582,11 +2732,31 @@ hdmi_video_sample(hdmi); hdmi_tx_hdcp_config(hdmi, mode); + /* HDMI Enable phy output */ + if (!hdmi->phy.enabled || + hdmi->hdmi_data.video_mode.previous_pixelclock != + hdmi->hdmi_data.video_mode.mpixelclock || + hdmi->hdmi_data.video_mode.previous_tmdsclock != + hdmi->hdmi_data.video_mode.mtmdsclock) { + ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data, + &hdmi->previous_mode); + if (ret) + return ret; + hdmi->phy.enabled = true; + } + dw_hdmi_clear_overflow(hdmi); - /* XXX: Add delay to make csc work before unmute video. */ - if (need_delay) + /* + * konka tv should switch pattern after set to yuv420 10bit or + * the TV might not recognize the signal. + */ + if (!hdmi->update) { + hdmi_writeb(hdmi, 1, HDMI_FC_DBGFORCE); msleep(50); + hdmi_writeb(hdmi, 0, HDMI_FC_DBGFORCE); + } + return 0; } @@ -2686,6 +2856,7 @@ if (hdmi->initialized) { hdmi->initialized = false; hdmi->disabled = true; + hdmi->logo_plug_out = true; } if (hdmi->bridge_is_on) dw_hdmi_poweroff(hdmi); @@ -2793,6 +2964,8 @@ edid = drm_get_edid(connector, hdmi->ddc); if (edid) { + int vic = 0; + dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n", edid->width_cm, edid->height_cm); @@ -2802,7 +2975,18 @@ drm_connector_update_edid_property(connector, edid); cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid); ret = drm_add_edid_modes(connector, edid); - dw_hdmi_update_hdr_property(connector); + + list_for_each_entry(mode, &connector->probed_modes, head) { + vic = drm_match_cea_mode(mode); + + if (mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_NONE) { + if (vic >= 93 && vic <= 95) + mode->picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9; + else if (vic == 98) + mode->picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135; + } + } + kfree(edid); } else { hdmi->support_hdmi = true; @@ -2815,11 +2999,8 @@ mode = drm_mode_duplicate(connector->dev, ptr); if (mode) { - if (!i) { + if (!i) mode->type = DRM_MODE_TYPE_PREFERRED; - mode->picture_aspect_ratio = - HDMI_PICTURE_ASPECT_NONE; - } drm_mode_probed_add(connector, mode); ret++; } @@ -2830,6 +3011,7 @@ dev_info(hdmi->dev, "failed to get edid\n"); } + dw_hdmi_update_hdr_property(connector); dw_hdmi_check_output_type_changed(hdmi); return ret; @@ -2892,19 +3074,86 @@ return ret; } -static bool hdr_metadata_equal(const struct drm_connector_state *old_state, +static bool hdr_metadata_equal(struct dw_hdmi *hdmi, const struct drm_connector_state *old_state, const struct drm_connector_state *new_state) { struct drm_property_blob *old_blob = old_state->hdr_output_metadata; struct drm_property_blob *new_blob = new_state->hdr_output_metadata; + int i, ret; + u8 *data; - if (!old_blob || !new_blob) - return old_blob == new_blob; + hdmi->hdr2sdr = false; + + if (!old_blob && !new_blob) + return true; + + if (!old_blob) { + data = (u8 *)new_blob->data; + + for (i = 0; i < new_blob->length; i++) + if (data[i]) + return false; + + return true; + } + + if (!new_blob) { + data = (u8 *)old_blob->data; + + for (i = 0; i < old_blob->length; i++) + if (data[i]) + return false; + + return true; + } if (old_blob->length != new_blob->length) return false; - return !memcmp(old_blob->data, new_blob->data, old_blob->length); + ret = !memcmp(old_blob->data, new_blob->data, old_blob->length); + + if (!ret && new_blob) { + data = (u8 *)new_blob->data; + + for (i = 0; i < new_blob->length; i++) + if (data[i]) + break; + + if (i == new_blob->length) + hdmi->hdr2sdr = true; + } + + return ret; +} + +static bool check_hdr_color_change(struct drm_connector_state *old_state, + struct drm_connector_state *new_state, + struct dw_hdmi *hdmi) +{ + void *data = hdmi->plat_data->phy_data; + + if (!hdr_metadata_equal(hdmi, old_state, new_state)) { + hdmi->plat_data->check_hdr_color_change(new_state, data); + return true; + } + + return false; +} + +static bool check_hdmi_format_change(struct drm_connector_state *old_state, + struct drm_connector_state *new_state, + struct drm_connector *connector, + struct dw_hdmi *hdmi) +{ + bool hdr_change, color_change; + + hdr_change = check_hdr_color_change(old_state, new_state, hdmi); + color_change = dw_hdmi_color_changed(connector); + + if (hdr_change || color_change) + return true; + + return false; } static int dw_hdmi_connector_atomic_check(struct drm_connector *connector, @@ -2925,12 +3174,19 @@ if (!crtc) return 0; + crtc_state = drm_atomic_get_crtc_state(state, crtc); + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); + + mode = &crtc_state->mode; + /* * If HDMI is enabled in uboot, it's need to record * drm_display_mode and set phy status to enabled. */ if (!vmode->mpixelclock) { - crtc_state = drm_atomic_get_crtc_state(state, crtc); + u8 val; + if (hdmi->plat_data->get_enc_in_encoding) hdmi->hdmi_data.enc_in_encoding = hdmi->plat_data->get_enc_in_encoding(data); @@ -2944,27 +3200,84 @@ hdmi->hdmi_data.enc_out_bus_format = hdmi->plat_data->get_output_bus_format(data); - mode = &crtc_state->mode; memcpy(&hdmi->previous_mode, mode, sizeof(hdmi->previous_mode)); vmode->mpixelclock = mode->crtc_clock * 1000; - vmode->previous_pixelclock = mode->clock; - vmode->previous_tmdsclock = mode->clock; + vmode->previous_pixelclock = mode->clock * 1000; + vmode->previous_tmdsclock = mode->clock * 1000; vmode->mtmdsclock = hdmi_get_tmdsclock(hdmi, vmode->mpixelclock); if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) vmode->mtmdsclock /= 2; + + dw_hdmi_force_output_pattern(hdmi, mode); + + hdmi_clk_regenerator_update_pixel_clock(hdmi); + hdmi_enable_audio_clk(hdmi, hdmi->audio_enable); + + drm_scdc_readb(hdmi->ddc, SCDC_TMDS_CONFIG, &val); + + /* if plug out before hdmi bind, reset hdmi */ + if (vmode->mtmdsclock >= 340000000 && !(val & SCDC_TMDS_BIT_CLOCK_RATIO_BY_40)) + hdmi->logo_plug_out = true; } - if (!hdr_metadata_equal(old_state, new_state) || - dw_hdmi_color_changed(connector)) { - crtc_state = drm_atomic_get_crtc_state(state, crtc); - if (IS_ERR(crtc_state)) - return PTR_ERR(crtc_state); + if (check_hdmi_format_change(old_state, new_state, connector, hdmi) || + hdmi->logo_plug_out) { + u32 mtmdsclk; - crtc_state->mode_changed = true; + if (hdmi->plat_data->update_color_format) + hdmi->plat_data->update_color_format(new_state, data); + if (hdmi->plat_data->get_enc_in_encoding) + hdmi->hdmi_data.enc_in_encoding = + hdmi->plat_data->get_enc_in_encoding(data); + if (hdmi->plat_data->get_enc_out_encoding) + hdmi->hdmi_data.enc_out_encoding = + hdmi->plat_data->get_enc_out_encoding(data); + if (hdmi->plat_data->get_input_bus_format) + hdmi->hdmi_data.enc_in_bus_format = + hdmi->plat_data->get_input_bus_format(data); + if (hdmi->plat_data->get_output_bus_format) + hdmi->hdmi_data.enc_out_bus_format = + hdmi->plat_data->get_output_bus_format(data); + + mtmdsclk = hdmi_get_tmdsclock(hdmi, mode->clock); + + if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) + mtmdsclk /= 2; + + if (!(hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD)) + return 0; + + if (hdmi->hdmi_data.video_mode.mpixelclock == (mode->clock * 1000) && + hdmi->hdmi_data.video_mode.mtmdsclock == (mtmdsclk * 1000) && + !hdmi->logo_plug_out && !hdmi->disabled) { + hdmi->update = true; + hdmi_writeb(hdmi, HDMI_FC_GCP_SET_AVMUTE, HDMI_FC_GCP); + mdelay(180); + handle_plugged_change(hdmi, false); + } else { + hdmi->update = false; + crtc_state->mode_changed = true; + hdmi->logo_plug_out = false; + } } return 0; +} + +static void dw_hdmi_connector_atomic_commit(struct drm_connector *connector, + struct drm_connector_state *state) +{ + struct dw_hdmi *hdmi = + container_of(connector, struct dw_hdmi, connector); + + if (hdmi->update) { + dw_hdmi_setup(hdmi, &hdmi->previous_mode); + mdelay(50); + handle_plugged_change(hdmi, true); + hdmi_writeb(hdmi, HDMI_FC_GCP_CLEAR_AVMUTE, HDMI_FC_GCP); + hdmi->update = false; + } } void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi) @@ -3006,6 +3319,15 @@ } EXPORT_SYMBOL_GPL(dw_hdmi_get_output_type_cap); +void dw_hdmi_set_hpd_wake(struct dw_hdmi *hdmi) +{ + if (!hdmi->cec) + return; + + dw_hdmi_hpd_wake_up(hdmi->cec); +} +EXPORT_SYMBOL_GPL(dw_hdmi_set_hpd_wake); + static void dw_hdmi_connector_force(struct drm_connector *connector) { struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi, @@ -3045,6 +3367,7 @@ .get_modes = dw_hdmi_connector_get_modes, .best_encoder = drm_atomic_helper_best_encoder, .atomic_check = dw_hdmi_connector_atomic_check, + .atomic_commit = dw_hdmi_connector_atomic_commit, }; static void dw_hdmi_attach_properties(struct dw_hdmi *hdmi) @@ -3172,6 +3495,9 @@ if (hdmi->next_bridge) return MODE_OK; + if (!(hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD) && hdmi->hdr2sdr) + return MODE_OK; + if (hdmi->plat_data->mode_valid) mode_status = hdmi->plat_data->mode_valid(connector, mode); @@ -3195,12 +3521,21 @@ static void dw_hdmi_bridge_disable(struct drm_bridge *bridge) { struct dw_hdmi *hdmi = bridge->driver_private; + void *data = hdmi->plat_data->phy_data; mutex_lock(&hdmi->mutex); hdmi->disabled = true; + handle_plugged_change(hdmi, false); dw_hdmi_update_power(hdmi); dw_hdmi_update_phy_mask(hdmi); + if (hdmi->plat_data->dclk_set) + hdmi->plat_data->dclk_set(hdmi->plat_data->phy_data, false, 0); mutex_unlock(&hdmi->mutex); + + mutex_lock(&hdmi->i2c->lock); + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(data, false); + mutex_unlock(&hdmi->i2c->lock); } static void dw_hdmi_bridge_enable(struct drm_bridge *bridge) @@ -3209,8 +3544,11 @@ mutex_lock(&hdmi->mutex); hdmi->disabled = false; + if (hdmi->plat_data->dclk_set) + hdmi->plat_data->dclk_set(hdmi->plat_data->phy_data, true, 0); dw_hdmi_update_power(hdmi); dw_hdmi_update_phy_mask(hdmi); + handle_plugged_change(hdmi, true); mutex_unlock(&hdmi->mutex); } @@ -3456,6 +3794,7 @@ static const struct dw_hdmi_cec_ops dw_hdmi_cec_ops = { .write = hdmi_writeb, .read = hdmi_readb, + .mod = hdmi_modb, .enable = dw_hdmi_cec_enable, .disable = dw_hdmi_cec_disable, }; @@ -3464,14 +3803,14 @@ .reg_bits = 32, .val_bits = 8, .reg_stride = 1, - .max_register = HDMI_I2CM_FS_SCL_LCNT_0_ADDR, + .max_register = HDMI_I2CM_SCDC_UPDATE1, }; static const struct regmap_config hdmi_regmap_32bit_config = { .reg_bits = 32, .val_bits = 32, .reg_stride = 4, - .max_register = HDMI_I2CM_FS_SCL_LCNT_0_ADDR << 2, + .max_register = HDMI_I2CM_SCDC_UPDATE1 << 2, }; static int dw_hdmi_status_show(struct seq_file *s, void *v) @@ -3852,6 +4191,7 @@ hdmi->connector.stereo_allowed = 1; hdmi->plat_data = plat_data; hdmi->dev = dev; + hdmi->audio_enable = true; hdmi->sample_rate = 48000; hdmi->disabled = true; hdmi->rxsense = true; @@ -3983,6 +4323,7 @@ if (ret) goto err_iahb; + hdmi->logo_plug_out = false; hdmi->initialized = false; ret = hdmi_readb(hdmi, HDMI_PHY_STAT0); if (((ret & HDMI_PHY_TX_PHY_LOCK) && (ret & HDMI_PHY_HPD) && @@ -3992,8 +4333,14 @@ hdmi->bridge_is_on = true; hdmi->phy.enabled = true; hdmi->initialized = true; + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(hdmi->plat_data->phy_data, true); + if (hdmi->plat_data->dclk_set) + hdmi->plat_data->dclk_set(hdmi->plat_data->phy_data, true, 0); } else if (ret & HDMI_PHY_TX_PHY_LOCK) { hdmi->phy.ops->disable(hdmi, hdmi->phy.data); + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(hdmi->plat_data->phy_data, false); } init_hpd_work(hdmi); @@ -4007,7 +4354,7 @@ hdmi->irq = irq; ret = devm_request_threaded_irq(dev, irq, dw_hdmi_hardirq, - dw_hdmi_irq, IRQF_SHARED, + dw_hdmi_irq, IRQF_SHARED | IRQF_ONESHOT, dev_name(dev), hdmi); if (ret) goto err_iahb; @@ -4126,6 +4473,12 @@ cec.ops = &dw_hdmi_cec_ops; cec.irq = irq; + irq = platform_get_irq(pdev, 1); + if (irq < 0) + dev_dbg(hdmi->dev, "can't get cec wake up irq\n"); + + cec.wake_irq = irq; + pdevinfo.name = "dw-hdmi-cec"; pdevinfo.data = &cec; pdevinfo.size_data = sizeof(cec); @@ -4136,7 +4489,8 @@ hdmi->extcon = devm_extcon_dev_allocate(hdmi->dev, dw_hdmi_cable); if (IS_ERR(hdmi->extcon)) { - dev_err(hdmi->dev, "allocate extcon failed\n"); + ret = PTR_ERR(hdmi->extcon); + dev_err(hdmi->dev, "allocate extcon failed: %d\n", ret); goto err_iahb; } diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h index bb53a5c..b7d3137 100644 --- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h +++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h @@ -586,6 +586,16 @@ #define HDMI_I2CM_FS_SCL_LCNT_1_ADDR 0x7E11 #define HDMI_I2CM_FS_SCL_LCNT_0_ADDR 0x7E12 #define HDMI_I2CM_SDA_HOLD 0x7E13 +#define HDMI_I2CM_SCDC_READ_UPDATE 0x7E14 +#define HDMI_I2CM_READ_REQ_EN_MSK BIT(4) +#define HDMI_I2CM_READ_REQ_EN_OFFSET 4 +#define HDMI_I2CM_READ_UPDATE_MSK BIT(0) +#define HDMI_I2CM_READ_UPDATE_OFFSET 0 +#define HDMI_I2CM_I2CM_UPRD_VSYNC_EN_MSK BIT(5) +#define HDMI_I2CM_I2CM_UPRD_VSYNC_EN_OFFSET 5 +#define HDMI_I2CM_READ_BUFF0 0x7E20 +#define HDMI_I2CM_SCDC_UPDATE0 0x7E30 +#define HDMI_I2CM_SCDC_UPDATE1 0x7E31 enum { /* PRODUCT_ID0 field values */ @@ -1152,7 +1162,10 @@ 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, HDMI_I2CM_OPERATION_READ_EXT = 0x2, HDMI_I2CM_OPERATION_READ = 0x1, diff --git a/kernel/drivers/gpu/drm/drm_edid.c b/kernel/drivers/gpu/drm/drm_edid.c index 05aa5c2..46e6148 100644 --- a/kernel/drivers/gpu/drm/drm_edid.c +++ b/kernel/drivers/gpu/drm/drm_edid.c @@ -4120,6 +4120,113 @@ hdmi->y420_cmdb_map = map; } +#ifdef CONFIG_NO_GKI +static int drm_find_all_edid_extension(const struct edid *edid, + int ext_id, int *ext_list) +{ + u8 *edid_ext = NULL; + int i, count = 0; + + /* No EDID or EDID extensions */ + if (edid == NULL || edid->extensions == 0) + return -EINVAL; + + /* too many EDID extensions */ + if (edid->extensions > 32) + return -EINVAL; + + /* Find CEA extension */ + for (i = 0; i < edid->extensions; i++) { + edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1); + if (edid_ext[0] == ext_id) { + *ext_list = i; + ext_list++; + count++; + } + } + + return count; +} + +/* + * Search EDID for CEA extension block. + */ +static u8 *drm_find_edid_extension_from_index(const struct edid *edid, + int ext_id, int *ext_index) +{ + u8 *edid_ext = NULL; + int i; + /* No EDID or EDID extensions */ + if (edid == NULL || edid->extensions == 0) + return NULL; + /* Find CEA extension */ + for (i = *ext_index; i < edid->extensions; i++) { + edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1); + if (edid_ext[0] == ext_id) + break; + } + if (i >= edid->extensions) + return NULL; + *ext_index = i + 1; + return edid_ext; +} + +static int +add_cea_modes(struct drm_connector *connector, struct edid *edid) +{ + const u8 *cea; + const u8 *db, *hdmi = NULL, *video = NULL; + u8 dbl, hdmi_len, video_len = 0; + int i, count = 0, modes = 0; + int ext_index = 0; + int ext_list[32]; + + count = drm_find_all_edid_extension(edid, CEA_EXT, ext_list); + for (i = 0; i < count; i++) { + ext_index = ext_list[i]; + cea = drm_find_edid_extension_from_index(edid, CEA_EXT, &ext_index); + if (cea && cea_revision(cea) >= 3) { + int i, start, end; + + if (cea_db_offsets(cea, &start, &end)) + return 0; + + for_each_cea_db(cea, i, start, end) { + db = &cea[i]; + dbl = cea_db_payload_len(db); + + if (cea_db_tag(db) == VIDEO_BLOCK) { + video = db + 1; + video_len = dbl; + modes += do_cea_modes(connector, video, dbl); + } else if (cea_db_is_hdmi_vsdb(db)) { + hdmi = db; + hdmi_len = dbl; + } else if (cea_db_is_y420vdb(db)) { + const u8 *vdb420 = &db[2]; + + /* Add 4:2:0(only) modes present in EDID */ + modes += do_y420vdb_modes(connector, + vdb420, + dbl - 1); + } + } + } + + /* + * We parse the HDMI VSDB after having added the cea modes as we will + * be patching their flags when the sink supports stereo 3D. + */ + if (hdmi) + modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video, + video_len); + } + + return modes; +} + +#else + static int add_cea_modes(struct drm_connector *connector, struct edid *edid) { @@ -4166,6 +4273,7 @@ return modes; } +#endif static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode) { diff --git a/kernel/drivers/gpu/drm/drm_gem.c b/kernel/drivers/gpu/drm/drm_gem.c index 2835ba2..fdda429 100644 --- a/kernel/drivers/gpu/drm/drm_gem.c +++ b/kernel/drivers/gpu/drm/drm_gem.c @@ -175,21 +175,6 @@ } EXPORT_SYMBOL(drm_gem_private_object_init); -static void -drm_gem_remove_prime_handles(struct drm_gem_object *obj, struct drm_file *filp) -{ - /* - * Note: obj->dma_buf can't disappear as long as we still hold a - * handle reference in obj->handle_count. - */ - mutex_lock(&filp->prime.lock); - if (obj->dma_buf) { - drm_prime_remove_buf_handle_locked(&filp->prime, - obj->dma_buf); - } - mutex_unlock(&filp->prime.lock); -} - /** * drm_gem_object_handle_free - release resources bound to userspace handles * @obj: GEM object to clean up. @@ -262,7 +247,7 @@ dev->driver->gem_close_object(obj, file_priv); if (drm_core_check_feature(dev, DRIVER_PRIME)) - drm_gem_remove_prime_handles(obj, file_priv); + drm_prime_remove_buf_handle(&file_priv->prime, id); drm_vma_node_revoke(&obj->vma_node, file_priv); drm_gem_object_handle_put_unlocked(obj); diff --git a/kernel/drivers/gpu/drm/drm_internal.h b/kernel/drivers/gpu/drm/drm_internal.h index 6d03513..b3ece55 100644 --- a/kernel/drivers/gpu/drm/drm_internal.h +++ b/kernel/drivers/gpu/drm/drm_internal.h @@ -44,8 +44,8 @@ void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv); void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv); -void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv, - struct dma_buf *dma_buf); +void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, + uint32_t handle); /* drm_drv.c */ struct drm_minor *drm_minor_acquire(unsigned int minor_id); diff --git a/kernel/drivers/gpu/drm/drm_prime.c b/kernel/drivers/gpu/drm/drm_prime.c index 0183b85..441113b 100644 --- a/kernel/drivers/gpu/drm/drm_prime.c +++ b/kernel/drivers/gpu/drm/drm_prime.c @@ -252,29 +252,33 @@ } EXPORT_SYMBOL(drm_gem_map_detach); -void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv, - struct dma_buf *dma_buf) +void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, + uint32_t handle) { struct rb_node *rb; - rb = prime_fpriv->dmabufs.rb_node; + mutex_lock(&prime_fpriv->lock); + + rb = prime_fpriv->handles.rb_node; while (rb) { struct drm_prime_member *member; - member = rb_entry(rb, struct drm_prime_member, dmabuf_rb); - if (member->dma_buf == dma_buf) { + member = rb_entry(rb, struct drm_prime_member, handle_rb); + if (member->handle == handle) { rb_erase(&member->handle_rb, &prime_fpriv->handles); rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs); - dma_buf_put(dma_buf); + dma_buf_put(member->dma_buf); kfree(member); - return; - } else if (member->dma_buf < dma_buf) { + break; + } else if (member->handle < handle) { rb = rb->rb_right; } else { rb = rb->rb_left; } } + + mutex_unlock(&prime_fpriv->lock); } /** diff --git a/kernel/drivers/gpu/drm/i915/i915_gem.c b/kernel/drivers/gpu/drm/i915/i915_gem.c index fe40f46..8f83a31 100644 --- a/kernel/drivers/gpu/drm/i915/i915_gem.c +++ b/kernel/drivers/gpu/drm/i915/i915_gem.c @@ -516,7 +516,7 @@ long timeout, struct intel_rps_client *rps_client) { - unsigned int seq = __read_seqcount_begin(&resv->seq); + unsigned int seq = read_seqbegin(&resv->seq); struct dma_fence *excl; bool prune_fences = false; @@ -569,9 +569,9 @@ * signaled and that the reservation object has not been changed (i.e. * no new fences have been added). */ - if (prune_fences && !__read_seqcount_retry(&resv->seq, seq)) { + if (prune_fences && !read_seqretry(&resv->seq, seq)) { if (reservation_object_trylock(resv)) { - if (!__read_seqcount_retry(&resv->seq, seq)) + if (!read_seqretry(&resv->seq, seq)) reservation_object_add_excl_fence(resv, NULL); reservation_object_unlock(resv); } @@ -4719,7 +4719,7 @@ * */ retry: - seq = raw_read_seqcount(&obj->resv->seq); + seq = read_seqbegin(&obj->resv->seq); /* Translate the exclusive fence to the READ *and* WRITE engine */ args->busy = busy_check_writer(rcu_dereference(obj->resv->fence_excl)); @@ -4737,7 +4737,7 @@ } } - if (args->busy && read_seqcount_retry(&obj->resv->seq, seq)) + if (args->busy && read_seqretry(&obj->resv->seq, seq)) goto retry; err = 0; diff --git a/kernel/drivers/gpu/drm/i915/i915_irq.c b/kernel/drivers/gpu/drm/i915/i915_irq.c index b7c3982..eed1ba3 100644 --- a/kernel/drivers/gpu/drm/i915/i915_irq.c +++ b/kernel/drivers/gpu/drm/i915/i915_irq.c @@ -1025,6 +1025,7 @@ spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ + preempt_disable_rt(); /* Get optional system timestamp before query. */ if (stime) @@ -1076,6 +1077,7 @@ *etime = ktime_get(); /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ + preempt_enable_rt(); spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); diff --git a/kernel/drivers/gpu/drm/i915/i915_request.c b/kernel/drivers/gpu/drm/i915/i915_request.c index 5c2c93c..7124510 100644 --- a/kernel/drivers/gpu/drm/i915/i915_request.c +++ b/kernel/drivers/gpu/drm/i915/i915_request.c @@ -356,9 +356,7 @@ GEM_BUG_ON(!i915_request_completed(rq)); - local_irq_disable(); - - spin_lock(&engine->timeline.lock); + spin_lock_irq(&engine->timeline.lock); GEM_BUG_ON(!list_is_first(&rq->link, &engine->timeline.requests)); list_del_init(&rq->link); spin_unlock(&engine->timeline.lock); @@ -372,9 +370,7 @@ GEM_BUG_ON(!atomic_read(&rq->i915->gt_pm.rps.num_waiters)); atomic_dec(&rq->i915->gt_pm.rps.num_waiters); } - spin_unlock(&rq->lock); - - local_irq_enable(); + spin_unlock_irq(&rq->lock); /* * The backing object for the context is done after switching to the diff --git a/kernel/drivers/gpu/drm/i915/i915_trace.h b/kernel/drivers/gpu/drm/i915/i915_trace.h index b50c6b8..33028d8 100644 --- a/kernel/drivers/gpu/drm/i915/i915_trace.h +++ b/kernel/drivers/gpu/drm/i915/i915_trace.h @@ -2,6 +2,10 @@ #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) #define _I915_TRACE_H_ +#ifdef CONFIG_PREEMPT_RT_BASE +#define NOTRACE +#endif + #include <linux/stringify.h> #include <linux/types.h> #include <linux/tracepoint.h> @@ -679,7 +683,7 @@ TP_ARGS(rq) ); -#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) +#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) && !defined(NOTRACE) DEFINE_EVENT(i915_request, i915_request_submit, TP_PROTO(struct i915_request *rq), TP_ARGS(rq) diff --git a/kernel/drivers/gpu/drm/i915/intel_sprite.c b/kernel/drivers/gpu/drm/i915/intel_sprite.c index f7026e8..07e4dde 100644 --- a/kernel/drivers/gpu/drm/i915/intel_sprite.c +++ b/kernel/drivers/gpu/drm/i915/intel_sprite.c @@ -36,6 +36,7 @@ #include <drm/drm_rect.h> #include <drm/drm_atomic.h> #include <drm/drm_plane_helper.h> +#include <linux/locallock.h> #include "intel_drv.h" #include "intel_frontbuffer.h" #include <drm/i915_drm.h> @@ -59,6 +60,8 @@ #else #define VBLANK_EVASION_TIME_US 100 #endif + +static DEFINE_LOCAL_IRQ_LOCK(pipe_update_lock); /** * intel_pipe_update_start() - start update of a set of display registers @@ -107,7 +110,7 @@ if (intel_psr_wait_for_idle(new_crtc_state)) DRM_ERROR("PSR idle timed out, atomic update may fail\n"); - local_irq_disable(); + local_lock_irq(pipe_update_lock); crtc->debug.min_vbl = min; crtc->debug.max_vbl = max; @@ -131,11 +134,11 @@ break; } - local_irq_enable(); + local_unlock_irq(pipe_update_lock); timeout = schedule_timeout(timeout); - local_irq_disable(); + local_lock_irq(pipe_update_lock); } finish_wait(wq, &wait); @@ -168,7 +171,7 @@ return; irq_disable: - local_irq_disable(); + local_lock_irq(pipe_update_lock); } /** @@ -204,7 +207,7 @@ new_crtc_state->base.event = NULL; } - local_irq_enable(); + local_unlock_irq(pipe_update_lock); if (intel_vgpu_active(dev_priv)) return; diff --git a/kernel/drivers/gpu/drm/radeon/radeon_display.c b/kernel/drivers/gpu/drm/radeon/radeon_display.c index 5985efc..de2552a 100644 --- a/kernel/drivers/gpu/drm/radeon/radeon_display.c +++ b/kernel/drivers/gpu/drm/radeon/radeon_display.c @@ -1818,6 +1818,7 @@ struct radeon_device *rdev = dev->dev_private; /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ + preempt_disable_rt(); /* Get optional system timestamp before query. */ if (stime) @@ -1910,6 +1911,7 @@ *etime = ktime_get(); /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ + preempt_enable_rt(); /* Decode into vertical and horizontal scanout position. */ *vpos = position & 0x1fff; diff --git a/kernel/drivers/gpu/drm/rockchip/Makefile b/kernel/drivers/gpu/drm/rockchip/Makefile index a5384c9..e2a7d20 100644 --- a/kernel/drivers/gpu/drm/rockchip/Makefile +++ b/kernel/drivers/gpu/drm/rockchip/Makefile @@ -9,7 +9,7 @@ rockchipdrm-$(CONFIG_ROCKCHIP_PSR) += rockchip_drm_psr.o rockchipdrm-$(CONFIG_ROCKCHIP_VOP) += rockchip_drm_vop.o rockchip_vop_reg.o -rockchipdrm-$(CONFIG_ROCKCHIP_VOP2) += rockchip_drm_vop2.o rockchip_vop2_reg.o +rockchipdrm-$(CONFIG_ROCKCHIP_VOP2) += rockchip_drm_vop2.o rockchip_vop2_reg.o rockchip_post_csc.o rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o diff --git a/kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c b/kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c index bf67c88..913615b 100644 --- a/kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -729,6 +729,8 @@ static void cdn_dp_encoder_disable(struct drm_encoder *encoder) { struct cdn_dp_device *dp = encoder_to_dp(encoder); + struct drm_crtc *crtc = encoder->crtc; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); int ret; mutex_lock(&dp->lock); @@ -752,6 +754,8 @@ */ if (!dp->connected && cdn_dp_connected_port(dp)) schedule_work(&dp->event_work); + + s->output_if &= ~VOP_OUTPUT_IF_DP0; } static int cdn_dp_encoder_atomic_check(struct drm_encoder *encoder, @@ -773,6 +777,7 @@ } s->output_mode = ROCKCHIP_OUT_MODE_AAAA; + s->output_if |= VOP_OUTPUT_IF_DP0; s->output_type = DRM_MODE_CONNECTOR_DisplayPort; s->tv_state = &conn_state->tv; s->eotf = TRADITIONAL_GAMMA_SDR; diff --git a/kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index c2d7db8..bd8e944 100644 --- a/kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -1091,6 +1091,8 @@ static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder) { struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); + struct drm_crtc *crtc = encoder->crtc; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); if (dsi->panel) drm_panel_disable(dsi->panel); @@ -1105,6 +1107,11 @@ if (IS_ENABLED(CONFIG_CPU_RK3568) && dsi->pdata->soc_type == RK3568) vop2_standby(encoder->crtc, 0); + + if (dsi->slave) + s->output_if &= ~(VOP_OUTPUT_IF_MIPI1 | VOP_OUTPUT_IF_MIPI0); + else + s->output_if &= ~(dsi->id ? VOP_OUTPUT_IF_MIPI1 : VOP_OUTPUT_IF_MIPI0); } static void dw_mipi_dsi_vop_routing(struct dw_mipi_dsi *dsi) diff --git a/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 25cf927..27efb38 100644 --- a/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -8,8 +8,10 @@ */ #include <linux/clk.h> +#include <linux/gpio/consumer.h> #include <linux/mfd/syscon.h> #include <linux/module.h> +#include <linux/of_gpio.h> #include <linux/platform_device.h> #include <linux/phy/phy.h> #include <linux/regmap.h> @@ -57,6 +59,22 @@ #define RK3399_GRF_SOC_CON20 0x6250 #define RK3399_HDMI_LCDC_SEL BIT(6) +#define RK3528_VO_GRF_HDMI_MASK 0x60014 +#define RK3528_HDMI_SNKDET_SEL BIT(6) +#define RK3528_HDMI_SNKDET BIT(5) +#define RK3528_HDMI_CECIN_MSK BIT(2) +#define RK3528_HDMI_SDAIN_MSK BIT(1) +#define RK3528_HDMI_SCLIN_MSK BIT(0) + +#define RK3528PMU_GRF_SOC_CON6 0x70018 +#define RK3528_HDMI_SDA5V_GRF BIT(6) +#define RK3528_HDMI_SCL5V_GRF BIT(5) +#define RK3528_HDMI_CEC5V_GRF BIT(4) +#define RK3528_HDMI_HPD5V_GRF BIT(3) + +#define RK3528_GPIO_SWPORT_DR_L 0x0000 +#define RK3528_GPIO0_A2_DR BIT(2) + #define RK3568_GRF_VO_CON1 0x0364 #define RK3568_HDMI_SDAIN_MSK BIT(15) #define RK3568_HDMI_SCLIN_MSK BIT(14) @@ -103,12 +121,14 @@ struct rockchip_hdmi { struct device *dev; struct regmap *regmap; + void __iomem *gpio_base; struct drm_encoder encoder; const struct rockchip_hdmi_chip_data *chip_data; struct clk *phyref_clk; struct clk *grf_clk; struct clk *hclk_vio; struct clk *hclk_vop; + struct clk *dclk_vop; struct dw_hdmi *hdmi; struct phy *phy; @@ -117,12 +137,14 @@ bool unsupported_deep_color; bool skip_check_420_mode; bool mode_changed; + bool hpd_wake_en; u8 force_output; u8 id; unsigned long bus_format; unsigned long output_bus_format; unsigned long enc_out_encoding; + unsigned long prev_bus_format; int color_changed; struct drm_property *color_depth_property; @@ -143,6 +165,12 @@ unsigned int phy_bus_width; enum drm_hdmi_output_type hdmi_output; struct rockchip_drm_sub_dev sub_dev; + + struct gpio_desc *hpd_gpiod; + struct pinctrl *p; + struct pinctrl_state *idle_state; + struct pinctrl_state *default_state; + int hpd_irq; }; #define to_rockchip_hdmi(x) container_of(x, struct rockchip_hdmi, x) @@ -460,6 +488,37 @@ { ~0UL, 0x0000, 0x0000, 0x0000}, }; +static int hdmi_bus_fmt_color_depth(unsigned int bus_format) +{ + switch (bus_format) { + case MEDIA_BUS_FMT_RGB888_1X24: + case MEDIA_BUS_FMT_YUV8_1X24: + case MEDIA_BUS_FMT_UYVY8_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_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_UYYVYY12_0_5X36: + return 12; + + case MEDIA_BUS_FMT_RGB161616_1X48: + case MEDIA_BUS_FMT_YUV16_1X48: + case MEDIA_BUS_FMT_UYYVYY16_0_5X48: + return 16; + + default: + return 0; + } +} + static int rockchip_hdmi_update_phy_table(struct rockchip_hdmi *hdmi, u32 *config, int phy_table_size) @@ -482,6 +541,55 @@ } return 0; +} + +static irqreturn_t rockchip_hdmi_hpd_irq_handler(int irq, void *arg) +{ + u32 val; + struct rockchip_hdmi *hdmi = arg; + + val = gpiod_get_value(hdmi->hpd_gpiod); + if (val) { + val = HIWORD_UPDATE(RK3528_HDMI_SNKDET, RK3528_HDMI_SNKDET); + if (hdmi->hdmi && hdmi->hpd_wake_en && hdmi->hpd_gpiod) + dw_hdmi_set_hpd_wake(hdmi->hdmi); + } else { + val = HIWORD_UPDATE(0, RK3528_HDMI_SNKDET); + } + regmap_write(hdmi->regmap, RK3528_VO_GRF_HDMI_MASK, val); + + return IRQ_HANDLED; +} + +static void dw_hdmi_rk3528_gpio_hpd_init(struct rockchip_hdmi *hdmi) +{ + u32 val; + + if (hdmi->hpd_gpiod) { + /* gpio0_a2's input enable is controlled by gpio output data bit */ + val = HIWORD_UPDATE(RK3528_GPIO0_A2_DR, RK3528_GPIO0_A2_DR); + writel(val, hdmi->gpio_base + RK3528_GPIO_SWPORT_DR_L); + + val = HIWORD_UPDATE(RK3528_HDMI_SNKDET_SEL | RK3528_HDMI_SDAIN_MSK | + RK3528_HDMI_SCLIN_MSK, + RK3528_HDMI_SNKDET_SEL | RK3528_HDMI_SDAIN_MSK | + RK3528_HDMI_SCLIN_MSK); + } else { + val = HIWORD_UPDATE(RK3528_HDMI_SDAIN_MSK | RK3528_HDMI_SCLIN_MSK, + RK3528_HDMI_SDAIN_MSK | RK3528_HDMI_SCLIN_MSK); + } + + regmap_write(hdmi->regmap, RK3528_VO_GRF_HDMI_MASK, val); + + val = gpiod_get_value(hdmi->hpd_gpiod); + if (val) { + val = HIWORD_UPDATE(RK3528_HDMI_SNKDET, RK3528_HDMI_SNKDET); + if (hdmi->hdmi && hdmi->hpd_wake_en && hdmi->hpd_gpiod) + dw_hdmi_set_hpd_wake(hdmi->hdmi); + } else { + val = HIWORD_UPDATE(0, RK3528_HDMI_SNKDET); + } + regmap_write(hdmi->regmap, RK3528_VO_GRF_HDMI_MASK, val); } static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi) @@ -539,6 +647,12 @@ return PTR_ERR(hdmi->hclk_vop); } + hdmi->dclk_vop = devm_clk_get_optional(hdmi->dev, "dclk_vop"); + if (IS_ERR(hdmi->dclk_vop)) { + dev_err(hdmi->dev, "failed to get dclk_vop\n"); + return PTR_ERR(hdmi->dclk_vop); + } + ret = of_property_read_u32(np, "max-tmdsclk", &hdmi->max_tmdsclk); if (ret != -EINVAL && ret < 0) { @@ -576,6 +690,70 @@ kfree(phy_config); } else { dev_dbg(hdmi->dev, "use default hdmi phy table\n"); + } + + hdmi->hpd_gpiod = devm_gpiod_get_optional(hdmi->dev, "hpd", GPIOD_IN); + + if (IS_ERR(hdmi->hpd_gpiod)) { + dev_err(hdmi->dev, "error getting HDP GPIO: %ld\n", + PTR_ERR(hdmi->hpd_gpiod)); + return PTR_ERR(hdmi->hpd_gpiod); + } + + if (hdmi->hpd_gpiod) { + struct resource *res; + struct platform_device *pdev = to_platform_device(hdmi->dev); + + /* gpio interrupt reflects hpd status */ + hdmi->hpd_irq = gpiod_to_irq(hdmi->hpd_gpiod); + if (hdmi->hpd_irq < 0) + return -EINVAL; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (!res) { + DRM_DEV_ERROR(hdmi->dev, "failed to get gpio regs\n"); + return -EINVAL; + } + + hdmi->gpio_base = devm_ioremap(hdmi->dev, res->start, resource_size(res)); + if (IS_ERR(hdmi->gpio_base)) { + DRM_DEV_ERROR(hdmi->dev, "Unable to get gpio ioregmap\n"); + return PTR_ERR(hdmi->gpio_base); + } + + dw_hdmi_rk3528_gpio_hpd_init(hdmi); + ret = devm_request_threaded_irq(hdmi->dev, hdmi->hpd_irq, NULL, + rockchip_hdmi_hpd_irq_handler, + IRQF_TRIGGER_RISING | + IRQF_TRIGGER_FALLING | + IRQF_ONESHOT, + "hdmi-hpd", hdmi); + if (ret) { + dev_err(hdmi->dev, "failed to request hpd IRQ: %d\n", ret); + return ret; + } + + hdmi->hpd_wake_en = device_property_read_bool(hdmi->dev, "hpd-wake-up"); + if (hdmi->hpd_wake_en) + enable_irq_wake(hdmi->hpd_irq); + } + + hdmi->p = devm_pinctrl_get(hdmi->dev); + if (IS_ERR(hdmi->p)) { + dev_err(hdmi->dev, "could not get pinctrl\n"); + return PTR_ERR(hdmi->p); + } + + hdmi->idle_state = pinctrl_lookup_state(hdmi->p, "idle"); + if (IS_ERR(hdmi->idle_state)) { + dev_dbg(hdmi->dev, "idle state is not defined\n"); + return 0; + } + + hdmi->default_state = pinctrl_lookup_state(hdmi->p, "default"); + if (IS_ERR(hdmi->default_state)) { + dev_err(hdmi->dev, "could not find default state\n"); + return PTR_ERR(hdmi->default_state); } return 0; @@ -670,6 +848,9 @@ struct drm_crtc *crtc = encoder->crtc; struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); + if (WARN_ON(!crtc || !crtc->state)) + return; + if (!hdmi->mode_changed) s->output_if &= ~VOP_OUTPUT_IF_HDMI0; /* @@ -754,6 +935,7 @@ unsigned int color_depth; bool support_dc = false; bool sink_is_hdmi = dw_hdmi_get_output_whether_hdmi(hdmi->hdmi); + bool yuv422_out = false; int max_tmds_clock = info->max_tmds_clock; int output_eotf; @@ -829,22 +1011,27 @@ *eotf = output_eotf; } - if ((*eotf > TRADITIONAL_GAMMA_HDR && - conn_state->connector->hdr_sink_metadata.hdmi_type1.eotf & - BIT(*eotf)) || (hdmi->colorimetry == - RK_HDMI_COLORIMETRY_BT2020 && info->hdmi.colorimetry & - (BIT(6) | BIT(7)))) + /* bt2020 sdr/hdr output */ + if (hdmi->colorimetry == RK_HDMI_COLORIMETRY_BT2020 && + info->hdmi.colorimetry & (BIT(6) | BIT(7))) { *enc_out_encoding = V4L2_YCBCR_ENC_BT2020; - else if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) || - (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) - *enc_out_encoding = V4L2_YCBCR_ENC_601; - else + yuv422_out = true; + /* bt709 hdr output */ + } else if (hdmi->colorimetry != RK_HDMI_COLORIMETRY_BT2020 && + (conn_state->connector->hdr_sink_metadata.hdmi_type1.eotf & BIT(*eotf) && + *eotf > TRADITIONAL_GAMMA_HDR)) { *enc_out_encoding = V4L2_YCBCR_ENC_709; + yuv422_out = true; + } else if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) || + (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) { + *enc_out_encoding = V4L2_YCBCR_ENC_601; + } else { + *enc_out_encoding = V4L2_YCBCR_ENC_709; + } - if (*enc_out_encoding == V4L2_YCBCR_ENC_BT2020) { - /* BT2020 require color depth at lest 10bit */ - color_depth = 10; - /* We prefer use YCbCr422 to send 10bit */ + if ((yuv422_out || hdmi->hdmi_output == DRM_HDMI_OUTPUT_YCBCR_HQ) && + color_depth == 10 && hdmi_bus_fmt_color_depth(hdmi->prev_bus_format) == 8) { + /* We prefer use YCbCr422 to send hdr 10bit */ if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422) *color_format = DRM_HDMI_OUTPUT_YCBCR422; } @@ -1063,6 +1250,14 @@ return hdmi->hdr_panel_blob_ptr; } +static void dw_hdmi_rockchip_update_color_format(struct drm_connector_state *conn_state, + void *data) +{ + struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; + + dw_hdmi_rockchip_check_color(conn_state, hdmi); +} + static bool dw_hdmi_rockchip_get_color_changed(void *data) { @@ -1072,6 +1267,63 @@ if (hdmi->color_changed) ret = true; hdmi->color_changed = 0; + + return ret; +} + +static bool +dw_hdmi_rockchip_check_hdr_color_change(struct drm_connector_state *conn_state, + void *data) +{ + struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; + + if (!conn_state || !data) + return false; + + if (dw_hdmi_rockchip_check_color(conn_state, hdmi)) + return true; + + return false; +} + +static void dw_hdmi_rockchip_set_prev_bus_format(void *data, unsigned long bus_format) +{ + struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; + + hdmi->prev_bus_format = bus_format; +} + +static void dw_hdmi_rockchip_set_ddc_io(void *data, bool enable) +{ + struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; + + if (!hdmi->p || !hdmi->idle_state || !hdmi->default_state) + return; + + if (!enable) { + if (pinctrl_select_state(hdmi->p, hdmi->idle_state)) + dev_err(hdmi->dev, "could not select idle state\n"); + } else { + if (pinctrl_select_state(hdmi->p, hdmi->default_state)) + dev_err(hdmi->dev, "could not select default state\n"); + } +} + +static int dw_hdmi_rockchip_dclk_set(void *data, bool enable, int vp_id) +{ + struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; + int ret = 0; + + if (!hdmi->dclk_vop) + return 0; + + if (enable) { + ret = clk_prepare_enable(hdmi->dclk_vop); + if (ret < 0) + dev_err(hdmi->dev, "failed to enable dclk_vop\n"); + } else { + clk_disable_unprepare(hdmi->dclk_vop); + } return ret; } @@ -1158,6 +1410,7 @@ } hdmi->bus_format = color; + hdmi->prev_bus_format = color; if (hdmi->hdmi_output == DRM_HDMI_OUTPUT_YCBCR422) { if (hdmi->colordepth == 12) @@ -1581,6 +1834,20 @@ .setup_hpd = dw_hdmi_rk3328_setup_hpd, }; +static enum drm_connector_status +dw_hdmi_rk3528_read_hpd(struct dw_hdmi *dw_hdmi, void *data) +{ + return dw_hdmi_phy_read_hpd(dw_hdmi, data); +} + +static const struct dw_hdmi_phy_ops rk3528_hdmi_phy_ops = { + .init = dw_hdmi_rockchip_genphy_init, + .disable = dw_hdmi_rockchip_genphy_disable, + .read_hpd = dw_hdmi_rk3528_read_hpd, + .update_hpd = dw_hdmi_phy_update_hpd, + .setup_hpd = dw_hdmi_phy_setup_hpd, +}; + static struct rockchip_hdmi_chip_data rk3328_chip_data = { .lcdsel_grf_reg = -1, }; @@ -1627,6 +1894,22 @@ .ycbcr_420_allowed = true, }; +static struct rockchip_hdmi_chip_data rk3528_chip_data = { + .lcdsel_grf_reg = -1, +}; + +static const struct dw_hdmi_plat_data rk3528_hdmi_drv_data = { + .mode_valid = dw_hdmi_rockchip_mode_valid, + .mpll_cfg = rockchip_mpll_cfg, + .cur_ctr = rockchip_cur_ctr, + .phy_config = rockchip_phy_config, + .phy_data = &rk3528_chip_data, + .phy_ops = &rk3528_hdmi_phy_ops, + .phy_name = "inno_dw_hdmi_phy2", + .phy_force_vendor = true, + .ycbcr_420_allowed = true, +}; + static struct rockchip_hdmi_chip_data rk3568_chip_data = { .lcdsel_grf_reg = -1, .ddc_en_reg = RK3568_GRF_VO_CON1, @@ -1658,6 +1941,9 @@ }, { .compatible = "rockchip,rk3399-dw-hdmi", .data = &rk3399_hdmi_drv_data + }, + { .compatible = "rockchip,rk3528-dw-hdmi", + .data = &rk3528_hdmi_drv_data }, { .compatible = "rockchip,rk3568-dw-hdmi", .data = &rk3568_hdmi_drv_data @@ -1713,6 +1999,16 @@ dw_hdmi_rockchip_get_hdr_blob; plat_data->get_color_changed = dw_hdmi_rockchip_get_color_changed; + plat_data->update_color_format = + dw_hdmi_rockchip_update_color_format; + plat_data->check_hdr_color_change = + dw_hdmi_rockchip_check_hdr_color_change; + plat_data->set_prev_bus_format = + dw_hdmi_rockchip_set_prev_bus_format; + plat_data->set_ddc_io = + dw_hdmi_rockchip_set_ddc_io; + plat_data->dclk_set = + dw_hdmi_rockchip_dclk_set; plat_data->property_ops = &dw_hdmi_rockchip_property_ops; encoder = &hdmi->encoder; @@ -1780,7 +2076,6 @@ platform_set_drvdata(pdev, hdmi); hdmi->hdmi = dw_hdmi_bind(pdev, encoder, plat_data); - /* * If dw_hdmi_bind() fails we'll never call dw_hdmi_unbind(), * which would have called the encoder cleanup. Do it manually. @@ -1833,6 +2128,11 @@ if (!hdmi) return; + if (hdmi->hpd_gpiod) { + disable_irq(hdmi->hpd_irq); + if (hdmi->hpd_wake_en) + disable_irq_wake(hdmi->hpd_irq); + } dw_hdmi_suspend(&pdev->dev, hdmi->hdmi); pm_runtime_put_sync(&pdev->dev); } @@ -1849,6 +2149,8 @@ { struct rockchip_hdmi *hdmi = dev_get_drvdata(dev); + if (hdmi->hpd_gpiod) + disable_irq(hdmi->hpd_irq); dw_hdmi_suspend(dev, hdmi->hdmi); pm_runtime_put_sync(dev); @@ -1859,6 +2161,10 @@ { struct rockchip_hdmi *hdmi = dev_get_drvdata(dev); + if (hdmi->hpd_gpiod) { + dw_hdmi_rk3528_gpio_hpd_init(hdmi); + enable_irq(hdmi->hpd_irq); + } pm_runtime_get_sync(dev); dw_hdmi_resume(dev, hdmi->hdmi); diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile b/kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile index 848ac22..b648e33 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile @@ -7,3 +7,4 @@ obj-$(CONFIG_ROCKCHIP_EBC_DEV) += tcon/ rkebc-$(CONFIG_ARM64) += ebc_dev_v8.o +#rkebc-$(CONFIG_ARM64) += ebc_dev_y8_v8.o diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c index 6d83f49..262f4d5 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c @@ -76,6 +76,29 @@ } } +int ebc_drop_one_dsp_buf(void) +{ + struct ebc_buf_s *temp_buf; + int temp_pos; + + mutex_lock(&ebc_buf_info.dsp_buf_lock); + if (ebc_buf_info.dsp_buf_list) { + if (ebc_buf_info.dsp_buf_list->nb_elt > 0) { + temp_pos = ebc_buf_info.dsp_buf_list->nb_elt - 1; + temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.dsp_buf_list, temp_pos); + if (temp_buf->needpic == 2) { + buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos); + ebc_buf_release(temp_buf); + mutex_unlock(&ebc_buf_info.dsp_buf_lock); + return BUF_SUCCESS; + } + } + } + mutex_unlock(&ebc_buf_info.dsp_buf_lock); + + return BUF_ERROR; +} + int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf) { mutex_lock(&ebc_buf_info.dsp_buf_lock); diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h b/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h index 9885660..c13af6c 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h @@ -33,6 +33,7 @@ int needpic; }; +int ebc_drop_one_dsp_buf(void); struct ebc_buf_s *ebc_empty_osd_buf_get(void); struct ebc_buf_s *ebc_osd_buf_clone(void); int ebc_buf_release(struct ebc_buf_s *release_buf); diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h index 5e6554f..6e12427 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h @@ -11,13 +11,13 @@ #include <linux/notifier.h> /* -* max support panel size 2232x1680 +* max support panel size 2560x1920 * ebc module display buf use 4bit per pixel * eink module display buf use 8bit per pixel * ebc module direct mode display buf use 2bit per pixel */ #define EBC_FB_SIZE 0x200000 /* 2M */ -#define EINK_FB_SIZE 0x400000 /* 4M */ +#define EINK_FB_SIZE 0x500000 /* 5M */ #define DIRECT_FB_SIZE 0x200000 /* 2M */ #define LUT_TABLE_SIZE 0x100000 /* 1M */ #define FRAME_COUNT_SIZE 0x500000 /* 5M */ @@ -31,6 +31,12 @@ #define WF_5BIT 32 /* +* ebc buf format +*/ +#define EBC_Y4 (0) +#define EBC_Y8 (1) + +/* * ebc status notify */ #define EBC_OFF (0) @@ -41,22 +47,24 @@ /* * ebc system ioctl command */ -#define EBC_GET_BUFFER (0x7000) -#define EBC_SEND_BUFFER (0x7001) -#define EBC_GET_BUFFER_INFO (0x7002) +#define EBC_GET_BUFFER (0x7000) +#define EBC_SEND_BUFFER (0x7001) +#define EBC_GET_BUFFER_INFO (0x7002) #define EBC_SET_FULL_MODE_NUM (0x7003) -#define EBC_ENABLE_OVERLAY (0x7004) -#define EBC_DISABLE_OVERLAY (0x7005) -#define EBC_GET_OSD_BUFFER (0x7006) -#define EBC_SEND_OSD_BUFFER (0x7007) -#define EBC_NEW_BUF_PREPARE (0x7008) -#define EBC_SET_DIFF_PERCENT (0x7009) -#define EBC_WAIT_NEW_BUF_TIME (0x700a) +#define EBC_ENABLE_OVERLAY (0x7004) +#define EBC_DISABLE_OVERLAY (0x7005) +#define EBC_GET_OSD_BUFFER (0x7006) +#define EBC_SEND_OSD_BUFFER (0x7007) +#define EBC_NEW_BUF_PREPARE (0x7008) +#define EBC_SET_DIFF_PERCENT (0x7009) +#define EBC_WAIT_NEW_BUF_TIME (0x700a) #define EBC_GET_OVERLAY_STATUS (0x700b) -#define EBC_ENABLE_BG_CONTROL (0x700c) -#define EBC_DISABLE_BG_CONTROL (0x700d) -#define EBC_ENABLE_RESUME_COUNT (0x700e) -#define EBC_DISABLE_RESUME_COUNT (0x700f) +#define EBC_ENABLE_BG_CONTROL (0x700c) +#define EBC_DISABLE_BG_CONTROL (0x700d) +#define EBC_ENABLE_RESUME_COUNT (0x700e) +#define EBC_DISABLE_RESUME_COUNT (0x700f) +#define EBC_GET_BUF_FORMAT (0x7010) +#define EBC_DROP_PREV_BUFFER (0x7011) /* * IMPORTANT: Those values is corresponding to android hardware program, @@ -105,7 +113,7 @@ int win_y2; int width_mm; int height_mm; - int needpic; + int needpic; // 1: buf can not be drop by ebc, 0: buf can drop by ebc 2: regal buf, can not be drop by ebc char tid_name[16]; }; diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S index cad58de..cae08ae 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S @@ -23,31 +23,31 @@ get_overlay_image_area: .LFB2822: .file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" - .loc 1 760 0 + .loc 1 759 0 .cfi_startproc .LVL0: stp x29, x30, [sp, -128]! .cfi_def_cfa_offset 128 .cfi_offset 29, -128 .cfi_offset 30, -120 - .loc 1 761 0 - adrp x6, .LANCHOR0 .loc 1 760 0 + adrp x6, .LANCHOR0 + .loc 1 759 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x25, x26, [sp, 64] .cfi_offset 25, -64 .cfi_offset 26, -56 - .loc 1 761 0 + .loc 1 760 0 ldr x26, [x6, #:lo12:.LANCHOR0] - .loc 1 760 0 + .loc 1 759 0 str x0, [x29, 104] - .loc 1 784 0 - ldr x0, [x5, 248] + .loc 1 783 0 + ldr x0, [x5, 240] .LVL1: - .loc 1 776 0 + .loc 1 775 0 add x26, x26, 24 - .loc 1 760 0 + .loc 1 759 0 stp x19, x20, [sp, 16] stp x21, x22, [sp, 32] stp x27, x28, [sp, 80] @@ -60,71 +60,71 @@ .cfi_offset 28, -40 .cfi_offset 23, -80 .cfi_offset 24, -72 - .loc 1 789 0 + .loc 1 788 0 ldr w19, [x5, 96] - .loc 1 786 0 + .loc 1 785 0 ldp w7, w23, [x0, 48] - .loc 1 789 0 + .loc 1 788 0 add w27, w19, 7 - .loc 1 776 0 + .loc 1 775 0 ldr w6, [x26, 156] str w6, [x29, 124] - .loc 1 784 0 + .loc 1 783 0 cmp w7, 0 - .loc 1 787 0 + .loc 1 786 0 ldp w6, w28, [x0, 56] - .loc 1 784 0 + .loc 1 783 0 add w25, w7, 7 csel w25, w25, w7, lt - .loc 1 790 0 + .loc 1 789 0 ldr w0, [x5, 92] - .loc 1 785 0 + .loc 1 784 0 cmp w6, 0 add w21, w6, 7 csel w21, w21, w6, lt - .loc 1 789 0 + .loc 1 788 0 cmp w19, 0 csel w27, w27, w19, lt - .loc 1 785 0 + .loc 1 784 0 asr w21, w21, 3 add w21, w21, 1 .LVL2: - .loc 1 789 0 + .loc 1 788 0 asr w27, w27, 3 .LVL3: - .loc 1 792 0 + .loc 1 791 0 cmp w21, w27 sub w6, w27, #1 csel w21, w6, w21, ge .LVL4: - .loc 1 794 0 + .loc 1 793 0 cmp w28, w0 sub w0, w0, #1 .LVL5: csel w28, w0, w28, ge .LVL6: - .loc 1 796 0 + .loc 1 795 0 cmp w28, w23 blt .L1 asr w25, w25, 3 .LVL7: - .loc 1 815 0 + .loc 1 814 0 mov w22, 1 lsl w0, w25, 1 str w0, [x29, 120] lsl w0, w25, 3 str w0, [x29, 116] - .loc 1 797 0 + .loc 1 796 0 ldr w0, [x29, 124] mul w20, w23, w27 - .loc 1 896 0 + .loc 1 895 0 mov w30, w22 - .loc 1 797 0 + .loc 1 796 0 cbz w0, .L6 .LVL8: .p2align 2 .L50: - .loc 1 798 0 + .loc 1 797 0 ldp w0, w15, [x26, 84] .LVL9: sub w15, w15, #1 @@ -136,252 +136,252 @@ add x15, x0, x15 .LVL11: .L7: - .loc 1 803 0 + .loc 1 802 0 mul w19, w23, w19 - .loc 1 806 0 + .loc 1 805 0 mov w10, w25 cmp w21, w25 ldp w14, w11, [x29, 116] - .loc 1 803 0 + .loc 1 802 0 sxtw x19, w19 - .loc 1 806 0 + .loc 1 805 0 blt .L20 .LVL12: .p2align 2 .L37: - .loc 1 810 0 + .loc 1 809 0 sbfiz x0, x10, 2, 32 .LVL13: add x0, x0, x20, sxtw 2 ldr w8, [x1, x0] .LVL14: - .loc 1 811 0 + .loc 1 810 0 ldr w7, [x2, x0] .LVL15: - .loc 1 814 0 + .loc 1 813 0 cmp w8, w7 beq .L10 add x9, x19, x14, sxtw - .loc 1 809 0 + .loc 1 808 0 ldrb w13, [x15, w11, sxtw] - .loc 1 815 0 + .loc 1 814 0 str w22, [x5, 60] - .loc 1 816 0 + .loc 1 815 0 eor w6, w8, w7 .LVL16: - .loc 1 807 0 + .loc 1 806 0 add x12, x15, x11, sxtw - .loc 1 812 0 + .loc 1 811 0 add x0, x3, x9 .LVL17: - .loc 1 818 0 + .loc 1 817 0 ldrb w16, [x3, x9] .LVL18: tst x6, 15 ccmp w16, 0, 0, ne - .loc 1 813 0 + .loc 1 812 0 add x16, x4, x9 .LVL19: - .loc 1 818 0 + .loc 1 817 0 bne .L11 - .loc 1 820 0 + .loc 1 819 0 ldrb w17, [x4, x9] - .loc 1 821 0 - and w24, w8, 15 .loc 1 820 0 + and w24, w8, 15 + .loc 1 819 0 add x17, x17, 16 - .loc 1 821 0 + .loc 1 820 0 ldr x18, [x5, x17, lsl 3] ubfiz w17, w7, 5, 4 orr w17, w17, w24 - .loc 1 822 0 + .loc 1 821 0 ldrb w17, [x18, w17, uxtw] - .loc 1 823 0 - strb w22, [x3, x9] .loc 1 822 0 + strb w22, [x3, x9] + .loc 1 821 0 orr w13, w13, w17 and w13, w13, 255 .L11: - .loc 1 828 0 + .loc 1 827 0 ldrb w9, [x0, 1] tst w6, 240 ccmp w9, 0, 0, ne bne .L12 - .loc 1 830 0 + .loc 1 829 0 ldrb w9, [x16, 1] - .loc 1 831 0 - ubfx x18, x8, 4, 4 .loc 1 830 0 + ubfx x18, x8, 4, 4 + .loc 1 829 0 add x9, x9, 16 - .loc 1 831 0 + .loc 1 830 0 ldr x17, [x5, x9, lsl 3] lsr w9, w7, 4 ubfiz w9, w9, 5, 4 orr w9, w9, w18 - .loc 1 832 0 + .loc 1 831 0 ldrb w9, [x17, w9, uxtw] - .loc 1 833 0 - strb w30, [x0, 1] .loc 1 832 0 + strb w30, [x0, 1] + .loc 1 831 0 orr w13, w13, w9, lsl 2 and w13, w13, 255 .L12: - .loc 1 838 0 + .loc 1 837 0 ldrb w9, [x0, 2] tst w6, 3840 ccmp w9, 0, 0, ne bne .L13 - .loc 1 840 0 + .loc 1 839 0 ldrb w9, [x16, 2] - .loc 1 841 0 - ubfx x18, x8, 8, 4 .loc 1 840 0 + ubfx x18, x8, 8, 4 + .loc 1 839 0 add x9, x9, 16 - .loc 1 841 0 + .loc 1 840 0 ldr x17, [x5, x9, lsl 3] lsr w9, w7, 8 ubfiz w9, w9, 5, 4 orr w9, w9, w18 - .loc 1 842 0 + .loc 1 841 0 ldrb w9, [x17, w9, uxtw] - .loc 1 843 0 - strb w30, [x0, 2] .loc 1 842 0 + strb w30, [x0, 2] + .loc 1 841 0 orr w13, w13, w9, lsl 4 and w13, w13, 255 .L13: - .loc 1 848 0 + .loc 1 847 0 ldrb w9, [x0, 3] tst w6, 61440 ccmp w9, 0, 0, ne bne .L14 - .loc 1 850 0 + .loc 1 849 0 ldrb w9, [x16, 3] - .loc 1 851 0 - ubfx x18, x8, 12, 4 .loc 1 850 0 + ubfx x18, x8, 12, 4 + .loc 1 849 0 add x9, x9, 16 - .loc 1 851 0 + .loc 1 850 0 ldr x17, [x5, x9, lsl 3] lsr w9, w7, 12 ubfiz w9, w9, 5, 4 orr w9, w9, w18 - .loc 1 852 0 + .loc 1 851 0 ldrb w9, [x17, w9, uxtw] - .loc 1 853 0 - strb w30, [x0, 3] .loc 1 852 0 + strb w30, [x0, 3] + .loc 1 851 0 orr w13, w13, w9, lsl 6 and w13, w13, 255 .L14: - .loc 1 855 0 + .loc 1 854 0 strb w13, [x12] - .loc 1 861 0 + .loc 1 860 0 tst w6, 983040 - .loc 1 857 0 + .loc 1 856 0 ldrb w9, [x12, 1] - .loc 1 861 0 + .loc 1 860 0 ldrb w13, [x0, 4] ccmp w13, 0, 0, ne bne .L15 - .loc 1 863 0 + .loc 1 862 0 ldrb w13, [x16, 4] - .loc 1 864 0 - ubfx x18, x8, 16, 4 .loc 1 863 0 + ubfx x18, x8, 16, 4 + .loc 1 862 0 add x13, x13, 16 - .loc 1 864 0 + .loc 1 863 0 ldr x17, [x5, x13, lsl 3] lsr w13, w7, 16 ubfiz w13, w13, 5, 4 orr w13, w13, w18 - .loc 1 865 0 + .loc 1 864 0 ldrb w13, [x17, w13, uxtw] - .loc 1 866 0 - strb w30, [x0, 4] .loc 1 865 0 + strb w30, [x0, 4] + .loc 1 864 0 orr w9, w9, w13 and w9, w9, 255 .L15: - .loc 1 871 0 + .loc 1 870 0 ldrb w13, [x0, 5] tst w6, 15728640 ccmp w13, 0, 0, ne bne .L16 - .loc 1 873 0 + .loc 1 872 0 ldrb w13, [x16, 5] - .loc 1 874 0 - ubfx x18, x8, 20, 4 .loc 1 873 0 + ubfx x18, x8, 20, 4 + .loc 1 872 0 add x13, x13, 16 - .loc 1 874 0 + .loc 1 873 0 ldr x17, [x5, x13, lsl 3] lsr w13, w7, 20 ubfiz w13, w13, 5, 4 orr w13, w13, w18 - .loc 1 875 0 + .loc 1 874 0 ldrb w13, [x17, w13, uxtw] - .loc 1 876 0 - strb w30, [x0, 5] .loc 1 875 0 + strb w30, [x0, 5] + .loc 1 874 0 orr w9, w9, w13, lsl 2 and w9, w9, 255 .L16: - .loc 1 881 0 + .loc 1 880 0 ldrb w13, [x0, 6] tst w6, 251658240 ccmp w13, 0, 0, ne bne .L17 - .loc 1 883 0 + .loc 1 882 0 ldrb w13, [x16, 6] - .loc 1 884 0 - ubfx x18, x8, 24, 4 .loc 1 883 0 + ubfx x18, x8, 24, 4 + .loc 1 882 0 add x13, x13, 16 - .loc 1 884 0 + .loc 1 883 0 ldr x17, [x5, x13, lsl 3] lsr w13, w7, 24 ubfiz w13, w13, 5, 4 orr w13, w13, w18 - .loc 1 885 0 + .loc 1 884 0 ldrb w13, [x17, w13, uxtw] - .loc 1 886 0 - strb w30, [x0, 6] .loc 1 885 0 + strb w30, [x0, 6] + .loc 1 884 0 orr w9, w9, w13, lsl 4 and w9, w9, 255 .L17: - .loc 1 891 0 + .loc 1 890 0 tst w6, -268435456 ldrb w6, [x0, 7] .LVL20: ccmp w6, 0, 0, ne bne .L18 - .loc 1 893 0 + .loc 1 892 0 ldrb w6, [x16, 7] - .loc 1 894 0 + .loc 1 893 0 lsr w7, w7, 28 .LVL21: lsr w8, w8, 28 .LVL22: - .loc 1 893 0 + .loc 1 892 0 add x6, x6, 16 - .loc 1 894 0 + .loc 1 893 0 add w7, w8, w7, lsl 5 ldr x6, [x5, x6, lsl 3] - .loc 1 895 0 + .loc 1 894 0 ldrb w6, [x6, w7, uxtw] - .loc 1 896 0 - strb w30, [x0, 7] .loc 1 895 0 + strb w30, [x0, 7] + .loc 1 894 0 orr w9, w9, w6, lsl 6 and w9, w9, 255 .LVL23: .L18: - .loc 1 898 0 + .loc 1 897 0 strb w9, [x12, 1] .L10: - .loc 1 806 0 discriminator 2 + .loc 1 805 0 discriminator 2 add w10, w10, 1 add w11, w11, 2 add w14, w14, 8 @@ -389,18 +389,18 @@ bge .L37 .LVL24: .L20: - .loc 1 796 0 + .loc 1 795 0 add w23, w23, 1 add w20, w20, w27 cmp w28, w23 blt .L1 - .loc 1 797 0 + .loc 1 796 0 ldr w0, [x29, 124] .LVL25: ldr w19, [x5, 96] cbnz w0, .L50 .L6: - .loc 1 800 0 + .loc 1 799 0 ldr w15, [x26, 84] .LVL26: ldr x0, [x29, 104] @@ -412,7 +412,7 @@ b .L7 .LVL29: .L1: - .loc 1 902 0 + .loc 1 901 0 ldp x19, x20, [sp, 16] ldp x21, x22, [sp, 32] .LVL30: @@ -445,74 +445,74 @@ .type get_auto_image, %function get_auto_image: .LFB2825: - .loc 1 1050 0 + .loc 1 1049 0 .cfi_startproc .LVL34: stp x29, x30, [sp, -64]! .cfi_def_cfa_offset 64 .cfi_offset 29, -64 .cfi_offset 30, -56 - .loc 1 1051 0 - adrp x6, .LANCHOR0 - .loc 1 1070 0 - cmp w5, 2 .loc 1 1050 0 + adrp x6, .LANCHOR0 + .loc 1 1069 0 + cmp w5, 2 + .loc 1 1049 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 1051 0 - ldr x17, [x6, #:lo12:.LANCHOR0] .loc 1 1050 0 + ldr x17, [x6, #:lo12:.LANCHOR0] + .loc 1 1049 0 stp x19, x20, [sp, 16] .cfi_offset 19, -48 .cfi_offset 20, -40 - .loc 1 1065 0 + .loc 1 1064 0 add x20, x4, 60 .LVL35: - .loc 1 1061 0 + .loc 1 1060 0 add x17, x17, 24 - .loc 1 1050 0 + .loc 1 1049 0 stp x21, x22, [sp, 32] stp x23, x24, [sp, 48] .cfi_offset 21, -32 .cfi_offset 22, -24 .cfi_offset 23, -16 .cfi_offset 24, -8 - .loc 1 1058 0 + .loc 1 1057 0 ldrb w13, [x4, 56] .LVL36: - .loc 1 1068 0 - ldp w6, w24, [x17, 84] - .loc 1 1061 0 - ldr w30, [x17, 156] .loc 1 1067 0 + ldp w6, w24, [x17, 84] + .loc 1 1060 0 + ldr w30, [x17, 156] + .loc 1 1066 0 lsr w14, w6, 3 - .loc 1 1070 0 + .loc 1 1069 0 beq .L106 - .loc 1 1073 0 + .loc 1 1072 0 cmp w5, 3 - .loc 1 1080 0 + .loc 1 1079 0 mov w18, 0 .LVL37: - .loc 1 1073 0 + .loc 1 1072 0 beq .L107 .LVL38: .L55: - .loc 1 1083 0 discriminator 1 + .loc 1 1082 0 discriminator 1 cmp w18, w24 bge .L79 sub w16, w14, #1 - .loc 1 1083 0 is_stmt 0 + .loc 1 1082 0 is_stmt 0 mov w8, 0 .LVL39: add x16, x16, 1 lsl x19, x16, 3 lsl x16, x16, 2 - .loc 1 1084 0 is_stmt 1 + .loc 1 1083 0 is_stmt 1 cbz w30, .L56 .LVL40: .p2align 2 .L116: - .loc 1 1085 0 + .loc 1 1084 0 ldr w10, [x17, 88] sub w10, w10, #1 sub w10, w10, w18 @@ -524,293 +524,293 @@ add x6, x3, 8 add x10, x10, 2 .LVL42: - .loc 1 1089 0 discriminator 1 + .loc 1 1088 0 discriminator 1 mov x9, 0 cbz w14, .L58 .p2align 2 .L95: - .loc 1 1092 0 + .loc 1 1091 0 ldr w7, [x1, x9, lsl 2] .LVL43: - .loc 1 1093 0 + .loc 1 1092 0 ldr w5, [x2, x9, lsl 2] .LVL44: - .loc 1 1094 0 + .loc 1 1093 0 cmp w7, w5 beq .L60 - .loc 1 1096 0 + .loc 1 1095 0 eor w8, w7, w5 .LVL45: - .loc 1 1091 0 + .loc 1 1090 0 mov w11, 0 - .loc 1 1097 0 + .loc 1 1096 0 tst x8, 15 beq .L61 - .loc 1 1098 0 + .loc 1 1097 0 ldrb w21, [x6, -8] - .loc 1 1100 0 + .loc 1 1099 0 and w22, w7, 15 ubfiz w11, w5, 5, 4 ldr x15, [x4, 128] orr w11, w11, w22 - .loc 1 1102 0 + .loc 1 1101 0 add w12, w21, 1 - .loc 1 1100 0 - add x11, x15, x11 .loc 1 1099 0 + add x11, x15, x11 + .loc 1 1098 0 lsl w21, w21, 10 - .loc 1 1102 0 + .loc 1 1101 0 and w12, w12, 255 - .loc 1 1103 0 + .loc 1 1102 0 cmp w13, w12 - .loc 1 1100 0 + .loc 1 1099 0 ldrb w11, [x11, w21, sxtw] - .loc 1 1103 0 + .loc 1 1102 0 beq .L108 .L62: - .loc 1 1107 0 + .loc 1 1106 0 strb w12, [x6, -8] .L61: - .loc 1 1110 0 + .loc 1 1109 0 tst w8, 240 beq .L63 - .loc 1 1113 0 + .loc 1 1112 0 lsr w12, w5, 4 - .loc 1 1111 0 + .loc 1 1110 0 ldrb w21, [x6, -7] - .loc 1 1113 0 + .loc 1 1112 0 ubfx x22, x7, 4, 4 ubfiz w12, w12, 5, 4 orr w12, w12, w22 ldr x22, [x4, 128] - .loc 1 1112 0 + .loc 1 1111 0 lsl w23, w21, 10 - .loc 1 1115 0 - add w21, w21, 1 - .loc 1 1113 0 - add x12, x22, x12 - .loc 1 1115 0 - and w21, w21, 255 - .loc 1 1116 0 - cmp w13, w21 .loc 1 1114 0 + add w21, w21, 1 + .loc 1 1112 0 + add x12, x22, x12 + .loc 1 1114 0 + and w21, w21, 255 + .loc 1 1115 0 + cmp w13, w21 + .loc 1 1113 0 ldrb w12, [x12, w23, sxtw] orr w11, w11, w12, lsl 2 and w11, w11, 255 - .loc 1 1116 0 + .loc 1 1115 0 beq .L109 .L64: - .loc 1 1120 0 + .loc 1 1119 0 strb w21, [x6, -7] .L63: - .loc 1 1123 0 + .loc 1 1122 0 tst w8, 3840 beq .L65 - .loc 1 1126 0 + .loc 1 1125 0 lsr w12, w5, 8 - .loc 1 1124 0 + .loc 1 1123 0 ldrb w21, [x6, -6] - .loc 1 1126 0 + .loc 1 1125 0 ubfx x22, x7, 8, 4 ubfiz w12, w12, 5, 4 orr w12, w12, w22 ldr x22, [x4, 128] - .loc 1 1125 0 + .loc 1 1124 0 lsl w23, w21, 10 - .loc 1 1128 0 - add w21, w21, 1 - .loc 1 1126 0 - add x12, x22, x12 - .loc 1 1128 0 - and w21, w21, 255 - .loc 1 1129 0 - cmp w13, w21 .loc 1 1127 0 + add w21, w21, 1 + .loc 1 1125 0 + add x12, x22, x12 + .loc 1 1127 0 + and w21, w21, 255 + .loc 1 1128 0 + cmp w13, w21 + .loc 1 1126 0 ldrb w12, [x12, w23, sxtw] orr w11, w11, w12, lsl 4 and w11, w11, 255 - .loc 1 1129 0 + .loc 1 1128 0 beq .L110 .L66: - .loc 1 1133 0 + .loc 1 1132 0 strb w21, [x6, -6] .L65: - .loc 1 1136 0 + .loc 1 1135 0 tst w8, 61440 beq .L67 - .loc 1 1139 0 + .loc 1 1138 0 lsr w12, w5, 12 - .loc 1 1137 0 + .loc 1 1136 0 ldrb w21, [x6, -5] - .loc 1 1139 0 + .loc 1 1138 0 ubfx x22, x7, 12, 4 ubfiz w12, w12, 5, 4 orr w12, w12, w22 ldr x22, [x4, 128] - .loc 1 1138 0 + .loc 1 1137 0 lsl w23, w21, 10 - .loc 1 1141 0 - add w21, w21, 1 - .loc 1 1139 0 - add x12, x22, x12 - .loc 1 1141 0 - and w21, w21, 255 - .loc 1 1142 0 - cmp w13, w21 .loc 1 1140 0 + add w21, w21, 1 + .loc 1 1138 0 + add x12, x22, x12 + .loc 1 1140 0 + and w21, w21, 255 + .loc 1 1141 0 + cmp w13, w21 + .loc 1 1139 0 ldrb w12, [x12, w23, sxtw] orr w11, w11, w12, lsl 6 and w11, w11, 255 - .loc 1 1142 0 + .loc 1 1141 0 beq .L111 .L68: - .loc 1 1146 0 + .loc 1 1145 0 strb w21, [x6, -5] .L67: - .loc 1 1149 0 + .loc 1 1148 0 strb w11, [x10, -2] - .loc 1 1152 0 - tst w8, 983040 .loc 1 1151 0 + tst w8, 983040 + .loc 1 1150 0 mov w11, 0 - .loc 1 1152 0 + .loc 1 1151 0 beq .L69 - .loc 1 1155 0 + .loc 1 1154 0 lsr w11, w5, 16 - .loc 1 1153 0 + .loc 1 1152 0 ldrb w12, [x6, -4] - .loc 1 1155 0 + .loc 1 1154 0 ubfx x21, x7, 16, 4 ubfiz w11, w11, 5, 4 orr w11, w11, w21 ldr x21, [x4, 128] - .loc 1 1154 0 + .loc 1 1153 0 lsl w22, w12, 10 - .loc 1 1157 0 + .loc 1 1156 0 add w12, w12, 1 - .loc 1 1155 0 + .loc 1 1154 0 add x11, x21, x11 - .loc 1 1157 0 + .loc 1 1156 0 and w12, w12, 255 - .loc 1 1158 0 + .loc 1 1157 0 cmp w13, w12 - .loc 1 1155 0 + .loc 1 1154 0 ldrb w11, [x11, w22, sxtw] - .loc 1 1158 0 + .loc 1 1157 0 beq .L112 .L70: - .loc 1 1162 0 + .loc 1 1161 0 strb w12, [x6, -4] .L69: - .loc 1 1165 0 + .loc 1 1164 0 tst w8, 15728640 beq .L71 - .loc 1 1168 0 + .loc 1 1167 0 lsr w12, w5, 20 - .loc 1 1166 0 + .loc 1 1165 0 ldrb w21, [x6, -3] - .loc 1 1168 0 + .loc 1 1167 0 ubfx x22, x7, 20, 4 ubfiz w12, w12, 5, 4 orr w12, w12, w22 ldr x22, [x4, 128] - .loc 1 1167 0 + .loc 1 1166 0 lsl w23, w21, 10 - .loc 1 1170 0 - add w21, w21, 1 - .loc 1 1168 0 - add x12, x22, x12 - .loc 1 1170 0 - and w21, w21, 255 - .loc 1 1171 0 - cmp w13, w21 .loc 1 1169 0 + add w21, w21, 1 + .loc 1 1167 0 + add x12, x22, x12 + .loc 1 1169 0 + and w21, w21, 255 + .loc 1 1170 0 + cmp w13, w21 + .loc 1 1168 0 ldrb w12, [x12, w23, sxtw] orr w11, w11, w12, lsl 2 and w11, w11, 255 - .loc 1 1171 0 + .loc 1 1170 0 beq .L113 .L72: - .loc 1 1175 0 + .loc 1 1174 0 strb w21, [x6, -3] .L71: - .loc 1 1178 0 + .loc 1 1177 0 tst w8, 251658240 beq .L73 - .loc 1 1181 0 + .loc 1 1180 0 lsr w12, w5, 24 - .loc 1 1179 0 + .loc 1 1178 0 ldrb w21, [x6, -2] - .loc 1 1181 0 + .loc 1 1180 0 ubfx x22, x7, 24, 4 ubfiz w12, w12, 5, 4 orr w12, w12, w22 ldr x22, [x4, 128] - .loc 1 1180 0 + .loc 1 1179 0 lsl w23, w21, 10 - .loc 1 1183 0 - add w21, w21, 1 - .loc 1 1181 0 - add x12, x22, x12 - .loc 1 1183 0 - and w21, w21, 255 - .loc 1 1184 0 - cmp w13, w21 .loc 1 1182 0 + add w21, w21, 1 + .loc 1 1180 0 + add x12, x22, x12 + .loc 1 1182 0 + and w21, w21, 255 + .loc 1 1183 0 + cmp w13, w21 + .loc 1 1181 0 ldrb w12, [x12, w23, sxtw] orr w11, w11, w12, lsl 4 and w11, w11, 255 - .loc 1 1184 0 + .loc 1 1183 0 beq .L114 .L74: - .loc 1 1188 0 + .loc 1 1187 0 strb w21, [x6, -2] .L73: - .loc 1 1191 0 + .loc 1 1190 0 tst w8, -268435456 beq .L75 - .loc 1 1192 0 + .loc 1 1191 0 ldrb w21, [x6, -1] - .loc 1 1194 0 + .loc 1 1193 0 lsr w8, w5, 28 .LVL46: mov w12, w8 lsr w22, w7, 28 ldr x15, [x4, 128] add w8, w22, w12, lsl 5 - .loc 1 1196 0 - add w12, w21, 1 - .loc 1 1193 0 - lsl w21, w21, 10 - .loc 1 1194 0 - add x8, x15, x8 - .loc 1 1196 0 - and w12, w12, 255 - .loc 1 1197 0 - cmp w13, w12 .loc 1 1195 0 + add w12, w21, 1 + .loc 1 1192 0 + lsl w21, w21, 10 + .loc 1 1193 0 + add x8, x15, x8 + .loc 1 1195 0 + and w12, w12, 255 + .loc 1 1196 0 + cmp w13, w12 + .loc 1 1194 0 ldrb w8, [x8, w21, sxtw] orr w11, w11, w8, lsl 6 and w11, w11, 255 - .loc 1 1197 0 + .loc 1 1196 0 beq .L115 .L76: - .loc 1 1201 0 + .loc 1 1200 0 strb w12, [x6, -1] .LVL47: .L75: - .loc 1 1204 0 + .loc 1 1203 0 str w5, [x2, x9, lsl 2] - .loc 1 1095 0 + .loc 1 1094 0 mov w8, 1 .LVL48: - .loc 1 1205 0 + .loc 1 1204 0 strb w11, [x10, -1] .L77: add x9, x9, 1 add x6, x6, 8 add x10, x10, 2 - .loc 1 1089 0 discriminator 2 + .loc 1 1088 0 discriminator 2 cmp w14, w9 bgt .L95 add x3, x3, x19 @@ -818,15 +818,15 @@ add x1, x1, x16 .LVL49: .L58: - .loc 1 1083 0 + .loc 1 1082 0 add w18, w18, 1 cmp w24, w18 beq .L53 ldr w6, [x17, 84] - .loc 1 1084 0 + .loc 1 1083 0 cbnz w30, .L116 .L56: - .loc 1 1087 0 + .loc 1 1086 0 mul w10, w18, w6 lsr w10, w10, 2 add x10, x0, x10 @@ -835,107 +835,107 @@ .LVL51: .p2align 3 .L115: - .loc 1 1199 0 + .loc 1 1198 0 and w5, w5, 268435455 .LVL52: and w7, w7, -268435456 .LVL53: orr w5, w7, w5 .LVL54: - .loc 1 1198 0 + .loc 1 1197 0 mov w12, 0 b .L76 .LVL55: .p2align 3 .L114: - .loc 1 1186 0 + .loc 1 1185 0 and w5, w5, -251658241 .LVL56: and w12, w7, 251658240 orr w5, w12, w5 .LVL57: - .loc 1 1185 0 + .loc 1 1184 0 mov w21, 0 b .L74 .p2align 3 .L112: - .loc 1 1160 0 + .loc 1 1159 0 and w12, w7, 983040 and w5, w5, -983041 .LVL58: orr w5, w12, w5 .LVL59: - .loc 1 1159 0 + .loc 1 1158 0 mov w12, 0 b .L70 .p2align 3 .L113: - .loc 1 1173 0 + .loc 1 1172 0 and w5, w5, -15728641 .LVL60: and w12, w7, 15728640 orr w5, w12, w5 .LVL61: - .loc 1 1172 0 + .loc 1 1171 0 mov w21, 0 b .L72 .p2align 3 .L111: - .loc 1 1144 0 + .loc 1 1143 0 and w5, w5, -61441 .LVL62: and w12, w7, 61440 orr w5, w12, w5 .LVL63: - .loc 1 1143 0 + .loc 1 1142 0 mov w21, 0 b .L68 .p2align 3 .L109: - .loc 1 1118 0 + .loc 1 1117 0 and w5, w5, -241 .LVL64: and w12, w7, 240 orr w5, w12, w5 .LVL65: - .loc 1 1117 0 + .loc 1 1116 0 mov w21, 0 b .L64 .p2align 3 .L110: - .loc 1 1131 0 + .loc 1 1130 0 and w5, w5, -3841 .LVL66: and w12, w7, 3840 orr w5, w12, w5 .LVL67: - .loc 1 1130 0 + .loc 1 1129 0 mov w21, 0 b .L66 .p2align 3 .L108: - .loc 1 1105 0 - bfi w5, w22, 0, 4 .loc 1 1104 0 + bfi w5, w22, 0, 4 + .loc 1 1103 0 mov w12, 0 b .L62 .LVL68: .p2align 3 .L60: - .loc 1 1208 0 + .loc 1 1207 0 strb wzr, [x10, -2] - .loc 1 1209 0 + .loc 1 1208 0 strb wzr, [x10, -1] b .L77 .LVL69: .L79: - .loc 1 1083 0 + .loc 1 1082 0 mov w8, 0 .LVL70: .L53: - .loc 1 1216 0 + .loc 1 1215 0 str w8, [x20] - .loc 1 1217 0 + .loc 1 1216 0 ldp x19, x20, [sp, 16] .LVL71: ldp x21, x22, [sp, 32] @@ -956,29 +956,29 @@ .LVL73: .L106: .cfi_restore_state - .loc 1 1072 0 + .loc 1 1071 0 add w18, w24, w24, lsr 31 asr w24, w18, 1 - .loc 1 1071 0 + .loc 1 1070 0 mov w18, 0 .LVL74: b .L55 .LVL75: .L107: - .loc 1 1074 0 + .loc 1 1073 0 add w15, w24, w24, lsr 31 - .loc 1 1078 0 + .loc 1 1077 0 add x20, x4, 64 - .loc 1 1074 0 + .loc 1 1073 0 asr w18, w15, 1 - .loc 1 1075 0 + .loc 1 1074 0 mul w5, w14, w18 .LVL76: sbfiz x5, x5, 2, 32 add x1, x1, x5 - .loc 1 1076 0 + .loc 1 1075 0 add x2, x2, x5 - .loc 1 1077 0 + .loc 1 1076 0 mul w5, w18, w6 add x3, x3, x5 b .L55 @@ -990,15 +990,15 @@ .type waveform_open, %function waveform_open: .LFB2853: - .loc 1 3164 0 + .loc 1 3172 0 .cfi_startproc .LVL77: - .loc 1 3168 0 + .loc 1 3176 0 mov w0, 0 .LVL78: - .loc 1 3165 0 + .loc 1 3173 0 str xzr, [x1, 104] - .loc 1 3168 0 + .loc 1 3176 0 ret .cfi_endproc .LFE2853: @@ -1008,22 +1008,22 @@ .type ebc_exit, %function ebc_exit: .LFB2874: - .loc 1 3779 0 + .loc 1 3791 0 .cfi_startproc stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 3780 0 + .loc 1 3792 0 adrp x0, .LANCHOR1 add x0, x0, :lo12:.LANCHOR1 - .loc 1 3779 0 + .loc 1 3791 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3780 0 + .loc 1 3792 0 bl platform_driver_unregister .LVL79: - .loc 1 3781 0 + .loc 1 3793 0 ldp x29, x30, [sp], 16 .cfi_restore 30 .cfi_restore 29 @@ -1038,7 +1038,7 @@ .type ebc_resume, %function ebc_resume: .LFB2872: - .loc 1 3741 0 + .loc 1 3753 0 .cfi_startproc .LVL80: stp x29, x30, [sp, -32]! @@ -1049,17 +1049,17 @@ .cfi_def_cfa_register 29 str x19, [sp, 16] .cfi_offset 19, -16 -.LBB1056: -.LBB1057: +.LBB1088: +.LBB1089: .file 2 "./include/linux/device.h" .loc 2 1181 0 ldr x19, [x0, 184] -.LBE1057: -.LBE1056: - .loc 1 3745 0 +.LBE1089: +.LBE1088: + .loc 1 3757 0 ldr x1, [x19, 16] -.LBB1058: -.LBB1059: +.LBB1090: +.LBB1091: .file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h" .loc 3 45 0 mov x0, x1 @@ -1067,17 +1067,17 @@ ldr x1, [x1, 48] blr x1 .LVL82: -.LBE1059: -.LBE1058: - .loc 1 3746 0 - str wzr, [x19, 796] - .loc 1 3747 0 +.LBE1091: +.LBE1090: + .loc 1 3758 0 + str wzr, [x19, 780] + .loc 1 3759 0 ldr x0, [x19, 296] adrp x1, .LC0 add x1, x1, :lo12:.LC0 bl _dev_info .LVL83: - .loc 1 3750 0 + .loc 1 3762 0 ldr x19, [sp, 16] mov w0, 0 ldp x29, x30, [sp], 32 @@ -1094,34 +1094,34 @@ .type ebc_frame_control_timeout, %function ebc_frame_control_timeout: .LFB2846: - .loc 1 2835 0 + .loc 1 2838 0 .cfi_startproc .LVL84: stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 2836 0 + .loc 1 2839 0 adrp x0, .LANCHOR0 .LVL85: - .loc 1 2838 0 + .loc 1 2841 0 mov w3, 1 - .loc 1 2839 0 + .loc 1 2842 0 adrp x1, .LC1 - .loc 1 2835 0 + .loc 1 2838 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 2836 0 - ldr x2, [x0, #:lo12:.LANCHOR0] .loc 1 2839 0 + ldr x2, [x0, #:lo12:.LANCHOR0] + .loc 1 2842 0 add x1, x1, :lo12:.LC1 ldr x0, [x2, 296] - .loc 1 2838 0 - str w3, [x2, 808] - .loc 1 2839 0 + .loc 1 2841 0 + str w3, [x2, 792] + .loc 1 2842 0 bl _dev_info .LVL86: - .loc 1 2842 0 + .loc 1 2845 0 ldp x29, x30, [sp], 16 .cfi_restore 30 .cfi_restore 29 @@ -1135,27 +1135,27 @@ .type ebc_remove, %function ebc_remove: .LFB2870: - .loc 1 3717 0 + .loc 1 3729 0 .cfi_startproc .LVL87: stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 3718 0 + .loc 1 3730 0 adrp x0, .LANCHOR1 .LVL88: add x0, x0, :lo12:.LANCHOR1 - .loc 1 3717 0 + .loc 1 3729 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3718 0 + .loc 1 3730 0 add x0, x0, 224 - .loc 1 3717 0 - .loc 1 3718 0 + .loc 1 3729 0 + .loc 1 3730 0 bl misc_deregister .LVL89: - .loc 1 3721 0 + .loc 1 3733 0 mov w0, 0 ldp x29, x30, [sp], 16 .cfi_restore 30 @@ -1170,7 +1170,7 @@ .type ebc_mmap, %function ebc_mmap: .LFB2850: - .loc 1 3110 0 + .loc 1 3118 0 .cfi_startproc .LVL90: stp x29, x30, [sp, -32]! @@ -1181,33 +1181,33 @@ .cfi_def_cfa_register 29 str x19, [sp, 16] .cfi_offset 19, -16 - .loc 1 3110 0 + .loc 1 3118 0 mov x19, x1 - .loc 1 3113 0 + .loc 1 3121 0 bl ebc_phy_buf_base_get .LVL91: - .loc 1 3116 0 + .loc 1 3124 0 lsr x2, x0, 12 - .loc 1 3114 0 + .loc 1 3122 0 mov x6, 16384 - .loc 1 3116 0 + .loc 1 3124 0 mov x0, x19 - .loc 1 3114 0 + .loc 1 3122 0 ldp x4, x5, [x19, 72] movk x6, 0x404, lsl 16 - .loc 1 3116 0 + .loc 1 3124 0 ldp x1, x3, [x19] - .loc 1 3114 0 + .loc 1 3122 0 orr x5, x5, x6 str x5, [x19, 80] - .loc 1 3116 0 + .loc 1 3124 0 sub x3, x3, x1 bl remap_pfn_range .LVL92: - .loc 1 3119 0 + .loc 1 3127 0 cmp w0, 0 mov w1, -11 - .loc 1 3122 0 + .loc 1 3130 0 ldr x19, [sp, 16] .LVL93: csel w0, w0, w1, eq @@ -1225,47 +1225,47 @@ .type waveform_mmap, %function waveform_mmap: .LFB2852: - .loc 1 3148 0 + .loc 1 3156 0 .cfi_startproc .LVL94: stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 3149 0 + .loc 1 3157 0 adrp x2, .LANCHOR0 - .loc 1 3153 0 + .loc 1 3161 0 mov x7, 16384 - .loc 1 3155 0 + .loc 1 3163 0 mov x0, x1 .LVL95: - .loc 1 3148 0 + .loc 1 3156 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3152 0 + .loc 1 3160 0 ldr x2, [x2, #:lo12:.LANCHOR0] - .loc 1 3153 0 + .loc 1 3161 0 movk x7, 0x404, lsl 16 ldp x4, x5, [x1, 72] - .loc 1 3155 0 + .loc 1 3163 0 ldp x6, x3, [x1] - .loc 1 3153 0 + .loc 1 3161 0 orr x5, x5, x7 - .loc 1 3152 0 + .loc 1 3160 0 ldr x2, [x2, 232] - .loc 1 3153 0 + .loc 1 3161 0 str x5, [x1, 80] - .loc 1 3155 0 + .loc 1 3163 0 sub x3, x3, x6 mov x1, x6 .LVL96: lsr x2, x2, 12 bl remap_pfn_range .LVL97: - .loc 1 3158 0 + .loc 1 3166 0 cmp w0, 0 mov w1, -11 - .loc 1 3161 0 + .loc 1 3169 0 ldp x29, x30, [sp], 16 .cfi_restore 30 .cfi_restore 29 @@ -1280,7 +1280,7 @@ .type ebc_io_ctl, %function ebc_io_ctl: .LFB2849: - .loc 1 2924 0 + .loc 1 2927 0 .cfi_startproc .LVL98: stp x29, x30, [sp, -160]! @@ -1304,122 +1304,272 @@ mov x21, x2 str x25, [sp, 64] .cfi_offset 25, -96 - .loc 1 2924 0 + .loc 1 2927 0 ldr x3, [x0] str x3, [x29, 152] mov x3,0 - .loc 1 2934 0 + .loc 1 2937 0 mov w0, 28679 - .loc 1 2926 0 + .loc 1 2929 0 adrp x3, .LANCHOR0 - .loc 1 2934 0 + .loc 1 2937 0 cmp w1, w0 - .loc 1 2926 0 + .loc 1 2929 0 ldr x20, [x3, #:lo12:.LANCHOR0] - .loc 1 2934 0 + .loc 1 2937 0 bhi .L136 mov w0, 28678 cmp w1, w0 bcs .L137 sub w0, w1, #28672 cmp w0, 3 - bls .L137 + bhi .L135 +.L137: + .loc 1 2948 0 + cbz x21, .L252 +.L257: + sub w0, w1, #28672 .L135: - .loc 1 2953 0 - mov w0, 28679 - cmp w1, w0 - beq .L140 - bls .L255 - mov w0, 28683 - cmp w1, w0 - beq .L150 - bls .L256 - mov w0, 28685 - cmp w1, w0 - beq .L155 - bcc .L156 - mov w0, 28686 - cmp w1, w0 - beq .L157 - mov w0, 28687 - cmp w1, w0 - bne .L139 - .loc 1 3049 0 + .loc 1 2957 0 + cmp w0, 16 + bls .L260 + .loc 1 3110 0 ldr x0, [x20, 296] - adrp x1, .LC6 + adrp x2, .LANCHOR2 + adrp x1, .LC13 .LVL100: - .loc 1 3048 0 - str wzr, [x20, 816] - .loc 1 3049 0 - add x1, x1, :lo12:.LC6 - bl _dev_info + add x2, x2, :lo12:.LANCHOR2 + add x1, x1, :lo12:.LC13 + bl _dev_err .LVL101: - .loc 1 3050 0 + .loc 1 3111 0 mov x0, 0 b .L134 .LVL102: .p2align 3 .L136: - .loc 1 2934 0 - mov w0, -28681 - add w0, w1, w0 - cmp w0, 2 - bhi .L135 -.L137: - .loc 1 2944 0 - cbnz x21, .L135 - .loc 1 2945 0 - ldr x0, [x20, 296] - adrp x2, .LANCHOR2 - adrp x1, .LC2 -.LVL103: - add x2, x2, :lo12:.LANCHOR2 - add x1, x1, :lo12:.LC2 - bl _dev_err -.LVL104: - .loc 1 2946 0 - mov x0, -14 - b .L134 -.LVL105: + .loc 1 2937 0 + mov w0, 28681 + cmp w1, w0 + bcc .L257 + mov w0, 28683 + cmp w1, w0 + bls .L137 + mov w0, 28688 + cmp w1, w0 + bne .L257 + .loc 1 2948 0 + cbnz x21, .L257 + b .L252 .p2align 3 -.L255: - .loc 1 2953 0 - mov w0, 28675 - cmp w1, w0 - beq .L142 - bls .L257 - mov w0, 28677 - cmp w1, w0 - beq .L147 - bhi .L258 - .loc 1 3053 0 - ldr x0, [x20, 296] - .loc 1 3052 0 - mov w2, 1 - str w2, [x20, 804] - .loc 1 3053 0 - adrp x1, .LC7 +.L260: + .loc 1 2957 0 + adrp x1, .L141 +.LVL103: + add x1, x1, :lo12:.L141 + ldrh w0, [x1,w0,uxtw #1] + adr x1, .Lrtx141 + add x0, x1, w0, sxth #2 + br x0 +.Lrtx141: + .section .rodata + .align 0 + .align 2 +.L141: + .2byte (.L140 - .Lrtx141) / 4 + .2byte (.L142 - .Lrtx141) / 4 + .2byte (.L143 - .Lrtx141) / 4 + .2byte (.L144 - .Lrtx141) / 4 + .2byte (.L145 - .Lrtx141) / 4 + .2byte (.L146 - .Lrtx141) / 4 + .2byte (.L147 - .Lrtx141) / 4 + .2byte (.L148 - .Lrtx141) / 4 + .2byte (.L258 - .Lrtx141) / 4 + .2byte (.L150 - .Lrtx141) / 4 + .2byte (.L151 - .Lrtx141) / 4 + .2byte (.L152 - .Lrtx141) / 4 + .2byte (.L153 - .Lrtx141) / 4 + .2byte (.L154 - .Lrtx141) / 4 + .2byte (.L155 - .Lrtx141) / 4 + .2byte (.L156 - .Lrtx141) / 4 + .2byte (.L157 - .Lrtx141) / 4 + .text + .p2align 3 +.L151: +.LBB1092: +.LBB1093: +.LBB1094: +.LBB1095: +.LBB1096: +.LBB1097: +.LBB1098: + .file 4 "./arch/arm64/include/asm/current.h" + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL104: +#NO_APP +.LBE1098: +.LBE1097: + .file 5 "./arch/arm64/include/asm/uaccess.h" + .loc 5 85 0 + ldr w2, [x0, 52] +.LBE1096: +.LBE1095: +.LBE1094: +.LBE1093: +.LBE1092: + .loc 1 3103 0 + add x22, x20, 440 +.LBB1123: +.LBB1120: +.LBB1117: +.LBB1107: +.LBB1105: + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL105: + .loc 5 84 0 + tbnz x2, 21, .L201 +.LBB1099: +.LBB1100: +.LBB1101: + .file 6 "./include/asm-generic/bitops/non-atomic.h" + .loc 6 106 0 + ldr x2, [x0] +.LBE1101: +.LBE1100: +.LBE1099: +.LBE1105: +.LBE1107: +.LBE1117: +.LBE1120: +.LBE1123: + .loc 1 2928 0 + mov x0, x21 .LVL106: - add x1, x1, :lo12:.LC7 - bl _dev_info +.LBB1124: +.LBB1121: +.LBB1118: +.LBB1108: +.LBB1106: + .loc 5 84 0 + tbz x2, 26, .L202 .LVL107: - .loc 1 3054 0 - mov x0, 0 +.L201: +.LBB1102: +.LBB1103: +.LBB1104: + .file 7 "./include/linux/bitops.h" + .loc 7 157 0 + sbfx x0, x21, 0, 56 .LVL108: - .p2align 2 -.L134: +.LBE1104: +.LBE1103: + .loc 5 86 0 + and x0, x0, x21 +.LVL109: +.L202: +.LBE1102: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 4 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL110: +#NO_APP + mov x3, x0 +.LBE1106: +.LBE1108: + .file 8 "./include/linux/uaccess.h" + .loc 8 114 0 + cbz x0, .L225 +.LBB1109: +.LBB1110: +.LBB1111: +.LBB1112: +.LBB1113: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LBE1113: +.LBE1112: +.LBE1111: +.LBB1114: +.LBB1115: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL111: +#NO_APP +.LBE1115: +.LBE1114: +.LBB1116: + .loc 5 254 0 + and x0, x0, x21 +.LVL112: +.LBE1116: + .loc 5 249 0 + ldr x2, [x1, 8] +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x0, x2 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL113: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1110: +.LBE1109: + .loc 8 116 0 + mov x2, 4 + mov x0, x22 +.LVL114: + bl __arch_copy_from_user +.LVL115: + .loc 8 118 0 + cbnz x0, .L261 +.LBE1118: +.LBE1121: +.LBE1124: .loc 1 3107 0 + add x20, x20, 192 + ldr w2, [x20, 248] + ldr x0, [x20, 104] +.LVL116: + adrp x1, .LC16 + add x1, x1, :lo12:.LC16 + bl _dev_info +.LVL117: +.L258: + .loc 1 3108 0 + mov x0, 0 +.LVL118: +.L134: + .loc 1 3115 0 add x19, x19, :lo12:__stack_chk_guard ldr x2, [x29, 152] ldr x1, [x19] eor x1, x2, x1 -.LVL109: - cbnz x1, .L259 +.LVL119: + cbnz x1, .L262 ldp x19, x20, [sp, 16] ldp x21, x22, [sp, 32] -.LVL110: +.LVL120: ldp x23, x24, [sp, 48] -.LVL111: +.LVL121: ldr x25, [sp, 64] ldp x29, x30, [sp], 160 .cfi_remember_state @@ -1434,477 +1584,106 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL112: - .p2align 3 -.L257: - .cfi_restore_state - .loc 1 2953 0 - mov w0, 28673 - cmp w1, w0 - beq .L144 - bhi .L145 - cmp w1, 28672 - bne .L139 -.LBB1060: -.LBB1061: -.LBB1062: -.LBB1063: -.LBB1064: -.LBB1065: -.LBB1066: - .file 4 "./arch/arm64/include/asm/current.h" - .loc 4 19 0 -#APP -// 19 "./arch/arm64/include/asm/current.h" 1 - mrs x0, sp_el0 -// 0 "" 2 -.LVL113: -#NO_APP -.LBE1066: -.LBE1065: - .file 5 "./arch/arm64/include/asm/uaccess.h" - .loc 5 85 0 - ldr w2, [x0, 52] - .loc 5 77 0 - ldr x1, [x0, 8] -.LVL114: - .loc 5 84 0 - tbz x2, 21, .L260 -.LVL115: -.L164: -.LBB1067: -.LBB1068: -.LBB1069: - .file 6 "./include/linux/bitops.h" - .loc 6 157 0 - sbfx x0, x21, 0, 56 -.LVL116: -.LBE1069: -.LBE1068: - .loc 5 86 0 - and x0, x0, x21 -.LVL117: -.L165: -.LBE1067: - .loc 5 89 0 -#APP -// 89 "./arch/arm64/include/asm/uaccess.h" 1 - adds x0, x0, 64 - csel x1, xzr, x1, hi - csinv x0, x0, xzr, cc - sbcs xzr, x0, x1 - cset x0, ls - -// 0 "" 2 -.LVL118: -#NO_APP -.LBE1064: -.LBE1063: - .file 7 "./include/linux/uaccess.h" - .loc 7 114 0 - cbz x0, .L249 -.LBB1075: -.LBB1076: -.LBB1077: -.LBB1078: -.LBB1079: - .loc 6 157 0 - lsl x23, x21, 8 -.LBE1079: -.LBE1078: -.LBE1077: -.LBB1080: -.LBB1081: - .loc 4 19 0 -#APP -// 19 "./arch/arm64/include/asm/current.h" 1 - mrs x0, sp_el0 -// 0 "" 2 -.LVL119: -#NO_APP -.LBE1081: -.LBE1080: -.LBB1082: - .loc 5 254 0 - and x2, x21, x23, asr 8 -.LVL120: -.LBE1082: - .loc 5 249 0 - ldr x0, [x0, 8] -.LVL121: -#APP -// 249 "./arch/arm64/include/asm/uaccess.h" 1 - bics xzr, x2, x0 - csel x1, x21, xzr, eq - -// 0 "" 2 .LVL122: - .loc 5 257 0 -// 257 "./arch/arm64/include/asm/uaccess.h" 1 - hint #20 -// 0 "" 2 -#NO_APP -.LBE1076: -.LBE1075: - .loc 7 116 0 - add x24, x29, 88 - mov x2, 64 + .p2align 3 +.L156: + .cfi_restore_state + .loc 1 3054 0 + ldr x0, [x20, 296] + adrp x1, .LC6 + .loc 1 3053 0 + str wzr, [x20, 800] + .loc 1 3054 0 + add x1, x1, :lo12:.LC6 + bl _dev_info .LVL123: - mov x0, x24 - bl __arch_copy_from_user -.LVL124: - mov x22, x0 -.LVL125: - .loc 7 118 0 - cbnz x0, .L167 -.L170: -.LBE1062: -.LBE1061: -.LBE1060: - .loc 1 2974 0 - add x0, x24, 48 - bl ebc_empty_buf_get -.LVL126: - mov x25, x0 - .loc 1 2975 0 - cbz x0, .L168 - .loc 1 2978 0 - ldr x22, [x0, 8] -.LVL127: - bl ebc_phy_buf_base_get -.LVL128: - .loc 1 2982 0 - ldp w3, w1, [x20, 108] - .loc 1 2981 0 - stp w1, w3, [x29, 96] -.LBB1091: -.LBB1092: -.LBB1093: -.LBB1094: -.LBB1095: -.LBB1096: -.LBB1097: - .loc 4 19 0 -#APP -// 19 "./arch/arm64/include/asm/current.h" 1 - mrs x2, sp_el0 -// 0 "" 2 -.LVL129: -#NO_APP -.LBE1097: -.LBE1096: - .loc 5 85 0 - ldr w3, [x2, 52] -.LBE1095: -.LBE1094: -.LBE1093: -.LBE1092: -.LBE1091: - .loc 1 2978 0 - sub w0, w22, w0 - .loc 1 2983 0 - ldr w1, [x20, 176] - .loc 1 2984 0 - str wzr, [x29, 132] - .loc 1 2983 0 - str w1, [x29, 104] - .loc 1 2980 0 - str w0, [x29, 88] -.LBB1121: -.LBB1117: -.LBB1113: -.LBB1105: -.LBB1102: - .loc 5 77 0 - ldr x1, [x2, 8] -.LVL130: - .loc 5 84 0 - tbnz x3, 21, .L171 -.LBB1098: -.LBB1099: -.LBB1100: - .file 8 "./include/asm-generic/bitops/non-atomic.h" - .loc 8 106 0 - ldr x2, [x2] -.LVL131: -.LBE1100: -.LBE1099: -.LBE1098: -.LBE1102: -.LBE1105: -.LBE1113: -.LBE1117: -.LBE1121: - .loc 1 2925 0 - mov x0, x21 -.LVL132: -.LBB1122: -.LBB1118: -.LBB1114: -.LBB1106: -.LBB1103: - .loc 5 84 0 - tbnz x2, 26, .L171 -.LVL133: -.L172: - .loc 5 89 0 -#APP -// 89 "./arch/arm64/include/asm/uaccess.h" 1 - adds x0, x0, 64 - csel x1, xzr, x1, hi - csinv x0, x0, xzr, cc - sbcs xzr, x0, x1 - cset x0, ls - -// 0 "" 2 -.LVL134: -#NO_APP -.LBE1103: -.LBE1106: - .loc 7 132 0 - cbnz x0, .L173 -.LVL135: -.L174: -.LBE1114: -.LBE1118: -.LBE1122: - .loc 1 2988 0 - mov x0, x25 -.LVL136: - bl ebc_buf_release -.LVL137: - .loc 1 2989 0 - mov x0, -14 + .loc 1 3055 0 + mov x0, 0 b .L134 -.LVL138: .p2align 3 .L155: - .loc 1 3041 0 + .loc 1 3050 0 + ldr x0, [x20, 296] + .loc 1 3049 0 + mov w2, 1 + str w2, [x20, 800] + .loc 1 3050 0 + adrp x1, .LC5 + add x1, x1, :lo12:.LC5 + bl _dev_info +.LVL124: + .loc 1 3051 0 + mov x0, 0 + b .L134 + .p2align 3 +.L154: + .loc 1 3046 0 ldr x0, [x20, 296] adrp x1, .LC4 -.LVL139: - .loc 1 3040 0 - str wzr, [x20, 812] - .loc 1 3041 0 + .loc 1 3045 0 + str wzr, [x20, 796] + .loc 1 3046 0 add x1, x1, :lo12:.LC4 bl _dev_info -.LVL140: +.LVL125: + .loc 1 3047 0 + mov x0, 0 + b .L134 + .p2align 3 +.L153: .loc 1 3042 0 - mov x0, 0 - b .L134 -.LVL141: - .p2align 3 -.L256: - .loc 1 2953 0 - mov w0, 28681 - cmp w1, w0 - beq .L152 - bhi .L261 - .loc 1 3091 0 ldr x0, [x20, 296] - .loc 1 3090 0 - mov w21, 1 -.LVL142: - str w21, [x20, 448] - .loc 1 3091 0 - adrp x1, .LC12 -.LVL143: - add x1, x1, :lo12:.LC12 + .loc 1 3041 0 + mov w2, 1 + str w2, [x20, 796] + .loc 1 3042 0 + adrp x1, .LC3 + add x1, x1, :lo12:.LC3 bl _dev_info -.LVL144: - .loc 1 3092 0 - adrp x0, .LANCHOR1 - add x0, x0, :lo12:.LANCHOR1 - add x0, x0, 304 - mov w2, w21 - mov w1, w21 - bl __wake_up_sync -.LVL145: - .loc 1 3093 0 +.LVL126: + .loc 1 3043 0 mov x0, 0 b .L134 -.LVL146: .p2align 3 -.L140: -.LBB1123: -.LBB1124: +.L152: .LBB1125: .LBB1126: .LBB1127: .LBB1128: .LBB1129: - .loc 4 19 0 -#APP -// 19 "./arch/arm64/include/asm/current.h" 1 - mrs x0, sp_el0 -// 0 "" 2 -.LVL147: -#NO_APP -.LBE1129: -.LBE1128: - .loc 5 85 0 - ldr w2, [x0, 52] - .loc 5 77 0 - ldr x1, [x0, 8] -.LVL148: - .loc 5 84 0 - tbz x2, 21, .L262 -.LVL149: -.L181: .LBB1130: .LBB1131: -.LBB1132: - .loc 6 157 0 - sbfx x0, x21, 0, 56 -.LVL150: -.LBE1132: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL127: +#NO_APP .LBE1131: - .loc 5 86 0 - and x0, x0, x21 -.LVL151: -.L182: .LBE1130: - .loc 5 89 0 -#APP -// 89 "./arch/arm64/include/asm/uaccess.h" 1 - adds x0, x0, 64 - csel x1, xzr, x1, hi - csinv x0, x0, xzr, cc - sbcs xzr, x0, x1 - cset x0, ls - -// 0 "" 2 -.LVL152: -#NO_APP -.LBE1127: -.LBE1126: - .loc 7 114 0 - cbz x0, .L249 -.LBB1138: -.LBB1139: -.LBB1140: -.LBB1141: -.LBB1142: - .loc 6 157 0 - sbfx x0, x21, 0, 56 -.LVL153: -.LBE1142: -.LBE1141: -.LBE1140: -.LBB1143: -.LBB1144: - .loc 4 19 0 -#APP -// 19 "./arch/arm64/include/asm/current.h" 1 - mrs x1, sp_el0 -// 0 "" 2 -.LVL154: -#NO_APP -.LBE1144: -.LBE1143: -.LBB1145: - .loc 5 254 0 - and x0, x0, x21 -.LVL155: -.LBE1145: - .loc 5 249 0 - ldr x2, [x1, 8] -#APP -// 249 "./arch/arm64/include/asm/uaccess.h" 1 - bics xzr, x0, x2 - csel x1, x21, xzr, eq - -// 0 "" 2 -.LVL156: - .loc 5 257 0 -// 257 "./arch/arm64/include/asm/uaccess.h" 1 - hint #20 -// 0 "" 2 -#NO_APP -.LBE1139: -.LBE1138: - .loc 7 116 0 - mov x2, 64 - add x0, x29, 88 -.LVL157: - bl __arch_copy_from_user -.LVL158: - .loc 7 118 0 - cbnz x0, .L249 -.LBE1125: -.LBE1124: -.LBE1123: - .loc 1 3019 0 - bl ebc_osd_buf_clone -.LVL159: - mov x1, x0 - .loc 1 3020 0 - cbz x0, .L248 - .loc 1 3021 0 - ldr w6, [x29, 92] - .loc 1 3029 0 - add x20, x20, 192 - .loc 1 3025 0 - ldp w5, w3, [x29, 108] - .loc 1 3021 0 - str w6, [x1, 40] - .loc 1 3026 0 - ldp w4, w2, [x29, 116] - .loc 1 3025 0 - stp w5, w3, [x1, 48] - .loc 1 3026 0 - stp w4, w2, [x1, 56] - .loc 1 3028 0 - bl ebc_add_to_osd_buf_list -.LVL160: - .loc 1 3029 0 - ldr w0, [x20, 100] - cbz w0, .L250 -.L248: - .loc 1 3100 0 - mov x0, 0 - b .L134 -.LVL161: - .p2align 3 -.L150: -.LBB1152: -.LBB1153: -.LBB1154: -.LBB1155: -.LBB1156: -.LBB1157: -.LBB1158: - .loc 4 19 0 -#APP -// 19 "./arch/arm64/include/asm/current.h" 1 - mrs x1, sp_el0 -// 0 "" 2 -.LVL162: -#NO_APP -.LBE1158: -.LBE1157: .loc 5 85 0 ldr w2, [x1, 52] .loc 5 77 0 ldr x0, [x1, 8] -.LVL163: +.LVL128: .loc 5 84 0 tbz x2, 21, .L263 -.LVL164: -.L184: -.LBB1159: -.LBB1160: -.LBB1161: - .loc 6 157 0 +.LVL129: +.L183: +.LBB1132: +.LBB1133: +.LBB1134: + .loc 7 157 0 sbfx x1, x21, 0, 56 -.LVL165: -.LBE1161: -.LBE1160: +.LVL130: +.LBE1134: +.LBE1133: .loc 5 86 0 and x1, x1, x21 -.LVL166: -.L185: -.LBE1159: +.LVL131: +.L184: +.LBE1132: .loc 5 89 0 #APP // 89 "./arch/arm64/include/asm/uaccess.h" 1 @@ -1915,123 +1694,122 @@ cset x1, ls // 0 "" 2 -.LVL167: +.LVL132: #NO_APP -.LBE1156: -.LBE1155: - .loc 7 132 0 +.LBE1129: +.LBE1128: + .loc 8 132 0 mov x0, 4 -.LVL168: +.LVL133: cbz x1, .L134 -.LBB1167: -.LBB1168: -.LBB1169: -.LBB1170: -.LBB1171: - .loc 6 157 0 +.LBB1140: +.LBB1141: +.LBB1142: +.LBB1143: +.LBB1144: + .loc 7 157 0 sbfx x1, x21, 0, 56 -.LVL169: -.LBE1171: -.LBE1170: -.LBE1169: -.LBB1172: -.LBB1173: +.LVL134: +.LBE1144: +.LBE1143: +.LBE1142: +.LBB1145: +.LBB1146: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x2, sp_el0 // 0 "" 2 -.LVL170: +.LVL135: #NO_APP -.LBE1173: -.LBE1172: -.LBB1174: +.LBE1146: +.LBE1145: +.LBB1147: .loc 5 254 0 and x1, x1, x21 -.LVL171: -.LBE1174: +.LVL136: +.LBE1147: .loc 5 249 0 ldr x2, [x2, 8] -.LVL172: +.LVL137: #APP // 249 "./arch/arm64/include/asm/uaccess.h" 1 bics xzr, x1, x2 csel x3, x21, xzr, eq // 0 "" 2 -.LVL173: +.LVL138: .loc 5 257 0 // 257 "./arch/arm64/include/asm/uaccess.h" 1 hint #20 // 0 "" 2 #NO_APP -.LBE1168: -.LBE1167: - .loc 7 134 0 +.LBE1141: +.LBE1140: + .loc 8 134 0 mov x2, x0 - add x1, x20, 804 -.LVL174: + add x1, x20, 788 +.LVL139: mov x0, x3 bl __arch_copy_to_user -.LVL175: +.LVL140: sxtw x0, w0 b .L134 -.LVL176: .p2align 3 -.L261: -.LBE1154: -.LBE1153: -.LBE1152: -.LBB1181: -.LBB1182: -.LBB1183: -.LBB1184: -.LBB1185: -.LBB1186: -.LBB1187: +.L150: +.LBE1127: +.LBE1126: +.LBE1125: +.LBB1154: +.LBB1155: +.LBB1156: +.LBB1157: +.LBB1158: +.LBB1159: +.LBB1160: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x0, sp_el0 // 0 "" 2 -.LVL177: +.LVL141: #NO_APP -.LBE1187: -.LBE1186: +.LBE1160: +.LBE1159: .loc 5 85 0 ldr w2, [x0, 52] -.LBE1185: -.LBE1184: -.LBE1183: -.LBE1182: -.LBE1181: - .loc 1 3095 0 - add x22, x20, 452 -.LBB1216: -.LBB1212: -.LBB1208: -.LBB1197: -.LBB1194: +.LBE1158: +.LBE1157: +.LBE1156: +.LBE1155: +.LBE1154: + .loc 1 3094 0 + add x22, x20, 280 +.LBB1189: +.LBB1185: +.LBB1181: +.LBB1170: +.LBB1167: .loc 5 77 0 ldr x1, [x0, 8] -.LVL178: +.LVL142: .loc 5 84 0 tbz x2, 21, .L264 -.LVL179: -.L199: -.LBB1188: -.LBB1189: -.LBB1190: - .loc 6 157 0 +.LVL143: +.L197: +.LBB1161: +.LBB1162: +.LBB1163: + .loc 7 157 0 sbfx x0, x21, 0, 56 -.LVL180: -.LBE1190: -.LBE1189: +.LVL144: +.LBE1163: +.LBE1162: .loc 5 86 0 and x0, x0, x21 -.LVL181: -.L200: -.LBE1188: +.LVL145: +.L198: +.LBE1161: .loc 5 89 0 #APP // 89 "./arch/arm64/include/asm/uaccess.h" 1 @@ -2042,39 +1820,39 @@ cset x0, ls // 0 "" 2 -.LVL182: +.LVL146: #NO_APP mov x3, x0 -.LBE1194: -.LBE1197: - .loc 7 114 0 - cbz x0, .L220 -.LBB1198: -.LBB1199: -.LBB1200: -.LBB1201: -.LBB1202: - .loc 6 157 0 +.LBE1167: +.LBE1170: + .loc 8 114 0 + cbz x0, .L223 +.LBB1171: +.LBB1172: +.LBB1173: +.LBB1174: +.LBB1175: + .loc 7 157 0 sbfx x0, x21, 0, 56 -.LBE1202: -.LBE1201: -.LBE1200: -.LBB1203: -.LBB1204: +.LBE1175: +.LBE1174: +.LBE1173: +.LBB1176: +.LBB1177: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x1, sp_el0 // 0 "" 2 -.LVL183: +.LVL147: #NO_APP -.LBE1204: -.LBE1203: -.LBB1205: +.LBE1177: +.LBE1176: +.LBB1178: .loc 5 254 0 and x0, x0, x21 -.LVL184: -.LBE1205: +.LVL148: +.LBE1178: .loc 5 249 0 ldr x2, [x1, 8] #APP @@ -2083,279 +1861,257 @@ csel x1, x21, xzr, eq // 0 "" 2 -.LVL185: +.LVL149: .loc 5 257 0 // 257 "./arch/arm64/include/asm/uaccess.h" 1 hint #20 // 0 "" 2 #NO_APP -.LBE1199: -.LBE1198: - .loc 7 116 0 +.LBE1172: +.LBE1171: + .loc 8 116 0 mov x2, 4 mov x0, x22 -.LVL186: +.LVL150: bl __arch_copy_from_user -.LVL187: - .loc 7 118 0 +.LVL151: + .loc 8 118 0 cbnz x0, .L265 -.LBE1208: -.LBE1212: -.LBE1216: - .loc 1 3099 0 - add x20, x20, 192 - ldr x0, [x20, 104] -.LVL188: - ldr w2, [x20, 260] - adrp x1, .LC17 - add x1, x1, :lo12:.LC17 +.LBE1181: +.LBE1185: +.LBE1189: + .loc 1 3098 0 + ldr x0, [x20, 296] +.LVL152: + adrp x1, .LC15 + ldr w2, [x20, 280] + add x1, x1, :lo12:.LC15 bl _dev_info -.LVL189: - .loc 1 3100 0 +.LVL153: + .loc 1 3099 0 mov x0, 0 b .L134 -.LVL190: .p2align 3 -.L152: -.LBB1217: -.LBB1218: +.L148: +.LBB1190: +.LBB1191: +.LBB1192: +.LBB1193: +.LBB1194: +.LBB1195: +.LBB1196: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL154: +#NO_APP +.LBE1196: +.LBE1195: + .loc 5 85 0 + ldr w2, [x0, 52] + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL155: + .loc 5 84 0 + tbz x2, 21, .L266 +.LVL156: +.L180: +.LBB1197: +.LBB1198: +.LBB1199: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL157: +.LBE1199: +.LBE1198: + .loc 5 86 0 + and x0, x0, x21 +.LVL158: +.L181: +.LBE1197: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 64 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL159: +#NO_APP +.LBE1194: +.LBE1193: + .loc 8 114 0 + cbz x0, .L259 +.LBB1205: +.LBB1206: +.LBB1207: +.LBB1208: +.LBB1209: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL160: +.LBE1209: +.LBE1208: +.LBE1207: +.LBB1210: +.LBB1211: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL161: +#NO_APP +.LBE1211: +.LBE1210: +.LBB1212: + .loc 5 254 0 + and x0, x0, x21 +.LVL162: +.LBE1212: + .loc 5 249 0 + ldr x2, [x1, 8] +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x0, x2 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL163: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1206: +.LBE1205: + .loc 8 116 0 + mov x2, 64 + add x0, x29, 88 +.LVL164: + bl __arch_copy_from_user +.LVL165: + .loc 8 118 0 + cbnz x0, .L259 +.LBE1192: +.LBE1191: +.LBE1190: + .loc 1 3024 0 + bl ebc_osd_buf_clone +.LVL166: + mov x1, x0 + .loc 1 3025 0 + cbz x0, .L258 + .loc 1 3026 0 + ldr w6, [x29, 92] + .loc 1 3034 0 + add x20, x20, 192 + .loc 1 3030 0 + ldp w5, w3, [x29, 108] + .loc 1 3026 0 + str w6, [x1, 40] + .loc 1 3031 0 + ldp w4, w2, [x29, 116] + .loc 1 3030 0 + stp w5, w3, [x1, 48] + .loc 1 3031 0 + stp w4, w2, [x1, 56] + .loc 1 3033 0 + bl ebc_add_to_osd_buf_list +.LVL167: + .loc 1 3034 0 + ldr w0, [x20, 100] + cbnz w0, .L258 + .loc 1 3035 0 + mov w2, 1 + str w2, [x20, 100] + .loc 1 3036 0 + adrp x0, .LANCHOR1 + add x0, x0, :lo12:.LANCHOR1 + add x0, x0, 304 + mov w1, w2 + bl __wake_up_sync +.LVL168: + mov x0, 0 + b .L134 + .p2align 3 +.L147: + .loc 1 2959 0 + bl ebc_empty_osd_buf_get +.LVL169: + .loc 1 2960 0 + cbz x0, .L166 + .loc 1 2963 0 + ldr x22, [x0, 8] + bl ebc_phy_buf_base_get +.LVL170: .LBB1219: .LBB1220: .LBB1221: .LBB1222: .LBB1223: +.LBB1224: +.LBB1225: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 - mrs x0, sp_el0 + mrs x1, sp_el0 // 0 "" 2 -.LVL191: +.LVL171: #NO_APP +.LBE1225: +.LBE1224: + .loc 5 85 0 + ldr w2, [x1, 52] .LBE1223: .LBE1222: - .loc 5 85 0 - ldr w2, [x0, 52] .LBE1221: .LBE1220: .LBE1219: -.LBE1218: -.LBE1217: - .loc 1 3083 0 - add x22, x20, 280 -.LBB1252: -.LBB1248: -.LBB1244: -.LBB1233: -.LBB1230: - .loc 5 77 0 - ldr x1, [x0, 8] -.LVL192: - .loc 5 84 0 - tbz x2, 21, .L266 -.LVL193: -.L195: -.LBB1224: -.LBB1225: -.LBB1226: - .loc 6 157 0 - sbfx x0, x21, 0, 56 -.LVL194: -.LBE1226: -.LBE1225: - .loc 5 86 0 - and x0, x0, x21 -.LVL195: -.L196: -.LBE1224: - .loc 5 89 0 -#APP -// 89 "./arch/arm64/include/asm/uaccess.h" 1 - adds x0, x0, 4 - csel x1, xzr, x1, hi - csinv x0, x0, xzr, cc - sbcs xzr, x0, x1 - cset x0, ls - -// 0 "" 2 -.LVL196: -#NO_APP - mov x3, x0 -.LBE1230: -.LBE1233: - .loc 7 114 0 - cbz x0, .L218 -.LBB1234: -.LBB1235: -.LBB1236: -.LBB1237: -.LBB1238: - .loc 6 157 0 - sbfx x0, x21, 0, 56 -.LBE1238: -.LBE1237: -.LBE1236: -.LBB1239: -.LBB1240: - .loc 4 19 0 -#APP -// 19 "./arch/arm64/include/asm/current.h" 1 - mrs x1, sp_el0 -// 0 "" 2 -.LVL197: -#NO_APP -.LBE1240: -.LBE1239: -.LBB1241: - .loc 5 254 0 - and x0, x0, x21 -.LVL198: -.LBE1241: - .loc 5 249 0 - ldr x2, [x1, 8] -#APP -// 249 "./arch/arm64/include/asm/uaccess.h" 1 - bics xzr, x0, x2 - csel x1, x21, xzr, eq - -// 0 "" 2 -.LVL199: - .loc 5 257 0 -// 257 "./arch/arm64/include/asm/uaccess.h" 1 - hint #20 -// 0 "" 2 -#NO_APP -.LBE1235: -.LBE1234: - .loc 7 116 0 - mov x2, 4 - mov x0, x22 -.LVL200: - bl __arch_copy_from_user -.LVL201: - .loc 7 118 0 - cbnz x0, .L267 -.LBE1244: -.LBE1248: -.LBE1252: - .loc 1 3087 0 - ldr x0, [x20, 296] -.LVL202: - adrp x1, .LC16 - ldr w2, [x20, 280] - add x1, x1, :lo12:.LC16 - bl _dev_info -.LVL203: - .loc 1 3088 0 - mov x0, 0 - b .L134 -.LVL204: - .p2align 3 -.L157: - .loc 1 3045 0 - ldr x0, [x20, 296] - .loc 1 3044 0 - mov w2, 1 - str w2, [x20, 816] - .loc 1 3045 0 - adrp x1, .LC5 -.LVL205: - add x1, x1, :lo12:.LC5 - bl _dev_info -.LVL206: - .loc 1 3046 0 - mov x0, 0 - b .L134 -.LVL207: - .p2align 3 -.L156: - .loc 1 3037 0 - ldr x0, [x20, 296] - .loc 1 3036 0 - mov w2, 1 - str w2, [x20, 812] - .loc 1 3037 0 - adrp x1, .LC3 -.LVL208: - add x1, x1, :lo12:.LC3 - bl _dev_info -.LVL209: - .loc 1 3038 0 - mov x0, 0 - b .L134 -.LVL210: - .p2align 3 -.L258: - .loc 1 2955 0 - bl ebc_empty_osd_buf_get -.LVL211: - .loc 1 2956 0 - cbz x0, .L168 - .loc 1 2959 0 - ldr x22, [x0, 8] - bl ebc_phy_buf_base_get -.LVL212: -.LBB1253: -.LBB1254: -.LBB1255: -.LBB1256: -.LBB1257: -.LBB1258: -.LBB1259: - .loc 4 19 0 -#APP -// 19 "./arch/arm64/include/asm/current.h" 1 - mrs x1, sp_el0 -// 0 "" 2 -.LVL213: -#NO_APP -.LBE1259: -.LBE1258: - .loc 5 85 0 - ldr w2, [x1, 52] -.LBE1257: -.LBE1256: -.LBE1255: -.LBE1254: -.LBE1253: - .loc 1 2959 0 - sub w0, w22, w0 .loc 1 2963 0 + sub w0, w22, w0 + .loc 1 2967 0 ldp w5, w4, [x20, 108] - .loc 1 2961 0 - str w0, [x29, 88] - .loc 1 2964 0 - ldr w3, [x20, 176] - .loc 1 2962 0 - stp w4, w5, [x29, 96] - .loc 1 2964 0 - str w3, [x29, 104] .loc 1 2965 0 + str w0, [x29, 88] + .loc 1 2968 0 + ldr w3, [x20, 176] + .loc 1 2966 0 + stp w4, w5, [x29, 96] + .loc 1 2968 0 + str w3, [x29, 104] + .loc 1 2969 0 str wzr, [x29, 132] -.LBB1286: -.LBB1283: -.LBB1280: -.LBB1269: -.LBB1266: +.LBB1252: +.LBB1249: +.LBB1246: +.LBB1235: +.LBB1232: .loc 5 77 0 ldr x0, [x1, 8] -.LVL214: +.LVL172: .loc 5 84 0 - tbz x2, 21, .L268 -.LVL215: -.L160: -.LBB1260: -.LBB1261: -.LBB1262: - .loc 6 157 0 + tbz x2, 21, .L267 +.LVL173: +.L159: +.LBB1226: +.LBB1227: +.LBB1228: + .loc 7 157 0 sbfx x1, x21, 0, 56 -.LVL216: -.LBE1262: -.LBE1261: +.LVL174: +.LBE1228: +.LBE1227: .loc 5 86 0 and x1, x1, x21 -.LVL217: -.L161: -.LBE1260: +.LVL175: +.L160: +.LBE1226: .loc 5 89 0 #APP // 89 "./arch/arm64/include/asm/uaccess.h" 1 @@ -2366,139 +2122,151 @@ cset x1, ls // 0 "" 2 -.LVL218: +.LVL176: #NO_APP -.LBE1266: -.LBE1269: - .loc 7 132 0 +.LBE1232: +.LBE1235: + .loc 8 132 0 mov x0, 64 -.LVL219: +.LVL177: cbz x1, .L134 -.LBB1270: -.LBB1271: -.LBB1272: -.LBB1273: -.LBB1274: - .loc 6 157 0 +.LBB1236: +.LBB1237: +.LBB1238: +.LBB1239: +.LBB1240: + .loc 7 157 0 sbfx x1, x21, 0, 56 -.LVL220: -.LBE1274: -.LBE1273: -.LBE1272: -.LBB1275: -.LBB1276: +.LVL178: +.LBE1240: +.LBE1239: +.LBE1238: +.LBB1241: +.LBB1242: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x2, sp_el0 // 0 "" 2 -.LVL221: +.LVL179: #NO_APP -.LBE1276: -.LBE1275: -.LBB1277: +.LBE1242: +.LBE1241: +.LBB1243: .loc 5 254 0 and x1, x1, x21 -.LVL222: -.LBE1277: +.LVL180: +.LBE1243: .loc 5 249 0 ldr x2, [x2, 8] -.LVL223: +.LVL181: #APP // 249 "./arch/arm64/include/asm/uaccess.h" 1 bics xzr, x1, x2 csel x3, x21, xzr, eq // 0 "" 2 -.LVL224: +.LVL182: .loc 5 257 0 // 257 "./arch/arm64/include/asm/uaccess.h" 1 hint #20 // 0 "" 2 #NO_APP -.LBE1271: -.LBE1270: - .loc 7 134 0 +.LBE1237: +.LBE1236: + .loc 8 134 0 mov x2, x0 add x1, x29, 88 -.LVL225: +.LVL183: mov x0, x3 bl __arch_copy_to_user -.LVL226: +.LVL184: sxtw x0, w0 b .L134 -.LVL227: .p2align 3 -.L147: -.LBE1280: -.LBE1283: -.LBE1286: - .loc 1 3057 0 +.L146: +.LBE1246: +.LBE1249: +.LBE1252: + .loc 1 3062 0 ldr x0, [x20, 296] adrp x1, .LC8 -.LVL228: - .loc 1 3056 0 - str wzr, [x20, 804] - .loc 1 3057 0 + .loc 1 3061 0 + str wzr, [x20, 788] + .loc 1 3062 0 add x1, x1, :lo12:.LC8 bl _dev_info -.LVL229: - .loc 1 3058 0 +.LVL185: + .loc 1 3063 0 mov x0, 0 b .L134 -.LVL230: .p2align 3 -.L142: -.LBB1287: -.LBB1288: -.LBB1289: -.LBB1290: -.LBB1291: -.LBB1292: -.LBB1293: +.L145: + .loc 1 3058 0 + ldr x0, [x20, 296] + .loc 1 3057 0 + mov w2, 1 + str w2, [x20, 788] + .loc 1 3058 0 + adrp x1, .LC7 + add x1, x1, :lo12:.LC7 + bl _dev_info +.LVL186: + .loc 1 3059 0 + mov x0, 0 + b .L134 + .p2align 3 +.L144: +.LBB1253: +.LBB1254: +.LBB1255: +.LBB1256: +.LBB1257: +.LBB1258: +.LBB1259: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x0, sp_el0 // 0 "" 2 -.LVL231: +.LVL187: #NO_APP -.LBE1293: -.LBE1292: +.LBE1259: +.LBE1258: .loc 5 85 0 ldr w2, [x0, 52] -.LBE1291: -.LBE1290: -.LBE1289: -.LBE1288: -.LBE1287: - .loc 1 3063 0 +.LBE1257: +.LBE1256: +.LBE1255: +.LBE1254: +.LBE1253: + .loc 1 3074 0 add x22, x20, 276 -.LBB1322: -.LBB1318: -.LBB1314: -.LBB1303: -.LBB1300: +.LBB1288: +.LBB1284: +.LBB1280: +.LBB1269: +.LBB1266: .loc 5 77 0 ldr x1, [x0, 8] -.LVL232: +.LVL188: .loc 5 84 0 - tbz x2, 21, .L269 -.LVL233: -.L187: -.LBB1294: -.LBB1295: -.LBB1296: - .loc 6 157 0 + tbz x2, 21, .L268 +.LVL189: +.L189: +.LBB1260: +.LBB1261: +.LBB1262: + .loc 7 157 0 sbfx x0, x21, 0, 56 -.LVL234: -.LBE1296: -.LBE1295: +.LVL190: +.LBE1262: +.LBE1261: .loc 5 86 0 and x0, x0, x21 -.LVL235: -.L188: -.LBE1294: +.LVL191: +.L190: +.LBE1260: .loc 5 89 0 #APP // 89 "./arch/arm64/include/asm/uaccess.h" 1 @@ -2509,39 +2277,39 @@ cset x0, ls // 0 "" 2 -.LVL236: +.LVL192: #NO_APP mov x3, x0 -.LBE1300: -.LBE1303: - .loc 7 114 0 - cbz x0, .L215 -.LBB1304: -.LBB1305: -.LBB1306: -.LBB1307: -.LBB1308: - .loc 6 157 0 +.LBE1266: +.LBE1269: + .loc 8 114 0 + cbz x0, .L220 +.LBB1270: +.LBB1271: +.LBB1272: +.LBB1273: +.LBB1274: + .loc 7 157 0 sbfx x0, x21, 0, 56 -.LBE1308: -.LBE1307: -.LBE1306: -.LBB1309: -.LBB1310: +.LBE1274: +.LBE1273: +.LBE1272: +.LBB1275: +.LBB1276: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x1, sp_el0 // 0 "" 2 -.LVL237: +.LVL193: #NO_APP -.LBE1310: -.LBE1309: -.LBB1311: +.LBE1276: +.LBE1275: +.LBB1277: .loc 5 254 0 and x0, x0, x21 -.LVL238: -.LBE1311: +.LVL194: +.LBE1277: .loc 5 249 0 ldr x2, [x1, 8] #APP @@ -2550,116 +2318,98 @@ csel x1, x21, xzr, eq // 0 "" 2 -.LVL239: +.LVL195: .loc 5 257 0 // 257 "./arch/arm64/include/asm/uaccess.h" 1 hint #20 // 0 "" 2 #NO_APP -.LBE1305: -.LBE1304: - .loc 7 116 0 +.LBE1271: +.LBE1270: + .loc 8 116 0 mov x2, 4 mov x0, x22 -.LVL240: +.LVL196: bl __arch_copy_from_user -.LVL241: - .loc 7 118 0 - cbnz x0, .L270 -.LBE1314: -.LBE1318: -.LBE1322: - .loc 1 3067 0 +.LVL197: + .loc 8 118 0 + cbnz x0, .L269 +.LBE1280: +.LBE1284: +.LBE1288: + .loc 1 3078 0 ldr x0, [x20, 296] -.LVL242: - adrp x1, .LC15 - ldr w2, [x20, 276] - add x1, x1, :lo12:.LC15 - bl _dev_info -.LVL243: - .loc 1 3068 0 - mov x0, 0 - b .L134 -.LVL244: - .p2align 3 -.L139: - .loc 1 3102 0 - ldr x0, [x20, 296] - adrp x2, .LANCHOR2 +.LVL198: adrp x1, .LC14 -.LVL245: - add x2, x2, :lo12:.LANCHOR2 + ldr w2, [x20, 276] add x1, x1, :lo12:.LC14 - bl _dev_err -.LVL246: - .loc 1 3103 0 + bl _dev_info +.LVL199: + .loc 1 3079 0 mov x0, 0 - .loc 1 3106 0 b .L134 -.LVL247: .p2align 3 -.L145: -.LBB1323: -.LBB1324: -.LBB1325: -.LBB1326: -.LBB1327: -.LBB1328: -.LBB1329: +.L143: +.LBB1289: +.LBB1290: +.LBB1291: +.LBB1292: +.LBB1293: +.LBB1294: +.LBB1295: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x2, sp_el0 // 0 "" 2 -.LVL248: +.LVL200: #NO_APP -.LBE1329: -.LBE1328: +.LBE1295: +.LBE1294: .loc 5 85 0 ldr w3, [x2, 52] -.LBE1327: -.LBE1326: -.LBE1325: -.LBE1324: -.LBE1323: - .loc 1 3074 0 +.LBE1293: +.LBE1292: +.LBE1291: +.LBE1290: +.LBE1289: + .loc 1 3085 0 ldp w1, w0, [x20, 116] -.LVL249: stp w1, w0, [x29, 124] - .loc 1 3071 0 + .loc 1 3082 0 ldp w6, w5, [x20, 108] - .loc 1 3070 0 + .loc 1 3081 0 stp w5, w6, [x29, 96] - .loc 1 3072 0 + .loc 1 3083 0 ldr w4, [x20, 176] str w4, [x29, 104] - .loc 1 3075 0 + .loc 1 3086 0 str wzr, [x29, 132] -.LBB1358: -.LBB1354: -.LBB1350: -.LBB1339: -.LBB1336: +.LBB1324: +.LBB1320: +.LBB1316: +.LBB1305: +.LBB1302: .loc 5 77 0 ldr x1, [x2, 8] -.LVL250: +.LVL201: .loc 5 84 0 - tbz x3, 21, .L271 -.LVL251: -.L191: -.LBB1330: -.LBB1331: -.LBB1332: - .loc 6 157 0 + tbz x3, 21, .L270 +.LVL202: +.L193: +.LBB1296: +.LBB1297: +.LBB1298: + .loc 7 157 0 sbfx x0, x21, 0, 56 -.LVL252: -.LBE1332: -.LBE1331: +.LVL203: +.LBE1298: +.LBE1297: .loc 5 86 0 and x0, x0, x21 -.LVL253: -.L192: -.LBE1330: +.LVL204: +.L194: +.LBE1296: .loc 5 89 0 #APP // 89 "./arch/arm64/include/asm/uaccess.h" 1 @@ -2670,68 +2420,67 @@ cset x0, ls // 0 "" 2 -.LVL254: +.LVL205: #NO_APP -.LBE1336: -.LBE1339: - .loc 7 132 0 - cbnz x0, .L193 -.L194: -.LBE1350: -.LBE1354: -.LBE1358: - .loc 1 3078 0 +.LBE1302: +.LBE1305: + .loc 8 132 0 + cbnz x0, .L195 +.L196: +.LBE1316: +.LBE1320: +.LBE1324: + .loc 1 3089 0 ldr x0, [x20, 296] -.LVL255: +.LVL206: adrp x1, .LC10 -.LVL256: +.LVL207: add x1, x1, :lo12:.LC10 bl _dev_err -.LVL257: - .loc 1 3079 0 +.LVL208: + .loc 1 3090 0 mov x0, -14 b .L134 -.LVL258: .p2align 3 -.L144: -.LBB1359: -.LBB1360: -.LBB1361: -.LBB1362: -.LBB1363: -.LBB1364: -.LBB1365: +.L142: +.LBB1325: +.LBB1326: +.LBB1327: +.LBB1328: +.LBB1329: +.LBB1330: +.LBB1331: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x0, sp_el0 // 0 "" 2 -.LVL259: +.LVL209: #NO_APP -.LBE1365: -.LBE1364: +.LBE1331: +.LBE1330: .loc 5 85 0 ldr w2, [x0, 52] .loc 5 77 0 ldr x1, [x0, 8] -.LVL260: +.LVL210: .loc 5 84 0 - tbz x2, 21, .L272 -.LVL261: -.L175: -.LBB1366: -.LBB1367: -.LBB1368: - .loc 6 157 0 + tbz x2, 21, .L271 +.LVL211: +.L173: +.LBB1332: +.LBB1333: +.LBB1334: + .loc 7 157 0 sbfx x0, x21, 0, 56 -.LVL262: -.LBE1368: -.LBE1367: +.LVL212: +.LBE1334: +.LBE1333: .loc 5 86 0 and x0, x0, x21 -.LVL263: -.L176: -.LBE1366: +.LVL213: +.L174: +.LBE1332: .loc 5 89 0 #APP // 89 "./arch/arm64/include/asm/uaccess.h" 1 @@ -2742,39 +2491,39 @@ cset x0, ls // 0 "" 2 -.LVL264: +.LVL214: #NO_APP -.LBE1363: -.LBE1362: - .loc 7 114 0 - cbz x0, .L249 -.LBB1374: -.LBB1375: -.LBB1376: -.LBB1377: -.LBB1378: - .loc 6 157 0 +.LBE1329: +.LBE1328: + .loc 8 114 0 + cbz x0, .L259 +.LBB1340: +.LBB1341: +.LBB1342: +.LBB1343: +.LBB1344: + .loc 7 157 0 sbfx x0, x21, 0, 56 -.LVL265: -.LBE1378: -.LBE1377: -.LBE1376: -.LBB1379: -.LBB1380: +.LVL215: +.LBE1344: +.LBE1343: +.LBE1342: +.LBB1345: +.LBB1346: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x1, sp_el0 // 0 "" 2 -.LVL266: +.LVL216: #NO_APP -.LBE1380: -.LBE1379: -.LBB1381: +.LBE1346: +.LBE1345: +.LBB1347: .loc 5 254 0 and x0, x0, x21 -.LVL267: -.LBE1381: +.LVL217: +.LBE1347: .loc 5 249 0 ldr x2, [x1, 8] #APP @@ -2783,684 +2532,1060 @@ csel x1, x21, xzr, eq // 0 "" 2 -.LVL268: +.LVL218: .loc 5 257 0 // 257 "./arch/arm64/include/asm/uaccess.h" 1 hint #20 // 0 "" 2 #NO_APP -.LBE1375: -.LBE1374: - .loc 7 116 0 +.LBE1341: +.LBE1340: + .loc 8 116 0 mov x2, 64 add x0, x29, 88 -.LVL269: +.LVL219: bl __arch_copy_from_user -.LVL270: - .loc 7 118 0 - cbnz x0, .L249 -.LBE1361: -.LBE1360: -.LBE1359: - .loc 1 2997 0 +.LVL220: + .loc 8 118 0 + cbnz x0, .L259 +.LBE1327: +.LBE1326: +.LBE1325: + .loc 1 3001 0 bl ebc_phy_buf_base_get -.LVL271: +.LVL221: ldrsw x1, [x29, 88] - .loc 1 2998 0 + .loc 1 3002 0 add x0, x1, x0 bl ebc_find_buf_by_phy_addr -.LVL272: - mov x1, x0 - .loc 1 2999 0 - cbz x0, .L248 - .loc 1 3000 0 - ldr w2, [x29, 92] - .loc 1 3008 0 - add x20, x20, 192 - .loc 1 3000 0 - str w2, [x1, 40] +.LVL222: + mov x21, x0 +.LVL223: + .loc 1 3003 0 + cbz x0, .L258 .loc 1 3004 0 - ldp w6, w3, [x29, 108] - stp w6, w3, [x1, 48] - .loc 1 3003 0 - ldr w4, [x29, 116] - .loc 1 3005 0 - ldr w2, [x29, 120] - .loc 1 3001 0 - ldr w5, [x29, 132] - .loc 1 3003 0 - str w4, [x1, 56] - .loc 1 3001 0 - stp w2, w5, [x1, 60] - .loc 1 3007 0 - bl ebc_add_to_dsp_buf_list -.LVL273: + ldr w1, [x29, 92] + .loc 1 3012 0 + add x20, x20, 192 + .loc 1 3004 0 + str w1, [x21, 40] .loc 1 3008 0 - str wzr, [x20, 256] + ldp w4, w2, [x29, 108] + stp w4, w2, [x21, 48] + .loc 1 3007 0 + ldr w3, [x29, 116] .loc 1 3009 0 + ldr w1, [x29, 120] + .loc 1 3005 0 + ldr w5, [x29, 132] + .loc 1 3007 0 + str w3, [x21, 56] + .loc 1 3005 0 + stp w1, w5, [x21, 60] + .loc 1 3011 0 + bl ebc_add_to_dsp_buf_list +.LVL224: + .loc 1 3012 0 ldr w0, [x20, 100] - cbnz w0, .L248 -.L250: - .loc 1 3030 0 - mov w2, 1 - str w2, [x20, 100] - .loc 1 3031 0 - adrp x0, .LANCHOR1 - add x0, x0, :lo12:.LANCHOR1 - add x0, x0, 304 - mov w1, w2 - bl __wake_up_sync -.LVL274: + cbz w0, .L272 +.L178: + .loc 1 3016 0 + ldr w0, [x21, 40] + sub w0, w0, #18 + tst w0, -3 + bne .L258 + .loc 1 3017 0 + mov w1, 1 mov x0, 0 + str w1, [x20, 612] b .L134 -.LVL275: +.LVL225: .p2align 3 -.L271: -.LBB1388: +.L140: +.LBB1354: .LBB1355: -.LBB1351: -.LBB1340: -.LBB1337: -.LBB1333: -.LBB1334: -.LBB1335: - .loc 8 106 0 - ldr x2, [x2] -.LVL276: -.LBE1335: -.LBE1334: -.LBE1333: -.LBE1337: -.LBE1340: -.LBE1351: -.LBE1355: -.LBE1388: - .loc 1 2925 0 - mov x0, x21 -.LVL277: -.LBB1389: .LBB1356: -.LBB1352: -.LBB1341: -.LBB1338: +.LBB1357: +.LBB1358: +.LBB1359: +.LBB1360: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL226: +#NO_APP +.LBE1360: +.LBE1359: + .loc 5 85 0 + ldr w2, [x0, 52] + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL227: .loc 5 84 0 - tbz x2, 26, .L192 - b .L191 -.LVL278: - .p2align 3 -.L260: -.LBE1338: -.LBE1341: -.LBE1352: -.LBE1356: -.LBE1389: -.LBB1390: -.LBB1088: -.LBB1085: -.LBB1083: -.LBB1073: -.LBB1070: -.LBB1071: -.LBB1072: - .loc 8 106 0 - ldr x2, [x0] -.LBE1072: -.LBE1071: -.LBE1070: -.LBE1073: -.LBE1083: -.LBE1085: -.LBE1088: -.LBE1390: - .loc 1 2925 0 - mov x0, x21 -.LVL279: -.LBB1391: -.LBB1089: -.LBB1086: -.LBB1084: -.LBB1074: - .loc 5 84 0 - tbz x2, 26, .L165 - b .L164 -.LVL280: - .p2align 3 -.L272: -.LBE1074: -.LBE1084: -.LBE1086: -.LBE1089: -.LBE1391: -.LBB1392: -.LBB1386: -.LBB1384: -.LBB1382: -.LBB1372: + tbz x2, 21, .L273 +.LVL228: +.L162: +.LBB1361: +.LBB1362: +.LBB1363: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL229: +.LBE1363: +.LBE1362: + .loc 5 86 0 + and x0, x0, x21 +.LVL230: +.L163: +.LBE1361: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 64 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL231: +#NO_APP +.LBE1358: +.LBE1357: + .loc 8 114 0 + cbz x0, .L259 .LBB1369: .LBB1370: .LBB1371: - .loc 8 106 0 - ldr x2, [x0] +.LBB1372: +.LBB1373: + .loc 7 157 0 + lsl x23, x21, 8 +.LBE1373: +.LBE1372: .LBE1371: +.LBB1374: +.LBB1375: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL232: +#NO_APP +.LBE1375: +.LBE1374: +.LBB1376: + .loc 5 254 0 + and x2, x21, x23, asr 8 +.LVL233: +.LBE1376: + .loc 5 249 0 + ldr x0, [x0, 8] +.LVL234: +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x2, x0 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL235: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP .LBE1370: .LBE1369: -.LBE1372: -.LBE1382: -.LBE1384: -.LBE1386: -.LBE1392: - .loc 1 2925 0 - mov x0, x21 -.LVL281: -.LBB1393: -.LBB1387: + .loc 8 116 0 + add x24, x29, 88 + mov x2, 64 +.LVL236: + mov x0, x24 + bl __arch_copy_from_user +.LVL237: + mov x22, x0 +.LVL238: + .loc 8 118 0 + cbnz x0, .L165 +.L168: +.LBE1356: +.LBE1355: +.LBE1354: + .loc 1 2978 0 + add x0, x24, 48 + bl ebc_empty_buf_get +.LVL239: + mov x25, x0 + .loc 1 2979 0 + cbz x0, .L166 + .loc 1 2982 0 + ldr x22, [x0, 8] +.LVL240: + bl ebc_phy_buf_base_get +.LVL241: + .loc 1 2986 0 + ldp w3, w1, [x20, 108] + .loc 1 2985 0 + stp w1, w3, [x29, 96] .LBB1385: -.LBB1383: -.LBB1373: - .loc 5 84 0 - tbz x2, 26, .L176 - b .L175 -.LVL282: - .p2align 3 -.L262: -.LBE1373: -.LBE1383: -.LBE1385: +.LBB1386: +.LBB1387: +.LBB1388: +.LBB1389: +.LBB1390: +.LBB1391: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x2, sp_el0 +// 0 "" 2 +.LVL242: +#NO_APP +.LBE1391: +.LBE1390: + .loc 5 85 0 + ldr w3, [x2, 52] +.LBE1389: +.LBE1388: .LBE1387: -.LBE1393: -.LBB1394: -.LBB1150: -.LBB1148: -.LBB1146: -.LBB1136: -.LBB1133: -.LBB1134: -.LBB1135: - .loc 8 106 0 - ldr x2, [x0] -.LBE1135: -.LBE1134: -.LBE1133: -.LBE1136: -.LBE1146: -.LBE1148: -.LBE1150: -.LBE1394: - .loc 1 2925 0 - mov x0, x21 -.LVL283: -.LBB1395: -.LBB1151: -.LBB1149: -.LBB1147: -.LBB1137: - .loc 5 84 0 - tbz x2, 26, .L182 - b .L181 -.LVL284: - .p2align 3 -.L263: -.LBE1137: -.LBE1147: -.LBE1149: -.LBE1151: -.LBE1395: -.LBB1396: -.LBB1179: -.LBB1177: -.LBB1175: -.LBB1165: -.LBB1162: -.LBB1163: -.LBB1164: - .loc 8 106 0 - ldr x2, [x1] -.LBE1164: -.LBE1163: -.LBE1162: -.LBE1165: -.LBE1175: -.LBE1177: -.LBE1179: -.LBE1396: - .loc 1 2925 0 - mov x1, x21 -.LVL285: -.LBB1397: -.LBB1180: -.LBB1178: -.LBB1176: -.LBB1166: - .loc 5 84 0 - tbz x2, 26, .L185 - b .L184 -.LVL286: - .p2align 3 -.L264: -.LBE1166: -.LBE1176: -.LBE1178: -.LBE1180: -.LBE1397: -.LBB1398: -.LBB1213: -.LBB1209: -.LBB1206: -.LBB1195: -.LBB1191: -.LBB1192: -.LBB1193: - .loc 8 106 0 - ldr x2, [x0] -.LBE1193: -.LBE1192: -.LBE1191: -.LBE1195: -.LBE1206: -.LBE1209: -.LBE1213: -.LBE1398: - .loc 1 2925 0 - mov x0, x21 -.LVL287: +.LBE1386: +.LBE1385: + .loc 1 2982 0 + sub w0, w22, w0 + .loc 1 2987 0 + ldr w1, [x20, 176] + .loc 1 2988 0 + str wzr, [x29, 132] + .loc 1 2987 0 + str w1, [x29, 104] + .loc 1 2984 0 + str w0, [x29, 88] +.LBB1415: +.LBB1411: +.LBB1407: .LBB1399: -.LBB1214: -.LBB1210: -.LBB1207: -.LBB1196: +.LBB1396: + .loc 5 77 0 + ldr x1, [x2, 8] +.LVL243: .loc 5 84 0 - tbz x2, 26, .L200 - b .L199 -.LVL288: + tbnz x3, 21, .L169 +.LBB1392: +.LBB1393: +.LBB1394: + .loc 6 106 0 + ldr x2, [x2] +.LVL244: +.LBE1394: +.LBE1393: +.LBE1392: +.LBE1396: +.LBE1399: +.LBE1407: +.LBE1411: +.LBE1415: + .loc 1 2928 0 + mov x0, x21 +.LVL245: +.LBB1416: +.LBB1412: +.LBB1408: +.LBB1400: +.LBB1397: + .loc 5 84 0 + tbnz x2, 26, .L169 +.LVL246: +.L170: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 64 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL247: +#NO_APP +.LBE1397: +.LBE1400: + .loc 8 132 0 + cbnz x0, .L171 +.LVL248: +.L172: +.LBE1408: +.LBE1412: +.LBE1416: + .loc 1 2992 0 + mov x0, x25 +.LVL249: + bl ebc_buf_release +.LVL250: + .loc 1 2993 0 + mov x0, -14 + b .L134 +.LVL251: + .p2align 3 +.L157: +.LBB1417: +.LBB1418: +.LBB1419: +.LBB1420: +.LBB1421: +.LBB1422: +.LBB1423: +.LBB1424: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL252: +#NO_APP +.LBE1424: +.LBE1423: + .loc 5 85 0 + ldr w2, [x1, 52] +.LBE1422: +.LBE1421: +.LBE1420: +.LBE1419: +.LBE1418: + .loc 1 3069 0 + str wzr, [x29, 84] +.LVL253: +.LBB1449: +.LBB1447: +.LBB1445: +.LBB1434: +.LBB1431: + .loc 5 77 0 + ldr x0, [x1, 8] +.LVL254: + .loc 5 84 0 + tbz x2, 21, .L274 +.LVL255: +.L186: +.LBB1425: +.LBB1426: +.LBB1427: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL256: +.LBE1427: +.LBE1426: + .loc 5 86 0 + and x1, x1, x21 +.LVL257: +.L187: +.LBE1425: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x1, x1, 4 + csel x0, xzr, x0, hi + csinv x1, x1, xzr, cc + sbcs xzr, x1, x0 + cset x1, ls + +// 0 "" 2 +.LVL258: +#NO_APP +.LBE1431: +.LBE1434: + .loc 8 132 0 + mov x0, 4 +.LVL259: + cbz x1, .L134 +.LBB1435: +.LBB1436: +.LBB1437: +.LBB1438: +.LBB1439: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL260: +.LBE1439: +.LBE1438: +.LBE1437: +.LBB1440: +.LBB1441: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x2, sp_el0 +// 0 "" 2 +.LVL261: +#NO_APP +.LBE1441: +.LBE1440: +.LBB1442: + .loc 5 254 0 + and x1, x1, x21 +.LVL262: +.LBE1442: + .loc 5 249 0 + ldr x2, [x2, 8] +.LVL263: +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x1, x2 + csel x3, x21, xzr, eq + +// 0 "" 2 +.LVL264: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1436: +.LBE1435: + .loc 8 134 0 + mov x2, x0 + add x1, x29, 84 +.LVL265: + mov x0, x3 + bl __arch_copy_to_user +.LVL266: + sxtw x0, w0 + b .L134 +.LVL267: + .p2align 3 +.L274: +.LBB1443: +.LBB1432: +.LBB1428: +.LBB1429: +.LBB1430: + .loc 6 106 0 + ldr x2, [x1] +.LBE1430: +.LBE1429: +.LBE1428: +.LBE1432: +.LBE1443: +.LBE1445: +.LBE1447: +.LBE1449: +.LBE1417: + .loc 1 2928 0 + mov x1, x21 +.LVL268: +.LBB1451: +.LBB1450: +.LBB1448: +.LBB1446: +.LBB1444: +.LBB1433: + .loc 5 84 0 + tbz x2, 26, .L187 + b .L186 +.LVL269: .p2align 3 .L266: -.LBE1196: -.LBE1207: -.LBE1210: -.LBE1214: -.LBE1399: -.LBB1400: -.LBB1249: -.LBB1245: -.LBB1242: -.LBB1231: -.LBB1227: -.LBB1228: -.LBB1229: - .loc 8 106 0 +.LBE1433: +.LBE1444: +.LBE1446: +.LBE1448: +.LBE1450: +.LBE1451: +.LBB1452: +.LBB1217: +.LBB1215: +.LBB1213: +.LBB1203: +.LBB1200: +.LBB1201: +.LBB1202: + .loc 6 106 0 ldr x2, [x0] -.LBE1229: -.LBE1228: -.LBE1227: -.LBE1231: -.LBE1242: -.LBE1245: -.LBE1249: -.LBE1400: - .loc 1 2925 0 +.LBE1202: +.LBE1201: +.LBE1200: +.LBE1203: +.LBE1213: +.LBE1215: +.LBE1217: +.LBE1452: + .loc 1 2928 0 mov x0, x21 -.LVL289: -.LBB1401: -.LBB1250: -.LBB1246: -.LBB1243: -.LBB1232: +.LVL270: +.LBB1453: +.LBB1218: +.LBB1216: +.LBB1214: +.LBB1204: .loc 5 84 0 - tbz x2, 26, .L196 - b .L195 -.LVL290: + tbz x2, 26, .L181 + b .L180 +.LVL271: .p2align 3 -.L269: -.LBE1232: -.LBE1243: -.LBE1246: -.LBE1250: -.LBE1401: -.LBB1402: -.LBB1319: -.LBB1315: -.LBB1312: -.LBB1301: -.LBB1297: -.LBB1298: -.LBB1299: - .loc 8 106 0 +.L273: +.LBE1204: +.LBE1214: +.LBE1216: +.LBE1218: +.LBE1453: +.LBB1454: +.LBB1382: +.LBB1379: +.LBB1377: +.LBB1367: +.LBB1364: +.LBB1365: +.LBB1366: + .loc 6 106 0 ldr x2, [x0] -.LBE1299: -.LBE1298: -.LBE1297: -.LBE1301: -.LBE1312: -.LBE1315: -.LBE1319: -.LBE1402: - .loc 1 2925 0 +.LBE1366: +.LBE1365: +.LBE1364: +.LBE1367: +.LBE1377: +.LBE1379: +.LBE1382: +.LBE1454: + .loc 1 2928 0 mov x0, x21 -.LVL291: -.LBB1403: -.LBB1320: -.LBB1316: -.LBB1313: -.LBB1302: +.LVL272: +.LBB1455: +.LBB1383: +.LBB1380: +.LBB1378: +.LBB1368: .loc 5 84 0 - tbz x2, 26, .L188 - b .L187 -.LVL292: + tbz x2, 26, .L163 + b .L162 +.LVL273: + .p2align 3 +.L271: +.LBE1368: +.LBE1378: +.LBE1380: +.LBE1383: +.LBE1455: +.LBB1456: +.LBB1352: +.LBB1350: +.LBB1348: +.LBB1338: +.LBB1335: +.LBB1336: +.LBB1337: + .loc 6 106 0 + ldr x2, [x0] +.LBE1337: +.LBE1336: +.LBE1335: +.LBE1338: +.LBE1348: +.LBE1350: +.LBE1352: +.LBE1456: + .loc 1 2928 0 + mov x0, x21 +.LVL274: +.LBB1457: +.LBB1353: +.LBB1351: +.LBB1349: +.LBB1339: + .loc 5 84 0 + tbz x2, 26, .L174 + b .L173 +.LVL275: + .p2align 3 +.L270: +.LBE1339: +.LBE1349: +.LBE1351: +.LBE1353: +.LBE1457: +.LBB1458: +.LBB1321: +.LBB1317: +.LBB1306: +.LBB1303: +.LBB1299: +.LBB1300: +.LBB1301: + .loc 6 106 0 + ldr x2, [x2] +.LVL276: +.LBE1301: +.LBE1300: +.LBE1299: +.LBE1303: +.LBE1306: +.LBE1317: +.LBE1321: +.LBE1458: + .loc 1 2928 0 + mov x0, x21 +.LVL277: +.LBB1459: +.LBB1322: +.LBB1318: +.LBB1307: +.LBB1304: + .loc 5 84 0 + tbz x2, 26, .L194 + b .L193 +.LVL278: + .p2align 3 +.L263: +.LBE1304: +.LBE1307: +.LBE1318: +.LBE1322: +.LBE1459: +.LBB1460: +.LBB1152: +.LBB1150: +.LBB1148: +.LBB1138: +.LBB1135: +.LBB1136: +.LBB1137: + .loc 6 106 0 + ldr x2, [x1] +.LBE1137: +.LBE1136: +.LBE1135: +.LBE1138: +.LBE1148: +.LBE1150: +.LBE1152: +.LBE1460: + .loc 1 2928 0 + mov x1, x21 +.LVL279: +.LBB1461: +.LBB1153: +.LBB1151: +.LBB1149: +.LBB1139: + .loc 5 84 0 + tbz x2, 26, .L184 + b .L183 +.LVL280: + .p2align 3 +.L264: +.LBE1139: +.LBE1149: +.LBE1151: +.LBE1153: +.LBE1461: +.LBB1462: +.LBB1186: +.LBB1182: +.LBB1179: +.LBB1168: +.LBB1164: +.LBB1165: +.LBB1166: + .loc 6 106 0 + ldr x2, [x0] +.LBE1166: +.LBE1165: +.LBE1164: +.LBE1168: +.LBE1179: +.LBE1182: +.LBE1186: +.LBE1462: + .loc 1 2928 0 + mov x0, x21 +.LVL281: +.LBB1463: +.LBB1187: +.LBB1183: +.LBB1180: +.LBB1169: + .loc 5 84 0 + tbz x2, 26, .L198 + b .L197 +.LVL282: .p2align 3 .L268: -.LBE1302: -.LBE1313: -.LBE1316: -.LBE1320: -.LBE1403: -.LBB1404: -.LBB1284: +.LBE1169: +.LBE1180: +.LBE1183: +.LBE1187: +.LBE1463: +.LBB1464: +.LBB1285: .LBB1281: .LBB1278: .LBB1267: .LBB1263: .LBB1264: .LBB1265: - .loc 8 106 0 - ldr x2, [x1] + .loc 6 106 0 + ldr x2, [x0] .LBE1265: .LBE1264: .LBE1263: .LBE1267: .LBE1278: .LBE1281: -.LBE1284: -.LBE1404: - .loc 1 2925 0 - mov x1, x21 -.LVL293: -.LBB1405: -.LBB1285: +.LBE1285: +.LBE1464: + .loc 1 2928 0 + mov x0, x21 +.LVL283: +.LBB1465: +.LBB1286: .LBB1282: .LBB1279: .LBB1268: .loc 5 84 0 - tbz x2, 26, .L161 - b .L160 -.LVL294: + tbz x2, 26, .L190 + b .L189 +.LVL284: .p2align 3 -.L171: +.L267: .LBE1268: .LBE1279: .LBE1282: -.LBE1285: -.LBE1405: -.LBB1406: -.LBB1119: -.LBB1115: -.LBB1107: -.LBB1104: -.LBB1101: +.LBE1286: +.LBE1465: +.LBB1466: +.LBB1250: +.LBB1247: +.LBB1244: +.LBB1233: +.LBB1229: +.LBB1230: +.LBB1231: + .loc 6 106 0 + ldr x2, [x1] +.LBE1231: +.LBE1230: +.LBE1229: +.LBE1233: +.LBE1244: +.LBE1247: +.LBE1250: +.LBE1466: + .loc 1 2928 0 + mov x1, x21 +.LVL285: +.LBB1467: +.LBB1251: +.LBB1248: +.LBB1245: +.LBB1234: + .loc 5 84 0 + tbz x2, 26, .L160 + b .L159 +.LVL286: + .p2align 3 +.L169: +.LBE1234: +.LBE1245: +.LBE1248: +.LBE1251: +.LBE1467: +.LBB1468: +.LBB1413: +.LBB1409: +.LBB1401: +.LBB1398: +.LBB1395: .loc 5 86 0 and x0, x21, x23, asr 8 - b .L172 -.LVL295: + b .L170 +.LVL287: +.L252: +.LBE1395: +.LBE1398: +.LBE1401: +.LBE1409: +.LBE1413: +.LBE1468: + .loc 1 2949 0 + ldr x0, [x20, 296] + adrp x2, .LANCHOR2 + adrp x1, .LC2 +.LVL288: + add x2, x2, :lo12:.LANCHOR2 + add x1, x1, :lo12:.LC2 + bl _dev_err +.LVL289: + .loc 1 2950 0 + mov x0, -14 + b .L134 +.LVL290: .L220: -.LBE1101: -.LBE1104: -.LBE1107: -.LBE1115: -.LBE1119: -.LBE1406: -.LBB1407: -.LBB1215: -.LBB1211: - .loc 7 112 0 +.LBB1469: +.LBB1287: +.LBB1283: + .loc 8 112 0 mov x0, 4 -.LVL296: -.L201: - .loc 7 119 0 +.LVL291: +.L191: + .loc 8 119 0 mov x2, x0 mov w1, 0 -.LVL297: +.LVL292: add x0, x22, x3 -.LVL298: +.LVL293: bl memset -.LVL299: -.LBE1211: -.LBE1215: -.LBE1407: - .loc 1 3096 0 +.LVL294: +.LBE1283: +.LBE1287: +.LBE1469: + .loc 1 3075 0 ldr x0, [x20, 296] - adrp x1, .LC13 - add x1, x1, :lo12:.LC13 + adrp x1, .LC9 + add x1, x1, :lo12:.LC9 bl _dev_err -.LVL300: -.L249: - .loc 1 3097 0 +.LVL295: +.L259: + .loc 1 3076 0 mov x0, -14 -.LVL301: +.LVL296: b .L134 -.LVL302: +.LVL297: .p2align 3 -.L193: -.LBB1408: -.LBB1357: -.LBB1353: -.LBB1342: -.LBB1343: -.LBB1344: -.LBB1345: -.LBB1346: - .loc 6 157 0 +.L195: +.LBB1470: +.LBB1323: +.LBB1319: +.LBB1308: +.LBB1309: +.LBB1310: +.LBB1311: +.LBB1312: + .loc 7 157 0 sbfx x1, x21, 0, 56 -.LVL303: -.LBE1346: -.LBE1345: -.LBE1344: -.LBB1347: -.LBB1348: +.LVL298: +.LBE1312: +.LBE1311: +.LBE1310: +.LBB1313: +.LBB1314: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x0, sp_el0 // 0 "" 2 -.LVL304: +.LVL299: #NO_APP -.LBE1348: -.LBE1347: -.LBB1349: +.LBE1314: +.LBE1313: +.LBB1315: .loc 5 254 0 and x1, x1, x21 -.LVL305: -.LBE1349: +.LVL300: +.LBE1315: .loc 5 249 0 ldr x2, [x0, 8] -.LVL306: +.LVL301: #APP // 249 "./arch/arm64/include/asm/uaccess.h" 1 bics xzr, x1, x2 csel x0, x21, xzr, eq // 0 "" 2 -.LVL307: +.LVL302: .loc 5 257 0 // 257 "./arch/arm64/include/asm/uaccess.h" 1 hint #20 // 0 "" 2 #NO_APP -.LBE1343: -.LBE1342: - .loc 7 134 0 +.LBE1309: +.LBE1308: + .loc 8 134 0 mov x2, 64 add x1, x29, 88 -.LVL308: +.LVL303: bl __arch_copy_to_user -.LVL309: -.LBE1353: -.LBE1357: -.LBE1408: - .loc 1 3077 0 - cbnz x0, .L194 - .loc 1 3100 0 - mov x0, 0 - b .L134 -.LVL310: +.LVL304: +.LBE1319: +.LBE1323: +.LBE1470: + .loc 1 3088 0 + cbz x0, .L258 + b .L196 +.LVL305: .p2align 3 -.L173: -.LBB1409: -.LBB1120: -.LBB1116: -.LBB1108: -.LBB1109: -.LBB1110: -.LBB1111: +.L171: +.LBB1471: +.LBB1414: +.LBB1410: +.LBB1402: +.LBB1403: +.LBB1404: +.LBB1405: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x0, sp_el0 // 0 "" 2 -.LVL311: +.LVL306: #NO_APP -.LBE1111: -.LBE1110: -.LBB1112: +.LBE1405: +.LBE1404: +.LBB1406: .loc 5 254 0 and x23, x21, x23, asr 8 -.LVL312: -.LBE1112: +.LVL307: +.LBE1406: .loc 5 249 0 ldr x1, [x0, 8] -.LVL313: +.LVL308: #APP // 249 "./arch/arm64/include/asm/uaccess.h" 1 bics xzr, x23, x1 csel x0, x21, xzr, eq // 0 "" 2 -.LVL314: +.LVL309: .loc 5 257 0 // 257 "./arch/arm64/include/asm/uaccess.h" 1 hint #20 // 0 "" 2 #NO_APP -.LBE1109: -.LBE1108: - .loc 7 134 0 +.LBE1403: +.LBE1402: + .loc 8 134 0 mov x2, 64 -.LVL315: +.LVL310: mov x1, x24 bl __arch_copy_to_user -.LVL316: -.LBE1116: -.LBE1120: -.LBE1409: - .loc 1 2987 0 - cbnz w0, .L174 - .loc 1 3100 0 - mov x0, 0 - b .L134 -.LVL317: -.L215: -.LBB1410: -.LBB1321: -.LBB1317: - .loc 7 112 0 - mov x0, 4 -.LVL318: -.L189: - .loc 7 119 0 - mov x2, x0 - mov w1, 0 -.LVL319: - add x0, x22, x3 -.LVL320: - bl memset -.LVL321: -.LBE1317: -.LBE1321: +.LVL311: .LBE1410: - .loc 1 3064 0 - ldr x0, [x20, 296] - adrp x1, .LC9 - add x1, x1, :lo12:.LC9 - bl _dev_err -.LVL322: - .loc 1 3065 0 - mov x0, -14 - b .L134 -.LVL323: -.L218: -.LBB1411: -.LBB1251: -.LBB1247: - .loc 7 112 0 +.LBE1414: +.LBE1471: + .loc 1 2991 0 + cbz w0, .L258 + b .L172 +.LVL312: + .p2align 3 +.L272: + .loc 1 3013 0 + mov w2, 1 + str w2, [x20, 100] + .loc 1 3014 0 + adrp x0, .LANCHOR1 + add x0, x0, :lo12:.LANCHOR1 + mov w1, w2 + add x0, x0, 304 + bl __wake_up_sync +.LVL313: + b .L178 +.LVL314: +.L223: +.LBB1472: +.LBB1188: +.LBB1184: + .loc 8 112 0 mov x0, 4 -.LVL324: -.L197: - .loc 7 119 0 +.LVL315: +.L199: + .loc 8 119 0 mov x2, x0 mov w1, 0 -.LVL325: +.LVL316: add x0, x22, x3 -.LVL326: +.LVL317: bl memset -.LVL327: -.LBE1247: -.LBE1251: -.LBE1411: - .loc 1 3084 0 +.LVL318: +.LBE1184: +.LBE1188: +.LBE1472: + .loc 1 3095 0 ldr x0, [x20, 296] adrp x1, .LC11 add x1, x1, :lo12:.LC11 bl _dev_err -.LVL328: - .loc 1 3085 0 +.LVL319: + .loc 1 3096 0 mov x0, -14 b .L134 -.LVL329: -.L168: - .loc 1 2957 0 +.LVL320: +.L225: +.LBB1473: +.LBB1122: +.LBB1119: + .loc 8 112 0 + mov x0, 4 +.LVL321: +.L203: + .loc 8 119 0 + mov x2, x0 + mov w1, 0 +.LVL322: + add x0, x22, x3 +.LVL323: + bl memset +.LVL324: +.LBE1119: +.LBE1122: +.LBE1473: + .loc 1 3104 0 + ldr x0, [x20, 296] + adrp x1, .LC12 + add x1, x1, :lo12:.LC12 + bl _dev_err +.LVL325: + .loc 1 3105 0 + mov x0, -14 + b .L134 +.LVL326: +.L166: + .loc 1 2961 0 mov x0, -1 b .L134 -.LVL330: -.L259: - .loc 1 3107 0 +.LVL327: +.L262: + .loc 1 3115 0 bl __stack_chk_fail +.LVL328: +.L165: +.LBB1474: +.LBB1384: +.LBB1381: + .loc 8 119 0 + sub x0, x24, x0 +.LVL329: + mov x2, x22 + mov w1, 0 + add x0, x0, 64 + bl memset +.LVL330: +.LBE1381: +.LBE1384: +.LBE1474: + .loc 1 2975 0 + cbz w22, .L168 + .loc 1 3076 0 + mov x0, -14 + b .L134 .LVL331: .L265: mov x3, 4 sub x3, x3, x0 .LVL332: - b .L201 + b .L199 .LVL333: -.L267: +.L261: mov x3, 4 sub x3, x3, x0 .LVL334: - b .L197 + b .L203 .LVL335: -.L167: -.LBB1412: -.LBB1090: -.LBB1087: - .loc 7 119 0 - sub x0, x24, x0 -.LVL336: - mov x2, x22 - mov w1, 0 - add x0, x0, 64 - bl memset -.LVL337: -.LBE1087: -.LBE1090: -.LBE1412: - .loc 1 2971 0 - cbz w22, .L170 - .loc 1 3097 0 - mov x0, -14 - b .L134 -.LVL338: -.L270: +.L269: mov x3, 4 sub x3, x3, x0 -.LVL339: - b .L189 +.LVL336: + b .L191 .cfi_endproc .LFE2849: .size ebc_io_ctl, .-ebc_io_ctl @@ -3469,28 +3594,28 @@ .type get_overlay_image2, %function get_overlay_image2: .LFB2821: - .loc 1 667 0 + .loc 1 666 0 .cfi_startproc -.LVL340: +.LVL337: stp x29, x30, [sp, -112]! .cfi_def_cfa_offset 112 .cfi_offset 29, -112 .cfi_offset 30, -104 - .loc 1 668 0 - adrp x7, .LANCHOR0 - .loc 1 677 0 - cmp w6, 2 .loc 1 667 0 + adrp x7, .LANCHOR0 + .loc 1 676 0 + cmp w6, 2 + .loc 1 666 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, x0 - .loc 1 668 0 - ldr x0, [x7, #:lo12:.LANCHOR0] -.LVL341: .loc 1 667 0 + ldr x0, [x7, #:lo12:.LANCHOR0] +.LVL338: + .loc 1 666 0 stp x19, x20, [sp, 16] .cfi_offset 19, -96 .cfi_offset 20, -88 @@ -3506,29 +3631,29 @@ .cfi_offset 28, -24 .cfi_offset 23, -64 .cfi_offset 24, -56 - .loc 1 667 0 + .loc 1 666 0 mov x27, x3 mov x28, x4 - .loc 1 671 0 + .loc 1 670 0 add x24, x5, 60 -.LVL342: - .loc 1 675 0 - ldp w1, w23, [x0, 108] -.LVL343: +.LVL339: .loc 1 674 0 + ldp w1, w23, [x0, 108] +.LVL340: + .loc 1 673 0 lsr w20, w1, 3 - .loc 1 677 0 - beq .L430 - .loc 1 680 0 + .loc 1 676 0 + beq .L432 + .loc 1 679 0 cmp w6, 3 - beq .L276 + beq .L278 lsr w14, w1, 2 mov x0, 0 - .loc 1 688 0 + .loc 1 687 0 mov w21, 0 -.LVL344: -.L275: - .loc 1 692 0 +.LVL341: +.L277: + .loc 1 691 0 sub w2, w23, w21 add x0, x22, x0 mov w1, 0 @@ -3536,65 +3661,65 @@ mul w2, w2, w14 sxtw x2, w2 bl memset -.LVL345: - .loc 1 694 0 +.LVL342: + .loc 1 693 0 cmp w21, w23 - bge .L336 + bge .L338 ldr w14, [x29, 108] sub w11, w20, #1 add x11, x11, 1 mov w5, 0 -.LVL346: +.LVL343: lsl x12, x11, 3 lsl x11, x11, 2 mul w13, w21, w14 lsl w14, w14, 1 -.LVL347: +.LVL344: .p2align 2 -.L335: -.LBB1413: - .loc 1 695 0 +.L337: +.LBB1475: + .loc 1 694 0 add x10, x22, x13, sxtw - .loc 1 696 0 - cbz w20, .L278 + .loc 1 695 0 + cbz w20, .L280 add x1, x27, 8 add x8, x28, 8 mov x7, 0 -.LVL348: +.LVL345: .p2align 2 -.L306: -.LBB1414: - .loc 1 697 0 +.L308: +.LBB1476: + .loc 1 696 0 ldr w6, [x26, x7, lsl 2] -.LVL349: - .loc 1 698 0 +.LVL346: + .loc 1 697 0 ldr w0, [x25, x7, lsl 2] -.LVL350: - .loc 1 700 0 +.LVL347: + .loc 1 699 0 cmp w6, w0 - beq .L279 -.LBB1415: - .loc 1 703 0 + beq .L281 +.LBB1477: + .loc 1 702 0 eor w2, w6, w0 - .loc 1 701 0 + .loc 1 700 0 mov w9, 0 -.LVL351: - .loc 1 706 0 +.LVL348: + .loc 1 705 0 ands w5, w2, 15 -.LVL352: - beq .L280 -.LBB1416: - .loc 1 706 0 is_stmt 0 discriminator 1 +.LVL349: + beq .L282 +.LBB1478: + .loc 1 705 0 is_stmt 0 discriminator 1 ldrb w30, [x8, -8] -.LVL353: +.LVL350: and w15, w6, 15 ldrb w3, [x1, -8] -.LVL354: +.LVL351: ubfiz w4, w0, 5, 4 -.LVL355: +.LVL352: orr w4, w4, w15 ldrb w5, [x19, 56] -.LVL356: +.LVL353: add x18, x19, x30, sxtw 3 ldrb w17, [x19, 57] lsl w16, w3, 10 @@ -3606,249 +3731,249 @@ cmp w5, w3 add x4, x18, x4, uxtw ldrb w5, [x4, w16, sxtw] -.LVL357: - beq .L431 -.L282: - .loc 1 706 0 discriminator 9 +.LVL354: + beq .L433 +.L284: + .loc 1 705 0 discriminator 9 strb w3, [x1, -8] -.LVL358: -.L280: -.LBE1416: - .loc 1 707 0 is_stmt 1 discriminator 10 +.LVL355: +.L282: +.LBE1478: + .loc 1 706 0 is_stmt 1 discriminator 10 tst w2, 240 - beq .L283 -.LBB1417: - .loc 1 707 0 is_stmt 0 discriminator 1 + beq .L285 +.LBB1479: + .loc 1 706 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -7] -.LVL359: +.LVL356: lsr w3, w0, 4 -.LVL360: +.LVL357: ldrb w4, [x1, -7] -.LVL361: +.LVL358: ubfx x17, x6, 4, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL362: +.LVL359: orr w3, w3, w17 lsl w17, w4, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w4, w4, 1 ldr x16, [x30, 128] -.LVL363: +.LVL360: and w4, w4, 255 csel w15, w15, w18, eq cmp w15, w4 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL364: +.LVL361: orr w5, w5, w3, lsl 4 - beq .L432 -.L285: - .loc 1 707 0 discriminator 9 + beq .L434 +.L287: + .loc 1 706 0 discriminator 9 strb w4, [x1, -7] -.LVL365: -.L283: -.LBE1417: - .loc 1 708 0 is_stmt 1 discriminator 10 +.LVL362: +.L285: +.LBE1479: + .loc 1 707 0 is_stmt 1 discriminator 10 tst w2, 3840 - beq .L286 -.LBB1418: - .loc 1 708 0 is_stmt 0 discriminator 1 + beq .L288 +.LBB1480: + .loc 1 707 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -6] -.LVL366: +.LVL363: lsr w3, w0, 8 -.LVL367: +.LVL364: ldrb w4, [x1, -6] -.LVL368: +.LVL365: ubfx x17, x6, 8, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL369: +.LVL366: orr w3, w3, w17 lsl w17, w4, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w4, w4, 1 ldr x16, [x30, 128] -.LVL370: +.LVL367: and w4, w4, 255 csel w15, w15, w18, eq cmp w15, w4 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL371: +.LVL368: orr w5, w5, w3, lsl 8 - beq .L433 -.L288: - .loc 1 708 0 discriminator 9 + beq .L435 +.L290: + .loc 1 707 0 discriminator 9 strb w4, [x1, -6] -.LVL372: -.L286: -.LBE1418: - .loc 1 709 0 is_stmt 1 discriminator 10 +.LVL369: +.L288: +.LBE1480: + .loc 1 708 0 is_stmt 1 discriminator 10 tst w2, 61440 - beq .L289 -.LBB1419: - .loc 1 709 0 is_stmt 0 discriminator 1 + beq .L291 +.LBB1481: + .loc 1 708 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -5] -.LVL373: +.LVL370: lsr w3, w0, 12 -.LVL374: +.LVL371: ldrb w4, [x1, -5] -.LVL375: +.LVL372: ubfx x17, x6, 12, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL376: +.LVL373: orr w3, w3, w17 lsl w17, w4, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w4, w4, 1 ldr x16, [x30, 128] -.LVL377: +.LVL374: and w4, w4, 255 csel w15, w15, w18, eq cmp w15, w4 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL378: +.LVL375: orr w5, w5, w3, lsl 12 - beq .L434 -.L291: - .loc 1 709 0 discriminator 9 + beq .L436 +.L293: + .loc 1 708 0 discriminator 9 strb w4, [x1, -5] -.LVL379: -.L289: -.LBE1419: - .loc 1 710 0 is_stmt 1 discriminator 10 +.LVL376: +.L291: +.LBE1481: + .loc 1 709 0 is_stmt 1 discriminator 10 tst w2, 983040 - beq .L292 -.LBB1420: - .loc 1 710 0 is_stmt 0 discriminator 1 + beq .L294 +.LBB1482: + .loc 1 709 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -4] -.LVL380: +.LVL377: lsr w3, w0, 16 -.LVL381: +.LVL378: ldrb w4, [x1, -4] -.LVL382: +.LVL379: ubfx x17, x6, 16, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL383: +.LVL380: orr w3, w3, w17 lsl w17, w4, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w4, w4, 1 ldr x16, [x30, 128] -.LVL384: +.LVL381: and w4, w4, 255 csel w15, w15, w18, eq cmp w15, w4 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL385: +.LVL382: orr w5, w5, w3, lsl 16 - beq .L435 -.L294: - .loc 1 710 0 discriminator 9 + beq .L437 +.L296: + .loc 1 709 0 discriminator 9 strb w4, [x1, -4] -.LVL386: -.L292: -.LBE1420: - .loc 1 711 0 is_stmt 1 discriminator 10 +.LVL383: +.L294: +.LBE1482: + .loc 1 710 0 is_stmt 1 discriminator 10 tst w2, 15728640 - beq .L295 -.LBB1421: - .loc 1 711 0 is_stmt 0 discriminator 1 + beq .L297 +.LBB1483: + .loc 1 710 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -3] -.LVL387: +.LVL384: lsr w3, w0, 20 -.LVL388: +.LVL385: ldrb w4, [x1, -3] -.LVL389: +.LVL386: ubfx x17, x6, 20, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL390: +.LVL387: orr w3, w3, w17 lsl w17, w4, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w4, w4, 1 ldr x16, [x30, 128] -.LVL391: +.LVL388: and w4, w4, 255 csel w15, w15, w18, eq cmp w15, w4 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL392: +.LVL389: orr w5, w5, w3, lsl 20 - beq .L436 -.L297: - .loc 1 711 0 discriminator 9 + beq .L438 +.L299: + .loc 1 710 0 discriminator 9 strb w4, [x1, -3] -.LVL393: -.L295: -.LBE1421: - .loc 1 712 0 is_stmt 1 discriminator 10 +.LVL390: +.L297: +.LBE1483: + .loc 1 711 0 is_stmt 1 discriminator 10 tst w2, 251658240 - beq .L298 -.LBB1422: - .loc 1 712 0 is_stmt 0 discriminator 1 + beq .L300 +.LBB1484: + .loc 1 711 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -2] -.LVL394: +.LVL391: lsr w3, w0, 24 -.LVL395: +.LVL392: ldrb w4, [x1, -2] -.LVL396: +.LVL393: ubfx x17, x6, 24, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL397: +.LVL394: orr w3, w3, w17 lsl w17, w4, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w4, w4, 1 ldr x16, [x30, 128] -.LVL398: +.LVL395: and w4, w4, 255 csel w15, w15, w18, eq cmp w15, w4 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL399: +.LVL396: orr w5, w5, w3, lsl 24 - beq .L437 -.L300: - .loc 1 712 0 discriminator 9 + beq .L439 +.L302: + .loc 1 711 0 discriminator 9 strb w4, [x1, -2] -.LVL400: -.L298: -.LBE1422: - .loc 1 713 0 is_stmt 1 discriminator 10 +.LVL397: +.L300: +.LBE1484: + .loc 1 712 0 is_stmt 1 discriminator 10 tst w2, -268435456 - beq .L301 -.LBB1423: - .loc 1 713 0 is_stmt 0 discriminator 1 + beq .L303 +.LBB1485: + .loc 1 712 0 is_stmt 0 discriminator 1 ldrb w15, [x8, -1] -.LVL401: +.LVL398: lsr w4, w6, 28 -.LVL402: +.LVL399: ldrb w2, [x1, -1] -.LVL403: +.LVL400: lsr w3, w0, 28 -.LVL404: +.LVL401: cmp w15, 0 add w3, w4, w3, lsl 5 add x18, x19, x15, sxtw 3 @@ -3857,83 +3982,83 @@ ldrb w17, [x19, 57] add w2, w2, 1 ldr x15, [x18, 128] -.LVL405: +.LVL402: and w2, w2, 255 csel w4, w4, w17, eq cmp w4, w2 add x3, x15, x3, uxtw ldrb w3, [x3, w16, sxtw] -.LVL406: +.LVL403: orr w5, w5, w3, lsl 28 - beq .L438 - .loc 1 713 0 discriminator 9 + beq .L440 + .loc 1 712 0 discriminator 9 strb w2, [x1, -1] -.LVL407: -.L301: -.LBE1423: - .loc 1 714 0 is_stmt 1 discriminator 10 - cbnz w9, .L304 -.L305: - .loc 1 716 0 +.LVL404: +.L303: +.LBE1485: + .loc 1 713 0 is_stmt 1 discriminator 10 + cbnz w9, .L306 +.L307: + .loc 1 715 0 str w5, [x10, x7, lsl 2] - .loc 1 705 0 + .loc 1 704 0 mov w5, 1 -.LVL408: -.L279: +.LVL405: +.L281: add x7, x7, 1 add x1, x1, 8 add x8, x8, 8 -.LBE1415: -.LBE1414: - .loc 1 696 0 discriminator 2 +.LBE1477: +.LBE1476: + .loc 1 695 0 discriminator 2 cmp w20, w7 - bgt .L306 + bgt .L308 add x27, x27, x12 -.LVL409: +.LVL406: add x28, x28, x12 -.LVL410: +.LVL407: add x25, x25, x11 -.LVL411: +.LVL408: add x26, x26, x11 add x1, x27, 8 add x8, x28, 8 - .loc 1 696 0 is_stmt 0 + .loc 1 695 0 is_stmt 0 mov x6, 0 -.LVL412: +.LVL409: .p2align 2 -.L334: -.LBB1433: - .loc 1 727 0 is_stmt 1 +.L336: +.LBB1495: + .loc 1 726 0 is_stmt 1 ldr w7, [x26, x6, lsl 2] -.LVL413: - .loc 1 728 0 +.LVL410: + .loc 1 727 0 ldr w0, [x25, x6, lsl 2] -.LVL414: - .loc 1 730 0 +.LVL411: + .loc 1 729 0 cmp w7, w0 - beq .L307 -.LBB1434: - .loc 1 733 0 + beq .L309 +.LBB1496: + .loc 1 732 0 eor w5, w7, w0 -.LVL415: - .loc 1 731 0 +.LVL412: + .loc 1 730 0 mov w4, 0 - .loc 1 736 0 + .loc 1 735 0 ands w2, w5, 15 -.LVL416: - beq .L308 -.LBB1435: - .loc 1 736 0 is_stmt 0 discriminator 1 +.LVL413: + beq .L310 +.LBB1497: + .loc 1 735 0 is_stmt 0 discriminator 1 ldrb w30, [x8, -8] -.LVL417: +.LVL414: and w15, w7, 15 ldrb w3, [x1, -8] -.LVL418: +.LVL415: ubfiz w2, w0, 5, 4 -.LVL419: +.LVL416: orr w2, w2, w15 ldrb w9, [x19, 56] -.LVL420: +.LVL417: add x18, x19, x30, sxtw 3 ldrb w17, [x19, 57] lsl w16, w3, 10 @@ -3945,251 +4070,251 @@ cmp w9, w3 add x2, x18, x2, uxtw ldrb w2, [x2, w16, sxtw] -.LVL421: +.LVL418: lsl w2, w2, 2 -.LVL422: - beq .L439 -.L310: - .loc 1 736 0 discriminator 9 +.LVL419: + beq .L441 +.L312: + .loc 1 735 0 discriminator 9 strb w3, [x1, -8] -.LVL423: -.L308: -.LBE1435: - .loc 1 737 0 is_stmt 1 discriminator 10 +.LVL420: +.L310: +.LBE1497: + .loc 1 736 0 is_stmt 1 discriminator 10 tst w5, 240 - beq .L311 -.LBB1436: - .loc 1 737 0 is_stmt 0 discriminator 1 + beq .L313 +.LBB1498: + .loc 1 736 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -7] -.LVL424: +.LVL421: lsr w3, w0, 4 -.LVL425: +.LVL422: ldrb w9, [x1, -7] -.LVL426: +.LVL423: ubfx x17, x7, 4, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL427: +.LVL424: orr w3, w3, w17 lsl w17, w9, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w9, w9, 1 ldr x16, [x30, 128] -.LVL428: +.LVL425: and w9, w9, 255 csel w15, w15, w18, eq cmp w15, w9 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL429: +.LVL426: orr w2, w2, w3, lsl 6 - beq .L440 -.L313: - .loc 1 737 0 discriminator 9 + beq .L442 +.L315: + .loc 1 736 0 discriminator 9 strb w9, [x1, -7] -.LVL430: -.L311: -.LBE1436: - .loc 1 738 0 is_stmt 1 discriminator 10 +.LVL427: +.L313: +.LBE1498: + .loc 1 737 0 is_stmt 1 discriminator 10 tst w5, 3840 - beq .L314 -.LBB1437: - .loc 1 738 0 is_stmt 0 discriminator 1 + beq .L316 +.LBB1499: + .loc 1 737 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -6] -.LVL431: +.LVL428: lsr w3, w0, 8 -.LVL432: +.LVL429: ldrb w9, [x1, -6] -.LVL433: +.LVL430: ubfx x17, x7, 8, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL434: +.LVL431: orr w3, w3, w17 lsl w17, w9, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w9, w9, 1 ldr x16, [x30, 128] -.LVL435: +.LVL432: and w9, w9, 255 csel w15, w15, w18, eq cmp w15, w9 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL436: +.LVL433: orr w2, w2, w3, lsl 10 - beq .L441 -.L316: - .loc 1 738 0 discriminator 9 + beq .L443 +.L318: + .loc 1 737 0 discriminator 9 strb w9, [x1, -6] -.LVL437: -.L314: -.LBE1437: - .loc 1 739 0 is_stmt 1 discriminator 10 +.LVL434: +.L316: +.LBE1499: + .loc 1 738 0 is_stmt 1 discriminator 10 tst w5, 61440 - beq .L317 -.LBB1438: - .loc 1 739 0 is_stmt 0 discriminator 1 + beq .L319 +.LBB1500: + .loc 1 738 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -5] -.LVL438: +.LVL435: lsr w3, w0, 12 -.LVL439: +.LVL436: ldrb w9, [x1, -5] -.LVL440: +.LVL437: ubfx x17, x7, 12, 4 cmp w16, 0 ubfiz w3, w3, 5, 4 add x30, x19, x16, sxtw 3 -.LVL441: +.LVL438: orr w3, w3, w17 lsl w17, w9, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w9, w9, 1 ldr x16, [x30, 128] -.LVL442: +.LVL439: and w9, w9, 255 csel w15, w15, w18, eq cmp w15, w9 add x3, x16, x3, uxtw ldrb w3, [x3, w17, sxtw] -.LVL443: +.LVL440: orr w2, w2, w3, lsl 14 - beq .L442 -.L319: - .loc 1 739 0 discriminator 9 + beq .L444 +.L321: + .loc 1 738 0 discriminator 9 strb w9, [x1, -5] -.LVL444: -.L317: -.LBE1438: - .loc 1 740 0 is_stmt 1 discriminator 10 +.LVL441: +.L319: +.LBE1500: + .loc 1 739 0 is_stmt 1 discriminator 10 tst w5, 983040 - beq .L320 -.LBB1439: - .loc 1 740 0 is_stmt 0 discriminator 1 + beq .L322 +.LBB1501: + .loc 1 739 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -4] -.LVL445: +.LVL442: lsr w9, w0, 16 -.LVL446: +.LVL443: ldrb w3, [x1, -4] -.LVL447: +.LVL444: ubfx x17, x7, 16, 4 cmp w16, 0 ubfiz w9, w9, 5, 4 add x30, x19, x16, sxtw 3 -.LVL448: +.LVL445: orr w9, w9, w17 lsl w17, w3, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w3, w3, 1 ldr x16, [x30, 128] -.LVL449: +.LVL446: and w3, w3, 255 csel w15, w15, w18, eq cmp w15, w3 add x9, x16, x9, uxtw ldrb w9, [x9, w17, sxtw] -.LVL450: +.LVL447: orr w2, w2, w9, lsl 18 - beq .L443 -.L322: - .loc 1 740 0 discriminator 9 + beq .L445 +.L324: + .loc 1 739 0 discriminator 9 strb w3, [x1, -4] -.LVL451: -.L320: -.LBE1439: - .loc 1 741 0 is_stmt 1 discriminator 10 +.LVL448: +.L322: +.LBE1501: + .loc 1 740 0 is_stmt 1 discriminator 10 tst w5, 15728640 - beq .L323 -.LBB1440: - .loc 1 741 0 is_stmt 0 discriminator 1 + beq .L325 +.LBB1502: + .loc 1 740 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -3] -.LVL452: +.LVL449: lsr w9, w0, 20 -.LVL453: +.LVL450: ldrb w3, [x1, -3] -.LVL454: +.LVL451: ubfx x17, x7, 20, 4 cmp w16, 0 ubfiz w9, w9, 5, 4 add x30, x19, x16, sxtw 3 -.LVL455: +.LVL452: orr w9, w9, w17 lsl w17, w3, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w3, w3, 1 ldr x16, [x30, 128] -.LVL456: +.LVL453: and w3, w3, 255 csel w15, w15, w18, eq cmp w15, w3 add x9, x16, x9, uxtw ldrb w9, [x9, w17, sxtw] -.LVL457: +.LVL454: orr w2, w2, w9, lsl 22 - beq .L444 -.L325: - .loc 1 741 0 discriminator 9 + beq .L446 +.L327: + .loc 1 740 0 discriminator 9 strb w3, [x1, -3] -.LVL458: -.L323: -.LBE1440: - .loc 1 742 0 is_stmt 1 discriminator 10 +.LVL455: +.L325: +.LBE1502: + .loc 1 741 0 is_stmt 1 discriminator 10 tst w5, 251658240 - beq .L326 -.LBB1441: - .loc 1 742 0 is_stmt 0 discriminator 1 + beq .L328 +.LBB1503: + .loc 1 741 0 is_stmt 0 discriminator 1 ldrb w16, [x8, -2] -.LVL459: +.LVL456: lsr w9, w0, 24 -.LVL460: +.LVL457: ldrb w3, [x1, -2] -.LVL461: +.LVL458: ubfx x17, x7, 24, 4 cmp w16, 0 ubfiz w9, w9, 5, 4 add x30, x19, x16, sxtw 3 -.LVL462: +.LVL459: orr w9, w9, w17 lsl w17, w3, 10 ldrb w15, [x19, 56] ldrb w18, [x19, 57] add w3, w3, 1 ldr x16, [x30, 128] -.LVL463: +.LVL460: and w3, w3, 255 csel w15, w15, w18, eq cmp w15, w3 add x9, x16, x9, uxtw ldrb w9, [x9, w17, sxtw] -.LVL464: +.LVL461: orr w2, w2, w9, lsl 26 - beq .L445 -.L328: - .loc 1 742 0 discriminator 9 + beq .L447 +.L330: + .loc 1 741 0 discriminator 9 strb w3, [x1, -2] -.LVL465: -.L326: -.LBE1441: - .loc 1 743 0 is_stmt 1 discriminator 10 +.LVL462: +.L328: +.LBE1503: + .loc 1 742 0 is_stmt 1 discriminator 10 tst w5, -268435456 - beq .L329 -.LBB1442: - .loc 1 743 0 is_stmt 0 discriminator 1 + beq .L331 +.LBB1504: + .loc 1 742 0 is_stmt 0 discriminator 1 ldrb w15, [x8, -1] -.LVL466: +.LVL463: lsr w9, w7, 28 -.LVL467: +.LVL464: ldrb w3, [x1, -1] -.LVL468: +.LVL465: lsr w5, w0, 28 -.LVL469: +.LVL466: cmp w15, 0 add w5, w9, w5, lsl 5 add x18, x19, x15, sxtw 3 @@ -4198,67 +4323,67 @@ ldrb w17, [x19, 57] add w3, w3, 1 ldr x15, [x18, 128] -.LVL470: +.LVL467: and w3, w3, 255 csel w9, w9, w17, eq cmp w9, w3 add x5, x15, x5, uxtw ldrb w5, [x5, w16, sxtw] -.LVL471: +.LVL468: orr w2, w2, w5, lsl 30 - beq .L446 - .loc 1 743 0 discriminator 9 + beq .L448 + .loc 1 742 0 discriminator 9 strb w3, [x1, -1] -.LVL472: -.L329: -.LBE1442: - .loc 1 744 0 is_stmt 1 discriminator 10 - cbnz w4, .L332 -.L333: - .loc 1 746 0 +.LVL469: +.L331: +.LBE1504: + .loc 1 743 0 is_stmt 1 discriminator 10 + cbnz w4, .L334 +.L335: + .loc 1 745 0 ldr w0, [x10, x6, lsl 2] -.LVL473: - .loc 1 735 0 +.LVL470: + .loc 1 734 0 mov w5, 1 -.LVL474: - .loc 1 746 0 +.LVL471: + .loc 1 745 0 orr w2, w0, w2 -.LVL475: +.LVL472: str w2, [x10, x6, lsl 2] -.LVL476: -.L307: +.LVL473: +.L309: add x6, x6, 1 add x1, x1, 8 add x8, x8, 8 -.LBE1434: -.LBE1433: - .loc 1 726 0 discriminator 2 +.LBE1496: +.LBE1495: + .loc 1 725 0 discriminator 2 cmp w20, w6 - bgt .L334 + bgt .L336 add x27, x27, x12 add x28, x28, x12 add x25, x25, x11 add x26, x26, x11 -.L278: -.LBE1413: - .loc 1 694 0 +.L280: +.LBE1475: + .loc 1 693 0 add w21, w21, 2 add w13, w13, w14 cmp w23, w21 - bgt .L335 - .loc 1 756 0 + bgt .L337 + .loc 1 755 0 str w5, [x24] - .loc 1 757 0 + .loc 1 756 0 ldp x19, x20, [sp, 16] -.LVL477: +.LVL474: ldp x21, x22, [sp, 32] -.LVL478: +.LVL475: ldp x23, x24, [sp, 48] -.LVL479: +.LVL476: ldp x25, x26, [sp, 64] -.LVL480: +.LVL477: ldp x27, x28, [sp, 80] -.LVL481: +.LVL478: ldp x29, x30, [sp], 112 .cfi_remember_state .cfi_restore 30 @@ -4274,309 +4399,309 @@ .cfi_restore 19 .cfi_restore 20 .cfi_def_cfa 31, 0 -.LVL482: +.LVL479: ret +.LVL480: + .p2align 3 +.L440: + .cfi_restore_state +.LBB1516: +.LBB1514: +.LBB1494: +.LBB1486: + .loc 1 712 0 discriminator 7 + and w0, w0, 268435455 +.LVL481: + and w6, w6, -268435456 +.LVL482: + orr w0, w6, w0 .LVL483: + strb wzr, [x1, -1] +.LVL484: +.L306: +.LBE1486: + .loc 1 714 0 + str w0, [x25, x7, lsl 2] + b .L307 +.LVL485: + .p2align 3 +.L439: +.LBB1487: + .loc 1 711 0 discriminator 7 + and w0, w0, -251658241 +.LVL486: + and w3, w6, 251658240 +.LVL487: + orr w0, w3, w0 +.LVL488: + mov w4, 0 + mov w9, 1 + b .L302 +.LVL489: .p2align 3 .L438: - .cfi_restore_state -.LBB1454: -.LBB1452: -.LBB1432: -.LBB1424: - .loc 1 713 0 discriminator 7 - and w0, w0, 268435455 -.LVL484: - and w6, w6, -268435456 -.LVL485: - orr w0, w6, w0 -.LVL486: - strb wzr, [x1, -1] -.LVL487: -.L304: -.LBE1424: - .loc 1 715 0 - str w0, [x25, x7, lsl 2] - b .L305 -.LVL488: +.LBE1487: +.LBB1488: + .loc 1 710 0 discriminator 7 + and w0, w0, -15728641 +.LVL490: + and w3, w6, 15728640 +.LVL491: + orr w0, w3, w0 +.LVL492: + mov w4, 0 + mov w9, 1 + b .L299 +.LVL493: .p2align 3 .L437: -.LBB1425: - .loc 1 712 0 discriminator 7 - and w0, w0, -251658241 -.LVL489: - and w3, w6, 251658240 -.LVL490: +.LBE1488: +.LBB1489: + .loc 1 709 0 discriminator 7 + and w0, w0, -983041 +.LVL494: + and w3, w6, 983040 +.LVL495: orr w0, w3, w0 -.LVL491: +.LVL496: mov w4, 0 mov w9, 1 - b .L300 -.LVL492: + b .L296 +.LVL497: .p2align 3 .L436: -.LBE1425: -.LBB1426: - .loc 1 711 0 discriminator 7 - and w0, w0, -15728641 -.LVL493: - and w3, w6, 15728640 -.LVL494: +.LBE1489: +.LBB1490: + .loc 1 708 0 discriminator 7 + and w0, w0, -61441 +.LVL498: + and w3, w6, 61440 +.LVL499: orr w0, w3, w0 -.LVL495: +.LVL500: mov w4, 0 mov w9, 1 - b .L297 -.LVL496: + b .L293 +.LVL501: .p2align 3 .L435: -.LBE1426: -.LBB1427: - .loc 1 710 0 discriminator 7 - and w0, w0, -983041 -.LVL497: - and w3, w6, 983040 -.LVL498: +.LBE1490: +.LBB1491: + .loc 1 707 0 discriminator 7 + and w0, w0, -3841 +.LVL502: + and w3, w6, 3840 +.LVL503: orr w0, w3, w0 -.LVL499: +.LVL504: mov w4, 0 mov w9, 1 - b .L294 -.LVL500: + b .L290 +.LVL505: .p2align 3 .L434: -.LBE1427: -.LBB1428: - .loc 1 709 0 discriminator 7 - and w0, w0, -61441 -.LVL501: - and w3, w6, 61440 -.LVL502: +.LBE1491: +.LBB1492: + .loc 1 706 0 discriminator 7 + and w0, w0, -241 +.LVL506: + and w3, w6, 240 +.LVL507: orr w0, w3, w0 -.LVL503: +.LVL508: mov w4, 0 mov w9, 1 - b .L291 -.LVL504: + b .L287 +.LVL509: .p2align 3 .L433: -.LBE1428: -.LBB1429: - .loc 1 708 0 discriminator 7 - and w0, w0, -3841 -.LVL505: - and w3, w6, 3840 -.LVL506: - orr w0, w3, w0 -.LVL507: - mov w4, 0 - mov w9, 1 - b .L288 -.LVL508: - .p2align 3 -.L432: -.LBE1429: -.LBB1430: - .loc 1 707 0 discriminator 7 - and w0, w0, -241 -.LVL509: - and w3, w6, 240 -.LVL510: - orr w0, w3, w0 -.LVL511: - mov w4, 0 - mov w9, 1 - b .L285 -.LVL512: - .p2align 3 -.L431: -.LBE1430: -.LBB1431: - .loc 1 706 0 discriminator 7 +.LBE1492: +.LBB1493: + .loc 1 705 0 discriminator 7 bfi w0, w15, 0, 4 mov w3, 0 mov w9, 1 - b .L282 + b .L284 +.LVL510: + .p2align 3 +.L448: +.LBE1493: +.LBE1494: +.LBE1514: +.LBB1515: +.LBB1513: +.LBB1505: + .loc 1 742 0 discriminator 7 + and w0, w0, 268435455 +.LVL511: + and w7, w7, -268435456 +.LVL512: + orr w0, w7, w0 .LVL513: + strb wzr, [x1, -1] +.LVL514: +.L334: +.LBE1505: + .loc 1 744 0 + str w0, [x25, x6, lsl 2] + b .L335 +.LVL515: .p2align 3 .L446: -.LBE1431: -.LBE1432: -.LBE1452: -.LBB1453: -.LBB1451: -.LBB1443: - .loc 1 743 0 discriminator 7 - and w0, w0, 268435455 -.LVL514: - and w7, w7, -268435456 -.LVL515: - orr w0, w7, w0 -.LVL516: - strb wzr, [x1, -1] -.LVL517: -.L332: -.LBE1443: - .loc 1 745 0 - str w0, [x25, x6, lsl 2] - b .L333 -.LVL518: - .p2align 3 -.L444: -.LBB1444: - .loc 1 741 0 discriminator 7 +.LBB1506: + .loc 1 740 0 discriminator 7 and w3, w7, 15728640 and w0, w0, -15728641 +.LVL516: + orr w0, w3, w0 +.LVL517: + mov w4, 1 + mov w3, 0 + b .L327 +.LVL518: + .p2align 3 +.L447: +.LBE1506: +.LBB1507: + .loc 1 741 0 discriminator 7 + and w3, w7, 251658240 + and w0, w0, -251658241 .LVL519: orr w0, w3, w0 .LVL520: mov w4, 1 mov w3, 0 - b .L325 + b .L330 .LVL521: .p2align 3 .L445: -.LBE1444: -.LBB1445: - .loc 1 742 0 discriminator 7 - and w3, w7, 251658240 - and w0, w0, -251658241 +.LBE1507: +.LBB1508: + .loc 1 739 0 discriminator 7 + and w3, w7, 983040 + and w0, w0, -983041 .LVL522: orr w0, w3, w0 .LVL523: mov w4, 1 mov w3, 0 - b .L328 + b .L324 .LVL524: .p2align 3 -.L443: -.LBE1445: -.LBB1446: - .loc 1 740 0 discriminator 7 - and w3, w7, 983040 - and w0, w0, -983041 +.L444: +.LBE1508: +.LBB1509: + .loc 1 738 0 discriminator 7 + and w0, w0, -61441 .LVL525: - orr w0, w3, w0 + and w3, w7, 61440 .LVL526: - mov w4, 1 - mov w3, 0 - b .L322 + orr w0, w3, w0 .LVL527: + mov w9, 0 + mov w4, 1 + b .L321 +.LVL528: + .p2align 3 +.L443: +.LBE1509: +.LBB1510: + .loc 1 737 0 discriminator 7 + and w0, w0, -3841 +.LVL529: + and w3, w7, 3840 +.LVL530: + orr w0, w3, w0 +.LVL531: + mov w9, 0 + mov w4, 1 + b .L318 +.LVL532: .p2align 3 .L442: -.LBE1446: -.LBB1447: - .loc 1 739 0 discriminator 7 - and w0, w0, -61441 -.LVL528: - and w3, w7, 61440 -.LVL529: +.LBE1510: +.LBB1511: + .loc 1 736 0 discriminator 7 + and w0, w0, -241 +.LVL533: + and w3, w7, 240 +.LVL534: orr w0, w3, w0 -.LVL530: +.LVL535: mov w9, 0 mov w4, 1 - b .L319 -.LVL531: + b .L315 +.LVL536: .p2align 3 .L441: -.LBE1447: -.LBB1448: - .loc 1 738 0 discriminator 7 - and w0, w0, -3841 -.LVL532: - and w3, w7, 3840 -.LVL533: - orr w0, w3, w0 -.LVL534: - mov w9, 0 - mov w4, 1 - b .L316 -.LVL535: - .p2align 3 -.L440: -.LBE1448: -.LBB1449: - .loc 1 737 0 discriminator 7 - and w0, w0, -241 -.LVL536: - and w3, w7, 240 -.LVL537: - orr w0, w3, w0 -.LVL538: - mov w9, 0 - mov w4, 1 - b .L313 -.LVL539: - .p2align 3 -.L439: -.LBE1449: -.LBB1450: - .loc 1 736 0 discriminator 7 +.LBE1511: +.LBB1512: + .loc 1 735 0 discriminator 7 bfi w0, w15, 0, 4 mov w3, 0 mov w4, 1 - b .L310 -.LVL540: -.L430: -.LBE1450: -.LBE1451: -.LBE1453: -.LBE1454: - .loc 1 679 0 + b .L312 +.LVL537: +.L432: +.LBE1512: +.LBE1513: +.LBE1515: +.LBE1516: + .loc 1 678 0 add w23, w23, w23, lsr 31 -.LVL541: +.LVL538: lsr w14, w1, 2 asr w23, w23, 1 -.LVL542: +.LVL539: mov x0, 0 - .loc 1 678 0 + .loc 1 677 0 mov w21, 0 -.LVL543: - b .L275 -.LVL544: -.L276: - .loc 1 681 0 +.LVL540: + b .L277 +.LVL541: +.L278: + .loc 1 680 0 add w21, w23, w23, lsr 31 lsr w14, w1, 2 asr w21, w21, 1 -.LVL545: - .loc 1 686 0 +.LVL542: + .loc 1 685 0 add x24, x5, 64 - .loc 1 682 0 + .loc 1 681 0 mul w0, w20, w21 - .loc 1 684 0 - mul w1, w21, w1 - .loc 1 682 0 - sbfiz x0, x0, 2, 32 - .loc 1 684 0 - add x27, x3, x1 - .loc 1 682 0 - add x26, x26, x0 .loc 1 683 0 + mul w1, w21, w1 + .loc 1 681 0 + sbfiz x0, x0, 2, 32 + .loc 1 683 0 + add x27, x3, x1 + .loc 1 681 0 + add x26, x26, x0 + .loc 1 682 0 add x25, x2, x0 mul w0, w21, w14 - .loc 1 685 0 + .loc 1 684 0 add x28, x4, x1 sxtw x0, w0 - b .L275 -.LVL546: -.L336: - .loc 1 670 0 + b .L277 +.LVL543: +.L338: + .loc 1 669 0 mov w5, 0 -.LVL547: - .loc 1 756 0 +.LVL544: + .loc 1 755 0 str w5, [x24] - .loc 1 757 0 + .loc 1 756 0 ldp x19, x20, [sp, 16] -.LVL548: +.LVL545: ldp x21, x22, [sp, 32] -.LVL549: +.LVL546: ldp x23, x24, [sp, 48] -.LVL550: +.LVL547: ldp x25, x26, [sp, 64] -.LVL551: +.LVL548: ldp x27, x28, [sp, 80] -.LVL552: +.LVL549: ldp x29, x30, [sp], 112 .cfi_restore 20 .cfi_restore 19 @@ -4600,37 +4725,37 @@ .type get_overlay_image, %function get_overlay_image: .LFB2820: - .loc 1 595 0 + .loc 1 594 0 .cfi_startproc -.LVL553: +.LVL550: stp x29, x30, [sp, -112]! .cfi_def_cfa_offset 112 .cfi_offset 29, -112 .cfi_offset 30, -104 - .loc 1 596 0 - adrp x7, .LANCHOR0 - .loc 1 605 0 - cmp w6, 2 .loc 1 595 0 + adrp x7, .LANCHOR0 + .loc 1 604 0 + cmp w6, 2 + .loc 1 594 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x23, x24, [sp, 48] .cfi_offset 23, -64 .cfi_offset 24, -56 - .loc 1 596 0 - ldr x23, [x7, #:lo12:.LANCHOR0] .loc 1 595 0 + ldr x23, [x7, #:lo12:.LANCHOR0] + .loc 1 594 0 stp x19, x20, [sp, 16] .cfi_offset 19, -96 .cfi_offset 20, -88 mov x19, x5 - .loc 1 602 0 + .loc 1 601 0 add x23, x23, 24 - .loc 1 595 0 + .loc 1 594 0 stp x21, x22, [sp, 32] stp x25, x26, [sp, 64] mov x5, x0 -.LVL554: +.LVL551: stp x27, x28, [sp, 80] .cfi_offset 21, -80 .cfi_offset 22, -72 @@ -4638,40 +4763,40 @@ .cfi_offset 26, -40 .cfi_offset 27, -32 .cfi_offset 28, -24 - .loc 1 595 0 + .loc 1 594 0 mov x21, x1 mov x20, x2 mov x25, x3 - .loc 1 603 0 - ldp w12, w0, [x23, 84] -.LVL555: - .loc 1 595 0 - mov x26, x4 - .loc 1 599 0 - add x28, x19, 60 -.LVL556: .loc 1 602 0 + ldp w12, w0, [x23, 84] +.LVL552: + .loc 1 594 0 + mov x26, x4 + .loc 1 598 0 + add x28, x19, 60 +.LVL553: + .loc 1 601 0 lsr w22, w12, 3 - .loc 1 605 0 - beq .L530 + .loc 1 604 0 + beq .L532 mov w27, w0 -.LVL557: - .loc 1 608 0 +.LVL554: + .loc 1 607 0 cmp w6, 3 - .loc 1 616 0 + .loc 1 615 0 mov w24, 0 -.LVL558: - .loc 1 608 0 - beq .L531 -.L449: - .loc 1 620 0 - ldr w1, [x23, 156] +.LVL555: + .loc 1 607 0 + beq .L533 +.L451: .loc 1 619 0 + ldr w1, [x23, 156] + .loc 1 618 0 lsr w12, w12, 2 -.LVL559: +.LVL556: + .loc 1 619 0 + cbz w1, .L452 .loc 1 620 0 - cbz w1, .L450 - .loc 1 621 0 sub w2, w27, w24 sub w0, w0, w27 str x5, [x29, 96] @@ -4682,73 +4807,73 @@ sxtw x2, w2 add x0, x5, x0 bl memset -.LVL560: - .loc 1 622 0 +.LVL557: + .loc 1 621 0 ldr w0, [x23, 88] - .loc 1 629 0 + .loc 1 628 0 cmp w24, w27 - .loc 1 622 0 + .loc 1 621 0 ldr w12, [x29, 108] sub w0, w0, #1 ldr x5, [x29, 96] -.LVL561: +.LVL558: sub w0, w0, w24 -.LVL562: +.LVL559: mul w0, w0, w12 - .loc 1 623 0 - neg w12, w12 .loc 1 622 0 + neg w12, w12 + .loc 1 621 0 add x23, x5, x0 -.LVL563: - .loc 1 629 0 - bge .L485 -.L540: +.LVL560: + .loc 1 628 0 + bge .L487 +.L542: sub w4, w22, #1 sxtw x12, w12 -.LVL564: +.LVL561: add x4, x4, 1 mov w3, 0 -.LVL565: +.LVL562: lsl x11, x4, 3 lsl x4, x4, 2 -.LVL566: +.LVL563: .p2align 2 -.L452: +.L454: add x1, x25, 8 add x7, x26, 8 - .loc 1 630 0 discriminator 1 + .loc 1 629 0 discriminator 1 mov x6, 0 - cbz w22, .L483 + cbz w22, .L485 .p2align 2 -.L519: -.LBB1455: - .loc 1 631 0 +.L521: +.LBB1517: + .loc 1 630 0 ldr w2, [x21, x6, lsl 2] -.LVL567: - .loc 1 632 0 +.LVL564: + .loc 1 631 0 ldr w0, [x20, x6, lsl 2] -.LVL568: - .loc 1 634 0 +.LVL565: + .loc 1 633 0 cmp w2, w0 - beq .L454 -.LBB1456: - .loc 1 638 0 + beq .L456 +.LBB1518: + .loc 1 637 0 eor w5, w2, w0 - .loc 1 636 0 + .loc 1 635 0 lsl w9, w6, 1 -.LVL569: +.LVL566: add x9, x23, x9 -.LVL570: - .loc 1 641 0 +.LVL567: + .loc 1 640 0 tst x5, 15 - beq .L486 -.LBB1457: - .loc 1 641 0 is_stmt 0 discriminator 1 + beq .L488 +.LBB1519: + .loc 1 640 0 is_stmt 0 discriminator 1 ldrb w13, [x7, -8] -.LVL571: +.LVL568: and w14, w2, 15 ldrb w3, [x1, -8] -.LVL572: +.LVL569: ubfiz w8, w0, 5, 4 orr w8, w8, w14 ldrb w10, [x19, 56] @@ -4760,32 +4885,32 @@ csel w10, w10, w16, eq ldr x17, [x17, 128] and w3, w3, 255 -.LBE1457: - .loc 1 635 0 is_stmt 1 discriminator 1 +.LBE1519: + .loc 1 634 0 is_stmt 1 discriminator 1 mov w13, 0 -.LVL573: -.LBB1458: - .loc 1 641 0 discriminator 1 +.LVL570: +.LBB1520: + .loc 1 640 0 discriminator 1 cmp w10, w3 add x8, x17, x8, uxtw ldrb w8, [x8, w15, sxtw] - beq .L532 -.L457: - .loc 1 641 0 is_stmt 0 discriminator 9 + beq .L534 +.L459: + .loc 1 640 0 is_stmt 0 discriminator 9 strb w3, [x1, -8] -.LVL574: -.L455: -.LBE1458: - .loc 1 642 0 is_stmt 1 discriminator 10 +.LVL571: +.L457: +.LBE1520: + .loc 1 641 0 is_stmt 1 discriminator 10 tst w5, 240 - beq .L458 -.LBB1459: - .loc 1 642 0 is_stmt 0 discriminator 1 + beq .L460 +.LBB1521: + .loc 1 641 0 is_stmt 0 discriminator 1 ldrb w15, [x7, -7] -.LVL575: +.LVL572: lsr w10, w0, 4 ldrb w3, [x1, -7] -.LVL576: +.LVL573: ubfx x16, x2, 4, 4 cmp w15, 0 ubfiz w10, w10, 5, 4 @@ -4796,7 +4921,7 @@ ldrb w17, [x19, 57] add w3, w3, 1 ldr x15, [x18, 128] -.LVL577: +.LVL574: and w3, w3, 255 csel w14, w14, w17, eq cmp w14, w3 @@ -4804,22 +4929,22 @@ ldrb w10, [x10, w16, sxtw] ubfiz w10, w10, 2, 6 orr w8, w10, w8 - beq .L533 -.L460: - .loc 1 642 0 discriminator 9 + beq .L535 +.L462: + .loc 1 641 0 discriminator 9 strb w3, [x1, -7] -.LVL578: -.L458: -.LBE1459: - .loc 1 643 0 is_stmt 1 discriminator 10 +.LVL575: +.L460: +.LBE1521: + .loc 1 642 0 is_stmt 1 discriminator 10 tst w5, 3840 - beq .L461 -.LBB1460: - .loc 1 643 0 is_stmt 0 discriminator 1 + beq .L463 +.LBB1522: + .loc 1 642 0 is_stmt 0 discriminator 1 ldrb w15, [x7, -6] -.LVL579: +.LVL576: lsr w3, w0, 8 -.LVL580: +.LVL577: ldrb w10, [x1, -6] ubfx x16, x2, 8, 4 cmp w15, 0 @@ -4831,7 +4956,7 @@ ldrb w17, [x19, 57] add w10, w10, 1 ldr x15, [x18, 128] -.LVL581: +.LVL578: and w10, w10, 255 csel w14, w14, w17, eq cmp w14, w10 @@ -4839,22 +4964,22 @@ ldrb w3, [x3, w16, sxtw] ubfiz w3, w3, 4, 4 orr w8, w3, w8 - beq .L534 -.L463: - .loc 1 643 0 discriminator 9 + beq .L536 +.L465: + .loc 1 642 0 discriminator 9 strb w10, [x1, -6] -.LVL582: -.L461: -.LBE1460: - .loc 1 644 0 is_stmt 1 discriminator 10 +.LVL579: +.L463: +.LBE1522: + .loc 1 643 0 is_stmt 1 discriminator 10 tst w5, 61440 - beq .L464 -.LBB1461: - .loc 1 644 0 is_stmt 0 discriminator 1 + beq .L466 +.LBB1523: + .loc 1 643 0 is_stmt 0 discriminator 1 ldrb w15, [x7, -5] -.LVL583: +.LVL580: lsr w3, w0, 12 -.LVL584: +.LVL581: ldrb w10, [x1, -5] ubfx x16, x2, 12, 4 cmp w15, 0 @@ -4866,7 +4991,7 @@ ldrb w17, [x19, 57] add w10, w10, 1 ldr x15, [x18, 128] -.LVL585: +.LVL582: and w10, w10, 255 csel w14, w14, w17, eq cmp w14, w10 @@ -4874,27 +4999,27 @@ ldrb w3, [x3, w16, sxtw] ubfiz w3, w3, 6, 2 orr w8, w3, w8 - beq .L535 -.L466: - .loc 1 644 0 discriminator 9 + beq .L537 +.L468: + .loc 1 643 0 discriminator 9 strb w10, [x1, -5] -.LVL586: -.L464: -.LBE1461: - .loc 1 645 0 is_stmt 1 discriminator 10 +.LVL583: +.L466: +.LBE1523: + .loc 1 644 0 is_stmt 1 discriminator 10 strb w8, [x9] - .loc 1 647 0 discriminator 10 - tst w5, 983040 .loc 1 646 0 discriminator 10 + tst w5, 983040 + .loc 1 645 0 discriminator 10 mov w8, 0 - .loc 1 647 0 discriminator 10 - beq .L467 -.LBB1462: - .loc 1 647 0 is_stmt 0 discriminator 1 + .loc 1 646 0 discriminator 10 + beq .L469 +.LBB1524: + .loc 1 646 0 is_stmt 0 discriminator 1 ldrb w14, [x7, -4] -.LVL587: +.LVL584: lsr w3, w0, 16 -.LVL588: +.LVL585: ldrb w10, [x1, -4] ubfx x15, x2, 16, 4 cmp w14, 0 @@ -4906,28 +5031,28 @@ ldrb w16, [x19, 57] add w10, w10, 1 ldr x14, [x17, 128] -.LVL589: +.LVL586: and w10, w10, 255 csel w8, w8, w16, eq cmp w8, w10 add x3, x14, x3, uxtw ldrb w8, [x3, w15, sxtw] - beq .L536 -.L469: - .loc 1 647 0 discriminator 9 + beq .L538 +.L471: + .loc 1 646 0 discriminator 9 strb w10, [x1, -4] -.LVL590: -.L467: -.LBE1462: - .loc 1 648 0 is_stmt 1 discriminator 10 +.LVL587: +.L469: +.LBE1524: + .loc 1 647 0 is_stmt 1 discriminator 10 tst w5, 15728640 - beq .L470 -.LBB1463: - .loc 1 648 0 is_stmt 0 discriminator 1 + beq .L472 +.LBB1525: + .loc 1 647 0 is_stmt 0 discriminator 1 ldrb w15, [x7, -3] -.LVL591: +.LVL588: lsr w3, w0, 20 -.LVL592: +.LVL589: ldrb w10, [x1, -3] ubfx x16, x2, 20, 4 cmp w15, 0 @@ -4939,7 +5064,7 @@ ldrb w18, [x19, 57] add w10, w10, 1 ldr x15, [x17, 128] -.LVL593: +.LVL590: and w10, w10, 255 csel w14, w14, w18, eq cmp w14, w10 @@ -4947,22 +5072,22 @@ ldrb w3, [x3, w16, sxtw] ubfiz w3, w3, 2, 6 orr w8, w3, w8 - beq .L537 -.L472: - .loc 1 648 0 discriminator 9 + beq .L539 +.L474: + .loc 1 647 0 discriminator 9 strb w10, [x1, -3] -.LVL594: -.L470: -.LBE1463: - .loc 1 649 0 is_stmt 1 discriminator 10 +.LVL591: +.L472: +.LBE1525: + .loc 1 648 0 is_stmt 1 discriminator 10 tst w5, 251658240 - beq .L473 -.LBB1464: - .loc 1 649 0 is_stmt 0 discriminator 1 + beq .L475 +.LBB1526: + .loc 1 648 0 is_stmt 0 discriminator 1 ldrb w15, [x7, -2] -.LVL595: +.LVL592: lsr w3, w0, 24 -.LVL596: +.LVL593: ldrb w10, [x1, -2] ubfx x16, x2, 24, 4 cmp w15, 0 @@ -4974,7 +5099,7 @@ ldrb w18, [x19, 57] add w10, w10, 1 ldr x15, [x17, 128] -.LVL597: +.LVL594: and w10, w10, 255 csel w14, w14, w18, eq cmp w14, w10 @@ -4982,25 +5107,25 @@ ldrb w3, [x3, w16, sxtw] ubfiz w3, w3, 4, 4 orr w8, w3, w8 - beq .L538 -.L475: - .loc 1 649 0 discriminator 9 + beq .L540 +.L477: + .loc 1 648 0 discriminator 9 strb w10, [x1, -2] -.LVL598: -.L473: -.LBE1464: - .loc 1 650 0 is_stmt 1 discriminator 10 +.LVL595: +.L475: +.LBE1526: + .loc 1 649 0 is_stmt 1 discriminator 10 tst w5, -268435456 - beq .L476 -.LBB1465: - .loc 1 650 0 is_stmt 0 discriminator 1 + beq .L478 +.LBB1527: + .loc 1 649 0 is_stmt 0 discriminator 1 ldrb w14, [x7, -1] -.LVL599: +.LVL596: lsr w10, w2, 28 ldrb w3, [x1, -1] -.LVL600: +.LVL597: lsr w5, w0, 28 -.LVL601: +.LVL598: cmp w14, 0 add w5, w10, w5, lsl 5 add x17, x19, x14, sxtw 3 @@ -5009,7 +5134,7 @@ ldrb w16, [x19, 57] add w3, w3, 1 ldr x14, [x17, 128] -.LVL602: +.LVL599: and w3, w3, 255 csel w10, w10, w16, eq cmp w10, w3 @@ -5017,51 +5142,51 @@ ldrb w5, [x5, w15, sxtw] ubfiz w5, w5, 6, 2 orr w8, w5, w8 - beq .L539 - .loc 1 650 0 discriminator 9 + beq .L541 + .loc 1 649 0 discriminator 9 strb w3, [x1, -1] -.LVL603: -.L476: -.LBE1465: - .loc 1 651 0 is_stmt 1 discriminator 10 - cbnz w13, .L479 -.L480: - .loc 1 653 0 +.LVL600: +.L478: +.LBE1527: + .loc 1 650 0 is_stmt 1 discriminator 10 + cbnz w13, .L481 +.L482: + .loc 1 652 0 strb w8, [x9, 1] - .loc 1 640 0 + .loc 1 639 0 mov w3, 1 -.L454: +.L456: add x6, x6, 1 add x1, x1, 8 add x7, x7, 8 -.LBE1456: -.LBE1455: - .loc 1 630 0 discriminator 2 +.LBE1518: +.LBE1517: + .loc 1 629 0 discriminator 2 cmp w22, w6 - bgt .L519 + bgt .L521 add x25, x25, x11 add x26, x26, x11 add x20, x20, x4 add x21, x21, x4 -.L483: - .loc 1 629 0 +.L485: + .loc 1 628 0 add w24, w24, 1 add x23, x23, x12 cmp w27, w24 - bne .L452 - .loc 1 663 0 + bne .L454 + .loc 1 662 0 str w3, [x28] - .loc 1 664 0 + .loc 1 663 0 ldp x19, x20, [sp, 16] -.LVL604: +.LVL601: ldp x21, x22, [sp, 32] -.LVL605: +.LVL602: ldp x23, x24, [sp, 48] -.LVL606: +.LVL603: ldp x25, x26, [sp, 64] -.LVL607: +.LVL604: ldp x27, x28, [sp, 80] -.LVL608: +.LVL605: ldp x29, x30, [sp], 112 .cfi_remember_state .cfi_restore 30 @@ -5078,164 +5203,164 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL609: +.LVL606: .p2align 3 -.L539: +.L541: .cfi_restore_state -.LBB1475: -.LBB1474: -.LBB1466: - .loc 1 650 0 discriminator 7 - and w0, w0, 268435455 -.LVL610: - and w2, w2, -268435456 -.LVL611: - orr w0, w2, w0 -.LVL612: - strb wzr, [x1, -1] -.LVL613: -.L479: -.LBE1466: - .loc 1 652 0 - str w0, [x20, x6, lsl 2] - b .L480 -.LVL614: - .p2align 3 -.L538: -.LBB1467: +.LBB1537: +.LBB1536: +.LBB1528: .loc 1 649 0 discriminator 7 + and w0, w0, 268435455 +.LVL607: + and w2, w2, -268435456 +.LVL608: + orr w0, w2, w0 +.LVL609: + strb wzr, [x1, -1] +.LVL610: +.L481: +.LBE1528: + .loc 1 651 0 + str w0, [x20, x6, lsl 2] + b .L482 +.LVL611: + .p2align 3 +.L540: +.LBB1529: + .loc 1 648 0 discriminator 7 and w0, w0, -251658241 -.LVL615: +.LVL612: and w3, w2, 251658240 orr w0, w3, w0 -.LVL616: +.LVL613: mov w10, 0 mov w13, 1 - b .L475 + b .L477 .p2align 3 -.L537: -.LBE1467: -.LBB1468: - .loc 1 648 0 discriminator 7 +.L539: +.LBE1529: +.LBB1530: + .loc 1 647 0 discriminator 7 and w0, w0, -15728641 -.LVL617: +.LVL614: and w3, w2, 15728640 orr w0, w3, w0 -.LVL618: +.LVL615: mov w10, 0 mov w13, 1 - b .L472 + b .L474 .p2align 3 -.L535: -.LBE1468: -.LBB1469: - .loc 1 644 0 discriminator 7 +.L537: +.LBE1530: +.LBB1531: + .loc 1 643 0 discriminator 7 and w0, w0, -61441 -.LVL619: +.LVL616: and w3, w2, 61440 orr w0, w3, w0 -.LVL620: +.LVL617: mov w10, 0 mov w13, 1 - b .L466 + b .L468 .p2align 3 -.L536: -.LBE1469: -.LBB1470: - .loc 1 647 0 discriminator 7 +.L538: +.LBE1531: +.LBB1532: + .loc 1 646 0 discriminator 7 and w0, w0, -983041 -.LVL621: +.LVL618: and w3, w2, 983040 orr w0, w3, w0 -.LVL622: +.LVL619: mov w10, 0 mov w13, 1 - b .L469 + b .L471 .p2align 3 -.L534: -.LBE1470: -.LBB1471: - .loc 1 643 0 discriminator 7 +.L536: +.LBE1532: +.LBB1533: + .loc 1 642 0 discriminator 7 and w0, w0, -3841 -.LVL623: +.LVL620: and w3, w2, 3840 orr w0, w3, w0 -.LVL624: +.LVL621: mov w10, 0 mov w13, 1 - b .L463 + b .L465 .p2align 3 -.L532: -.LBE1471: -.LBB1472: - .loc 1 641 0 discriminator 7 +.L534: +.LBE1533: +.LBB1534: + .loc 1 640 0 discriminator 7 bfi w0, w14, 0, 4 mov w3, 0 mov w13, 1 - b .L457 + b .L459 .p2align 3 -.L533: -.LBE1472: -.LBB1473: - .loc 1 642 0 discriminator 7 +.L535: +.LBE1534: +.LBB1535: + .loc 1 641 0 discriminator 7 and w3, w2, 240 and w0, w0, -241 -.LVL625: +.LVL622: orr w0, w3, w0 -.LVL626: +.LVL623: mov w13, 1 mov w3, 0 - b .L460 -.LVL627: + b .L462 +.LVL624: .p2align 3 -.L486: -.LBE1473: - .loc 1 637 0 +.L488: +.LBE1535: + .loc 1 636 0 mov w8, 0 - .loc 1 635 0 + .loc 1 634 0 mov w13, 0 - b .L455 -.LVL628: -.L450: -.LBE1474: -.LBE1475: - .loc 1 626 0 - sub w2, w27, w24 + b .L457 +.LVL625: +.L452: +.LBE1536: +.LBE1537: .loc 1 625 0 + sub w2, w27, w24 + .loc 1 624 0 mul w23, w24, w12 str w12, [x29, 108] - .loc 1 626 0 + .loc 1 625 0 mov w1, 0 mul w2, w2, w12 - .loc 1 625 0 + .loc 1 624 0 add x23, x5, x23, sxtw -.LVL629: - .loc 1 626 0 +.LVL626: + .loc 1 625 0 mov x0, x23 sxtw x2, w2 bl memset -.LVL630: +.LVL627: ldr w12, [x29, 108] - .loc 1 629 0 + .loc 1 628 0 cmp w24, w27 - blt .L540 -.LVL631: -.L485: + blt .L542 +.LVL628: +.L487: mov w3, 0 -.LVL632: - .loc 1 663 0 +.LVL629: + .loc 1 662 0 str w3, [x28] - .loc 1 664 0 + .loc 1 663 0 ldp x19, x20, [sp, 16] -.LVL633: +.LVL630: ldp x21, x22, [sp, 32] -.LVL634: +.LVL631: ldp x23, x24, [sp, 48] -.LVL635: +.LVL632: ldp x25, x26, [sp, 64] -.LVL636: +.LVL633: ldp x27, x28, [sp, 80] -.LVL637: +.LVL634: ldp x29, x30, [sp], 112 .cfi_remember_state .cfi_restore 20 @@ -5252,39 +5377,39 @@ .cfi_restore 30 .cfi_def_cfa 31, 0 ret -.LVL638: -.L530: +.LVL635: +.L532: .cfi_restore_state - .loc 1 607 0 - add w27, w0, w0, lsr 31 .loc 1 606 0 + add w27, w0, w0, lsr 31 + .loc 1 605 0 mov w24, 0 -.LVL639: - .loc 1 607 0 +.LVL636: + .loc 1 606 0 asr w27, w27, 1 -.LVL640: - b .L449 -.L531: - .loc 1 609 0 +.LVL637: + b .L451 +.L533: + .loc 1 608 0 add w24, w0, w0, lsr 31 -.LVL641: - .loc 1 614 0 +.LVL638: + .loc 1 613 0 add x28, x19, 64 - .loc 1 609 0 + .loc 1 608 0 asr w24, w24, 1 -.LVL642: - .loc 1 610 0 +.LVL639: + .loc 1 609 0 mul w1, w22, w24 sbfiz x1, x1, 2, 32 add x21, x21, x1 - .loc 1 611 0 + .loc 1 610 0 add x20, x2, x1 - .loc 1 612 0 + .loc 1 611 0 mul w1, w24, w12 add x25, x3, x1 - .loc 1 613 0 + .loc 1 612 0 add x26, x4, x1 - b .L449 + b .L451 .cfi_endproc .LFE2820: .size get_overlay_image, .-get_overlay_image @@ -5293,56 +5418,56 @@ .type frame_done_callback, %function frame_done_callback: .LFB2838: - .loc 1 2067 0 + .loc 1 2068 0 .cfi_startproc stp x29, x30, [sp, -48]! .cfi_def_cfa_offset 48 .cfi_offset 29, -48 .cfi_offset 30, -40 - .loc 1 2068 0 + .loc 1 2069 0 adrp x0, .LANCHOR0 - .loc 1 2067 0 + .loc 1 2068 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x19, x20, [sp, 16] .cfi_offset 19, -32 .cfi_offset 20, -24 - .loc 1 2068 0 + .loc 1 2069 0 ldr x20, [x0, #:lo12:.LANCHOR0] - .loc 1 2067 0 + .loc 1 2068 0 str x21, [sp, 32] .cfi_offset 21, -16 - .loc 1 2070 0 + .loc 1 2071 0 add x19, x20, 192 - ldr w1, [x19, 264] + ldr w1, [x19, 252] cmp w1, 3 - beq .L543 + beq .L545 cmp w1, 4 - beq .L560 + beq .L562 add x2, x0, :lo12:.LANCHOR0 - .loc 1 2103 0 + .loc 1 2104 0 ldr w0, [x19, 72] - cbnz w0, .L561 - .loc 1 2108 0 - ldr x0, [x19, 104] - adrp x1, .LC20 - .loc 1 2107 0 - str wzr, [x19, 52] - .loc 1 2108 0 - add x1, x1, :lo12:.LC20 - bl _dev_info -.LVL643: -.L559: + cbnz w0, .L563 .loc 1 2109 0 + ldr x0, [x19, 104] + adrp x1, .LC19 + .loc 1 2108 0 + str wzr, [x19, 52] + .loc 1 2109 0 + add x1, x1, :lo12:.LC19 + bl _dev_info +.LVL640: +.L561: + .loc 1 2110 0 adrp x0, .LANCHOR1 add x0, x0, :lo12:.LANCHOR1 mov w2, 1 add x0, x0, 304 mov w1, w2 bl __wake_up_sync -.LVL644: -.L541: - .loc 1 2113 0 +.LVL641: +.L543: + .loc 1 2114 0 ldp x19, x20, [sp, 16] ldr x21, [sp, 32] ldp x29, x30, [sp], 48 @@ -5355,69 +5480,69 @@ .cfi_def_cfa 31, 0 ret .p2align 3 -.L560: +.L562: .cfi_restore_state - .loc 1 2073 0 + .loc 1 2074 0 ldr w1, [x19, 60] - .loc 1 2072 0 + .loc 1 2073 0 mov w21, 1 str w21, [x19, 76] - .loc 1 2073 0 - cbnz w1, .L548 - .loc 1 2073 0 is_stmt 0 discriminator 1 + .loc 1 2074 0 + cbnz w1, .L550 + .loc 1 2074 0 is_stmt 0 discriminator 1 ldr w1, [x19, 64] - cbnz w1, .L548 - .loc 1 2075 0 is_stmt 1 + cbnz w1, .L550 + .loc 1 2076 0 is_stmt 1 ldr w1, [x19, 68] - cbz w1, .L548 - .loc 1 2079 0 + cbz w1, .L550 + .loc 1 2080 0 ldr x0, [x19, 104] - adrp x1, .LC18 - add x1, x1, :lo12:.LC18 + adrp x1, .LC17 + add x1, x1, :lo12:.LC17 bl _dev_info -.LVL645: - .loc 1 2081 0 +.LVL642: + .loc 1 2082 0 ldp w3, w2, [x19, 92] mov w1, 0 - ldr x0, [x19, 176] + ldr x0, [x19, 168] mul w2, w2, w3 sxtw x2, w2 bl memset -.LVL646: - .loc 1 2082 0 +.LVL643: + .loc 1 2083 0 adrp x2, jiffies - add x0, x20, 736 + add x0, x20, 720 mov x1, 402653184 ldr x2, [x2, #:lo12:jiffies] add x1, x2, x1 bl mod_timer -.LVL647: - .loc 1 2083 0 - str wzr, [x19, 52] +.LVL644: .loc 1 2084 0 + str wzr, [x19, 52] + .loc 1 2085 0 adrp x0, .LANCHOR1 add x0, x0, :lo12:.LANCHOR1 mov w2, w21 mov w1, w21 add x0, x0, 304 bl __wake_up_sync -.LVL648: - b .L541 +.LVL645: + b .L543 .p2align 3 -.L543: - .loc 1 2088 0 +.L545: + .loc 1 2089 0 ldr w1, [x19, 60] - cbnz w1, .L548 - .loc 1 2088 0 is_stmt 0 discriminator 1 + cbnz w1, .L550 + .loc 1 2089 0 is_stmt 0 discriminator 1 ldr w1, [x19, 64] - cbz w1, .L549 -.L548: - .loc 1 2089 0 is_stmt 1 + cbz w1, .L551 +.L550: + .loc 1 2090 0 is_stmt 1 add x0, x0, :lo12:.LANCHOR0 ldr x0, [x0, 8] bl wake_up_process -.LVL649: - .loc 1 2113 0 +.LVL646: + .loc 1 2114 0 ldr x21, [sp, 32] ldp x19, x20, [sp, 16] ldp x29, x30, [sp], 48 @@ -5430,47 +5555,47 @@ .cfi_def_cfa 31, 0 ret .p2align 3 -.L549: +.L551: .cfi_restore_state - .loc 1 2090 0 + .loc 1 2091 0 ldr w1, [x19, 68] - cbz w1, .L548 - .loc 1 2094 0 + cbz w1, .L550 + .loc 1 2095 0 ldr x0, [x19, 104] - adrp x1, .LC19 - add x1, x1, :lo12:.LC19 + adrp x1, .LC18 + add x1, x1, :lo12:.LC18 bl _dev_info -.LVL650: - .loc 1 2096 0 +.LVL647: + .loc 1 2097 0 ldp w3, w2, [x19, 92] mov w1, 0 - ldr x0, [x19, 176] + ldr x0, [x19, 168] mul w2, w2, w3 sxtw x2, w2 bl memset -.LVL651: - .loc 1 2097 0 +.LVL648: + .loc 1 2098 0 adrp x2, jiffies mov x1, 402653184 - add x0, x20, 736 + add x0, x20, 720 ldr x2, [x2, #:lo12:jiffies] add x1, x2, x1 bl mod_timer -.LVL652: - .loc 1 2098 0 +.LVL649: + .loc 1 2099 0 str wzr, [x19, 52] - b .L559 + b .L561 .p2align 3 -.L561: - .loc 1 2105 0 +.L563: + .loc 1 2106 0 ldr x0, [x2, 8] - .loc 1 2104 0 + .loc 1 2105 0 mov w1, 1 str w1, [x19, 52] - .loc 1 2105 0 + .loc 1 2106 0 bl wake_up_process -.LVL653: - .loc 1 2113 0 +.LVL650: + .loc 1 2114 0 ldr x21, [sp, 32] ldp x19, x20, [sp, 16] ldp x29, x30, [sp], 48 @@ -5489,19 +5614,19 @@ .type ebc_frame_timeout, %function ebc_frame_timeout: .LFB2847: - .loc 1 2845 0 + .loc 1 2848 0 .cfi_startproc -.LVL654: +.LVL651: stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 2846 0 + .loc 1 2849 0 bl frame_done_callback -.LVL655: - .loc 1 2848 0 +.LVL652: + .loc 1 2851 0 ldp x29, x30, [sp], 16 .cfi_restore 30 .cfi_restore 29 @@ -5515,16 +5640,16 @@ .type ebc_lut_update, %function ebc_lut_update: .LFB2840: - .loc 1 2159 0 + .loc 1 2160 0 .cfi_startproc -.LVL656: +.LVL653: stp x29, x30, [sp, -64]! .cfi_def_cfa_offset 64 .cfi_offset 29, -64 .cfi_offset 30, -56 - .loc 1 2161 0 + .loc 1 2162 0 mov w4, 25 - .loc 1 2159 0 + .loc 1 2160 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x19, x20, [sp, 16] @@ -5534,91 +5659,92 @@ stp x21, x22, [sp, 32] .cfi_offset 21, -32 .cfi_offset 22, -24 - .loc 1 2161 0 + .loc 1 2162 0 add x0, x29, 64 -.LVL657: - .loc 1 2159 0 +.LVL654: + .loc 1 2160 0 adrp x19, __stack_chk_guard add x3, x19, :lo12:__stack_chk_guard - .loc 1 2166 0 + .loc 1 2167 0 ldr x2, [x20, 16] - .loc 1 2159 0 + .loc 1 2160 0 mov w22, w1 - .loc 1 2161 0 + .loc 1 2162 0 str w4, [x0, -12]! -.LVL658: - .loc 1 2159 0 +.LVL655: + .loc 1 2160 0 ldr x1, [x3] str x1, [x29, 56] mov x1,0 -.LVL659: -.LBB1476: -.LBB1477: +.LVL656: +.LBB1538: +.LBB1539: .loc 3 50 0 mov x1, x0 mov x0, x2 ldr x2, [x2, 56] blr x2 -.LVL660: -.LBE1477: -.LBE1476: - .loc 1 2167 0 - cbnz w0, .L565 -.LVL661: +.LVL657: +.LBE1539: +.LBE1538: .loc 1 2168 0 - ldr w2, [x29, 52] + cbnz w0, .L567 +.LVL658: .loc 1 2169 0 + ldr w2, [x29, 52] + .loc 1 2170 0 add x21, x20, 192 - .loc 1 2168 0 - tbnz w2, #31, .L588 - .loc 1 2172 0 + .loc 1 2169 0 + tbnz w2, #31, .L590 + .loc 1 2173 0 cmp w2, 50 - bgt .L589 -.L567: - .loc 1 2180 0 + bgt .L591 +.L569: + .loc 1 2181 0 + ldr x0, [x21, 104] + adrp x1, .LC23 + add x1, x1, :lo12:.LC23 + bl _dev_info +.LVL659: + .loc 1 2184 0 + cmp w22, 23 + bls .L592 +.L570: + .loc 1 2240 0 + mov w0, 12 + .loc 1 2241 0 + mov w1, 3 + .loc 1 2240 0 + str w0, [x21, 144] + .p2align 2 +.L573: + .loc 1 2244 0 + ldr w2, [x29, 52] + add x0, x20, 304 + mov w3, 16 + bl epd_lut_get +.LVL660: + mov w20, w0 +.LVL661: + .loc 1 2245 0 + cbz w0, .L566 + .loc 1 2246 0 ldr x0, [x21, 104] adrp x1, .LC24 add x1, x1, :lo12:.LC24 - bl _dev_info -.LVL662: - .loc 1 2183 0 - cmp w22, 23 - bls .L590 -.L568: - .loc 1 2239 0 - mov w0, 12 - .loc 1 2240 0 - mov w1, 3 - .loc 1 2239 0 - str w0, [x21, 144] - .p2align 2 -.L571: - .loc 1 2243 0 - ldr w2, [x29, 52] - add x0, x20, 304 - bl epd_lut_get -.LVL663: - mov w20, w0 -.LVL664: - .loc 1 2244 0 - cbz w0, .L564 - .loc 1 2245 0 - ldr x0, [x21, 104] - adrp x1, .LC25 - add x1, x1, :lo12:.LC25 bl _dev_err -.LVL665: -.L564: - .loc 1 2250 0 +.LVL662: +.L566: + .loc 1 2251 0 add x19, x19, :lo12:__stack_chk_guard mov w0, w20 ldr x2, [x29, 56] ldr x1, [x19] eor x1, x2, x1 - cbnz x1, .L591 + cbnz x1, .L593 ldp x19, x20, [sp, 16] ldp x21, x22, [sp, 32] -.LVL666: +.LVL663: ldp x29, x30, [sp], 64 .cfi_remember_state .cfi_restore 30 @@ -5629,164 +5755,164 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL667: +.LVL664: .p2align 3 -.L590: +.L592: .cfi_restore_state - .loc 1 2183 0 - adrp x0, .L570 - add x0, x0, :lo12:.L570 + .loc 1 2184 0 + adrp x0, .L572 + add x0, x0, :lo12:.L572 ldrb w0, [x0,w22,uxtw] - adr x1, .Lrtx570 + adr x1, .Lrtx572 add x0, x1, w0, sxtb #2 br x0 -.Lrtx570: +.Lrtx572: .section .rodata .align 0 .align 2 -.L570: - .byte (.L568 - .Lrtx570) / 4 - .byte (.L582 - .Lrtx570) / 4 - .byte (.L568 - .Lrtx570) / 4 - .byte (.L572 - .Lrtx570) / 4 - .byte (.L573 - .Lrtx570) / 4 - .byte (.L574 - .Lrtx570) / 4 - .byte (.L575 - .Lrtx570) / 4 - .byte (.L568 - .Lrtx570) / 4 - .byte (.L572 - .Lrtx570) / 4 - .byte (.L573 - .Lrtx570) / 4 - .byte (.L574 - .Lrtx570) / 4 - .byte (.L575 - .Lrtx570) / 4 - .byte (.L576 - .Lrtx570) / 4 - .byte (.L576 - .Lrtx570) / 4 - .byte (.L577 - .Lrtx570) / 4 - .byte (.L578 - .Lrtx570) / 4 - .byte (.L577 - .Lrtx570) / 4 - .byte (.L579 - .Lrtx570) / 4 - .byte (.L568 - .Lrtx570) / 4 - .byte (.L568 - .Lrtx570) / 4 - .byte (.L568 - .Lrtx570) / 4 - .byte (.L568 - .Lrtx570) / 4 - .byte (.L577 - .Lrtx570) / 4 - .byte (.L578 - .Lrtx570) / 4 +.L572: + .byte (.L570 - .Lrtx572) / 4 + .byte (.L584 - .Lrtx572) / 4 + .byte (.L570 - .Lrtx572) / 4 + .byte (.L574 - .Lrtx572) / 4 + .byte (.L575 - .Lrtx572) / 4 + .byte (.L576 - .Lrtx572) / 4 + .byte (.L577 - .Lrtx572) / 4 + .byte (.L570 - .Lrtx572) / 4 + .byte (.L574 - .Lrtx572) / 4 + .byte (.L575 - .Lrtx572) / 4 + .byte (.L576 - .Lrtx572) / 4 + .byte (.L577 - .Lrtx572) / 4 + .byte (.L578 - .Lrtx572) / 4 + .byte (.L578 - .Lrtx572) / 4 + .byte (.L579 - .Lrtx572) / 4 + .byte (.L580 - .Lrtx572) / 4 + .byte (.L579 - .Lrtx572) / 4 + .byte (.L581 - .Lrtx572) / 4 + .byte (.L570 - .Lrtx572) / 4 + .byte (.L570 - .Lrtx572) / 4 + .byte (.L570 - .Lrtx572) / 4 + .byte (.L570 - .Lrtx572) / 4 + .byte (.L579 - .Lrtx572) / 4 + .byte (.L580 - .Lrtx572) / 4 .text -.LVL668: +.LVL665: .p2align 3 -.L565: - .loc 1 2178 0 +.L567: + .loc 1 2179 0 add x21, x20, 192 mov w2, w0 - adrp x1, .LC23 - add x1, x1, :lo12:.LC23 - ldr x0, [x21, 104] - bl _dev_err -.LVL669: - ldr w2, [x29, 52] - b .L567 - .p2align 3 -.L589: - .loc 1 2173 0 - ldr x0, [x21, 104] adrp x1, .LC22 add x1, x1, :lo12:.LC22 - bl _dev_info -.LVL670: + ldr x0, [x21, 104] + bl _dev_err +.LVL666: + ldr w2, [x29, 52] + b .L569 + .p2align 3 +.L591: .loc 1 2174 0 - mov w2, 50 - str w2, [x29, 52] -.LVL671: - b .L567 - .p2align 3 -.L582: - .loc 1 2183 0 - mov w1, 10 - b .L571 - .p2align 3 -.L579: - .loc 1 2187 0 - mov w1, 0 - .loc 1 2186 0 - str wzr, [x21, 144] - .loc 1 2187 0 - b .L571 - .p2align 3 -.L572: - .loc 1 2220 0 - mov w0, 12 - .loc 1 2221 0 - mov w1, 4 - .loc 1 2220 0 - str w0, [x21, 144] - .loc 1 2221 0 - b .L571 - .p2align 3 -.L573: - .loc 1 2225 0 - mov w0, 12 - .loc 1 2226 0 - mov w1, 5 - .loc 1 2225 0 - str w0, [x21, 144] - .loc 1 2226 0 - b .L571 - .p2align 3 -.L574: - .loc 1 2230 0 - mov w0, 12 - .loc 1 2231 0 - mov w1, 6 - .loc 1 2230 0 - str w0, [x21, 144] - .loc 1 2231 0 - b .L571 - .p2align 3 -.L575: - .loc 1 2235 0 - mov w0, 12 - .loc 1 2236 0 - mov w1, 8 - .loc 1 2235 0 - str w0, [x21, 144] - .loc 1 2236 0 - b .L571 - .p2align 3 -.L576: - .loc 1 2204 0 - mov w1, 7 - str w1, [x21, 144] - .loc 1 2205 0 - b .L571 - .p2align 3 -.L577: - .loc 1 2210 0 - mov w1, 1 - str w1, [x21, 144] - .loc 1 2211 0 - b .L571 - .p2align 3 -.L578: - .loc 1 2215 0 - mov w1, 2 - str w1, [x21, 144] - .loc 1 2216 0 - b .L571 - .p2align 3 -.L588: - .loc 1 2169 0 ldr x0, [x21, 104] adrp x1, .LC21 add x1, x1, :lo12:.LC21 bl _dev_info -.LVL672: +.LVL667: + .loc 1 2175 0 + mov w2, 50 + str w2, [x29, 52] +.LVL668: + b .L569 + .p2align 3 +.L584: + .loc 1 2184 0 + mov w1, 10 + b .L573 + .p2align 3 +.L581: + .loc 1 2188 0 + mov w1, 0 + .loc 1 2187 0 + str wzr, [x21, 144] + .loc 1 2188 0 + b .L573 + .p2align 3 +.L574: + .loc 1 2221 0 + mov w0, 12 + .loc 1 2222 0 + mov w1, 4 + .loc 1 2221 0 + str w0, [x21, 144] + .loc 1 2222 0 + b .L573 + .p2align 3 +.L575: + .loc 1 2226 0 + mov w0, 12 + .loc 1 2227 0 + mov w1, 5 + .loc 1 2226 0 + str w0, [x21, 144] + .loc 1 2227 0 + b .L573 + .p2align 3 +.L576: + .loc 1 2231 0 + mov w0, 12 + .loc 1 2232 0 + mov w1, 6 + .loc 1 2231 0 + str w0, [x21, 144] + .loc 1 2232 0 + b .L573 + .p2align 3 +.L577: + .loc 1 2236 0 + mov w0, 12 + .loc 1 2237 0 + mov w1, 8 + .loc 1 2236 0 + str w0, [x21, 144] + .loc 1 2237 0 + b .L573 + .p2align 3 +.L578: + .loc 1 2205 0 + mov w1, 7 + str w1, [x21, 144] + .loc 1 2206 0 + b .L573 + .p2align 3 +.L579: + .loc 1 2211 0 + mov w1, 1 + str w1, [x21, 144] + .loc 1 2212 0 + b .L573 + .p2align 3 +.L580: + .loc 1 2216 0 + mov w1, 2 + str w1, [x21, 144] + .loc 1 2217 0 + b .L573 + .p2align 3 +.L590: .loc 1 2170 0 + ldr x0, [x21, 104] + adrp x1, .LC20 + add x1, x1, :lo12:.LC20 + bl _dev_info +.LVL669: + .loc 1 2171 0 str wzr, [x29, 52] mov w2, 0 - b .L567 -.LVL673: -.L591: - .loc 1 2250 0 + b .L569 +.LVL670: +.L593: + .loc 1 2251 0 bl __stack_chk_fail -.LVL674: +.LVL671: .cfi_endproc .LFE2840: .size ebc_lut_update, .-ebc_lut_update @@ -5795,32 +5921,32 @@ .type ebc_state_read, %function ebc_state_read: .LFB2860: - .loc 1 3266 0 + .loc 1 3274 0 .cfi_startproc -.LVL675: +.LVL672: stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 3267 0 + .loc 1 3275 0 adrp x3, .LANCHOR0 - .loc 1 3266 0 + .loc 1 3274 0 mov x0, x2 -.LVL676: - .loc 1 3267 0 - adrp x1, .LC26 -.LVL677: - .loc 1 3266 0 +.LVL673: + .loc 1 3275 0 + adrp x1, .LC25 +.LVL674: + .loc 1 3274 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3267 0 + .loc 1 3275 0 ldr x2, [x3, #:lo12:.LANCHOR0] -.LVL678: - add x1, x1, :lo12:.LC26 - ldr w2, [x2, 672] +.LVL675: + add x1, x1, :lo12:.LC25 + ldr w2, [x2, 656] bl sprintf -.LVL679: - .loc 1 3268 0 +.LVL676: + .loc 1 3276 0 sxtw x0, w0 ldp x29, x30, [sp], 16 .cfi_restore 30 @@ -5835,31 +5961,31 @@ .type ebc_version_read, %function ebc_version_read: .LFB2859: - .loc 1 3257 0 + .loc 1 3265 0 .cfi_startproc -.LVL680: +.LVL677: stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 mov x0, x2 -.LVL681: - .loc 1 3258 0 - adrp x1, .LC28 -.LVL682: - adrp x2, .LC27 -.LVL683: - .loc 1 3257 0 +.LVL678: + .loc 1 3266 0 + adrp x1, .LC27 +.LVL679: + adrp x2, .LC26 +.LVL680: + .loc 1 3265 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3258 0 - add x2, x2, :lo12:.LC27 - .loc 1 3257 0 - .loc 1 3258 0 - add x1, x1, :lo12:.LC28 + .loc 1 3266 0 + add x2, x2, :lo12:.LC26 + .loc 1 3265 0 + .loc 1 3266 0 + add x1, x1, :lo12:.LC27 bl sprintf -.LVL684: - .loc 1 3259 0 +.LVL681: + .loc 1 3267 0 sxtw x0, w0 ldp x29, x30, [sp], 16 .cfi_restore 30 @@ -5874,49 +6000,49 @@ .type pmic_vcom_read, %function pmic_vcom_read: .LFB2857: - .loc 1 3221 0 + .loc 1 3229 0 .cfi_startproc -.LVL685: +.LVL682: stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 .cfi_offset 30, -24 - .loc 1 3222 0 + .loc 1 3230 0 adrp x0, .LANCHOR0 -.LVL686: - .loc 1 3221 0 +.LVL683: + .loc 1 3229 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3225 0 + .loc 1 3233 0 ldr x0, [x0, #:lo12:.LANCHOR0] - .loc 1 3221 0 + .loc 1 3229 0 str x19, [sp, 16] .cfi_offset 19, -16 - .loc 1 3221 0 + .loc 1 3229 0 mov x19, x2 - .loc 1 3225 0 + .loc 1 3233 0 ldr x1, [x0, 16] -.LVL687: -.LBB1478: -.LBB1479: +.LVL684: +.LBB1540: +.LBB1541: .loc 3 55 0 mov x0, x1 ldr x1, [x1, 64] blr x1 -.LVL688: -.LBE1479: -.LBE1478: - .loc 1 3227 0 +.LVL685: +.LBE1541: +.LBE1540: + .loc 1 3235 0 mov w2, w0 - adrp x1, .LC26 + adrp x1, .LC25 mov x0, x19 - add x1, x1, :lo12:.LC26 + add x1, x1, :lo12:.LC25 bl sprintf -.LVL689: - .loc 1 3228 0 +.LVL686: + .loc 1 3236 0 sxtw x0, w0 ldr x19, [sp, 16] -.LVL690: +.LVL687: ldp x29, x30, [sp], 32 .cfi_restore 30 .cfi_restore 29 @@ -5931,65 +6057,65 @@ .type pmic_temp_read, %function pmic_temp_read: .LFB2856: - .loc 1 3207 0 + .loc 1 3215 0 .cfi_startproc -.LVL691: +.LVL688: stp x29, x30, [sp, -48]! .cfi_def_cfa_offset 48 .cfi_offset 29, -48 .cfi_offset 30, -40 - .loc 1 3208 0 + .loc 1 3216 0 adrp x0, .LANCHOR0 -.LVL692: - .loc 1 3207 0 +.LVL689: + .loc 1 3215 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3211 0 + .loc 1 3219 0 ldr x0, [x0, #:lo12:.LANCHOR0] -.LBB1480: -.LBB1481: +.LBB1542: +.LBB1543: .loc 3 50 0 add x1, x29, 36 -.LVL693: -.LBE1481: -.LBE1480: - .loc 1 3207 0 +.LVL690: +.LBE1543: +.LBE1542: + .loc 1 3215 0 stp x19, x20, [sp, 16] .cfi_offset 19, -32 .cfi_offset 20, -24 - .loc 1 3207 0 + .loc 1 3215 0 adrp x19, __stack_chk_guard add x19, x19, :lo12:__stack_chk_guard mov x20, x2 ldr x2, [x19] str x2, [x29, 40] mov x2,0 -.LVL694: - .loc 1 3211 0 +.LVL691: + .loc 1 3219 0 ldr x2, [x0, 16] -.LBB1483: -.LBB1482: +.LBB1545: +.LBB1544: .loc 3 50 0 mov x0, x2 ldr x2, [x2, 56] blr x2 -.LVL695: -.LBE1482: -.LBE1483: - .loc 1 3213 0 +.LVL692: +.LBE1544: +.LBE1545: + .loc 1 3221 0 ldr w2, [x29, 36] - adrp x1, .LC26 + adrp x1, .LC25 mov x0, x20 - add x1, x1, :lo12:.LC26 + add x1, x1, :lo12:.LC25 bl sprintf -.LVL696: - .loc 1 3214 0 +.LVL693: + .loc 1 3222 0 ldr x2, [x29, 40] ldr x1, [x19] eor x1, x2, x1 - cbnz x1, .L601 + cbnz x1, .L603 ldp x19, x20, [sp, 16] -.LVL697: +.LVL694: sxtw x0, w0 ldp x29, x30, [sp], 48 .cfi_remember_state @@ -5999,11 +6125,11 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL698: -.L601: +.LVL695: +.L603: .cfi_restore_state bl __stack_chk_fail -.LVL699: +.LVL696: .cfi_endproc .LFE2856: .size pmic_temp_read, .-pmic_temp_read @@ -6012,33 +6138,33 @@ .type pmic_name_read, %function pmic_name_read: .LFB2855: - .loc 1 3196 0 + .loc 1 3204 0 .cfi_startproc -.LVL700: +.LVL697: stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 3197 0 + .loc 1 3205 0 adrp x3, .LANCHOR0 - .loc 1 3196 0 + .loc 1 3204 0 mov x0, x2 -.LVL701: - .loc 1 3199 0 - adrp x1, .LC28 -.LVL702: - .loc 1 3196 0 +.LVL698: + .loc 1 3207 0 + adrp x1, .LC27 +.LVL699: + .loc 1 3204 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3199 0 + .loc 1 3207 0 ldr x2, [x3, #:lo12:.LANCHOR0] -.LVL703: - add x1, x1, :lo12:.LC28 +.LVL700: + add x1, x1, :lo12:.LC27 ldr x2, [x2, 16] add x2, x2, 8 bl sprintf -.LVL704: - .loc 1 3200 0 +.LVL701: + .loc 1 3208 0 sxtw x0, w0 ldp x29, x30, [sp], 16 .cfi_restore 30 @@ -6053,23 +6179,23 @@ .type ebc_buf_state_read, %function ebc_buf_state_read: .LFB2861: - .loc 1 3275 0 + .loc 1 3283 0 .cfi_startproc -.LVL705: +.LVL702: stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 3276 0 + .loc 1 3284 0 mov x0, x2 -.LVL706: - .loc 1 3275 0 +.LVL703: + .loc 1 3283 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3276 0 + .loc 1 3284 0 bl ebc_buf_state_show -.LVL707: - .loc 1 3277 0 +.LVL704: + .loc 1 3285 0 sxtw x0, w0 ldp x29, x30, [sp], 16 .cfi_restore 30 @@ -6084,17 +6210,17 @@ .type pmic_vcom_write, %function pmic_vcom_write: .LFB2858: - .loc 1 3233 0 + .loc 1 3241 0 .cfi_startproc -.LVL708: +.LVL705: stp x29, x30, [sp, -64]! .cfi_def_cfa_offset 64 .cfi_offset 29, -64 .cfi_offset 30, -56 - .loc 1 3234 0 + .loc 1 3242 0 adrp x0, .LANCHOR0 -.LVL709: - .loc 1 3233 0 +.LVL706: + .loc 1 3241 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x19, x20, [sp, 16] @@ -6104,47 +6230,47 @@ stp x21, x22, [sp, 32] .cfi_offset 21, -32 .cfi_offset 22, -24 - .loc 1 3233 0 + .loc 1 3241 0 add x1, x19, :lo12:__stack_chk_guard -.LVL710: +.LVL707: mov x21, x2 - .loc 1 3234 0 + .loc 1 3242 0 ldr x22, [x0, #:lo12:.LANCHOR0] -.LVL711: - .loc 1 3233 0 +.LVL708: + .loc 1 3241 0 ldr x2, [x1] str x2, [x29, 56] mov x2,0 -.LVL712: +.LVL709: mov x20, x3 - .loc 1 3237 0 + .loc 1 3245 0 add x2, x29, 52 mov w1, 0 mov x0, x21 bl kstrtouint -.LVL713: - .loc 1 3238 0 - cbnz w0, .L613 -.LVL714: - .loc 1 3242 0 +.LVL710: + .loc 1 3246 0 + cbnz w0, .L615 +.LVL711: + .loc 1 3250 0 ldr w1, [x29, 52] ldr x0, [x22, 16] bl ebc_pmic_set_vcom -.LVL715: - .loc 1 3243 0 - cbnz w0, .L614 -.L606: - .loc 1 3249 0 +.LVL712: + .loc 1 3251 0 + cbnz w0, .L616 +.L608: + .loc 1 3257 0 add x19, x19, :lo12:__stack_chk_guard mov x0, x20 -.LVL716: +.LVL713: ldr x2, [x29, 56] ldr x1, [x19] eor x1, x2, x1 - cbnz x1, .L615 + cbnz x1, .L617 ldp x19, x20, [sp, 16] ldp x21, x22, [sp, 32] -.LVL717: +.LVL714: ldp x29, x30, [sp], 64 .cfi_remember_state .cfi_restore 30 @@ -6155,42 +6281,42 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret +.LVL715: + .p2align 3 +.L615: + .cfi_restore_state + .loc 1 3247 0 + ldr x0, [x22] + adrp x1, .LC28 + mov x2, x21 + add x1, x1, :lo12:.LC28 + .loc 1 3248 0 + mov x20, -1 +.LVL716: + .loc 1 3247 0 + bl _dev_err +.LVL717: + .loc 1 3248 0 + b .L608 .LVL718: .p2align 3 -.L613: - .cfi_restore_state - .loc 1 3239 0 +.L616: + .loc 1 3252 0 ldr x0, [x22] adrp x1, .LC29 - mov x2, x21 - add x1, x1, :lo12:.LC29 - .loc 1 3240 0 + .loc 1 3253 0 mov x20, -1 .LVL719: - .loc 1 3239 0 + .loc 1 3252 0 + add x1, x1, :lo12:.LC29 bl _dev_err .LVL720: - .loc 1 3240 0 - b .L606 -.LVL721: - .p2align 3 -.L614: - .loc 1 3244 0 - ldr x0, [x22] - adrp x1, .LC30 - .loc 1 3245 0 - mov x20, -1 -.LVL722: - .loc 1 3244 0 - add x1, x1, :lo12:.LC30 - bl _dev_err -.LVL723: - .loc 1 3245 0 - b .L606 -.L615: - .loc 1 3249 0 + .loc 1 3253 0 + b .L608 +.L617: + .loc 1 3257 0 bl __stack_chk_fail -.LVL724: +.LVL721: .cfi_endproc .LFE2858: .size pmic_vcom_write, .-pmic_vcom_write @@ -6199,9 +6325,9 @@ .type waveform_version_read, %function waveform_version_read: .LFB2854: - .loc 1 3185 0 + .loc 1 3193 0 .cfi_startproc -.LVL725: +.LVL722: stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 @@ -6210,22 +6336,22 @@ .cfi_def_cfa_register 29 str x19, [sp, 16] .cfi_offset 19, -16 - .loc 1 3185 0 + .loc 1 3193 0 mov x19, x2 - .loc 1 3186 0 + .loc 1 3194 0 bl epd_lut_get_wf_version -.LVL726: - .loc 1 3188 0 +.LVL723: + .loc 1 3196 0 mov x2, x0 - adrp x1, .LC28 + adrp x1, .LC27 mov x0, x19 - add x1, x1, :lo12:.LC28 + add x1, x1, :lo12:.LC27 bl sprintf -.LVL727: - .loc 1 3189 0 +.LVL724: + .loc 1 3197 0 sxtw x0, w0 ldr x19, [sp, 16] -.LVL728: +.LVL725: ldp x29, x30, [sp], 32 .cfi_restore 30 .cfi_restore 29 @@ -6240,23 +6366,23 @@ .type ebc_init, %function ebc_init: .LFB2873: - .loc 1 3774 0 + .loc 1 3786 0 .cfi_startproc stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 3775 0 + .loc 1 3787 0 mov x1, 0 adrp x0, .LANCHOR1 add x0, x0, :lo12:.LANCHOR1 - .loc 1 3774 0 + .loc 1 3786 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3775 0 + .loc 1 3787 0 bl __platform_driver_register -.LVL729: - .loc 1 3776 0 +.LVL726: + .loc 1 3788 0 ldp x29, x30, [sp], 16 .cfi_restore 30 .cfi_restore 29 @@ -6271,31 +6397,31 @@ .type get_overlay_image_area2.isra.0, %function get_overlay_image_area2.isra.0: .LFB2875: - .loc 1 997 0 + .loc 1 996 0 .cfi_startproc -.LVL730: +.LVL727: stp x29, x30, [sp, -128]! .cfi_def_cfa_offset 128 .cfi_offset 29, -128 .cfi_offset 30, -120 - .loc 1 999 0 + .loc 1 998 0 adrp x5, .LANCHOR0 - .loc 1 997 0 + .loc 1 996 0 mov x10, x0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 999 0 + .loc 1 998 0 ldr x5, [x5, #:lo12:.LANCHOR0] - .loc 1 997 0 + .loc 1 996 0 stp x19, x20, [sp, 16] - .loc 1 1027 0 + .loc 1 1026 0 add x5, x5, 24 - .loc 1 997 0 + .loc 1 996 0 stp x5, x0, [x29, 96] - .loc 1 1015 0 - ldr x0, [x4, 248] -.LVL731: - .loc 1 997 0 + .loc 1 1014 0 + ldr x0, [x4, 240] +.LVL728: + .loc 1 996 0 stp x21, x22, [sp, 32] stp x23, x24, [sp, 48] stp x25, x26, [sp, 64] @@ -6310,362 +6436,362 @@ .cfi_offset 26, -56 .cfi_offset 27, -48 .cfi_offset 28, -40 - .loc 1 1020 0 + .loc 1 1019 0 ldr w17, [x4, 96] - .loc 1 1017 0 - ldp w7, w21, [x0, 48] - .loc 1 1027 0 - ldr w13, [x5, 84] .loc 1 1016 0 - ldr w5, [x0, 56] + ldp w7, w21, [x0, 48] + .loc 1 1026 0 + ldr w13, [x5, 84] .loc 1 1015 0 + ldr w5, [x0, 56] + .loc 1 1014 0 cmp w7, 0 add w6, w7, 7 csel w6, w6, w7, lt - .loc 1 1016 0 + .loc 1 1015 0 add w30, w5, 7 cmp w5, 0 - .loc 1 1015 0 + .loc 1 1014 0 asr w7, w6, 3 -.LVL732: - .loc 1 1016 0 +.LVL729: + .loc 1 1015 0 csel w30, w30, w5, lt - .loc 1 1018 0 + .loc 1 1017 0 ldr w5, [x0, 60] - .loc 1 1020 0 + .loc 1 1019 0 cmp w17, 0 add w0, w17, 7 csel w0, w0, w17, lt - .loc 1 1016 0 + .loc 1 1015 0 asr w30, w30, 3 -.LVL733: - .loc 1 1018 0 +.LVL730: + .loc 1 1017 0 mov w9, w5 - .loc 1 1016 0 + .loc 1 1015 0 add w30, w30, 1 -.LVL734: - .loc 1 1020 0 +.LVL731: + .loc 1 1019 0 asr w5, w0, 3 -.LVL735: - .loc 1 1021 0 - ldr w0, [x4, 92] - .loc 1 1023 0 - cmp w30, w5 -.LVL736: - .loc 1 1027 0 - mul w13, w21, w13 +.LVL732: .loc 1 1020 0 + ldr w0, [x4, 92] + .loc 1 1022 0 + cmp w30, w5 +.LVL733: + .loc 1 1026 0 + mul w13, w21, w13 + .loc 1 1019 0 mov w6, w5 str w5, [x29, 116] - .loc 1 1023 0 + .loc 1 1022 0 sub w5, w5, #1 -.LVL737: - .loc 1 1015 0 +.LVL734: + .loc 1 1014 0 str w7, [x29, 124] - .loc 1 1023 0 + .loc 1 1022 0 csel w30, w5, w30, ge -.LVL738: - .loc 1 1025 0 +.LVL735: + .loc 1 1024 0 cmp w9, w0 sub w0, w0, #1 -.LVL739: - .loc 1 1027 0 +.LVL736: + .loc 1 1026 0 lsr w13, w13, 2 - .loc 1 1025 0 + .loc 1 1024 0 csel w0, w0, w9, ge -.LVL740: +.LVL737: str w0, [x29, 120] - .loc 1 1027 0 + .loc 1 1026 0 add x13, x10, x13 -.LVL741: - .loc 1 1028 0 +.LVL738: + .loc 1 1027 0 cmp w21, w0 - bgt .L620 + bgt .L622 mul w18, w21, w6 - .loc 1 1042 0 + .loc 1 1041 0 mov w19, 1 -.LBB1486: -.LBB1487: - .loc 1 991 0 +.LBB1548: +.LBB1549: + .loc 1 990 0 mov w16, w19 lsl w0, w7, 3 -.LVL742: +.LVL739: str w0, [x29, 112] -.LVL743: +.LVL740: .p2align 2 -.L624: -.LBE1487: -.LBE1486: - .loc 1 1029 0 +.L626: +.LBE1549: +.LBE1548: + .loc 1 1028 0 and w0, w21, 1 -.LVL744: - tbnz x21, 0, .L625 - .loc 1 1030 0 +.LVL741: + tbnz x21, 0, .L627 + .loc 1 1029 0 ldr x5, [x29, 96] ldr w13, [x5, 84] -.LVL745: +.LVL742: ldr x5, [x29, 104] -.LVL746: +.LVL743: mul w13, w21, w13 lsr w13, w13, 2 add x13, x5, x13 -.LVL747: -.L625: - .loc 1 1033 0 +.LVL744: +.L627: + .loc 1 1032 0 mul w17, w21, w17 - .loc 1 1036 0 + .loc 1 1035 0 ldr w5, [x29, 124] cmp w5, w30 - .loc 1 1033 0 + .loc 1 1032 0 sxtw x17, w17 - .loc 1 1036 0 - bgt .L638 + .loc 1 1035 0 + bgt .L640 cmp w0, 0 -.LBB1491: -.LBB1488: - .loc 1 990 0 +.LBB1553: +.LBB1550: + .loc 1 989 0 ldr w11, [x29, 112] mov w0, 2 ldr w9, [x29, 124] -.LVL748: +.LVL745: csel w20, w0, wzr, ne - .loc 1 930 0 + .loc 1 929 0 add w28, w20, 4 - .loc 1 940 0 + .loc 1 939 0 add w27, w20, 8 - .loc 1 950 0 + .loc 1 949 0 add w26, w20, 12 - .loc 1 960 0 + .loc 1 959 0 add w25, w20, 16 - .loc 1 970 0 + .loc 1 969 0 add w24, w20, 20 - .loc 1 980 0 + .loc 1 979 0 add w23, w20, 24 - .loc 1 990 0 + .loc 1 989 0 add w22, w20, 28 -.LVL749: +.LVL746: .p2align 2 -.L637: -.LBE1488: -.LBE1491: - .loc 1 1037 0 +.L639: +.LBE1550: +.LBE1553: + .loc 1 1036 0 sxtw x8, w9 -.LVL750: +.LVL747: lsl x0, x8, 2 add x0, x0, x18, sxtw 2 ldr w7, [x1, x0] -.LVL751: - .loc 1 1038 0 +.LVL748: + .loc 1 1037 0 ldr w6, [x2, x0] -.LVL752: - .loc 1 1041 0 +.LVL749: + .loc 1 1040 0 cmp w7, w6 - beq .L628 - .loc 1 1039 0 + beq .L630 + .loc 1 1038 0 add x12, x17, x11, sxtw - .loc 1 1042 0 + .loc 1 1041 0 str w19, [x4, 60] -.LBB1492: -.LBB1489: - .loc 1 914 0 - eor w5, w7, w6 -.LVL753: -.LBE1489: -.LBE1492: - .loc 1 1039 0 - add x0, x3, x12 -.LVL754: -.LBB1493: -.LBB1490: - .loc 1 916 0 - and w14, w5, 15 +.LBB1554: +.LBB1551: .loc 1 913 0 + eor w5, w7, w6 +.LVL750: +.LBE1551: +.LBE1554: + .loc 1 1038 0 + add x0, x3, x12 +.LVL751: +.LBB1555: +.LBB1552: + .loc 1 915 0 + and w14, w5, 15 + .loc 1 912 0 mov w10, 0 -.LVL755: - .loc 1 916 0 +.LVL752: + .loc 1 915 0 ldrb w15, [x3, x12] cmp w15, 0 ccmp w14, 0, 4, eq - beq .L629 - .loc 1 919 0 + beq .L631 + .loc 1 918 0 ldr x14, [x4, 128] ubfiz w10, w6, 5, 4 -.LVL756: +.LVL753: and w15, w7, 15 orr w10, w10, w15 ldrb w10, [x14, w10, uxtw] - .loc 1 921 0 - strb w19, [x3, x12] .loc 1 920 0 + strb w19, [x3, x12] + .loc 1 919 0 lsl w10, w10, w20 -.LVL757: -.L629: - .loc 1 926 0 +.LVL754: +.L631: + .loc 1 925 0 ldrb w12, [x0, 1] cmp w12, 0 and w12, w5, 240 ccmp w12, 0, 4, eq - beq .L630 - .loc 1 929 0 + beq .L632 + .loc 1 928 0 lsr w12, w6, 4 ldr x14, [x4, 128] ubfiz w12, w12, 5, 4 ubfx x15, x7, 4, 4 orr w12, w12, w15 ldrb w12, [x14, w12, uxtw] - .loc 1 931 0 - strb w16, [x0, 1] .loc 1 930 0 + strb w16, [x0, 1] + .loc 1 929 0 lsl w12, w12, w28 orr w10, w10, w12 -.L630: - .loc 1 936 0 +.L632: + .loc 1 935 0 ldrb w12, [x0, 2] cmp w12, 0 and w12, w5, 3840 ccmp w12, 0, 4, eq - beq .L631 - .loc 1 939 0 + beq .L633 + .loc 1 938 0 lsr w12, w6, 8 ldr x14, [x4, 128] ubfiz w12, w12, 5, 4 ubfx x15, x7, 8, 4 orr w12, w12, w15 ldrb w12, [x14, w12, uxtw] - .loc 1 941 0 - strb w16, [x0, 2] .loc 1 940 0 + strb w16, [x0, 2] + .loc 1 939 0 lsl w12, w12, w27 orr w10, w10, w12 -.L631: - .loc 1 946 0 +.L633: + .loc 1 945 0 ldrb w12, [x0, 3] tst w5, 61440 ccmp w12, 0, 0, ne - bne .L632 - .loc 1 949 0 + bne .L634 + .loc 1 948 0 lsr w12, w6, 12 ldr x14, [x4, 128] ubfiz w12, w12, 5, 4 ubfx x15, x7, 12, 4 orr w12, w12, w15 ldrb w12, [x14, w12, uxtw] - .loc 1 951 0 - strb w16, [x0, 3] .loc 1 950 0 + strb w16, [x0, 3] + .loc 1 949 0 lsl w12, w12, w26 orr w10, w10, w12 -.L632: - .loc 1 956 0 +.L634: + .loc 1 955 0 ldrb w12, [x0, 4] cmp w12, 0 and w12, w5, 983040 ccmp w12, 0, 4, eq - beq .L633 - .loc 1 959 0 + beq .L635 + .loc 1 958 0 lsr w12, w6, 16 ldr x14, [x4, 128] ubfiz w12, w12, 5, 4 ubfx x15, x7, 16, 4 orr w12, w12, w15 ldrb w12, [x14, w12, uxtw] - .loc 1 961 0 - strb w16, [x0, 4] .loc 1 960 0 + strb w16, [x0, 4] + .loc 1 959 0 lsl w12, w12, w25 orr w10, w10, w12 -.L633: - .loc 1 966 0 +.L635: + .loc 1 965 0 ldrb w12, [x0, 5] cmp w12, 0 and w12, w5, 15728640 ccmp w12, 0, 4, eq - beq .L634 - .loc 1 969 0 + beq .L636 + .loc 1 968 0 lsr w12, w6, 20 ldr x14, [x4, 128] ubfiz w12, w12, 5, 4 ubfx x15, x7, 20, 4 orr w12, w12, w15 ldrb w12, [x14, w12, uxtw] - .loc 1 971 0 - strb w16, [x0, 5] .loc 1 970 0 + strb w16, [x0, 5] + .loc 1 969 0 lsl w12, w12, w24 orr w10, w10, w12 -.L634: - .loc 1 976 0 +.L636: + .loc 1 975 0 ldrb w12, [x0, 6] tst w5, 251658240 ccmp w12, 0, 0, ne - bne .L635 - .loc 1 979 0 + bne .L637 + .loc 1 978 0 lsr w12, w6, 24 ldr x14, [x4, 128] ubfiz w12, w12, 5, 4 ubfx x15, x7, 24, 4 orr w12, w12, w15 ldrb w12, [x14, w12, uxtw] - .loc 1 981 0 - strb w16, [x0, 6] .loc 1 980 0 + strb w16, [x0, 6] + .loc 1 979 0 lsl w12, w12, w23 orr w10, w10, w12 -.L635: - .loc 1 986 0 +.L637: + .loc 1 985 0 tst w5, -268435456 ldrb w5, [x0, 7] -.LVL758: +.LVL755: ccmp w5, 0, 0, ne - bne .L636 - .loc 1 989 0 + bne .L638 + .loc 1 988 0 ldr x5, [x4, 128] lsr w6, w6, 28 -.LVL759: +.LVL756: lsr w7, w7, 28 -.LVL760: +.LVL757: add w6, w7, w6, lsl 5 ldrb w5, [x5, w6, uxtw] - .loc 1 991 0 - strb w16, [x0, 7] .loc 1 990 0 + strb w16, [x0, 7] + .loc 1 989 0 lsl w0, w5, w22 -.LVL761: +.LVL758: orr w10, w10, w0 -.LVL762: -.L636: -.LBE1490: -.LBE1493: - .loc 1 1043 0 +.LVL759: +.L638: +.LBE1552: +.LBE1555: + .loc 1 1042 0 ldr w0, [x13, x8, lsl 2] -.LVL763: +.LVL760: orr w10, w0, w10 -.LVL764: +.LVL761: str w10, [x13, x8, lsl 2] -.LVL765: -.L628: - .loc 1 1036 0 +.LVL762: +.L630: + .loc 1 1035 0 add w9, w9, 1 add w11, w11, 8 cmp w9, w30 - ble .L637 -.LVL766: -.L638: + ble .L639 +.LVL763: +.L640: ldr w0, [x29, 116] - .loc 1 1028 0 + .loc 1 1027 0 add w21, w21, 1 add w18, w18, w0 ldr w0, [x29, 120] -.LVL767: +.LVL764: cmp w21, w0 - bgt .L620 + bgt .L622 ldr w17, [x4, 96] - b .L624 -.L620: - .loc 1 1047 0 + b .L626 +.L622: + .loc 1 1046 0 ldp x19, x20, [sp, 16] ldp x21, x22, [sp, 32] -.LVL768: +.LVL765: ldp x23, x24, [sp, 48] ldp x25, x26, [sp, 64] ldp x27, x28, [sp, 80] @@ -6683,7 +6809,7 @@ .cfi_restore 19 .cfi_restore 20 .cfi_def_cfa 31, 0 -.LVL769: +.LVL766: ret .cfi_endproc .LFE2875: @@ -6693,371 +6819,371 @@ .type get_one_auto_image2.isra.1, %function get_one_auto_image2.isra.1: .LFB2876: - .loc 1 1219 0 + .loc 1 1218 0 .cfi_startproc -.LVL770: - .loc 1 1227 0 +.LVL767: + .loc 1 1226 0 ldr w6, [x1] - .loc 1 1219 0 + .loc 1 1218 0 and w3, w3, 255 -.LVL771: - .loc 1 1231 0 +.LVL768: + .loc 1 1230 0 eor w8, w6, w0 -.LVL772: - .loc 1 1232 0 +.LVL769: + .loc 1 1231 0 ands w7, w8, 15 - beq .L665 - .loc 1 1233 0 + beq .L667 + .loc 1 1232 0 ldrb w9, [x2] - .loc 1 1235 0 + .loc 1 1234 0 and w11, w0, 15 ldr x10, [x4] ubfiz w7, w6, 5, 4 orr w7, w7, w11 add x7, x10, x7 - .loc 1 1234 0 + .loc 1 1233 0 lsl w10, w9, 10 - .loc 1 1237 0 + .loc 1 1236 0 add w9, w9, 1 and w9, w9, 255 - .loc 1 1235 0 + .loc 1 1234 0 ldrb w7, [x7, w10, sxtw] - .loc 1 1238 0 + .loc 1 1237 0 cmp w9, w3 - .loc 1 1236 0 + .loc 1 1235 0 lsl w7, w7, w5 - .loc 1 1238 0 - beq .L705 -.L666: - .loc 1 1242 0 + .loc 1 1237 0 + beq .L707 +.L668: + .loc 1 1241 0 strb w9, [x2] -.L665: - .loc 1 1245 0 +.L667: + .loc 1 1244 0 tst w8, 240 - beq .L667 - .loc 1 1248 0 + beq .L669 + .loc 1 1247 0 lsr w10, w6, 4 - .loc 1 1246 0 + .loc 1 1245 0 ldrb w9, [x2, 1] - .loc 1 1248 0 + .loc 1 1247 0 ubfx x11, x0, 4, 4 ubfiz w10, w10, 5, 4 orr w10, w10, w11 ldr x11, [x4] add x10, x11, x10 - .loc 1 1247 0 + .loc 1 1246 0 lsl w11, w9, 10 - .loc 1 1250 0 + .loc 1 1249 0 add w9, w9, 1 and w9, w9, 255 - .loc 1 1248 0 + .loc 1 1247 0 ldrb w10, [x10, w11, sxtw] - .loc 1 1249 0 + .loc 1 1248 0 add w11, w5, 4 - .loc 1 1251 0 + .loc 1 1250 0 cmp w9, w3 - .loc 1 1249 0 + .loc 1 1248 0 lsl w10, w10, w11 orr w7, w7, w10 - .loc 1 1251 0 - beq .L706 -.L668: - .loc 1 1255 0 + .loc 1 1250 0 + beq .L708 +.L670: + .loc 1 1254 0 strb w9, [x2, 1] -.L667: - .loc 1 1258 0 +.L669: + .loc 1 1257 0 tst w8, 3840 - beq .L669 - .loc 1 1261 0 + beq .L671 + .loc 1 1260 0 lsr w10, w6, 8 - .loc 1 1259 0 + .loc 1 1258 0 ldrb w9, [x2, 2] - .loc 1 1261 0 + .loc 1 1260 0 ubfx x11, x0, 8, 4 ubfiz w10, w10, 5, 4 orr w10, w10, w11 ldr x11, [x4] add x10, x11, x10 - .loc 1 1260 0 + .loc 1 1259 0 lsl w11, w9, 10 - .loc 1 1263 0 + .loc 1 1262 0 add w9, w9, 1 and w9, w9, 255 - .loc 1 1261 0 + .loc 1 1260 0 ldrb w10, [x10, w11, sxtw] - .loc 1 1262 0 + .loc 1 1261 0 add w11, w5, 8 - .loc 1 1264 0 + .loc 1 1263 0 cmp w9, w3 - .loc 1 1262 0 + .loc 1 1261 0 lsl w10, w10, w11 orr w7, w7, w10 - .loc 1 1264 0 - beq .L707 -.L670: - .loc 1 1268 0 + .loc 1 1263 0 + beq .L709 +.L672: + .loc 1 1267 0 strb w9, [x2, 2] -.L669: - .loc 1 1271 0 +.L671: + .loc 1 1270 0 tst w8, 61440 - beq .L671 - .loc 1 1274 0 + beq .L673 + .loc 1 1273 0 lsr w10, w6, 12 - .loc 1 1272 0 + .loc 1 1271 0 ldrb w9, [x2, 3] - .loc 1 1274 0 + .loc 1 1273 0 ubfx x11, x0, 12, 4 ubfiz w10, w10, 5, 4 orr w10, w10, w11 ldr x11, [x4] add x10, x11, x10 - .loc 1 1273 0 + .loc 1 1272 0 lsl w11, w9, 10 - .loc 1 1276 0 + .loc 1 1275 0 add w9, w9, 1 and w9, w9, 255 - .loc 1 1274 0 + .loc 1 1273 0 ldrb w10, [x10, w11, sxtw] - .loc 1 1275 0 + .loc 1 1274 0 add w11, w5, 12 - .loc 1 1277 0 + .loc 1 1276 0 cmp w9, w3 - .loc 1 1275 0 + .loc 1 1274 0 lsl w10, w10, w11 orr w7, w7, w10 - .loc 1 1277 0 - beq .L708 -.L672: - .loc 1 1281 0 + .loc 1 1276 0 + beq .L710 +.L674: + .loc 1 1280 0 strb w9, [x2, 3] -.L671: - .loc 1 1284 0 +.L673: + .loc 1 1283 0 tst w8, 983040 - beq .L673 - .loc 1 1287 0 + beq .L675 + .loc 1 1286 0 lsr w10, w6, 16 - .loc 1 1285 0 + .loc 1 1284 0 ldrb w9, [x2, 4] - .loc 1 1287 0 + .loc 1 1286 0 ubfx x11, x0, 16, 4 ubfiz w10, w10, 5, 4 orr w10, w10, w11 ldr x11, [x4] add x10, x11, x10 - .loc 1 1286 0 + .loc 1 1285 0 lsl w11, w9, 10 - .loc 1 1289 0 + .loc 1 1288 0 add w9, w9, 1 and w9, w9, 255 - .loc 1 1287 0 + .loc 1 1286 0 ldrb w10, [x10, w11, sxtw] - .loc 1 1288 0 + .loc 1 1287 0 add w11, w5, 16 - .loc 1 1290 0 + .loc 1 1289 0 cmp w9, w3 - .loc 1 1288 0 + .loc 1 1287 0 lsl w10, w10, w11 orr w7, w7, w10 - .loc 1 1290 0 - beq .L709 -.L674: - .loc 1 1294 0 + .loc 1 1289 0 + beq .L711 +.L676: + .loc 1 1293 0 strb w9, [x2, 4] -.L673: - .loc 1 1297 0 +.L675: + .loc 1 1296 0 tst w8, 15728640 - beq .L675 - .loc 1 1300 0 + beq .L677 + .loc 1 1299 0 lsr w10, w6, 20 - .loc 1 1298 0 + .loc 1 1297 0 ldrb w9, [x2, 5] - .loc 1 1300 0 + .loc 1 1299 0 ubfx x11, x0, 20, 4 ubfiz w10, w10, 5, 4 orr w10, w10, w11 ldr x11, [x4] add x10, x11, x10 - .loc 1 1299 0 + .loc 1 1298 0 lsl w11, w9, 10 - .loc 1 1302 0 + .loc 1 1301 0 add w9, w9, 1 and w9, w9, 255 - .loc 1 1300 0 + .loc 1 1299 0 ldrb w10, [x10, w11, sxtw] - .loc 1 1301 0 + .loc 1 1300 0 add w11, w5, 20 - .loc 1 1303 0 + .loc 1 1302 0 cmp w9, w3 - .loc 1 1301 0 + .loc 1 1300 0 lsl w10, w10, w11 orr w7, w7, w10 - .loc 1 1303 0 - beq .L710 -.L676: - .loc 1 1307 0 + .loc 1 1302 0 + beq .L712 +.L678: + .loc 1 1306 0 strb w9, [x2, 5] -.L675: - .loc 1 1310 0 +.L677: + .loc 1 1309 0 tst w8, 251658240 - beq .L677 - .loc 1 1313 0 + beq .L679 + .loc 1 1312 0 lsr w10, w6, 24 - .loc 1 1311 0 + .loc 1 1310 0 ldrb w9, [x2, 6] - .loc 1 1313 0 + .loc 1 1312 0 ubfx x11, x0, 24, 4 ubfiz w10, w10, 5, 4 orr w10, w10, w11 ldr x11, [x4] add x10, x11, x10 - .loc 1 1312 0 + .loc 1 1311 0 lsl w11, w9, 10 - .loc 1 1315 0 + .loc 1 1314 0 add w9, w9, 1 and w9, w9, 255 - .loc 1 1313 0 + .loc 1 1312 0 ldrb w10, [x10, w11, sxtw] - .loc 1 1314 0 + .loc 1 1313 0 add w11, w5, 24 - .loc 1 1316 0 + .loc 1 1315 0 cmp w9, w3 - .loc 1 1314 0 + .loc 1 1313 0 lsl w10, w10, w11 orr w7, w7, w10 - .loc 1 1316 0 - beq .L711 -.L678: - .loc 1 1320 0 + .loc 1 1315 0 + beq .L713 +.L680: + .loc 1 1319 0 strb w9, [x2, 6] -.L677: - .loc 1 1323 0 +.L679: + .loc 1 1322 0 tst w8, -268435456 - beq .L679 - .loc 1 1324 0 + beq .L681 + .loc 1 1323 0 ldrb w9, [x2, 7] - .loc 1 1326 0 + .loc 1 1325 0 lsr w8, w6, 28 -.LVL773: +.LVL770: ldr x10, [x4] lsr w11, w0, 28 add w4, w11, w8, lsl 5 - .loc 1 1328 0 + .loc 1 1327 0 add w8, w9, 1 - .loc 1 1326 0 - add x4, x10, x4 .loc 1 1325 0 + add x4, x10, x4 + .loc 1 1324 0 lsl w9, w9, 10 - .loc 1 1328 0 + .loc 1 1327 0 and w8, w8, 255 - .loc 1 1327 0 - add w5, w5, 28 -.LVL774: - .loc 1 1329 0 - cmp w8, w3 .loc 1 1326 0 + add w5, w5, 28 +.LVL771: + .loc 1 1328 0 + cmp w8, w3 + .loc 1 1325 0 ldrb w3, [x4, w9, sxtw] - .loc 1 1327 0 + .loc 1 1326 0 lsl w5, w3, w5 orr w7, w7, w5 - .loc 1 1329 0 - beq .L712 -.L680: - .loc 1 1333 0 + .loc 1 1328 0 + beq .L714 +.L682: + .loc 1 1332 0 strb w8, [x2, 7] -.LVL775: -.L679: - .loc 1 1338 0 +.LVL772: +.L681: + .loc 1 1337 0 mov w0, w7 - .loc 1 1335 0 + .loc 1 1334 0 str w6, [x1] - .loc 1 1338 0 + .loc 1 1337 0 ret -.LVL776: +.LVL773: .p2align 3 -.L712: - .loc 1 1331 0 +.L714: + .loc 1 1330 0 and w6, w6, 268435455 -.LVL777: +.LVL774: and w0, w0, -268435456 orr w6, w0, w6 -.LVL778: - .loc 1 1330 0 +.LVL775: + .loc 1 1329 0 mov w8, 0 - b .L680 -.LVL779: + b .L682 +.LVL776: .p2align 3 -.L705: - .loc 1 1240 0 - bfi w6, w11, 0, 4 +.L707: .loc 1 1239 0 - mov w9, 0 - b .L666 - .p2align 3 -.L706: - .loc 1 1253 0 - and w9, w0, 240 - and w6, w6, -241 -.LVL780: - orr w6, w9, w6 -.LVL781: - .loc 1 1252 0 + bfi w6, w11, 0, 4 + .loc 1 1238 0 mov w9, 0 b .L668 .p2align 3 -.L707: - .loc 1 1266 0 - and w9, w0, 3840 - and w6, w6, -3841 -.LVL782: +.L708: + .loc 1 1252 0 + and w9, w0, 240 + and w6, w6, -241 +.LVL777: orr w6, w9, w6 -.LVL783: - .loc 1 1265 0 +.LVL778: + .loc 1 1251 0 mov w9, 0 b .L670 .p2align 3 -.L708: - .loc 1 1279 0 - and w9, w0, 61440 - and w6, w6, -61441 -.LVL784: +.L709: + .loc 1 1265 0 + and w9, w0, 3840 + and w6, w6, -3841 +.LVL779: orr w6, w9, w6 -.LVL785: - .loc 1 1278 0 +.LVL780: + .loc 1 1264 0 mov w9, 0 b .L672 .p2align 3 -.L709: - .loc 1 1292 0 - and w9, w0, 983040 - and w6, w6, -983041 -.LVL786: +.L710: + .loc 1 1278 0 + and w9, w0, 61440 + and w6, w6, -61441 +.LVL781: orr w6, w9, w6 -.LVL787: - .loc 1 1291 0 +.LVL782: + .loc 1 1277 0 mov w9, 0 b .L674 .p2align 3 -.L710: - .loc 1 1305 0 - and w9, w0, 15728640 - and w6, w6, -15728641 -.LVL788: +.L711: + .loc 1 1291 0 + and w9, w0, 983040 + and w6, w6, -983041 +.LVL783: orr w6, w9, w6 -.LVL789: - .loc 1 1304 0 +.LVL784: + .loc 1 1290 0 mov w9, 0 b .L676 .p2align 3 -.L711: - .loc 1 1318 0 - and w9, w0, 251658240 - and w6, w6, -251658241 -.LVL790: +.L712: + .loc 1 1304 0 + and w9, w0, 15728640 + and w6, w6, -15728641 +.LVL785: orr w6, w9, w6 -.LVL791: - .loc 1 1317 0 +.LVL786: + .loc 1 1303 0 mov w9, 0 b .L678 + .p2align 3 +.L713: + .loc 1 1317 0 + and w9, w0, 251658240 + and w6, w6, -251658241 +.LVL787: + orr w6, w9, w6 +.LVL788: + .loc 1 1316 0 + mov w9, 0 + b .L680 .cfi_endproc .LFE2876: .size get_one_auto_image2.isra.1, .-get_one_auto_image2.isra.1 @@ -7066,33 +7192,33 @@ .type get_auto_image2, %function get_auto_image2: .LFB2827: - .loc 1 1341 0 + .loc 1 1340 0 .cfi_startproc -.LVL792: +.LVL789: stp x29, x30, [sp, -112]! .cfi_def_cfa_offset 112 .cfi_offset 29, -112 .cfi_offset 30, -104 - .loc 1 1342 0 - adrp x6, .LANCHOR0 - .loc 1 1355 0 - cmp w5, 2 .loc 1 1341 0 + adrp x6, .LANCHOR0 + .loc 1 1354 0 + cmp w5, 2 + .loc 1 1340 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x21, x22, [sp, 32] .cfi_offset 21, -80 .cfi_offset 22, -72 - .loc 1 1342 0 - ldr x21, [x6, #:lo12:.LANCHOR0] .loc 1 1341 0 + ldr x21, [x6, #:lo12:.LANCHOR0] + .loc 1 1340 0 stp x25, x26, [sp, 64] .cfi_offset 25, -48 .cfi_offset 26, -40 mov x25, x1 - .loc 1 1352 0 + .loc 1 1351 0 add x21, x21, 24 - .loc 1 1341 0 + .loc 1 1340 0 stp x19, x20, [sp, 16] stp x23, x24, [sp, 48] .cfi_offset 19, -96 @@ -7103,178 +7229,178 @@ stp x27, x28, [sp, 80] .cfi_offset 27, -32 .cfi_offset 28, -24 - .loc 1 1341 0 + .loc 1 1340 0 mov x26, x2 str x0, [x29, 104] - .loc 1 1350 0 + .loc 1 1349 0 add x0, x4, 60 -.LVL793: - .loc 1 1353 0 - ldp w1, w22, [x21, 84] -.LVL794: - .loc 1 1350 0 - str x0, [x29, 96] - .loc 1 1341 0 - mov x27, x3 +.LVL790: .loc 1 1352 0 + ldp w1, w22, [x21, 84] +.LVL791: + .loc 1 1349 0 + str x0, [x29, 96] + .loc 1 1340 0 + mov x27, x3 + .loc 1 1351 0 lsr w23, w1, 3 - .loc 1 1355 0 - beq .L732 - .loc 1 1358 0 + .loc 1 1354 0 + beq .L734 + .loc 1 1357 0 cmp w5, 3 mov x0, 0 -.LVL795: - .loc 1 1365 0 +.LVL792: + .loc 1 1364 0 mov w20, 0 -.LVL796: - .loc 1 1358 0 - beq .L733 -.LVL797: -.L715: - .loc 1 1368 0 +.LVL793: + .loc 1 1357 0 + beq .L735 +.LVL794: +.L717: + .loc 1 1367 0 ldr x2, [x29, 104] -.LVL798: +.LVL795: add x0, x2, x0 sub w2, w22, w20 -.LVL799: +.LVL796: mul w2, w2, w1 mov w1, 0 lsr w2, w2, 2 bl memset -.LVL800: - .loc 1 1369 0 +.LVL797: + .loc 1 1368 0 cmp w20, w22 - bge .L724 + bge .L726 sub w15, w23, #1 - .loc 1 1376 0 + .loc 1 1375 0 add x14, x19, 128 add x15, x15, 1 - .loc 1 1369 0 + .loc 1 1368 0 mov w8, 0 -.LVL801: +.LVL798: lsl x28, x15, 2 lsl x15, x15, 3 -.LVL802: +.LVL799: .p2align 2 -.L722: - .loc 1 1370 0 +.L724: + .loc 1 1369 0 ldr w6, [x21, 84] ldr x0, [x29, 104] mul w6, w20, w6 lsr w6, w6, 2 add x24, x0, x6 - .loc 1 1371 0 - cbz w23, .L717 + .loc 1 1370 0 + cbz w23, .L719 mov x18, x27 -.LVL803: +.LVL800: mov x13, x26 -.LVL804: +.LVL801: mov x12, 0 .p2align 2 -.L719: - .loc 1 1372 0 +.L721: + .loc 1 1371 0 ldr w3, [x25, x12] - .loc 1 1376 0 + .loc 1 1375 0 mov x2, x18 - .loc 1 1374 0 + .loc 1 1373 0 ldr w9, [x13] - .loc 1 1376 0 + .loc 1 1375 0 mov x1, x13 mov w5, 0 mov x4, x14 mov w0, w3 -.LVL805: - .loc 1 1374 0 +.LVL802: + .loc 1 1373 0 cmp w3, w9 - beq .L718 - .loc 1 1376 0 + beq .L720 + .loc 1 1375 0 ldrb w3, [x19, 56] bl get_one_auto_image2.isra.1 -.LVL806: +.LVL803: str w0, [x24, x12] - .loc 1 1375 0 + .loc 1 1374 0 mov w8, 1 -.LVL807: -.L718: +.LVL804: +.L720: add x12, x12, 4 - .loc 1 1378 0 discriminator 2 + .loc 1 1377 0 discriminator 2 add x13, x13, 4 - .loc 1 1380 0 discriminator 2 + .loc 1 1379 0 discriminator 2 add x18, x18, 8 - .loc 1 1371 0 discriminator 2 + .loc 1 1370 0 discriminator 2 cmp x12, x28 - bne .L719 -.LVL808: + bne .L721 +.LVL805: add x26, x26, x28 -.LVL809: +.LVL806: add x27, x27, x15 add x25, x25, x28 - .loc 1 1371 0 is_stmt 0 + .loc 1 1370 0 is_stmt 0 mov x18, x27 mov x13, x26 mov x12, 0 .p2align 2 -.L721: - .loc 1 1383 0 is_stmt 1 +.L723: + .loc 1 1382 0 is_stmt 1 ldr w3, [x25, x12] - .loc 1 1387 0 + .loc 1 1386 0 mov x2, x18 - .loc 1 1385 0 + .loc 1 1384 0 ldr w9, [x13] - .loc 1 1387 0 + .loc 1 1386 0 mov x1, x13 mov w5, 2 mov x4, x14 - .loc 1 1391 0 + .loc 1 1390 0 add x18, x18, 8 - .loc 1 1387 0 + .loc 1 1386 0 mov w0, w3 - .loc 1 1389 0 + .loc 1 1388 0 add x13, x13, 4 - .loc 1 1385 0 + .loc 1 1384 0 cmp w3, w9 - beq .L720 - .loc 1 1387 0 + beq .L722 + .loc 1 1386 0 ldrb w3, [x19, 56] bl get_one_auto_image2.isra.1 -.LVL810: +.LVL807: ldr w1, [x24, x12] - .loc 1 1386 0 + .loc 1 1385 0 mov w8, 1 -.LVL811: - .loc 1 1387 0 +.LVL808: + .loc 1 1386 0 orr w0, w1, w0 str w0, [x24, x12] -.L720: +.L722: add x12, x12, 4 - .loc 1 1382 0 discriminator 2 + .loc 1 1381 0 discriminator 2 cmp x12, x28 - bne .L721 + bne .L723 add x26, x26, x28 add x25, x25, x28 add x27, x27, x15 -.LVL812: -.L717: - .loc 1 1369 0 +.LVL809: +.L719: + .loc 1 1368 0 add w20, w20, 2 cmp w22, w20 - bgt .L722 -.L716: - .loc 1 1394 0 + bgt .L724 +.L718: + .loc 1 1393 0 ldr x0, [x29, 96] -.LVL813: +.LVL810: str w8, [x0] - .loc 1 1395 0 + .loc 1 1394 0 ldp x19, x20, [sp, 16] -.LVL814: +.LVL811: ldp x21, x22, [sp, 32] -.LVL815: +.LVL812: ldp x23, x24, [sp, 48] -.LVL816: +.LVL813: ldp x25, x26, [sp, 64] -.LVL817: +.LVL814: ldp x27, x28, [sp, 80] -.LVL818: +.LVL815: ldp x29, x30, [sp], 112 .cfi_remember_state .cfi_restore 30 @@ -7291,51 +7417,51 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL819: -.L732: +.LVL816: +.L734: .cfi_restore_state - .loc 1 1357 0 - add w22, w22, w22, lsr 31 -.LVL820: - mov x0, 0 -.LVL821: - asr w22, w22, 1 -.LVL822: .loc 1 1356 0 + add w22, w22, w22, lsr 31 +.LVL817: + mov x0, 0 +.LVL818: + asr w22, w22, 1 +.LVL819: + .loc 1 1355 0 mov w20, 0 -.LVL823: - b .L715 -.LVL824: -.L733: - .loc 1 1359 0 +.LVL820: + b .L717 +.LVL821: +.L735: + .loc 1 1358 0 add w20, w22, w22, lsr 31 -.LVL825: - .loc 1 1363 0 +.LVL822: + .loc 1 1362 0 add x0, x4, 64 -.LVL826: - .loc 1 1359 0 +.LVL823: + .loc 1 1358 0 asr w20, w20, 1 -.LVL827: - .loc 1 1363 0 +.LVL824: + .loc 1 1362 0 str x0, [x29, 96] - .loc 1 1360 0 + .loc 1 1359 0 mul w0, w23, w20 -.LVL828: +.LVL825: sbfiz x0, x0, 2, 32 add x25, x25, x0 - .loc 1 1361 0 + .loc 1 1360 0 add x26, x2, x0 - .loc 1 1362 0 + .loc 1 1361 0 mul w0, w20, w1 add x27, x3, x0, uxtw lsr w0, w0, 2 - b .L715 -.LVL829: -.L724: - .loc 1 1349 0 + b .L717 +.LVL826: +.L726: + .loc 1 1348 0 mov w8, 0 -.LVL830: - b .L716 +.LVL827: + b .L718 .cfi_endproc .LFE2827: .size get_auto_image2, .-get_auto_image2 @@ -7344,73 +7470,73 @@ .type direct_mode_data_change.isra.2, %function direct_mode_data_change.isra.2: .LFB2877: - .loc 1 1397 0 + .loc 1 1396 0 .cfi_startproc -.LVL831: - .loc 1 1399 0 +.LVL828: + .loc 1 1398 0 adrp x7, .LANCHOR0 - .loc 1 1397 0 + .loc 1 1396 0 and w3, w3, 255 - .loc 1 1404 0 + .loc 1 1403 0 sub w4, w3, w4 -.LVL832: - .loc 1 1411 0 +.LVL829: + .loc 1 1410 0 cmp w6, 2 - .loc 1 1399 0 + .loc 1 1398 0 ldr x3, [x7, #:lo12:.LANCHOR0] - .loc 1 1405 0 + .loc 1 1404 0 lsl w7, w4, 10 add x5, x5, x7, sxtw -.LVL833: - .loc 1 1408 0 +.LVL830: + .loc 1 1407 0 add x4, x3, 24 -.LVL834: - .loc 1 1409 0 - ldp w7, w3, [x4, 84] +.LVL831: .loc 1 1408 0 + ldp w7, w3, [x4, 84] + .loc 1 1407 0 lsr w11, w7, 3 - .loc 1 1411 0 - beq .L754 - .loc 1 1414 0 + .loc 1 1410 0 + beq .L756 + .loc 1 1413 0 cmp w6, 3 mov w14, w3 -.LVL835: +.LVL832: mov w6, 0 -.LVL836: - .loc 1 1419 0 +.LVL833: + .loc 1 1418 0 mov w12, 0 -.LVL837: - .loc 1 1414 0 - beq .L755 -.L736: - .loc 1 1422 0 +.LVL834: + .loc 1 1413 0 + beq .L757 +.L738: + .loc 1 1421 0 ldr w4, [x4, 156] - cbz w4, .L737 - .loc 1 1423 0 + cbz w4, .L739 + .loc 1 1422 0 sub w3, w3, #1 - .loc 1 1424 0 - neg w15, w7, lsr 2 -.LVL838: .loc 1 1423 0 + neg w15, w7, lsr 2 +.LVL835: + .loc 1 1422 0 sub w3, w3, w6 mul w3, w3, w7 lsr w3, w3, 2 add x10, x0, x3 -.LVL839: -.L740: - .loc 1 1430 0 +.LVL836: +.L742: + .loc 1 1429 0 cmp w12, w14 - bge .L748 + bge .L750 sub w13, w11, #1 sxtw x15, w15 -.LVL840: +.LVL837: add x13, x13, 1 lsl x13, x13, 2 -.L749: - .loc 1 1431 0 +.L751: + .loc 1 1430 0 mov x6, 0 - cbz w11, .L756 - .loc 1 1397 0 + cbz w11, .L758 + .loc 1 1396 0 stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 @@ -7421,133 +7547,133 @@ .cfi_offset 19, -16 .cfi_offset 20, -8 .p2align 2 -.L745: - .loc 1 1433 0 - ldr w0, [x2, x6, lsl 2] +.L747: .loc 1 1432 0 + ldr w0, [x2, x6, lsl 2] + .loc 1 1431 0 ldr w3, [x1, x6, lsl 2] -.LVL841: -.LBB1494: -.LBB1495: - .loc 1 270 0 +.LVL838: +.LBB1556: +.LBB1557: + .loc 1 269 0 lsr w16, w0, 11 - .loc 1 268 0 + .loc 1 267 0 lsr w4, w0, 3 -.LVL842: - .loc 1 270 0 +.LVL839: + .loc 1 269 0 ubfx x17, x3, 16, 4 - .loc 1 268 0 + .loc 1 267 0 ubfx x7, x3, 8, 4 - .loc 1 269 0 + .loc 1 268 0 lsr w30, w0, 7 - .loc 1 267 0 + .loc 1 266 0 lsl w9, w0, 1 - .loc 1 272 0 + .loc 1 271 0 lsr w8, w0, 19 - .loc 1 270 0 + .loc 1 269 0 and w16, w16, 480 - .loc 1 268 0 + .loc 1 267 0 and w4, w4, 480 - .loc 1 270 0 + .loc 1 269 0 orr w16, w16, w17 - .loc 1 268 0 + .loc 1 267 0 orr w4, w4, w7 - .loc 1 267 0 + .loc 1 266 0 ubfx x17, x3, 4, 4 - .loc 1 272 0 + .loc 1 271 0 ubfx x18, x3, 24, 4 - .loc 1 269 0 + .loc 1 268 0 ubfx x20, x3, 12, 4 - .loc 1 271 0 + .loc 1 270 0 lsr w7, w0, 15 - .loc 1 269 0 + .loc 1 268 0 and w30, w30, 480 - .loc 1 267 0 + .loc 1 266 0 and w9, w9, 480 - .loc 1 272 0 + .loc 1 271 0 and w8, w8, 480 - .loc 1 267 0 + .loc 1 266 0 orr w9, w9, w17 - .loc 1 272 0 + .loc 1 271 0 orr w8, w8, w18 - .loc 1 271 0 + .loc 1 270 0 ubfx x17, x3, 20, 4 - .loc 1 273 0 - lsr w18, w0, 23 - .loc 1 269 0 - orr w30, w30, w20 - .loc 1 271 0 - and w7, w7, 480 - .loc 1 266 0 - and w19, w3, 15 - .loc 1 271 0 - orr w7, w7, w17 - .loc 1 273 0 - and w18, w18, 480 - .loc 1 266 0 - ubfiz w0, w0, 5, 4 -.LVL843: - .loc 1 270 0 - ldrb w17, [x5, w16, uxtw] - .loc 1 273 0 - add w3, w18, w3, lsr 28 -.LVL844: - .loc 1 268 0 - ldrb w16, [x5, w4, uxtw] - .loc 1 266 0 - orr w0, w0, w19 - .loc 1 269 0 - ldrb w4, [x5, w30, uxtw] - .loc 1 267 0 - ldrb w9, [x5, w9, uxtw] .loc 1 272 0 - ldrb w8, [x5, w8, uxtw] + lsr w18, w0, 23 .loc 1 268 0 - lsl w16, w16, 4 - .loc 1 271 0 - ldrb w7, [x5, w7, uxtw] - .loc 1 266 0 - ldrb w18, [x5, w0, uxtw] + orr w30, w30, w20 .loc 1 270 0 + and w7, w7, 480 + .loc 1 265 0 + and w19, w3, 15 + .loc 1 270 0 + orr w7, w7, w17 + .loc 1 272 0 + and w18, w18, 480 + .loc 1 265 0 + ubfiz w0, w0, 5, 4 +.LVL840: + .loc 1 269 0 + ldrb w17, [x5, w16, uxtw] + .loc 1 272 0 + add w3, w18, w3, lsr 28 +.LVL841: + .loc 1 267 0 + ldrb w16, [x5, w4, uxtw] + .loc 1 265 0 + orr w0, w0, w19 + .loc 1 268 0 + ldrb w4, [x5, w30, uxtw] + .loc 1 266 0 + ldrb w9, [x5, w9, uxtw] + .loc 1 271 0 + ldrb w8, [x5, w8, uxtw] + .loc 1 267 0 + lsl w16, w16, 4 + .loc 1 270 0 + ldrb w7, [x5, w7, uxtw] + .loc 1 265 0 + ldrb w18, [x5, w0, uxtw] + .loc 1 269 0 lsl w0, w17, 8 - .loc 1 273 0 + .loc 1 272 0 ldrb w3, [x5, w3, uxtw] orr w0, w0, w4, lsl 6 orr w9, w16, w9, lsl 2 - .loc 1 272 0 + .loc 1 271 0 lsl w4, w8, 12 - .loc 1 273 0 + .loc 1 272 0 orr w0, w0, w9 orr w4, w4, w7, lsl 10 orr w0, w0, w4 orr w3, w18, w3, lsl 14 orr w0, w0, w3 -.LBE1495: -.LBE1494: - .loc 1 1434 0 +.LBE1557: +.LBE1556: + .loc 1 1433 0 strh w0, [x10, x6, lsl 1] add x6, x6, 1 - .loc 1 1431 0 - cmp w11, w6 - bgt .L745 .loc 1 1430 0 + cmp w11, w6 + bgt .L747 + .loc 1 1429 0 add w12, w12, 1 add x1, x1, x13 add x2, x2, x13 add x10, x10, x15 cmp w12, w14 - beq .L734 -.L757: - .loc 1 1431 0 - mov x6, 0 - cbnz w11, .L745 + beq .L736 +.L759: .loc 1 1430 0 + mov x6, 0 + cbnz w11, .L747 + .loc 1 1429 0 add w12, w12, 1 add x10, x10, x15 cmp w12, w14 - bne .L757 -.L734: - .loc 1 1437 0 + bne .L759 +.L736: + .loc 1 1436 0 ldp x19, x20, [sp, 16] ldp x29, x30, [sp], 32 .cfi_restore 30 @@ -7556,53 +7682,53 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.L756: - .loc 1 1430 0 +.L758: + .loc 1 1429 0 add w12, w12, 1 add x10, x10, x15 cmp w12, w14 - bne .L749 -.LVL845: -.L748: + bne .L751 +.LVL842: +.L750: ret -.LVL846: -.L737: - .loc 1 1426 0 +.LVL843: +.L739: + .loc 1 1425 0 mul w3, w7, w6 - .loc 1 1427 0 - lsr w15, w7, 2 -.LVL847: .loc 1 1426 0 + lsr w15, w7, 2 +.LVL844: + .loc 1 1425 0 lsr w3, w3, 2 add x10, x0, x3 -.LVL848: - b .L740 -.LVL849: -.L754: - .loc 1 1413 0 +.LVL845: + b .L742 +.LVL846: +.L756: + .loc 1 1412 0 add w14, w3, w3, lsr 31 mov w6, 0 -.LVL850: +.LVL847: asr w14, w14, 1 -.LVL851: - .loc 1 1412 0 +.LVL848: + .loc 1 1411 0 mov w12, 0 -.LVL852: - b .L736 -.L755: - .loc 1 1415 0 +.LVL849: + b .L738 +.L757: + .loc 1 1414 0 add w12, w3, w3, lsr 31 -.LVL853: +.LVL850: asr w12, w12, 1 -.LVL854: +.LVL851: mov w6, w12 - .loc 1 1416 0 + .loc 1 1415 0 mul w8, w11, w12 sbfiz x8, x8, 2, 32 add x1, x1, x8 - .loc 1 1417 0 + .loc 1 1416 0 add x2, x2, x8 - b .L736 + b .L738 .cfi_endproc .LFE2877: .size direct_mode_data_change.isra.2, .-direct_mode_data_change.isra.2 @@ -7611,59 +7737,59 @@ .type direct_mode_data_change2.isra.3, %function direct_mode_data_change2.isra.3: .LFB2878: - .loc 1 1484 0 + .loc 1 1483 0 .cfi_startproc -.LVL855: - .loc 1 1486 0 +.LVL852: + .loc 1 1485 0 adrp x7, .LANCHOR0 - .loc 1 1484 0 + .loc 1 1483 0 and w3, w3, 255 - .loc 1 1491 0 + .loc 1 1490 0 sub w3, w3, w4 -.LVL856: - .loc 1 1499 0 +.LVL853: + .loc 1 1498 0 cmp w6, 2 - .loc 1 1486 0 + .loc 1 1485 0 ldr x4, [x7, #:lo12:.LANCHOR0] - .loc 1 1492 0 + .loc 1 1491 0 lsl w3, w3, 10 -.LVL857: +.LVL854: add x5, x5, x3, sxtw -.LVL858: - .loc 1 1497 0 - ldp w12, w13, [x4, 108] +.LVL855: .loc 1 1496 0 + ldp w12, w13, [x4, 108] + .loc 1 1495 0 lsr w8, w12, 3 - .loc 1 1499 0 - beq .L782 - .loc 1 1507 0 + .loc 1 1498 0 + beq .L784 + .loc 1 1506 0 mov w10, 0 -.LVL859: - .loc 1 1502 0 +.LVL856: + .loc 1 1501 0 cmp w6, 3 - beq .L783 -.LVL860: -.L760: - .loc 1 1510 0 + beq .L785 +.LVL857: +.L762: + .loc 1 1509 0 lsr w12, w12, 2 -.LVL861: - .loc 1 1511 0 +.LVL858: + .loc 1 1510 0 cmp w13, w10 - ble .L775 -.L786: + ble .L777 +.L788: sub w9, w8, #1 mul w11, w12, w10 add x9, x9, 1 lsl w12, w12, 1 -.LVL862: +.LVL859: lsl x9, x9, 2 -.LVL863: -.L776: - .loc 1 1512 0 +.LVL860: +.L778: + .loc 1 1511 0 add x7, x0, x11, sxtw - .loc 1 1513 0 - cbz w8, .L784 - .loc 1 1484 0 + .loc 1 1512 0 + cbz w8, .L786 + .loc 1 1483 0 stp x29, x30, [sp, -64]! .cfi_def_cfa_offset 64 .cfi_offset 29, -64 @@ -7679,246 +7805,246 @@ .cfi_offset 22, -24 .cfi_offset 23, -16 .p2align 2 -.L777: - .loc 1 1513 0 +.L779: + .loc 1 1512 0 mov x14, 0 .p2align 2 -.L763: - .loc 1 1515 0 - ldr w3, [x2, x14, lsl 2] +.L765: .loc 1 1514 0 + ldr w3, [x2, x14, lsl 2] + .loc 1 1513 0 ldr w4, [x1, x14, lsl 2] -.LBB1496: -.LBB1497: - .loc 1 282 0 +.LBB1558: +.LBB1559: + .loc 1 281 0 lsr w16, w3, 11 - .loc 1 280 0 + .loc 1 279 0 lsr w6, w3, 3 -.LVL864: - .loc 1 282 0 +.LVL861: + .loc 1 281 0 ubfx x17, x4, 16, 4 - .loc 1 280 0 + .loc 1 279 0 ubfx x15, x4, 8, 4 - .loc 1 281 0 + .loc 1 280 0 lsr w30, w3, 7 - .loc 1 279 0 + .loc 1 278 0 lsl w21, w3, 1 - .loc 1 284 0 - lsr w20, w3, 19 - .loc 1 282 0 - and w16, w16, 480 - .loc 1 280 0 - and w6, w6, 480 - .loc 1 281 0 - ubfx x19, x4, 12, 4 - .loc 1 282 0 - orr w16, w16, w17 - .loc 1 279 0 - ubfx x18, x4, 4, 4 - .loc 1 280 0 - orr w6, w6, w15 - .loc 1 284 0 - ubfx x17, x4, 24, 4 .loc 1 283 0 - lsr w15, w3, 15 + lsr w20, w3, 19 .loc 1 281 0 - and w30, w30, 480 + and w16, w16, 480 .loc 1 279 0 + and w6, w6, 480 + .loc 1 280 0 + ubfx x19, x4, 12, 4 + .loc 1 281 0 + orr w16, w16, w17 + .loc 1 278 0 + ubfx x18, x4, 4, 4 + .loc 1 279 0 + orr w6, w6, w15 + .loc 1 283 0 + ubfx x17, x4, 24, 4 + .loc 1 282 0 + lsr w15, w3, 15 + .loc 1 280 0 + and w30, w30, 480 + .loc 1 278 0 and w21, w21, 480 - .loc 1 284 0 + .loc 1 283 0 and w20, w20, 480 orr w20, w20, w17 - .loc 1 281 0 + .loc 1 280 0 orr w30, w30, w19 - .loc 1 279 0 + .loc 1 278 0 orr w21, w21, w18 - .loc 1 285 0 + .loc 1 284 0 lsr w17, w3, 23 - .loc 1 283 0 + .loc 1 282 0 ubfx x18, x4, 20, 4 and w15, w15, 480 - .loc 1 278 0 + .loc 1 277 0 and w22, w4, 15 - .loc 1 283 0 + .loc 1 282 0 orr w15, w15, w18 - .loc 1 285 0 - and w17, w17, 480 - .loc 1 278 0 - ubfiz w3, w3, 5, 4 - .loc 1 282 0 - ldrb w19, [x5, w16, uxtw] - .loc 1 285 0 - add w4, w17, w4, lsr 28 - .loc 1 280 0 - ldrb w18, [x5, w6, uxtw] - .loc 1 278 0 - orr w3, w3, w22 - .loc 1 281 0 - ldrb w6, [x5, w30, uxtw] .loc 1 284 0 - ldrb w16, [x5, w20, uxtw] + and w17, w17, 480 + .loc 1 277 0 + ubfiz w3, w3, 5, 4 + .loc 1 281 0 + ldrb w19, [x5, w16, uxtw] + .loc 1 284 0 + add w4, w17, w4, lsr 28 .loc 1 279 0 - ldrb w17, [x5, w21, uxtw] + ldrb w18, [x5, w6, uxtw] + .loc 1 277 0 + orr w3, w3, w22 .loc 1 280 0 - lsl w18, w18, 8 + ldrb w6, [x5, w30, uxtw] .loc 1 283 0 - ldrb w15, [x5, w15, uxtw] + ldrb w16, [x5, w20, uxtw] .loc 1 278 0 - ldrb w20, [x5, w3, uxtw] + ldrb w17, [x5, w21, uxtw] + .loc 1 279 0 + lsl w18, w18, 8 .loc 1 282 0 + ldrb w15, [x5, w15, uxtw] + .loc 1 277 0 + ldrb w20, [x5, w3, uxtw] + .loc 1 281 0 lsl w3, w19, 16 - .loc 1 285 0 + .loc 1 284 0 ldrb w4, [x5, w4, uxtw] orr w3, w3, w6, lsl 12 orr w17, w18, w17, lsl 4 - .loc 1 284 0 + .loc 1 283 0 lsl w6, w16, 24 - .loc 1 285 0 + .loc 1 284 0 orr w3, w3, w17 orr w6, w6, w15, lsl 20 orr w3, w3, w6 orr w4, w20, w4, lsl 28 orr w3, w3, w4 -.LBE1497: -.LBE1496: - .loc 1 1516 0 +.LBE1559: +.LBE1558: + .loc 1 1515 0 str w3, [x7, x14, lsl 2] add x14, x14, 1 - .loc 1 1513 0 + .loc 1 1512 0 cmp w8, w14 - bgt .L763 + bgt .L765 add x1, x1, x9 add x2, x2, x9 mov x14, 0 .p2align 2 -.L764: - .loc 1 1520 0 - ldr w3, [x2, x14, lsl 2] +.L766: .loc 1 1519 0 + ldr w3, [x2, x14, lsl 2] + .loc 1 1518 0 ldr w4, [x1, x14, lsl 2] - .loc 1 1521 0 + .loc 1 1520 0 ldr w16, [x7, x14, lsl 2] -.LBB1498: -.LBB1499: - .loc 1 293 0 - lsr w20, w3, 7 - .loc 1 290 0 - and w6, w4, 15 - .loc 1 293 0 - ubfx x15, x4, 12, 4 +.LBB1560: +.LBB1561: .loc 1 292 0 - lsr w19, w3, 3 + lsr w20, w3, 7 + .loc 1 289 0 + and w6, w4, 15 + .loc 1 292 0 + ubfx x15, x4, 12, 4 .loc 1 291 0 - lsl w18, w3, 1 + lsr w19, w3, 3 .loc 1 290 0 + lsl w18, w3, 1 + .loc 1 289 0 ubfiz w30, w3, 5, 4 - .loc 1 295 0 + .loc 1 294 0 lsr w17, w3, 15 - .loc 1 293 0 + .loc 1 292 0 and w20, w20, 480 orr w20, w20, w15 - .loc 1 291 0 - ubfx x21, x4, 4, 4 .loc 1 290 0 + ubfx x21, x4, 4, 4 + .loc 1 289 0 orr w30, w30, w6 - .loc 1 295 0 + .loc 1 294 0 ubfx x22, x4, 20, 4 - .loc 1 292 0 + .loc 1 291 0 ubfx x23, x4, 8, 4 - .loc 1 294 0 + .loc 1 293 0 lsr w15, w3, 11 - .loc 1 297 0 + .loc 1 296 0 lsr w6, w3, 23 - .loc 1 292 0 + .loc 1 291 0 and w19, w19, 480 - .loc 1 291 0 + .loc 1 290 0 and w18, w18, 480 - .loc 1 295 0 + .loc 1 294 0 and w17, w17, 480 - .loc 1 291 0 + .loc 1 290 0 orr w18, w18, w21 - .loc 1 295 0 + .loc 1 294 0 orr w17, w17, w22 - .loc 1 294 0 + .loc 1 293 0 ubfx x21, x4, 16, 4 - .loc 1 292 0 + .loc 1 291 0 orr w19, w19, w23 - .loc 1 297 0 + .loc 1 296 0 and w6, w6, 480 - .loc 1 294 0 + .loc 1 293 0 and w15, w15, 480 - .loc 1 296 0 + .loc 1 295 0 lsr w3, w3, 19 - .loc 1 294 0 + .loc 1 293 0 orr w15, w15, w21 - .loc 1 296 0 + .loc 1 295 0 ubfx x22, x4, 24, 4 and w3, w3, 480 - .loc 1 297 0 + .loc 1 296 0 add w4, w6, w4, lsr 28 - .loc 1 293 0 - ldrb w21, [x5, w20, uxtw] - .loc 1 296 0 - orr w3, w3, w22 - .loc 1 290 0 - ldrb w20, [x5, w30, uxtw] .loc 1 292 0 - ldrb w6, [x5, w19, uxtw] + ldrb w21, [x5, w20, uxtw] .loc 1 295 0 - ldrb w30, [x5, w17, uxtw] + orr w3, w3, w22 + .loc 1 289 0 + ldrb w20, [x5, w30, uxtw] .loc 1 291 0 - ldrb w19, [x5, w18, uxtw] - .loc 1 297 0 - ldrb w17, [x5, w4, uxtw] - .loc 1 293 0 - lsl w4, w21, 14 + ldrb w6, [x5, w19, uxtw] .loc 1 294 0 - ldrb w18, [x5, w15, uxtw] - .loc 1 297 0 - orr w4, w4, w6, lsl 10 - .loc 1 296 0 - ldrb w15, [x5, w3, uxtw] + ldrb w30, [x5, w17, uxtw] .loc 1 290 0 - lsl w3, w20, 2 - .loc 1 297 0 - orr w3, w3, w19, lsl 6 + ldrb w19, [x5, w18, uxtw] + .loc 1 296 0 + ldrb w17, [x5, w4, uxtw] + .loc 1 292 0 + lsl w4, w21, 14 + .loc 1 293 0 + ldrb w18, [x5, w15, uxtw] + .loc 1 296 0 + orr w4, w4, w6, lsl 10 .loc 1 295 0 + ldrb w15, [x5, w3, uxtw] + .loc 1 289 0 + lsl w3, w20, 2 + .loc 1 296 0 + orr w3, w3, w19, lsl 6 + .loc 1 294 0 lsl w6, w30, 22 - .loc 1 297 0 + .loc 1 296 0 orr w3, w4, w3 orr w6, w6, w18, lsl 18 lsl w4, w17, 30 orr w3, w3, w6 orr w4, w4, w15, lsl 26 orr w3, w3, w4 -.LBE1499: -.LBE1498: - .loc 1 1521 0 +.LBE1561: +.LBE1560: + .loc 1 1520 0 orr w3, w16, w3 str w3, [x7, x14, lsl 2] add x14, x14, 1 - .loc 1 1518 0 + .loc 1 1517 0 cmp w8, w14 - bgt .L764 - .loc 1 1511 0 + bgt .L766 + .loc 1 1510 0 add w10, w10, 2 add x1, x1, x9 add x2, x2, x9 add w11, w11, w12 cmp w10, w13 - bge .L785 -.L765: - .loc 1 1512 0 - add x7, x0, x11, sxtw - .loc 1 1513 0 - cbnz w8, .L777 + bge .L787 +.L767: .loc 1 1511 0 + add x7, x0, x11, sxtw + .loc 1 1512 0 + cbnz w8, .L779 + .loc 1 1510 0 add w10, w10, 2 add w11, w11, w12 cmp w10, w13 - blt .L765 -.L785: - .loc 1 1524 0 + blt .L767 +.L787: + .loc 1 1523 0 ldp x19, x20, [sp, 16] ldp x21, x22, [sp, 32] ldr x23, [sp, 48] @@ -7932,47 +8058,47 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL865: -.L784: - .loc 1 1511 0 +.LVL862: +.L786: + .loc 1 1510 0 add w10, w10, 2 add w11, w11, w12 cmp w10, w13 - blt .L776 + blt .L778 ret -.LVL866: -.L782: - .loc 1 1501 0 - add w13, w13, w13, lsr 31 -.LVL867: +.LVL863: +.L784: .loc 1 1500 0 + add w13, w13, w13, lsr 31 +.LVL864: + .loc 1 1499 0 mov w10, 0 -.LVL868: - .loc 1 1501 0 +.LVL865: + .loc 1 1500 0 asr w13, w13, 1 -.LVL869: - .loc 1 1510 0 +.LVL866: + .loc 1 1509 0 lsr w12, w12, 2 -.LVL870: - .loc 1 1511 0 +.LVL867: + .loc 1 1510 0 cmp w13, w10 - bgt .L786 -.L775: + bgt .L788 +.L777: ret -.LVL871: -.L783: - .loc 1 1503 0 +.LVL868: +.L785: + .loc 1 1502 0 add w10, w13, w13, lsr 31 -.LVL872: +.LVL869: asr w10, w10, 1 -.LVL873: - .loc 1 1504 0 +.LVL870: + .loc 1 1503 0 mul w3, w8, w10 sbfiz x3, x3, 2, 32 add x1, x1, x3 - .loc 1 1505 0 + .loc 1 1504 0 add x2, x2, x3 - b .L760 + b .L762 .cfi_endproc .LFE2878: .size direct_mode_data_change2.isra.3, .-direct_mode_data_change2.isra.3 @@ -7981,73 +8107,73 @@ .type flip.isra.4, %function flip.isra.4: .LFB2879: - .loc 1 1573 0 + .loc 1 1572 0 .cfi_startproc -.LVL874: +.LVL871: stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 .cfi_offset 30, -24 - .loc 1 1577 0 + .loc 1 1576 0 sxtw x2, w1 - .loc 1 1573 0 + .loc 1 1572 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x19, x20, [sp, 16] .cfi_offset 19, -16 .cfi_offset 20, -8 - .loc 1 1573 0 + .loc 1 1572 0 mov x20, x0 - .loc 1 1575 0 + .loc 1 1574 0 ldr w19, [x0, 72] - .loc 1 1577 0 + .loc 1 1576 0 ldr x0, [x0] -.LVL875: -.LBB1500: -.LBB1501: -.LBB1502: -.LBB1503: +.LVL872: +.LBB1562: +.LBB1563: +.LBB1564: +.LBB1565: .file 9 "./include/linux/dma-mapping.h" .loc 9 266 0 - cbz x0, .L790 + cbz x0, .L792 ldr x3, [x0, 648] .loc 9 268 0 adrp x4, dummy_dma_ops add x4, x4, :lo12:dummy_dma_ops cmp x3, 0 csel x3, x4, x3, eq -.L788: -.LBE1503: -.LBE1502: +.L790: +.LBE1565: +.LBE1564: .loc 9 434 0 ldr x5, [x3, 88] sxtw x19, w19 - cbz x5, .L789 -.LBE1501: -.LBE1500: - .loc 1 1577 0 + cbz x5, .L791 +.LBE1563: +.LBE1562: + .loc 1 1576 0 add x4, x19, x19, lsl 1 -.LBB1509: -.LBB1506: +.LBB1571: +.LBB1568: .loc 9 435 0 mov w3, 1 -.LBE1506: -.LBE1509: - .loc 1 1577 0 +.LBE1568: +.LBE1571: + .loc 1 1576 0 add x4, x20, x4, lsl 3 -.LBB1510: -.LBB1507: +.LBB1572: +.LBB1569: .loc 9 435 0 ldr x1, [x4, 32] blr x5 -.LVL876: -.L789: -.LBE1507: -.LBE1510: - .loc 1 1578 0 +.LVL873: +.L791: +.LBE1569: +.LBE1572: + .loc 1 1577 0 ldr x5, [x20, 8] -.LBB1511: -.LBB1512: +.LBB1573: +.LBB1574: .file 10 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h" .loc 10 56 0 mov w4, 0 @@ -8055,58 +8181,58 @@ mov w2, 0 mov x0, x5 mov w1, 0 -.LBE1512: -.LBE1511: - .loc 1 1579 0 +.LBE1574: +.LBE1573: + .loc 1 1578 0 add x19, x19, x19, lsl 1 -.LBB1515: -.LBB1513: +.LBB1577: +.LBB1575: .loc 10 56 0 ldr x5, [x5, 64] -.LBE1513: -.LBE1515: - .loc 1 1579 0 +.LBE1575: +.LBE1577: + .loc 1 1578 0 add x19, x20, x19, lsl 3 -.LBB1516: -.LBB1514: +.LBB1578: +.LBB1576: .loc 10 56 0 blr x5 -.LVL877: -.LBE1514: -.LBE1516: - .loc 1 1579 0 +.LVL874: +.LBE1576: +.LBE1578: + .loc 1 1578 0 ldr x1, [x20, 8] -.LBB1517: -.LBB1518: +.LBB1579: +.LBB1580: .loc 10 61 0 mov w2, 0 mov x0, x1 ldr x3, [x1, 72] ldr w1, [x19, 32] blr x3 -.LVL878: -.LBE1518: -.LBE1517: - .loc 1 1580 0 +.LVL875: +.LBE1580: +.LBE1579: + .loc 1 1579 0 ldr x2, [x20, 8] -.LBB1519: -.LBB1520: +.LBB1581: +.LBB1582: .loc 10 76 0 mov w1, 1 mov x0, x2 ldr x2, [x2, 96] blr x2 -.LVL879: -.LBE1520: -.LBE1519: - .loc 1 1581 0 +.LVL876: +.LBE1582: +.LBE1581: + .loc 1 1580 0 ldr w1, [x20, 72] mov w0, 1 sub w0, w0, w1 str w0, [x20, 72] - .loc 1 1582 0 + .loc 1 1581 0 ldp x19, x20, [sp, 16] -.LVL880: +.LVL877: ldp x29, x30, [sp], 32 .cfi_remember_state .cfi_restore 30 @@ -8115,22 +8241,22 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL881: +.LVL878: .p2align 3 -.L790: +.L792: .cfi_restore_state -.LBB1521: -.LBB1508: -.LBB1505: -.LBB1504: +.LBB1583: +.LBB1570: +.LBB1567: +.LBB1566: .loc 9 268 0 adrp x3, dummy_dma_ops add x3, x3, :lo12:dummy_dma_ops - b .L788 -.LBE1504: -.LBE1505: -.LBE1508: -.LBE1521: + b .L790 +.LBE1566: +.LBE1567: +.LBE1570: +.LBE1583: .cfi_endproc .LFE2879: .size flip.isra.4, .-flip.isra.4 @@ -8139,9 +8265,9 @@ .type ebc_power_set.part.7, %function ebc_power_set.part.7: .LFB2882: - .loc 1 390 0 + .loc 1 389 0 .cfi_startproc -.LVL882: +.LVL879: stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 @@ -8151,47 +8277,47 @@ stp x19, x20, [sp, 16] .cfi_offset 19, -16 .cfi_offset 20, -8 - .loc 1 390 0 + .loc 1 389 0 mov x19, x0 + .loc 1 406 0 + str w1, [x0, 392] .loc 1 407 0 - str w1, [x0, 400] - .loc 1 408 0 ldr x1, [x0, 8] -.LVL883: -.LBB1522: -.LBB1523: +.LVL880: +.LBB1584: +.LBB1585: .loc 10 50 0 mov x0, x1 -.LVL884: +.LVL881: ldr x1, [x1, 56] blr x1 -.LVL885: -.LBE1523: -.LBE1522: - .loc 1 409 0 +.LVL882: +.LBE1585: +.LBE1584: + .loc 1 408 0 ldr x2, [x19, 16] -.LBB1524: -.LBB1525: +.LBB1586: +.LBB1587: .loc 3 35 0 mov w1, 0 mov x0, x2 ldr x2, [x2, 32] blr x2 -.LVL886: -.LBE1525: -.LBE1524: - .loc 1 410 0 - ldr w0, [x19, 672] - cbnz w0, .L801 - .loc 1 414 0 +.LVL883: +.LBE1587: +.LBE1586: + .loc 1 409 0 + ldr w0, [x19, 656] + cbnz w0, .L803 + .loc 1 413 0 ldr x0, [x19] - adrp x1, .LC31 - add x1, x1, :lo12:.LC31 + adrp x1, .LC30 + add x1, x1, :lo12:.LC30 bl _dev_info -.LVL887: - .loc 1 418 0 +.LVL884: + .loc 1 417 0 ldp x19, x20, [sp, 16] -.LVL888: +.LVL885: ldp x29, x30, [sp], 32 .cfi_remember_state .cfi_restore 30 @@ -8200,30 +8326,30 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL889: +.LVL886: .p2align 3 -.L801: +.L803: .cfi_restore_state - .loc 1 411 0 - str wzr, [x19, 672] -.LBB1526: -.LBB1527: + .loc 1 410 0 + str wzr, [x19, 656] +.LBB1588: +.LBB1589: .file 11 "./include/linux/wakelock.h" .loc 11 68 0 - add x0, x19, 464 + add x0, x19, 448 bl __pm_relax -.LVL890: -.LBE1527: -.LBE1526: - .loc 1 414 0 +.LVL887: +.LBE1589: +.LBE1588: + .loc 1 413 0 ldr x0, [x19] - adrp x1, .LC31 - add x1, x1, :lo12:.LC31 + adrp x1, .LC30 + add x1, x1, :lo12:.LC30 bl _dev_info -.LVL891: - .loc 1 418 0 +.LVL888: + .loc 1 417 0 ldp x19, x20, [sp, 16] -.LVL892: +.LVL889: ldp x29, x30, [sp], 32 .cfi_restore 20 .cfi_restore 19 @@ -8239,9 +8365,9 @@ .type ebc_suspend, %function ebc_suspend: .LFB2871: - .loc 1 3724 0 + .loc 1 3736 0 .cfi_startproc -.LVL893: +.LVL890: stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 @@ -8251,40 +8377,40 @@ stp x19, x20, [sp, 16] .cfi_offset 19, -16 .cfi_offset 20, -8 -.LBB1528: -.LBB1529: +.LBB1590: +.LBB1591: .loc 2 1181 0 ldr x20, [x0, 184] -.LBE1529: -.LBE1528: - .loc 1 3728 0 +.LBE1591: +.LBE1590: + .loc 1 3740 0 add x19, x20, 192 - ldr w0, [x19, 208] -.LVL894: + ldr w0, [x19, 200] +.LVL891: cmp w0, 1 - beq .L805 -.L803: - .loc 1 3732 0 + beq .L807 +.L805: + .loc 1 3744 0 mov w0, 1 - str w0, [x19, 604] - .loc 1 3734 0 + str w0, [x19, 588] + .loc 1 3746 0 ldr x1, [x20, 16] -.LBB1530: -.LBB1531: +.LBB1592: +.LBB1593: .loc 3 40 0 mov x0, x1 ldr x1, [x1, 40] blr x1 -.LVL895: -.LBE1531: -.LBE1530: - .loc 1 3735 0 +.LVL892: +.LBE1593: +.LBE1592: + .loc 1 3747 0 ldr x0, [x19, 104] - adrp x1, .LC33 - add x1, x1, :lo12:.LC33 + adrp x1, .LC32 + add x1, x1, :lo12:.LC32 bl _dev_info -.LVL896: - .loc 1 3738 0 +.LVL893: + .loc 1 3750 0 mov w0, 0 ldp x19, x20, [sp, 16] ldp x29, x30, [sp], 32 @@ -8296,25 +8422,25 @@ .cfi_def_cfa 31, 0 ret .p2align 3 -.L805: +.L807: .cfi_restore_state - .loc 1 3729 0 + .loc 1 3741 0 ldr x0, [x19, 104] adrp x2, .LANCHOR3 add x2, x2, :lo12:.LANCHOR3 - adrp x1, .LC32 - add x1, x1, :lo12:.LC32 + adrp x1, .LC31 + add x1, x1, :lo12:.LC31 bl _dev_info -.LVL897: -.LBB1532: -.LBB1533: +.LVL894: +.LBB1594: +.LBB1595: mov w1, 0 mov x0, x20 bl ebc_power_set.part.7 -.LVL898: - b .L803 -.LBE1533: -.LBE1532: +.LVL895: + b .L805 +.LBE1595: +.LBE1594: .cfi_endproc .LFE2871: .size ebc_suspend, .-ebc_suspend @@ -8323,42 +8449,42 @@ .type direct_mode_data_change_part2.isra.8, %function direct_mode_data_change_part2.isra.8: .LFB2883: - .loc 1 1527 0 + .loc 1 1526 0 .cfi_startproc -.LVL899: +.LVL896: stp x29, x30, [sp, -80]! .cfi_def_cfa_offset 80 .cfi_offset 29, -80 .cfi_offset 30, -72 - .loc 1 1529 0 + .loc 1 1528 0 adrp x7, .LANCHOR0 - .loc 1 1527 0 + .loc 1 1526 0 and w3, w3, 255 - .loc 1 1541 0 + .loc 1 1540 0 cmp w6, 2 - .loc 1 1533 0 + .loc 1 1532 0 sub w3, w3, w4 -.LVL900: - .loc 1 1527 0 +.LVL897: + .loc 1 1526 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 1529 0 + .loc 1 1528 0 ldr x4, [x7, #:lo12:.LANCHOR0] - .loc 1 1527 0 + .loc 1 1526 0 stp x19, x20, [sp, 16] - .loc 1 1534 0 + .loc 1 1533 0 lsl w3, w3, 10 -.LVL901: - .loc 1 1527 0 +.LVL898: + .loc 1 1526 0 stp x21, x22, [sp, 32] .cfi_offset 19, -64 .cfi_offset 20, -56 .cfi_offset 21, -48 .cfi_offset 22, -40 - .loc 1 1534 0 + .loc 1 1533 0 add x19, x5, x3, sxtw -.LVL902: - .loc 1 1527 0 +.LVL899: + .loc 1 1526 0 stp x23, x24, [sp, 48] mov x22, x0 stp x25, x26, [sp, 64] @@ -8366,543 +8492,543 @@ .cfi_offset 24, -24 .cfi_offset 25, -16 .cfi_offset 26, -8 - .loc 1 1527 0 + .loc 1 1526 0 mov x24, x1 mov x25, x2 - .loc 1 1539 0 - ldp w9, w23, [x4, 108] .loc 1 1538 0 + ldp w9, w23, [x4, 108] + .loc 1 1537 0 lsr w20, w9, 3 - .loc 1 1541 0 - beq .L871 - .loc 1 1544 0 + .loc 1 1540 0 + beq .L873 + .loc 1 1543 0 cmp w6, 3 - beq .L809 + beq .L811 lsr w26, w9, 2 mov x0, 0 - .loc 1 1549 0 + .loc 1 1548 0 mov w21, 0 -.LVL903: -.L808: - .loc 1 1553 0 +.LVL900: +.L810: + .loc 1 1552 0 sub w2, w23, w21 add x0, x22, x0 mov w1, 0 mul w2, w2, w26 sxtw x2, w2 bl memset -.LVL904: - .loc 1 1554 0 +.LVL901: + .loc 1 1553 0 cmp w21, w23 - bge .L806 + bge .L808 sub w7, w20, #1 mul w8, w21, w26 add x7, x7, 1 lsl w9, w26, 1 lsl x7, x7, 2 -.LBB1534: -.LBB1535: - .loc 1 339 0 +.LBB1596: +.LBB1597: + .loc 1 338 0 mov w6, 3 -.LBE1535: -.LBE1534: -.LBB1568: -.LBB1569: - .loc 1 369 0 +.LBE1597: +.LBE1596: +.LBB1630: +.LBB1631: + .loc 1 368 0 mov w5, 12 -.LVL905: +.LVL902: .p2align 2 -.L832: -.LBE1569: -.LBE1568: - .loc 1 1555 0 +.L834: +.LBE1631: +.LBE1630: + .loc 1 1554 0 add x4, x22, x8, sxtw - .loc 1 1556 0 - cbz w20, .L811 + .loc 1 1555 0 + cbz w20, .L813 mov x10, 0 -.LVL906: +.LVL903: .p2align 2 -.L821: - .loc 1 1558 0 - ldr w0, [x25, x10, lsl 2] +.L823: .loc 1 1557 0 + ldr w0, [x25, x10, lsl 2] + .loc 1 1556 0 ldr w1, [x24, x10, lsl 2] -.LBB1605: -.LBB1566: -.LBB1536: -.LBB1537: - .loc 1 280 0 +.LBB1667: +.LBB1628: +.LBB1598: +.LBB1599: + .loc 1 279 0 lsr w17, w0, 3 - .loc 1 282 0 - lsr w16, w0, 11 - .loc 1 284 0 - lsr w2, w0, 19 - .loc 1 280 0 - ubfx x12, x1, 8, 4 - .loc 1 282 0 - ubfx x11, x1, 16, 4 - .loc 1 284 0 - and w2, w2, 480 - .loc 1 279 0 - lsl w15, w0, 1 - .loc 1 280 0 - and w17, w17, 480 .loc 1 281 0 - lsr w14, w0, 7 - .loc 1 282 0 - and w16, w16, 480 - .loc 1 284 0 - ubfx x13, x1, 24, 4 + lsr w16, w0, 11 + .loc 1 283 0 + lsr w2, w0, 19 .loc 1 279 0 + ubfx x12, x1, 8, 4 + .loc 1 281 0 + ubfx x11, x1, 16, 4 + .loc 1 283 0 + and w2, w2, 480 + .loc 1 278 0 + lsl w15, w0, 1 + .loc 1 279 0 + and w17, w17, 480 + .loc 1 280 0 + lsr w14, w0, 7 + .loc 1 281 0 + and w16, w16, 480 + .loc 1 283 0 + ubfx x13, x1, 24, 4 + .loc 1 278 0 ubfx x30, x1, 4, 4 and w15, w15, 480 - .loc 1 280 0 + .loc 1 279 0 orr w17, w17, w12 - .loc 1 281 0 + .loc 1 280 0 and w14, w14, 480 ubfx x12, x1, 12, 4 - .loc 1 282 0 - orr w16, w16, w11 - .loc 1 284 0 - orr w13, w2, w13 - .loc 1 283 0 - lsr w11, w0, 15 - .loc 1 285 0 - lsr w2, w0, 23 - .loc 1 283 0 - and w11, w11, 480 - .loc 1 278 0 - and w18, w1, 15 - .loc 1 279 0 - orr w15, w15, w30 .loc 1 281 0 - orr w14, w14, w12 - .loc 1 285 0 - and w2, w2, 480 + orr w16, w16, w11 .loc 1 283 0 - ubfx x12, x1, 20, 4 + orr w13, w2, w13 + .loc 1 282 0 + lsr w11, w0, 15 + .loc 1 284 0 + lsr w2, w0, 23 + .loc 1 282 0 + and w11, w11, 480 + .loc 1 277 0 + and w18, w1, 15 .loc 1 278 0 - ubfiz w30, w0, 5, 4 - .loc 1 283 0 - orr w12, w11, w12 -.LBE1537: -.LBE1536: - .loc 1 333 0 - eor w3, w1, w0 -.LVL907: -.LBB1552: -.LBB1538: - .loc 1 285 0 - add w11, w2, w1, lsr 28 - .loc 1 278 0 - orr w18, w30, w18 -.LBE1538: -.LBE1552: -.LBE1566: -.LBE1605: - .loc 1 1559 0 - cmp w1, w0 - beq .L812 -.LBB1606: -.LBB1567: - .loc 1 339 0 - ands w0, w3, 15 -.LBB1553: -.LBB1539: + orr w15, w15, w30 .loc 1 280 0 + orr w14, w14, w12 + .loc 1 284 0 + and w2, w2, 480 + .loc 1 282 0 + ubfx x12, x1, 20, 4 + .loc 1 277 0 + ubfiz w30, w0, 5, 4 + .loc 1 282 0 + orr w12, w11, w12 +.LBE1599: +.LBE1598: + .loc 1 332 0 + eor w3, w1, w0 +.LVL904: +.LBB1614: +.LBB1600: + .loc 1 284 0 + add w11, w2, w1, lsr 28 + .loc 1 277 0 + orr w18, w30, w18 +.LBE1600: +.LBE1614: +.LBE1628: +.LBE1667: + .loc 1 1558 0 + cmp w1, w0 + beq .L814 +.LBB1668: +.LBB1629: + .loc 1 338 0 + ands w0, w3, 15 +.LBB1615: +.LBB1601: + .loc 1 279 0 ldrb w17, [x19, w17, uxtw] -.LBE1539: -.LBE1553: - .loc 1 339 0 +.LBE1601: +.LBE1615: + .loc 1 338 0 csel w0, w0, w6, eq - .loc 1 341 0 + .loc 1 340 0 tst w3, 240 orr w1, w0, 48 -.LBB1554: -.LBB1540: - .loc 1 282 0 +.LBB1616: +.LBB1602: + .loc 1 281 0 ldrb w30, [x19, w16, uxtw] -.LBE1540: -.LBE1554: - .loc 1 341 0 +.LBE1602: +.LBE1616: + .loc 1 340 0 csel w0, w1, w0, ne - .loc 1 343 0 + .loc 1 342 0 tst w3, 3840 orr w1, w0, 768 -.LBB1555: -.LBB1541: - .loc 1 279 0 +.LBB1617: +.LBB1603: + .loc 1 278 0 ldrb w2, [x19, w15, uxtw] -.LBE1541: -.LBE1555: - .loc 1 343 0 +.LBE1603: +.LBE1617: + .loc 1 342 0 csel w0, w1, w0, ne - .loc 1 345 0 + .loc 1 344 0 tst w3, 61440 orr w1, w0, 12288 -.LBB1556: -.LBB1542: - .loc 1 281 0 +.LBB1618: +.LBB1604: + .loc 1 280 0 ldrb w14, [x19, w14, uxtw] -.LBE1542: -.LBE1556: - .loc 1 345 0 +.LBE1604: +.LBE1618: + .loc 1 344 0 csel w0, w1, w0, ne - .loc 1 347 0 + .loc 1 346 0 tst w3, 983040 orr w1, w0, 196608 -.LBB1557: -.LBB1543: - .loc 1 284 0 - ldrb w13, [x19, w13, uxtw] -.LBE1543: -.LBE1557: - .loc 1 347 0 - csel w0, w1, w0, ne -.LBB1558: -.LBB1544: +.LBB1619: +.LBB1605: .loc 1 283 0 + ldrb w13, [x19, w13, uxtw] +.LBE1605: +.LBE1619: + .loc 1 346 0 + csel w0, w1, w0, ne +.LBB1620: +.LBB1606: + .loc 1 282 0 ldrb w12, [x19, w12, uxtw] -.LBE1544: -.LBE1558: - .loc 1 349 0 +.LBE1606: +.LBE1620: + .loc 1 348 0 tst w3, 15728640 orr w1, w0, 3145728 csel w0, w1, w0, ne -.LBB1559: -.LBB1545: - .loc 1 285 0 - ldrb w11, [x19, w11, uxtw] - .loc 1 278 0 - ldrb w16, [x19, w18, uxtw] - .loc 1 280 0 - lsl w1, w17, 8 - .loc 1 282 0 - lsl w15, w30, 16 -.LBE1545: -.LBE1559: - .loc 1 351 0 - tst w3, 251658240 -.LBB1560: -.LBB1546: - .loc 1 285 0 - orr w1, w1, w2, lsl 4 -.LBE1546: -.LBE1560: - .loc 1 351 0 - orr w17, w0, 50331648 -.LBB1561: -.LBB1547: - .loc 1 285 0 - orr w14, w15, w14, lsl 12 +.LBB1621: +.LBB1607: .loc 1 284 0 + ldrb w11, [x19, w11, uxtw] + .loc 1 277 0 + ldrb w16, [x19, w18, uxtw] + .loc 1 279 0 + lsl w1, w17, 8 + .loc 1 281 0 + lsl w15, w30, 16 +.LBE1607: +.LBE1621: + .loc 1 350 0 + tst w3, 251658240 +.LBB1622: +.LBB1608: + .loc 1 284 0 + orr w1, w1, w2, lsl 4 +.LBE1608: +.LBE1622: + .loc 1 350 0 + orr w17, w0, 50331648 +.LBB1623: +.LBB1609: + .loc 1 284 0 + orr w14, w15, w14, lsl 12 + .loc 1 283 0 lsl w13, w13, 24 -.LBE1547: -.LBE1561: - .loc 1 351 0 +.LBE1609: +.LBE1623: + .loc 1 350 0 csel w0, w17, w0, ne -.LBB1562: -.LBB1548: - .loc 1 285 0 +.LBB1624: +.LBB1610: + .loc 1 284 0 orr w1, w1, w14 orr w12, w13, w12, lsl 20 -.LBE1548: -.LBE1562: - .loc 1 353 0 +.LBE1610: +.LBE1624: + .loc 1 352 0 tst w3, -268435456 -.LBB1563: -.LBB1549: - .loc 1 285 0 +.LBB1625: +.LBB1611: + .loc 1 284 0 orr w1, w1, w12 -.LBE1549: -.LBE1563: - .loc 1 353 0 +.LBE1611: +.LBE1625: + .loc 1 352 0 orr w3, w0, 805306368 -.LVL908: -.LBB1564: -.LBB1550: - .loc 1 285 0 +.LVL905: +.LBB1626: +.LBB1612: + .loc 1 284 0 orr w2, w16, w11, lsl 28 -.LBE1550: -.LBE1564: - .loc 1 353 0 +.LBE1612: +.LBE1626: + .loc 1 352 0 csel w0, w3, w0, ne -.LBB1565: -.LBB1551: - .loc 1 285 0 +.LBB1627: +.LBB1613: + .loc 1 284 0 orr w1, w1, w2 -.LBE1551: -.LBE1565: - .loc 1 355 0 +.LBE1613: +.LBE1627: + .loc 1 354 0 and w0, w1, w0 -.LBE1567: -.LBE1606: - .loc 1 1560 0 +.LBE1629: +.LBE1668: + .loc 1 1559 0 str w0, [x4, x10, lsl 2] -.LVL909: -.L812: +.LVL906: +.L814: add x10, x10, 1 - .loc 1 1556 0 + .loc 1 1555 0 cmp w20, w10 - bgt .L821 + bgt .L823 add x24, x24, x7 -.LVL910: +.LVL907: add x25, x25, x7 -.LVL911: +.LVL908: mov x10, 0 -.LVL912: +.LVL909: .p2align 2 -.L831: - .loc 1 1565 0 - ldr w0, [x25, x10, lsl 2] +.L833: .loc 1 1564 0 + ldr w0, [x25, x10, lsl 2] + .loc 1 1563 0 ldr w1, [x24, x10, lsl 2] -.LBB1607: -.LBB1602: -.LBB1570: -.LBB1571: - .loc 1 293 0 +.LBB1669: +.LBB1664: +.LBB1632: +.LBB1633: + .loc 1 292 0 lsr w16, w0, 7 - .loc 1 290 0 + .loc 1 289 0 and w2, w1, 15 - .loc 1 293 0 + .loc 1 292 0 ubfx x11, x1, 12, 4 and w16, w16, 480 - .loc 1 291 0 + .loc 1 290 0 lsl w14, w0, 1 - .loc 1 290 0 + .loc 1 289 0 ubfiz w17, w0, 5, 4 - .loc 1 295 0 - lsr w13, w0, 15 - .loc 1 291 0 - ubfx x18, x1, 4, 4 - .loc 1 293 0 - orr w16, w16, w11 - .loc 1 291 0 - and w14, w14, 480 - .loc 1 290 0 - orr w17, w17, w2 .loc 1 294 0 + lsr w13, w0, 15 + .loc 1 290 0 + ubfx x18, x1, 4, 4 + .loc 1 292 0 + orr w16, w16, w11 + .loc 1 290 0 + and w14, w14, 480 + .loc 1 289 0 + orr w17, w17, w2 + .loc 1 293 0 lsr w11, w0, 11 - .loc 1 295 0 + .loc 1 294 0 ubfx x2, x1, 20, 4 and w13, w13, 480 - .loc 1 294 0 + .loc 1 293 0 and w11, w11, 480 - .loc 1 292 0 - lsr w15, w0, 3 - .loc 1 297 0 - lsr w12, w0, 23 .loc 1 291 0 - orr w14, w14, w18 - .loc 1 295 0 - orr w13, w13, w2 - .loc 1 294 0 - ubfx x18, x1, 16, 4 + lsr w15, w0, 3 .loc 1 296 0 + lsr w12, w0, 23 + .loc 1 290 0 + orr w14, w14, w18 + .loc 1 294 0 + orr w13, w13, w2 + .loc 1 293 0 + ubfx x18, x1, 16, 4 + .loc 1 295 0 lsr w2, w0, 19 - .loc 1 292 0 + .loc 1 291 0 and w15, w15, 480 ubfx x30, x1, 8, 4 - .loc 1 297 0 - and w12, w12, 480 - .loc 1 294 0 - orr w18, w11, w18 .loc 1 296 0 + and w12, w12, 480 + .loc 1 293 0 + orr w18, w11, w18 + .loc 1 295 0 and w2, w2, 480 ubfx x11, x1, 24, 4 -.LBE1571: -.LBE1570: - .loc 1 363 0 +.LBE1633: +.LBE1632: + .loc 1 362 0 eor w3, w1, w0 -.LVL913: -.LBB1587: -.LBB1572: - .loc 1 292 0 +.LVL910: +.LBB1649: +.LBB1634: + .loc 1 291 0 orr w15, w15, w30 - .loc 1 297 0 - add w12, w12, w1, lsr 28 .loc 1 296 0 + add w12, w12, w1, lsr 28 + .loc 1 295 0 orr w11, w2, w11 -.LBE1572: -.LBE1587: -.LBE1602: -.LBE1607: - .loc 1 1566 0 +.LBE1634: +.LBE1649: +.LBE1664: +.LBE1669: + .loc 1 1565 0 cmp w1, w0 - beq .L822 -.LBB1608: -.LBB1603: - .loc 1 369 0 + beq .L824 +.LBB1670: +.LBB1665: + .loc 1 368 0 ands w0, w3, 15 -.LBB1588: -.LBB1573: - .loc 1 293 0 +.LBB1650: +.LBB1635: + .loc 1 292 0 ldrb w30, [x19, w16, uxtw] -.LBE1573: -.LBE1588: - .loc 1 369 0 +.LBE1635: +.LBE1650: + .loc 1 368 0 csel w0, w0, w5, eq - .loc 1 371 0 + .loc 1 370 0 tst w3, 240 orr w1, w0, 192 -.LBB1589: -.LBB1574: - .loc 1 290 0 +.LBB1651: +.LBB1636: + .loc 1 289 0 ldrb w16, [x19, w17, uxtw] -.LBE1574: -.LBE1589: - .loc 1 371 0 +.LBE1636: +.LBE1651: + .loc 1 370 0 csel w0, w1, w0, ne - .loc 1 373 0 + .loc 1 372 0 tst w3, 3840 orr w1, w0, 3072 -.LBB1590: -.LBB1575: - .loc 1 292 0 +.LBB1652: +.LBB1637: + .loc 1 291 0 ldrb w2, [x19, w15, uxtw] -.LBE1575: -.LBE1590: - .loc 1 373 0 +.LBE1637: +.LBE1652: + .loc 1 372 0 csel w0, w1, w0, ne - .loc 1 375 0 + .loc 1 374 0 tst w3, 61440 orr w1, w0, 49152 -.LBB1591: -.LBB1576: - .loc 1 291 0 +.LBB1653: +.LBB1638: + .loc 1 290 0 ldrb w15, [x19, w14, uxtw] -.LBE1576: -.LBE1591: - .loc 1 375 0 +.LBE1638: +.LBE1653: + .loc 1 374 0 csel w0, w1, w0, ne - .loc 1 377 0 + .loc 1 376 0 tst w3, 983040 orr w1, w0, 786432 -.LBB1592: -.LBB1577: - .loc 1 295 0 - ldrb w14, [x19, w13, uxtw] -.LBE1577: -.LBE1592: - .loc 1 377 0 - csel w0, w1, w0, ne -.LBB1593: -.LBB1578: - .loc 1 297 0 - ldrb w12, [x19, w12, uxtw] -.LBE1578: -.LBE1593: - .loc 1 379 0 - tst w3, 15728640 -.LBB1594: -.LBB1579: +.LBB1654: +.LBB1639: .loc 1 294 0 - ldrb w13, [x19, w18, uxtw] -.LBE1579: -.LBE1594: - .loc 1 379 0 - orr w1, w0, 12582912 -.LBB1595: -.LBB1580: - .loc 1 296 0 - ldrb w11, [x19, w11, uxtw] -.LBE1580: -.LBE1595: - .loc 1 379 0 + ldrb w14, [x19, w13, uxtw] +.LBE1639: +.LBE1654: + .loc 1 376 0 csel w0, w1, w0, ne -.LBB1596: -.LBB1581: - .loc 1 290 0 - lsl w16, w16, 2 +.LBB1655: +.LBB1640: + .loc 1 296 0 + ldrb w12, [x19, w12, uxtw] +.LBE1640: +.LBE1655: + .loc 1 378 0 + tst w3, 15728640 +.LBB1656: +.LBB1641: .loc 1 293 0 - lsl w1, w30, 14 -.LBE1581: -.LBE1596: - .loc 1 381 0 - tst w3, 251658240 -.LBB1597: -.LBB1582: - .loc 1 297 0 - orr w1, w1, w2, lsl 10 -.LBE1582: -.LBE1597: - .loc 1 381 0 - orr w17, w0, 201326592 -.LBB1598: -.LBB1583: + ldrb w13, [x19, w18, uxtw] +.LBE1641: +.LBE1656: + .loc 1 378 0 + orr w1, w0, 12582912 +.LBB1657: +.LBB1642: .loc 1 295 0 + ldrb w11, [x19, w11, uxtw] +.LBE1642: +.LBE1657: + .loc 1 378 0 + csel w0, w1, w0, ne +.LBB1658: +.LBB1643: + .loc 1 289 0 + lsl w16, w16, 2 + .loc 1 292 0 + lsl w1, w30, 14 +.LBE1643: +.LBE1658: + .loc 1 380 0 + tst w3, 251658240 +.LBB1659: +.LBB1644: + .loc 1 296 0 + orr w1, w1, w2, lsl 10 +.LBE1644: +.LBE1659: + .loc 1 380 0 + orr w17, w0, 201326592 +.LBB1660: +.LBB1645: + .loc 1 294 0 lsl w2, w14, 22 - .loc 1 297 0 + .loc 1 296 0 orr w15, w16, w15, lsl 6 -.LBE1583: -.LBE1598: - .loc 1 381 0 +.LBE1645: +.LBE1660: + .loc 1 380 0 csel w0, w17, w0, ne -.LBB1599: -.LBB1584: - .loc 1 297 0 +.LBB1661: +.LBB1646: + .loc 1 296 0 orr w13, w2, w13, lsl 18 orr w1, w1, w15 lsl w2, w12, 30 -.LBE1584: -.LBE1599: - .loc 1 383 0 +.LBE1646: +.LBE1661: + .loc 1 382 0 tst w3, -268435456 orr w12, w0, -1073741824 -.LBB1600: -.LBB1585: - .loc 1 297 0 +.LBB1662: +.LBB1647: + .loc 1 296 0 orr w3, w2, w11, lsl 26 -.LVL914: +.LVL911: orr w1, w1, w13 -.LBE1585: -.LBE1600: -.LBE1603: -.LBE1608: - .loc 1 1567 0 +.LBE1647: +.LBE1662: +.LBE1665: +.LBE1670: + .loc 1 1566 0 ldr w2, [x4, x10, lsl 2] -.LBB1609: -.LBB1604: - .loc 1 383 0 +.LBB1671: +.LBB1666: + .loc 1 382 0 csel w0, w12, w0, ne -.LBB1601: -.LBB1586: - .loc 1 297 0 +.LBB1663: +.LBB1648: + .loc 1 296 0 orr w1, w1, w3 -.LBE1586: -.LBE1601: - .loc 1 385 0 +.LBE1648: +.LBE1663: + .loc 1 384 0 and w0, w1, w0 -.LBE1604: -.LBE1609: - .loc 1 1567 0 +.LBE1666: +.LBE1671: + .loc 1 1566 0 orr w0, w2, w0 str w0, [x4, x10, lsl 2] -.LVL915: -.L822: +.LVL912: +.L824: add x10, x10, 1 - .loc 1 1563 0 + .loc 1 1562 0 cmp w20, w10 - bgt .L831 + bgt .L833 add x24, x24, x7 add x25, x25, x7 -.L811: - .loc 1 1554 0 +.L813: + .loc 1 1553 0 add w21, w21, 2 add w8, w8, w9 cmp w23, w21 - bgt .L832 -.L806: - .loc 1 1571 0 + bgt .L834 +.L808: + .loc 1 1570 0 ldp x19, x20, [sp, 16] -.LVL916: +.LVL913: ldp x21, x22, [sp, 32] -.LVL917: +.LVL914: ldp x23, x24, [sp, 48] -.LVL918: +.LVL915: ldp x25, x26, [sp, 64] -.LVL919: +.LVL916: ldp x29, x30, [sp], 80 .cfi_remember_state .cfi_restore 30 @@ -8917,36 +9043,36 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL920: -.L871: +.LVL917: +.L873: .cfi_restore_state - .loc 1 1543 0 + .loc 1 1542 0 add w23, w23, w23, lsr 31 -.LVL921: +.LVL918: lsr w26, w9, 2 asr w23, w23, 1 -.LVL922: +.LVL919: mov x0, 0 - .loc 1 1542 0 + .loc 1 1541 0 mov w21, 0 -.LVL923: - b .L808 -.LVL924: -.L809: - .loc 1 1545 0 +.LVL920: + b .L810 +.LVL921: +.L811: + .loc 1 1544 0 add w21, w23, w23, lsr 31 lsr w26, w9, 2 asr w21, w21, 1 -.LVL925: - .loc 1 1546 0 +.LVL922: + .loc 1 1545 0 mul w1, w20, w21 mul w0, w21, w26 sbfiz x1, x1, 2, 32 sxtw x0, w0 add x24, x24, x1 - .loc 1 1547 0 + .loc 1 1546 0 add x25, x2, x1 - b .L808 + b .L810 .cfi_endproc .LFE2883: .size direct_mode_data_change_part2.isra.8, .-direct_mode_data_change_part2.isra.8 @@ -8955,37 +9081,37 @@ .type direct_mode_data_change_part.isra.9, %function direct_mode_data_change_part.isra.9: .LFB2884: - .loc 1 1439 0 + .loc 1 1438 0 .cfi_startproc -.LVL926: +.LVL923: stp x29, x30, [sp, -96]! .cfi_def_cfa_offset 96 .cfi_offset 29, -96 .cfi_offset 30, -88 - .loc 1 1441 0 + .loc 1 1440 0 adrp x7, .LANCHOR0 - .loc 1 1439 0 + .loc 1 1438 0 and w3, w3, 255 - .loc 1 1452 0 + .loc 1 1451 0 cmp w6, 2 - .loc 1 1445 0 + .loc 1 1444 0 sub w4, w3, w4 -.LVL927: - .loc 1 1439 0 +.LVL924: + .loc 1 1438 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 1441 0 + .loc 1 1440 0 ldr x3, [x7, #:lo12:.LANCHOR0] - .loc 1 1439 0 + .loc 1 1438 0 stp x23, x24, [sp, 48] - .loc 1 1446 0 + .loc 1 1445 0 lsl w4, w4, 10 -.LVL928: +.LVL925: .cfi_offset 23, -48 .cfi_offset 24, -40 - .loc 1 1449 0 + .loc 1 1448 0 add x23, x3, 24 - .loc 1 1439 0 + .loc 1 1438 0 stp x19, x20, [sp, 16] stp x21, x22, [sp, 32] .cfi_offset 19, -80 @@ -8999,36 +9125,36 @@ stp x25, x26, [sp, 64] .cfi_offset 25, -32 .cfi_offset 26, -24 - .loc 1 1439 0 + .loc 1 1438 0 mov x21, x2 - .loc 1 1446 0 + .loc 1 1445 0 add x19, x5, x4, sxtw -.LVL929: - .loc 1 1450 0 - ldp w10, w0, [x23, 84] -.LVL930: +.LVL926: .loc 1 1449 0 + ldp w10, w0, [x23, 84] +.LVL927: + .loc 1 1448 0 lsr w22, w10, 3 - .loc 1 1452 0 - beq .L910 + .loc 1 1451 0 + beq .L912 mov w25, w0 -.LVL931: - .loc 1 1455 0 +.LVL928: + .loc 1 1454 0 cmp w6, 3 - .loc 1 1460 0 + .loc 1 1459 0 mov w24, 0 -.LVL932: - .loc 1 1455 0 - beq .L911 -.L874: - .loc 1 1464 0 - ldr w1, [x23, 156] +.LVL929: + .loc 1 1454 0 + beq .L913 +.L876: .loc 1 1463 0 + ldr w1, [x23, 156] + .loc 1 1462 0 lsr w26, w10, 2 -.LVL933: +.LVL930: + .loc 1 1463 0 + cbz w1, .L877 .loc 1 1464 0 - cbz w1, .L875 - .loc 1 1465 0 sub w2, w25, w24 sub w0, w0, w25 mov w1, 0 @@ -9037,303 +9163,303 @@ sxtw x2, w2 add x0, x27, x0 bl memset -.LVL934: - .loc 1 1466 0 +.LVL931: + .loc 1 1465 0 ldr w0, [x23, 88] sub w0, w0, #1 sub w0, w0, w24 mul w0, w0, w26 neg w26, w26 add x27, x27, x0 -.L878: - .loc 1 1473 0 +.L880: + .loc 1 1472 0 cmp w25, w24 - ble .L872 + ble .L874 sub w9, w22, #1 sxtw x10, w26 add x9, x9, 1 -.LBB1610: -.LBB1611: - .loc 1 302 0 +.LBB1672: +.LBB1673: + .loc 1 301 0 mov w8, 3 lsl x9, x9, 2 -.LVL935: +.LVL932: .p2align 2 -.L877: -.LBE1611: -.LBE1610: - .loc 1 1474 0 +.L879: +.LBE1673: +.LBE1672: + .loc 1 1473 0 mov x4, 0 - cbz w22, .L890 + cbz w22, .L892 .p2align 2 -.L907: - .loc 1 1476 0 - ldr w0, [x21, x4, lsl 2] -.LVL936: +.L909: .loc 1 1475 0 + ldr w0, [x21, x4, lsl 2] +.LVL933: + .loc 1 1474 0 ldr w1, [x20, x4, lsl 2] -.LVL937: -.LBB1650: -.LBB1648: -.LBB1612: -.LBB1613: - .loc 1 270 0 +.LVL934: +.LBB1712: +.LBB1710: +.LBB1674: +.LBB1675: + .loc 1 269 0 lsr w15, w0, 11 - .loc 1 268 0 + .loc 1 267 0 lsr w13, w0, 3 -.LVL938: - .loc 1 270 0 +.LVL935: + .loc 1 269 0 ubfx x7, x1, 16, 4 and w15, w15, 480 - .loc 1 272 0 + .loc 1 271 0 lsr w2, w0, 19 - .loc 1 268 0 + .loc 1 267 0 ubfx x5, x1, 8, 4 - .loc 1 272 0 + .loc 1 271 0 and w2, w2, 480 - .loc 1 269 0 + .loc 1 268 0 lsr w12, w0, 7 - .loc 1 267 0 + .loc 1 266 0 lsl w6, w0, 1 - .loc 1 268 0 + .loc 1 267 0 and w13, w13, 480 - .loc 1 270 0 + .loc 1 269 0 orr w15, w15, w7 - .loc 1 272 0 + .loc 1 271 0 ubfx x7, x1, 24, 4 - .loc 1 269 0 - ubfx x16, x1, 12, 4 - .loc 1 267 0 - and w6, w6, 480 - .loc 1 269 0 - and w12, w12, 480 - .loc 1 267 0 - ubfx x11, x1, 4, 4 .loc 1 268 0 - orr w13, w13, w5 - .loc 1 272 0 - orr w7, w2, w7 - .loc 1 271 0 - lsr w5, w0, 15 - .loc 1 273 0 - lsr w2, w0, 23 - .loc 1 271 0 - and w5, w5, 480 + ubfx x16, x1, 12, 4 .loc 1 266 0 - and w14, w1, 15 - .loc 1 269 0 - orr w12, w12, w16 + and w6, w6, 480 + .loc 1 268 0 + and w12, w12, 480 + .loc 1 266 0 + ubfx x11, x1, 4, 4 .loc 1 267 0 - orr w11, w6, w11 - .loc 1 273 0 - and w2, w2, 480 + orr w13, w13, w5 .loc 1 271 0 - ubfx x6, x1, 20, 4 - .loc 1 266 0 - ubfiz w16, w0, 5, 4 - .loc 1 271 0 - orr w6, w5, w6 -.LBE1613: -.LBE1612: - .loc 1 303 0 - eor w3, w1, w0 -.LBB1631: -.LBB1614: - .loc 1 273 0 - add w5, w2, w1, lsr 28 - .loc 1 266 0 - orr w14, w16, w14 -.LBE1614: -.LBE1631: -.LBE1648: -.LBE1650: - .loc 1 1477 0 - cmp w1, w0 - beq .L879 -.LBB1651: -.LBB1649: - .loc 1 302 0 - tst x3, 15 -.LBB1632: -.LBB1615: + orr w7, w2, w7 .loc 1 270 0 - ldrb w1, [x19, w15, uxtw] -.LVL939: -.LBE1615: -.LBE1632: + lsr w5, w0, 15 + .loc 1 272 0 + lsr w2, w0, 23 + .loc 1 270 0 + and w5, w5, 480 + .loc 1 265 0 + and w14, w1, 15 + .loc 1 268 0 + orr w12, w12, w16 + .loc 1 266 0 + orr w11, w6, w11 + .loc 1 272 0 + and w2, w2, 480 + .loc 1 270 0 + ubfx x6, x1, 20, 4 + .loc 1 265 0 + ubfiz w16, w0, 5, 4 + .loc 1 270 0 + orr w6, w5, w6 +.LBE1675: +.LBE1674: .loc 1 302 0 + eor w3, w1, w0 +.LBB1693: +.LBB1676: + .loc 1 272 0 + add w5, w2, w1, lsr 28 + .loc 1 265 0 + orr w14, w16, w14 +.LBE1676: +.LBE1693: +.LBE1710: +.LBE1712: + .loc 1 1476 0 + cmp w1, w0 + beq .L881 +.LBB1713: +.LBB1711: + .loc 1 301 0 + tst x3, 15 +.LBB1694: +.LBB1677: + .loc 1 269 0 + ldrb w1, [x19, w15, uxtw] +.LVL936: +.LBE1677: +.LBE1694: + .loc 1 301 0 csel w0, w8, wzr, ne -.LVL940: - .loc 1 311 0 +.LVL937: + .loc 1 310 0 tst w3, 240 orr w2, w0, 12 -.LBB1633: -.LBB1616: - .loc 1 268 0 +.LBB1695: +.LBB1678: + .loc 1 267 0 ldrb w13, [x19, w13, uxtw] -.LBE1616: -.LBE1633: - .loc 1 311 0 +.LBE1678: +.LBE1695: + .loc 1 310 0 csel w0, w2, w0, ne - .loc 1 313 0 + .loc 1 312 0 tst w3, 3840 orr w15, w0, 48 -.LBB1634: -.LBB1617: - .loc 1 269 0 +.LBB1696: +.LBB1679: + .loc 1 268 0 ldrb w2, [x19, w12, uxtw] -.LBE1617: -.LBE1634: - .loc 1 313 0 +.LBE1679: +.LBE1696: + .loc 1 312 0 csel w0, w15, w0, ne - .loc 1 315 0 + .loc 1 314 0 tst w3, 61440 orr w15, w0, 192 -.LBB1635: -.LBB1618: - .loc 1 267 0 +.LBB1697: +.LBB1680: + .loc 1 266 0 ldrb w12, [x19, w11, uxtw] -.LBE1618: -.LBE1635: - .loc 1 315 0 +.LBE1680: +.LBE1697: + .loc 1 314 0 and w15, w15, 65535 -.LBB1636: -.LBB1619: - .loc 1 272 0 - ldrb w11, [x19, w7, uxtw] -.LBE1619: -.LBE1636: - .loc 1 315 0 - csel w0, w15, w0, ne -.LBB1637: -.LBB1620: +.LBB1698: +.LBB1681: .loc 1 271 0 + ldrb w11, [x19, w7, uxtw] +.LBE1681: +.LBE1698: + .loc 1 314 0 + csel w0, w15, w0, ne +.LBB1699: +.LBB1682: + .loc 1 270 0 ldrb w7, [x19, w6, uxtw] -.LBE1620: -.LBE1637: - .loc 1 317 0 +.LBE1682: +.LBE1699: + .loc 1 316 0 orr w15, w0, 768 tst w3, 983040 and w6, w15, 65535 -.LBB1638: -.LBB1621: - .loc 1 273 0 +.LBB1700: +.LBB1683: + .loc 1 272 0 ldrb w5, [x19, w5, uxtw] -.LBE1621: -.LBE1638: - .loc 1 317 0 +.LBE1683: +.LBE1700: + .loc 1 316 0 csel w0, w6, w0, ne - .loc 1 319 0 + .loc 1 318 0 tst w3, 15728640 orr w6, w0, 3072 -.LBB1639: -.LBB1622: - .loc 1 266 0 +.LBB1701: +.LBB1684: + .loc 1 265 0 ldrb w14, [x19, w14, uxtw] -.LBE1622: -.LBE1639: - .loc 1 319 0 +.LBE1684: +.LBE1701: + .loc 1 318 0 and w6, w6, 65535 -.LBB1640: -.LBB1623: - .loc 1 270 0 +.LBB1702: +.LBB1685: + .loc 1 269 0 lsl w1, w1, 8 -.LBE1623: -.LBE1640: - .loc 1 319 0 +.LBE1685: +.LBE1702: + .loc 1 318 0 csel w0, w6, w0, ne -.LBB1641: -.LBB1624: - .loc 1 268 0 +.LBB1703: +.LBB1686: + .loc 1 267 0 lsl w6, w13, 4 -.LBE1624: -.LBE1641: - .loc 1 321 0 +.LBE1686: +.LBE1703: + .loc 1 320 0 orr w13, w0, 12288 tst w3, 251658240 and w13, w13, 65535 -.LBB1642: -.LBB1625: - .loc 1 273 0 - orr w1, w1, w2, lsl 6 -.LBE1625: -.LBE1642: - .loc 1 321 0 - csel w0, w13, w0, ne -.LBB1643: -.LBB1626: - .loc 1 273 0 - orr w12, w6, w12, lsl 2 +.LBB1704: +.LBB1687: .loc 1 272 0 + orr w1, w1, w2, lsl 6 +.LBE1687: +.LBE1704: + .loc 1 320 0 + csel w0, w13, w0, ne +.LBB1705: +.LBB1688: + .loc 1 272 0 + orr w12, w6, w12, lsl 2 + .loc 1 271 0 lsl w11, w11, 12 -.LBE1626: -.LBE1643: - .loc 1 323 0 +.LBE1688: +.LBE1705: + .loc 1 322 0 orr w6, w0, -16384 -.LBB1644: -.LBB1627: - .loc 1 273 0 +.LBB1706: +.LBB1689: + .loc 1 272 0 orr w1, w1, w12 orr w7, w11, w7, lsl 10 -.LBE1627: -.LBE1644: - .loc 1 323 0 +.LBE1689: +.LBE1706: + .loc 1 322 0 tst w3, -268435456 -.LBB1645: -.LBB1628: - .loc 1 273 0 +.LBB1707: +.LBB1690: + .loc 1 272 0 orr w1, w1, w7 -.LBE1628: -.LBE1645: - .loc 1 323 0 +.LBE1690: +.LBE1707: + .loc 1 322 0 and w3, w6, 65535 -.LVL941: -.LBB1646: -.LBB1629: - .loc 1 273 0 +.LVL938: +.LBB1708: +.LBB1691: + .loc 1 272 0 orr w2, w14, w5, lsl 14 -.LBE1629: -.LBE1646: - .loc 1 323 0 +.LBE1691: +.LBE1708: + .loc 1 322 0 csel w0, w3, w0, ne -.LBB1647: -.LBB1630: - .loc 1 273 0 +.LBB1709: +.LBB1692: + .loc 1 272 0 orr w1, w1, w2 -.LBE1630: -.LBE1647: - .loc 1 325 0 +.LBE1692: +.LBE1709: + .loc 1 324 0 and w0, w0, w1 -.LBE1649: -.LBE1651: - .loc 1 1478 0 +.LBE1711: +.LBE1713: + .loc 1 1477 0 strh w0, [x27, x4, lsl 1] -.LVL942: -.L879: +.LVL939: +.L881: add x4, x4, 1 - .loc 1 1474 0 + .loc 1 1473 0 cmp w22, w4 - bgt .L907 + bgt .L909 add x20, x20, x9 add x21, x21, x9 -.L890: - .loc 1 1473 0 +.L892: + .loc 1 1472 0 add w24, w24, 1 add x27, x27, x10 cmp w25, w24 - bne .L877 -.L872: - .loc 1 1482 0 + bne .L879 +.L874: + .loc 1 1481 0 ldp x19, x20, [sp, 16] -.LVL943: +.LVL940: ldp x21, x22, [sp, 32] -.LVL944: +.LVL941: ldp x23, x24, [sp, 48] -.LVL945: +.LVL942: ldp x25, x26, [sp, 64] -.LVL946: +.LVL943: ldr x27, [sp, 80] -.LVL947: +.LVL944: ldp x29, x30, [sp], 96 .cfi_remember_state .cfi_restore 30 @@ -9349,48 +9475,48 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL948: -.L875: +.LVL945: +.L877: .cfi_restore_state - .loc 1 1470 0 - sub w2, w25, w24 .loc 1 1469 0 + sub w2, w25, w24 + .loc 1 1468 0 mul w23, w26, w24 - .loc 1 1470 0 + .loc 1 1469 0 mov w1, 0 mul w2, w2, w26 - .loc 1 1469 0 + .loc 1 1468 0 add x27, x27, x23, sxtw - .loc 1 1470 0 + .loc 1 1469 0 mov x0, x27 sxtw x2, w2 bl memset -.LVL949: - b .L878 -.LVL950: -.L910: - .loc 1 1454 0 - add w25, w0, w0, lsr 31 +.LVL946: + b .L880 +.LVL947: +.L912: .loc 1 1453 0 + add w25, w0, w0, lsr 31 + .loc 1 1452 0 mov w24, 0 -.LVL951: - .loc 1 1454 0 +.LVL948: + .loc 1 1453 0 asr w25, w25, 1 -.LVL952: - b .L874 -.L911: - .loc 1 1456 0 +.LVL949: + b .L876 +.L913: + .loc 1 1455 0 add w24, w0, w0, lsr 31 -.LVL953: +.LVL950: asr w24, w24, 1 -.LVL954: - .loc 1 1457 0 +.LVL951: + .loc 1 1456 0 mul w1, w22, w24 sbfiz x1, x1, 2, 32 add x20, x20, x1 - .loc 1 1458 0 + .loc 1 1457 0 add x21, x2, x1 - b .L874 + b .L876 .cfi_endproc .LFE2884: .size direct_mode_data_change_part.isra.9, .-direct_mode_data_change_part.isra.9 @@ -9399,9 +9525,9 @@ .type ebc_frame_start, %function ebc_frame_start: .LFB2835: - .loc 1 1641 0 + .loc 1 1640 0 .cfi_startproc -.LVL955: +.LVL952: stp x29, x30, [sp, -48]! .cfi_def_cfa_offset 48 .cfi_offset 29, -48 @@ -9411,361 +9537,347 @@ stp x19, x20, [sp, 16] .cfi_offset 19, -32 .cfi_offset 20, -24 - .loc 1 1643 0 + .loc 1 1642 0 add x19, x0, 192 - .loc 1 1641 0 + .loc 1 1640 0 str x21, [sp, 32] .cfi_offset 21, -16 - .loc 1 1641 0 + .loc 1 1640 0 mov x20, x0 - .loc 1 1642 0 + .loc 1 1641 0 add x21, x0, 24 - .loc 1 1645 0 - ldr w6, [x19, 264] + .loc 1 1644 0 + ldr w6, [x19, 252] cmp w6, 3 - beq .L914 + beq .L916 cmp w6, 4 - beq .L915 + beq .L917 cmp w6, 1 - beq .L936 - .loc 1 1751 0 + beq .L940 + .loc 1 1750 0 ldrb w4, [x19, 56] str w4, [x19, 72] - .loc 1 1754 0 - ldp x2, x1, [x19, 224] - .loc 1 1752 0 - ldr w0, [x21, 164] .loc 1 1753 0 - ldr x5, [x20, 320] + ldp x2, x1, [x19, 216] + .loc 1 1751 0 + ldr w0, [x21, 164] .loc 1 1752 0 - cbnz w0, .L937 - .loc 1 1759 0 - ldr x1, [x1, 16] - mov w6, 1 - ldr x2, [x2, 16] - mov w3, w4 - ldr x0, [x19, 192] - bl direct_mode_data_change.isra.2 -.LVL956: -.L931: -.LBB1652: -.LBB1653: - .loc 1 1586 0 - str wzr, [x21, 72] - .loc 1 1587 0 - mov x0, x21 - ldr w1, [x20, 224] - bl flip.isra.4 -.LVL957: -.LBE1653: -.LBE1652: - .loc 1 1765 0 - ldr w4, [x19, 72] - .loc 1 1768 0 - ldp x2, x1, [x19, 224] - .loc 1 1765 0 - sub w4, w4, #1 - str w4, [x19, 72] - .loc 1 1766 0 - ldr w0, [x21, 164] - .loc 1 1767 0 - ldrb w3, [x20, 248] ldr x5, [x20, 320] - .loc 1 1766 0 - cbnz w0, .L938 - .loc 1 1773 0 - ldr x0, [x19, 200] - mov w6, 1 - ldr x1, [x1, 16] - ldr x2, [x2, 16] - bl direct_mode_data_change.isra.2 -.LVL958: - .loc 1 1782 0 - ldr x21, [sp, 32] - ldp x19, x20, [sp, 16] -.LVL959: - ldp x29, x30, [sp], 48 - .cfi_remember_state - .cfi_restore 20 - .cfi_restore 19 - .cfi_restore 21 - .cfi_restore 29 - .cfi_restore 30 - .cfi_def_cfa 31, 0 - ret -.LVL960: - .p2align 3 -.L936: - .cfi_restore_state - .loc 1 1721 0 - ldrb w4, [x19, 56] - str w4, [x19, 72] - .loc 1 1725 0 - ldr x1, [x19, 224] - .loc 1 1722 0 - ldr w0, [x21, 164] -.LVL961: - cbnz w0, .L939 - .loc 1 1730 0 - ldr x0, [x19, 232] - .loc 1 1729 0 - mov w3, w4 - ldr x2, [x1, 16] - ldr x5, [x20, 320] - ldr x1, [x0, 16] - ldr x0, [x19, 192] - bl direct_mode_data_change_part.isra.9 -.LVL962: -.L928: -.LBB1654: -.LBB1655: - .loc 1 1586 0 - str wzr, [x21, 72] - .loc 1 1587 0 - mov x0, x21 - ldr w1, [x20, 224] - bl flip.isra.4 -.LVL963: -.LBE1655: -.LBE1654: - .loc 1 1736 0 - ldr w4, [x19, 72] - .loc 1 1739 0 - ldp x2, x1, [x19, 224] - .loc 1 1736 0 - sub w4, w4, #1 - str w4, [x19, 72] - .loc 1 1737 0 - ldr w0, [x21, 164] - .loc 1 1738 0 - ldrb w3, [x20, 248] - ldr x5, [x20, 320] - .loc 1 1737 0 - cbz w0, .L929 - .loc 1 1738 0 - ldr x0, [x19, 200] - mov w6, 1 - ldr x1, [x1, 16] - ldr x2, [x2, 16] - bl direct_mode_data_change_part2.isra.8 -.LVL964: - .loc 1 1782 0 - ldr x21, [sp, 32] - ldp x19, x20, [sp, 16] -.LVL965: - ldp x29, x30, [sp], 48 - .cfi_remember_state - .cfi_restore 20 - .cfi_restore 19 - .cfi_restore 21 - .cfi_restore 29 - .cfi_restore 30 - .cfi_def_cfa 31, 0 - ret -.LVL966: - .p2align 3 -.L915: - .cfi_restore_state - .loc 1 1647 0 - ldrsw x2, [x19, 32] - mov w1, 0 - ldr x0, [x19, 192] -.LVL967: - bl memset -.LVL968: - .loc 1 1648 0 - ldr w0, [x21, 164] - cbnz w0, .L940 - .loc 1 1656 0 - ldp x1, x2, [x19, 152] - mov x5, x19 - ldp x3, x4, [x19, 176] - ldr x0, [x19, 192] - bl get_overlay_image_area -.LVL969: -.L918: - .loc 1 1662 0 - ldr w0, [x19, 60] - cbz w0, .L919 -.LBB1656: -.LBB1657: - .loc 1 1586 0 - str wzr, [x21, 72] - .loc 1 1587 0 - mov x0, x21 - ldr w1, [x20, 224] - bl flip.isra.4 -.LVL970: -.LBE1657: -.LBE1656: - .loc 1 1664 0 - ldrsw x2, [x19, 32] - mov w1, 0 - ldr x0, [x19, 200] - bl memset -.LVL971: - .loc 1 1665 0 - ldr w0, [x21, 164] - cbz w0, .L920 - .loc 1 1666 0 - ldp x1, x2, [x19, 152] - mov x4, x19 - ldr x3, [x19, 176] - ldr x0, [x19, 200] - bl get_overlay_image_area2.isra.0 -.LVL972: - b .L912 -.LVL973: - .p2align 3 -.L914: - .loc 1 1685 0 - ldr w0, [x21, 164] -.LVL974: - .loc 1 1686 0 - ldp x1, x2, [x19, 152] - ldr x3, [x19, 176] - .loc 1 1685 0 + .loc 1 1751 0 cbnz w0, .L941 - .loc 1 1693 0 - ldr x0, [x19, 192] - mov w5, 1 - mov x4, x19 - bl get_auto_image -.LVL975: -.L923: - .loc 1 1699 0 - ldr w0, [x19, 60] - cbz w0, .L924 - .loc 1 1700 0 + .loc 1 1758 0 + ldr x1, [x1, 16] + mov w3, w4 + ldr x2, [x2, 16] + mov w6, 1 + ldr x0, [x19, 184] + bl direct_mode_data_change.isra.2 +.LVL953: + .loc 1 1763 0 + ldr w4, [x19, 72] + .loc 1 1766 0 + ldp x2, x1, [x19, 216] + .loc 1 1763 0 + sub w4, w4, #1 + str w4, [x19, 72] + .loc 1 1764 0 ldr w0, [x21, 164] - .loc 1 1701 0 - ldp x1, x2, [x19, 152] - ldr x3, [x19, 176] - .loc 1 1700 0 - cbz w0, .L925 - .loc 1 1701 0 - ldr x0, [x19, 200] - mov w5, 1 - mov x4, x19 - bl get_auto_image2 -.LVL976: -.L926: -.LBB1658: -.LBB1659: - .loc 1 1586 0 - str wzr, [x21, 72] - .loc 1 1587 0 - mov x0, x21 - ldr w1, [x20, 224] - bl flip.isra.4 -.LVL977: -.L912: -.LBE1659: -.LBE1658: - .loc 1 1782 0 - ldp x19, x20, [sp, 16] -.LVL978: - ldr x21, [sp, 32] - ldp x29, x30, [sp], 48 - .cfi_remember_state - .cfi_restore 30 - .cfi_restore 29 - .cfi_restore 21 - .cfi_restore 19 - .cfi_restore 20 - .cfi_def_cfa 31, 0 - ret -.LVL979: - .p2align 3 -.L941: - .cfi_restore_state - .loc 1 1686 0 + .loc 1 1765 0 + ldrb w3, [x20, 248] + ldr x5, [x20, 320] + .loc 1 1764 0 + cbz w0, .L935 +.L946: + .loc 1 1765 0 + ldr x1, [x1, 16] + mov w6, 1 + ldr x2, [x2, 16] ldr x0, [x19, 192] - mov w5, 1 - mov x4, x19 - bl get_auto_image2 -.LVL980: - b .L923 + bl direct_mode_data_change2.isra.3 +.LVL954: + b .L936 .p2align 3 .L940: - .loc 1 1649 0 - ldp x1, x2, [x19, 152] - mov x4, x19 - ldr x3, [x19, 176] - ldr x0, [x19, 192] - bl get_overlay_image_area2.isra.0 -.LVL981: - b .L918 - .p2align 3 -.L939: + .loc 1 1720 0 + ldrb w4, [x19, 56] + str w4, [x19, 72] .loc 1 1724 0 - ldr x0, [x19, 232] - .loc 1 1723 0 + ldr x1, [x19, 216] + .loc 1 1721 0 + ldr w0, [x21, 164] +.LVL955: + cbnz w0, .L942 + .loc 1 1729 0 + ldr x0, [x19, 224] + .loc 1 1728 0 mov w3, w4 ldr x2, [x1, 16] ldr x5, [x20, 320] ldr x1, [x0, 16] + ldr x0, [x19, 184] + bl direct_mode_data_change_part.isra.9 +.LVL956: + .loc 1 1734 0 + ldr w4, [x19, 72] + .loc 1 1737 0 + ldp x2, x1, [x19, 216] + .loc 1 1734 0 + sub w4, w4, #1 + str w4, [x19, 72] + .loc 1 1735 0 + ldr w0, [x21, 164] + .loc 1 1736 0 + ldrb w3, [x20, 248] + ldr x5, [x20, 320] + .loc 1 1735 0 + cbz w0, .L931 +.L945: + .loc 1 1736 0 + ldr x1, [x1, 16] + mov w6, 1 + ldr x2, [x2, 16] ldr x0, [x19, 192] bl direct_mode_data_change_part2.isra.8 -.LVL982: - b .L928 +.LVL957: + b .L936 +.LVL958: .p2align 3 -.L937: - .loc 1 1753 0 - ldr x1, [x1, 16] - mov w6, 1 - ldr x2, [x2, 16] - mov w3, w4 +.L917: + .loc 1 1646 0 + ldrsw x2, [x19, 32] + mov w1, 0 + ldr x0, [x19, 184] +.LVL959: + bl memset +.LVL960: + .loc 1 1647 0 + ldr w0, [x21, 164] + cbnz w0, .L943 + .loc 1 1655 0 + ldp x1, x2, [x19, 152] + mov x5, x19 + ldp x3, x4, [x19, 168] + ldr x0, [x19, 184] + bl get_overlay_image_area +.LVL961: +.L920: + .loc 1 1661 0 + ldr w0, [x19, 60] + cbz w0, .L921 +.LBB1714: +.LBB1715: + .loc 1 1585 0 + str wzr, [x21, 72] + .loc 1 1586 0 + mov x0, x21 + ldr w1, [x20, 224] + bl flip.isra.4 +.LVL962: +.LBE1715: +.LBE1714: + .loc 1 1663 0 + ldrsw x2, [x19, 32] + mov w1, 0 ldr x0, [x19, 192] - bl direct_mode_data_change2.isra.3 -.LVL983: - b .L931 + bl memset +.LVL963: + .loc 1 1664 0 + ldr w0, [x21, 164] + cbz w0, .L922 + .loc 1 1665 0 + ldp x1, x2, [x19, 152] + mov x4, x19 + ldr x3, [x19, 168] + ldr x0, [x19, 192] + bl get_overlay_image_area2.isra.0 +.LVL964: + b .L914 +.LVL965: .p2align 3 -.L929: - .loc 1 1744 0 - ldr x0, [x19, 200] - mov w6, 1 - ldr x1, [x1, 16] - ldr x2, [x2, 16] - bl direct_mode_data_change_part.isra.9 -.LVL984: - .loc 1 1782 0 - ldr x21, [sp, 32] - ldp x19, x20, [sp, 16] -.LVL985: - ldp x29, x30, [sp], 48 - .cfi_remember_state - .cfi_restore 20 - .cfi_restore 19 - .cfi_restore 21 - .cfi_restore 29 - .cfi_restore 30 - .cfi_def_cfa 31, 0 - ret -.LVL986: - .p2align 3 -.L925: - .cfi_restore_state - .loc 1 1708 0 - ldr x0, [x19, 200] +.L916: + .loc 1 1684 0 + ldr w0, [x21, 164] +.LVL966: + .loc 1 1685 0 + ldp x1, x2, [x19, 152] + ldr x3, [x19, 168] + .loc 1 1684 0 + cbnz w0, .L944 + .loc 1 1692 0 + ldr x0, [x19, 184] mov w5, 1 mov x4, x19 bl get_auto_image -.LVL987: - b .L926 +.LVL967: +.L925: + .loc 1 1698 0 + ldr w0, [x19, 60] + cbz w0, .L926 + .loc 1 1699 0 + ldr w0, [x21, 164] + .loc 1 1700 0 + ldp x1, x2, [x19, 152] + ldr x3, [x19, 168] + .loc 1 1699 0 + cbz w0, .L927 + .loc 1 1700 0 + ldr x0, [x19, 192] + mov w5, 1 + mov x4, x19 + bl get_auto_image2 +.LVL968: + .p2align 2 +.L936: +.LBB1716: +.LBB1717: + .loc 1 1585 0 + str wzr, [x21, 72] + .loc 1 1586 0 + mov x0, x21 + ldr w1, [x20, 224] + bl flip.isra.4 +.LVL969: +.L914: +.LBE1717: +.LBE1716: + .loc 1 1781 0 + ldp x19, x20, [sp, 16] +.LVL970: + ldr x21, [sp, 32] + ldp x29, x30, [sp], 48 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL971: .p2align 3 -.L938: - .loc 1 1767 0 +.L944: + .cfi_restore_state + .loc 1 1685 0 + ldr x0, [x19, 184] + mov w5, 1 + mov x4, x19 + bl get_auto_image2 +.LVL972: + b .L925 + .p2align 3 +.L943: + .loc 1 1648 0 + ldp x1, x2, [x19, 152] + mov x4, x19 + ldr x3, [x19, 168] + ldr x0, [x19, 184] + bl get_overlay_image_area2.isra.0 +.LVL973: + b .L920 + .p2align 3 +.L942: + .loc 1 1723 0 + ldr x0, [x19, 224] + .loc 1 1722 0 + mov w3, w4 + ldr x2, [x1, 16] + ldr x5, [x20, 320] + ldr x1, [x0, 16] + ldr x0, [x19, 184] + bl direct_mode_data_change_part2.isra.8 +.LVL974: + .loc 1 1734 0 + ldr w4, [x19, 72] + .loc 1 1737 0 + ldp x2, x1, [x19, 216] + .loc 1 1734 0 + sub w4, w4, #1 + str w4, [x19, 72] + .loc 1 1735 0 + ldr w0, [x21, 164] + .loc 1 1736 0 + ldrb w3, [x20, 248] + ldr x5, [x20, 320] + .loc 1 1735 0 + cbnz w0, .L945 +.L931: + .loc 1 1742 0 ldr x1, [x1, 16] mov w6, 1 ldr x2, [x2, 16] - ldr x0, [x19, 200] - bl direct_mode_data_change2.isra.3 -.LVL988: - b .L912 + ldr x0, [x19, 192] + bl direct_mode_data_change_part.isra.9 +.LVL975: + b .L936 .p2align 3 -.L919: +.L941: + .loc 1 1752 0 + ldr x1, [x1, 16] + mov w3, w4 + ldr x2, [x2, 16] + mov w6, 1 + ldr x0, [x19, 184] + bl direct_mode_data_change2.isra.3 +.LVL976: + .loc 1 1763 0 + ldr w4, [x19, 72] + .loc 1 1766 0 + ldp x2, x1, [x19, 216] + .loc 1 1763 0 + sub w4, w4, #1 + str w4, [x19, 72] + .loc 1 1764 0 + ldr w0, [x21, 164] + .loc 1 1765 0 + ldrb w3, [x20, 248] + ldr x5, [x20, 320] + .loc 1 1764 0 + cbnz w0, .L946 +.L935: + .loc 1 1771 0 + ldr x1, [x1, 16] + mov w6, 1 + ldr x2, [x2, 16] + ldr x0, [x19, 192] + bl direct_mode_data_change.isra.2 +.LVL977: + b .L936 + .p2align 3 +.L927: + .loc 1 1707 0 + ldr x0, [x19, 192] + mov w5, 1 + mov x4, x19 + bl get_auto_image +.LVL978: + b .L936 + .p2align 3 +.L921: + .loc 1 1679 0 + ldr x0, [x19, 104] + adrp x2, .LANCHOR3 + add x2, x2, :lo12:.LANCHOR3 + adrp x1, .LC33 + add x2, x2, 16 + add x1, x1, :lo12:.LC33 + bl _dev_info +.LVL979: .loc 1 1680 0 + str wzr, [x19, 52] + b .L914 + .p2align 3 +.L922: + .loc 1 1672 0 + ldp x1, x2, [x19, 152] + mov x5, x19 + ldp x3, x4, [x19, 168] + ldr x0, [x19, 192] + bl get_overlay_image_area +.LVL980: + b .L914 + .p2align 3 +.L926: + .loc 1 1715 0 ldr x0, [x19, 104] adrp x2, .LANCHOR3 add x2, x2, :lo12:.LANCHOR3 @@ -9773,34 +9885,10 @@ add x2, x2, 16 add x1, x1, :lo12:.LC34 bl _dev_info -.LVL989: - .loc 1 1681 0 - str wzr, [x19, 52] - b .L912 - .p2align 3 -.L920: - .loc 1 1673 0 - ldp x1, x2, [x19, 152] - mov x5, x19 - ldp x3, x4, [x19, 176] - ldr x0, [x19, 200] - bl get_overlay_image_area -.LVL990: - b .L912 - .p2align 3 -.L924: +.LVL981: .loc 1 1716 0 - ldr x0, [x19, 104] - adrp x2, .LANCHOR3 - add x2, x2, :lo12:.LANCHOR3 - adrp x1, .LC35 - add x2, x2, 16 - add x1, x1, :lo12:.LC35 - bl _dev_info -.LVL991: - .loc 1 1717 0 str wzr, [x19, 52] - b .L912 + b .L914 .cfi_endproc .LFE2835: .size ebc_frame_start, .-ebc_frame_start @@ -9809,18 +9897,18 @@ .type ebc_auto_assist_tast_function, %function ebc_auto_assist_tast_function: .LFB2836: - .loc 1 1786 0 + .loc 1 1785 0 .cfi_startproc -.LVL992: +.LVL982: stp x29, x30, [sp, -96]! .cfi_def_cfa_offset 96 .cfi_offset 29, -96 .cfi_offset 30, -88 - .loc 1 1787 0 - adrp x1, .LANCHOR0 .loc 1 1786 0 + adrp x1, .LANCHOR0 + .loc 1 1785 0 adrp x0, __stack_chk_guard -.LVL993: +.LVL983: add x0, x0, :lo12:__stack_chk_guard add x29, sp, 0 .cfi_def_cfa_register 29 @@ -9832,224 +9920,224 @@ .cfi_offset 22, -56 adrp x22, .LANCHOR1 stp x23, x24, [sp, 48] - .loc 1 1792 0 + .loc 1 1791 0 add x22, x22, :lo12:.LANCHOR1 - .loc 1 1786 0 + .loc 1 1785 0 str x25, [sp, 64] .cfi_offset 23, -48 .cfi_offset 24, -40 .cfi_offset 25, -32 - .loc 1 1792 0 + .loc 1 1791 0 add x20, x22, 328 - .loc 1 1787 0 + .loc 1 1786 0 ldr x25, [x1, #:lo12:.LANCHOR0] -.LVL994: - .loc 1 1865 0 +.LVL984: + .loc 1 1864 0 add x22, x22, 352 -.LBB1660: -.LBB1661: -.LBB1662: +.LBB1718: +.LBB1719: +.LBB1720: .file 12 "./include/linux/compiler.h" .loc 12 290 0 mov x24, 2 -.LBE1662: -.LBE1661: -.LBE1660: - .loc 1 1786 0 +.LBE1720: +.LBE1719: +.LBE1718: + .loc 1 1785 0 ldr x1, [x0] str x1, [x29, 88] mov x1,0 -.LBB1667: -.LBB1664: -.LBB1665: +.LBB1725: +.LBB1722: +.LBB1723: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x23, sp_el0 // 0 "" 2 -.LVL995: +.LVL985: #NO_APP -.LBE1665: -.LBE1664: -.LBE1667: - .loc 1 1789 0 +.LBE1723: +.LBE1722: +.LBE1725: + .loc 1 1788 0 add x19, x25, 192 add x21, x25, 24 - b .L952 + b .L957 .p2align 3 -.L964: - .loc 1 1797 0 +.L969: + .loc 1 1796 0 cmp w5, 4 - beq .L945 + beq .L950 cmp w5, 1 - beq .L963 - .loc 1 1849 0 + beq .L968 + .loc 1 1848 0 ldr w4, [x19, 72] - cbz w4, .L948 - .loc 1 1851 0 + cbz w4, .L953 + .loc 1 1850 0 ldr w0, [x21, 164] - cbz w0, .L951 - .loc 1 1852 0 + cbz w0, .L956 + .loc 1 1851 0 ldrsw x0, [x21, 72] mov w6, 3 - .loc 1 1853 0 - ldp x2, x1, [x19, 224] .loc 1 1852 0 - add x0, x0, 24 + ldp x2, x1, [x19, 216] + .loc 1 1851 0 + add x0, x19, x0, lsl 3 ldrb w3, [x25, 248] ldr x5, [x25, 320] - ldr x0, [x19, x0, lsl 3] ldr x1, [x1, 16] + ldr x0, [x0, 184] ldr x2, [x2, 16] bl direct_mode_data_change2.isra.3 -.LVL996: +.LVL986: .p2align 2 -.L948: - .loc 1 1865 0 +.L953: + .loc 1 1864 0 mov x0, x22 bl up -.LVL997: - .loc 1 1866 0 +.LVL987: + .loc 1 1865 0 mov x0, x20 bl up -.LVL998: - .loc 1 1867 0 +.LVL988: + .loc 1 1866 0 bl schedule -.LVL999: -.L952: - .loc 1 1792 0 +.LVL989: +.L957: + .loc 1 1791 0 mov x0, x20 bl down -.LVL1000: -.LBB1668: -.LBB1666: -.LBB1663: +.LVL990: +.LBB1726: +.LBB1724: +.LBB1721: .loc 12 290 0 str x24, [x23, 32] -.LBE1663: -.LBE1666: -.LBE1668: - .loc 1 1796 0 +.LBE1721: +.LBE1724: +.LBE1726: + .loc 1 1795 0 #APP -// 1796 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1 +// 1795 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1 dmb ish // 0 "" 2 - .loc 1 1797 0 + .loc 1 1796 0 #NO_APP - ldr w5, [x19, 264] + ldr w5, [x19, 252] cmp w5, 3 - bne .L964 - .loc 1 1817 0 + bne .L969 + .loc 1 1816 0 ldr w0, [x21, 164] - cbz w0, .L949 - .loc 1 1818 0 + cbz w0, .L954 + .loc 1 1817 0 ldrsw x0, [x21, 72] mov x4, x19 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldr x3, [x19, 176] - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] bl get_auto_image2 -.LVL1001: - b .L948 +.LVL991: + b .L953 .p2align 3 -.L963: - .loc 1 1833 0 +.L968: + .loc 1 1832 0 ldr w4, [x19, 72] - cbz w4, .L948 - .loc 1 1835 0 + cbz w4, .L953 + .loc 1 1834 0 ldr w0, [x21, 164] - cbz w0, .L950 - .loc 1 1836 0 + cbz w0, .L955 + .loc 1 1835 0 ldrsw x0, [x21, 72] mov w6, 3 - .loc 1 1837 0 - ldp x2, x1, [x19, 224] .loc 1 1836 0 - add x0, x0, 24 + ldp x2, x1, [x19, 216] + .loc 1 1835 0 + add x0, x19, x0, lsl 3 ldrb w3, [x25, 248] ldr x5, [x25, 320] - ldr x0, [x19, x0, lsl 3] ldr x1, [x1, 16] + ldr x0, [x0, 184] ldr x2, [x2, 16] bl direct_mode_data_change_part2.isra.8 -.LVL1002: - b .L948 +.LVL992: + b .L953 .p2align 3 -.L945: - .loc 1 1799 0 +.L950: + .loc 1 1798 0 ldr w0, [x21, 164] - cbz w0, .L947 - .loc 1 1800 0 + cbz w0, .L952 + .loc 1 1799 0 ldrsw x0, [x21, 72] mov w6, 3 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldp x3, x4, [x19, 176] mov x5, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] bl get_overlay_image2 -.LVL1003: - b .L948 +.LVL993: + b .L953 .p2align 3 -.L949: - .loc 1 1825 0 +.L954: + .loc 1 1824 0 ldrsw x0, [x21, 72] mov x4, x19 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldr x3, [x19, 176] - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] bl get_auto_image -.LVL1004: - b .L948 +.LVL994: + b .L953 .p2align 3 -.L947: - .loc 1 1808 0 +.L952: + .loc 1 1807 0 ldrsw x0, [x21, 72] mov w6, 3 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldp x3, x4, [x19, 176] mov x5, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] bl get_overlay_image -.LVL1005: - b .L948 +.LVL995: + b .L953 .p2align 3 -.L951: - .loc 1 1858 0 +.L956: + .loc 1 1857 0 ldrsw x0, [x21, 72] mov w6, 3 - .loc 1 1859 0 - ldp x2, x1, [x19, 224] .loc 1 1858 0 - add x0, x0, 24 + ldp x2, x1, [x19, 216] + .loc 1 1857 0 + add x0, x19, x0, lsl 3 ldrb w3, [x25, 248] ldr x5, [x25, 320] - ldr x0, [x19, x0, lsl 3] ldr x1, [x1, 16] + ldr x0, [x0, 184] ldr x2, [x2, 16] bl direct_mode_data_change.isra.2 -.LVL1006: - b .L948 +.LVL996: + b .L953 .p2align 3 -.L950: - .loc 1 1842 0 +.L955: + .loc 1 1841 0 ldrsw x0, [x21, 72] mov w6, 3 - .loc 1 1843 0 - ldp x2, x1, [x19, 224] .loc 1 1842 0 - add x0, x0, 24 + ldp x2, x1, [x19, 216] + .loc 1 1841 0 + add x0, x19, x0, lsl 3 ldrb w3, [x25, 248] ldr x5, [x25, 320] - ldr x0, [x19, x0, lsl 3] ldr x1, [x1, 16] + ldr x0, [x0, 184] ldr x2, [x2, 16] bl direct_mode_data_change_part.isra.9 -.LVL1007: - b .L948 +.LVL997: + b .L953 .cfi_endproc .LFE2836: .size ebc_auto_assist_tast_function, .-ebc_auto_assist_tast_function @@ -10058,67 +10146,67 @@ .type check_black_percent.isra.11, %function check_black_percent.isra.11: .LFB2886: - .loc 1 2252 0 + .loc 1 2253 0 .cfi_startproc - .loc 1 2263 0 + .loc 1 2264 0 mov w2, 26215 - .loc 1 2264 0 + .loc 1 2265 0 cmp w1, 0 - .loc 1 2263 0 - movk w2, 0x6666, lsl 16 .loc 1 2264 0 + movk w2, 0x6666, lsl 16 + .loc 1 2265 0 add w5, w1, 7 csel w5, w5, w1, lt - .loc 1 2263 0 - smull x4, w1, w2 .loc 1 2264 0 + smull x4, w1, w2 + .loc 1 2265 0 asr w5, w5, 3 cmp w5, 0 - .loc 1 2263 0 + .loc 1 2264 0 asr x4, x4, 34 sub w4, w4, w1, asr 31 -.LVL1008: - .loc 1 2264 0 - ble .L966 +.LVL998: + .loc 1 2265 0 + ble .L971 mov x1, 0 mov w2, 0 -.LVL1009: - b .L969 +.LVL999: + b .L974 .p2align 3 -.L977: +.L982: cmp w5, w1 - ble .L966 -.L969: - .loc 1 2266 0 + ble .L971 +.L974: + .loc 1 2267 0 ldr x3, [x0, x1, lsl 3] add x1, x1, 1 - .loc 1 2267 0 + .loc 1 2268 0 cmp x3, 0 cinc w2, w2, ne - .loc 1 2268 0 - cmp w4, w2, lsl 3 - bge .L977 .loc 1 2269 0 + cmp w4, w2, lsl 3 + bge .L982 + .loc 1 2270 0 mov w0, 0 ret -.L966: - .loc 1 2252 0 +.L971: + .loc 1 2253 0 stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 2272 0 - adrp x0, .LC36 - add x0, x0, :lo12:.LC36 - .loc 1 2252 0 + .loc 1 2273 0 + adrp x0, .LC35 + add x0, x0, :lo12:.LC35 + .loc 1 2253 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 2272 0 + .loc 1 2273 0 bl printk -.LVL1010: - .loc 1 2274 0 - mov w0, 1 +.LVL1000: .loc 1 2275 0 + mov w0, 1 + .loc 1 2276 0 ldp x29, x30, [sp], 16 .cfi_restore 30 .cfi_restore 29 @@ -10132,79 +10220,79 @@ .type check_diff_percent.isra.12, %function check_diff_percent.isra.12: .LFB2887: - .loc 1 2300 0 + .loc 1 2301 0 .cfi_startproc - .loc 1 2311 0 + .loc 1 2312 0 mul w8, w2, w3 mov w4, 34079 movk w4, 0x51eb, lsl 16 - .loc 1 2312 0 + .loc 1 2313 0 cmp w2, 0 add w7, w2, 7 csel w7, w7, w2, lt - .loc 1 2311 0 - smull x4, w8, w4 .loc 1 2312 0 + smull x4, w8, w4 + .loc 1 2313 0 asr w7, w7, 3 cmp w7, 0 - .loc 1 2311 0 + .loc 1 2312 0 asr x4, x4, 37 sub w8, w4, w8, asr 31 -.LVL1011: - .loc 1 2312 0 - ble .L983 +.LVL1001: + .loc 1 2313 0 + ble .L988 mov x2, 0 mov w9, 0 mov w4, 0 -.LVL1012: +.LVL1002: .p2align 2 -.L982: - .loc 1 2316 0 +.L987: + .loc 1 2317 0 ldr x6, [x0, x2, lsl 3] ldr x5, [x1, x2, lsl 3] add x2, x2, 1 cmp x6, x5 - beq .L980 - .loc 1 2318 0 + beq .L985 + .loc 1 2319 0 add w4, w4, 1 - .loc 1 2317 0 + .loc 1 2318 0 mov w9, 1 -.L980: - .loc 1 2320 0 +.L985: + .loc 1 2321 0 cmp w8, w4, lsl 3 - blt .L989 - .loc 1 2312 0 + blt .L994 + .loc 1 2313 0 cmp w7, w2 - bgt .L982 -.L986: - .loc 1 2327 0 + bgt .L987 +.L991: + .loc 1 2328 0 mov w0, w9 ret -.LVL1013: -.L983: - .loc 1 2304 0 +.LVL1003: +.L988: + .loc 1 2305 0 mov w9, 0 - b .L986 -.LVL1014: -.L989: - .loc 1 2300 0 + b .L991 +.LVL1004: +.L994: + .loc 1 2301 0 stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 mov w1, w3 - .loc 1 2321 0 - adrp x0, .LC37 - add x0, x0, :lo12:.LC37 - .loc 1 2300 0 + .loc 1 2322 0 + adrp x0, .LC36 + add x0, x0, :lo12:.LC36 + .loc 1 2301 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 2321 0 - bl printk -.LVL1015: .loc 1 2322 0 + bl printk +.LVL1005: + .loc 1 2323 0 mov w9, 2 - .loc 1 2327 0 + .loc 1 2328 0 mov w0, w9 ldp x29, x30, [sp], 16 .cfi_restore 30 @@ -10219,36 +10307,36 @@ .type ebc_probe, %function ebc_probe: .LFB2869: - .loc 1 3589 0 + .loc 1 3601 0 .cfi_startproc -.LVL1016: +.LVL1006: stp x29, x30, [sp, -208]! .cfi_def_cfa_offset 208 .cfi_offset 29, -208 .cfi_offset 30, -200 -.LBB1816: -.LBB1817: +.LBB1874: +.LBB1875: .loc 2 711 0 mov w2, 32960 movk w2, 0x60, lsl 16 -.LBE1817: -.LBE1816: - .loc 1 3589 0 +.LBE1875: +.LBE1874: + .loc 1 3601 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x21, x22, [sp, 32] .cfi_offset 21, -176 .cfi_offset 22, -168 - .loc 1 3590 0 + .loc 1 3602 0 add x22, x0, 16 - .loc 1 3589 0 + .loc 1 3601 0 stp x23, x24, [sp, 48] .cfi_offset 23, -160 .cfi_offset 24, -152 adrp x23, __stack_chk_guard stp x19, x20, [sp, 16] add x0, x23, :lo12:__stack_chk_guard -.LVL1017: +.LVL1007: stp x25, x26, [sp, 64] stp x27, x28, [sp, 80] .cfi_offset 19, -192 @@ -10257,148 +10345,148 @@ .cfi_offset 26, -136 .cfi_offset 27, -128 .cfi_offset 28, -120 - .loc 1 3589 0 + .loc 1 3601 0 ldr x1, [x0] str x1, [x29, 200] mov x1,0 -.LBB1819: -.LBB1818: +.LBB1877: +.LBB1876: .loc 2 711 0 mov x0, x22 - mov x1, 824 + mov x1, 808 bl devm_kmalloc -.LVL1018: -.LBE1818: -.LBE1819: - .loc 1 3605 0 - cbz x0, .L1045 - .loc 1 3609 0 +.LVL1008: +.LBE1876: +.LBE1877: + .loc 1 3617 0 + cbz x0, .L1051 + .loc 1 3621 0 adrp x24, .LANCHOR0 mov x20, x0 - .loc 1 3611 0 - adrp x1, .LC38 + .loc 1 3623 0 + adrp x1, .LC37 mov w2, 0 - .loc 1 3609 0 + .loc 1 3621 0 str x0, [x24, #:lo12:.LANCHOR0] - .loc 1 3611 0 - add x1, x1, :lo12:.LC38 + .loc 1 3623 0 + add x1, x1, :lo12:.LC37 ldr x0, [x22, 752] - .loc 1 3608 0 + .loc 1 3620 0 str x22, [x20] - .loc 1 3611 0 + .loc 1 3623 0 bl of_parse_phandle -.LVL1019: - .loc 1 3612 0 - cbz x0, .L1079 - .loc 1 3617 0 +.LVL1009: + .loc 1 3624 0 + cbz x0, .L1085 + .loc 1 3629 0 bl of_find_device_by_node -.LVL1020: - .loc 1 3619 0 - cbz x0, .L994 -.LBB1820: -.LBB1821: -.LBB1822: +.LVL1010: + .loc 1 3631 0 + cbz x0, .L999 +.LBB1878: +.LBB1879: +.LBB1880: .loc 2 1181 0 ldr x0, [x0, 200] -.LVL1021: -.LBE1822: -.LBE1821: -.LBE1820: - .loc 1 3622 0 +.LVL1011: +.LBE1880: +.LBE1879: +.LBE1878: + .loc 1 3634 0 str x0, [x20, 8] - .loc 1 3623 0 - cbz x0, .L994 - .loc 1 3625 0 + .loc 1 3635 0 + cbz x0, .L999 + .loc 1 3637 0 adrp x1, frame_done_callback add x1, x1, :lo12:frame_done_callback str x1, [x0, 104] - .loc 1 3627 0 + .loc 1 3639 0 add x2, x29, 96 - adrp x1, .LC40 - add x1, x1, :lo12:.LC40 + adrp x1, .LC39 + add x1, x1, :lo12:.LC39 ldr x0, [x22, 752] bl of_get_property -.LVL1022: +.LVL1012: mov x21, x0 -.LVL1023: - .loc 1 3628 0 +.LVL1013: + .loc 1 3640 0 ldrsw x0, [x29, 96] -.LVL1024: +.LVL1014: lsr x0, x0, 2 -.LVL1025: +.LVL1015: str w0, [x29, 96] -.LVL1026: - .loc 1 3629 0 +.LVL1016: + .loc 1 3641 0 cmp w0, 0 - beq .L995 - .loc 1 3634 0 discriminator 1 + beq .L1000 + .loc 1 3646 0 discriminator 1 mov w19, 0 -.LVL1027: - bgt .L1067 - b .L997 +.LVL1017: + bgt .L1073 + b .L1002 .p2align 3 -.L998: - .loc 1 3642 0 +.L1003: + .loc 1 3654 0 bl of_find_i2c_device_by_node -.LVL1028: - .loc 1 3644 0 - cbz x0, .L1080 -.LBB1823: -.LBB1824: -.LBB1825: +.LVL1018: + .loc 1 3656 0 + cbz x0, .L1086 +.LBB1881: +.LBB1882: +.LBB1883: .loc 2 1181 0 ldr x0, [x0, 216] -.LVL1029: -.LBE1825: -.LBE1824: -.LBE1823: - .loc 1 3649 0 +.LVL1019: +.LBE1883: +.LBE1882: +.LBE1881: + .loc 1 3661 0 str x0, [x20, 16] - .loc 1 3650 0 - cbnz x0, .L1081 - .loc 1 3634 0 discriminator 2 + .loc 1 3662 0 + cbnz x0, .L1087 + .loc 1 3646 0 discriminator 2 ldr w0, [x29, 96] add w19, w19, 1 -.LVL1030: +.LVL1020: cmp w0, w19 - ble .L1002 -.L1067: + ble .L1007 +.L1073: ldr w0, [x21], 4 - .loc 1 3636 0 + .loc 1 3648 0 rev w0, w0 bl of_find_node_by_phandle -.LVL1031: - .loc 1 3637 0 - cbnz x0, .L998 - .loc 1 3638 0 - adrp x1, .LC42 +.LVL1021: + .loc 1 3649 0 + cbnz x0, .L1003 + .loc 1 3650 0 + adrp x1, .LC41 mov x0, x22 - add x1, x1, :lo12:.LC42 - .loc 1 3639 0 + add x1, x1, :lo12:.LC41 + .loc 1 3651 0 mov w25, -19 - .loc 1 3638 0 + .loc 1 3650 0 bl _dev_err -.LVL1032: +.LVL1022: .p2align 2 -.L990: - .loc 1 3714 0 +.L995: + .loc 1 3726 0 add x23, x23, :lo12:__stack_chk_guard mov w0, w25 -.LVL1033: +.LVL1023: ldr x2, [x29, 200] ldr x1, [x23] eor x1, x2, x1 - cbnz x1, .L1082 + cbnz x1, .L1088 ldp x19, x20, [sp, 16] -.LVL1034: +.LVL1024: ldp x21, x22, [sp, 32] -.LVL1035: +.LVL1025: ldp x23, x24, [sp, 48] -.LVL1036: +.LVL1026: ldp x25, x26, [sp, 64] -.LVL1037: +.LVL1027: ldp x27, x28, [sp, 80] -.LVL1038: +.LVL1028: ldp x29, x30, [sp], 208 .cfi_remember_state .cfi_restore 30 @@ -10415,91 +10503,91 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL1039: +.LVL1029: .p2align 3 -.L1081: +.L1087: .cfi_restore_state - .loc 1 3651 0 - adrp x1, .LC44 + .loc 1 3663 0 + adrp x1, .LC43 mov w2, w19 - add x1, x1, :lo12:.LC44 + add x1, x1, :lo12:.LC43 mov x0, x22 bl _dev_info -.LVL1040: -.L997: - .loc 1 3656 0 +.LVL1030: +.L1002: + .loc 1 3668 0 ldr x0, [x20, 16] - cbz x0, .L1002 - .loc 1 3662 0 + cbz x0, .L1007 + .loc 1 3674 0 add x19, x20, 192 -.LVL1041: - .loc 1 3664 0 +.LVL1031: + .loc 1 3676 0 add x21, x20, 24 -.LVL1042: - .loc 1 3662 0 +.LVL1032: + .loc 1 3674 0 str x22, [x19, 104] -.LBB1826: -.LBB1827: -.LBB1828: -.LBB1829: -.LBB1830: +.LBB1884: +.LBB1885: +.LBB1886: +.LBB1887: +.LBB1888: .file 13 "./include/linux/of.h" .loc 13 499 0 - adrp x1, .LC46 -.LBE1830: -.LBE1829: -.LBE1828: -.LBE1827: -.LBE1826: - .loc 1 3664 0 + adrp x1, .LC45 +.LBE1888: +.LBE1887: +.LBE1886: +.LBE1885: +.LBE1884: + .loc 1 3676 0 str x22, [x20, 24] -.LBB1906: -.LBB1903: -.LBB1837: -.LBB1834: -.LBB1831: +.LBB1964: +.LBB1961: +.LBB1895: +.LBB1892: +.LBB1889: .loc 13 499 0 mov x4, 0 -.LBE1831: -.LBE1834: -.LBE1837: -.LBE1903: -.LBE1906: - .loc 1 3665 0 +.LBE1889: +.LBE1892: +.LBE1895: +.LBE1961: +.LBE1964: + .loc 1 3677 0 ldr x2, [x20, 8] -.LBB1907: -.LBB1904: -.LBB1838: -.LBB1835: -.LBB1832: +.LBB1965: +.LBB1962: +.LBB1896: +.LBB1893: +.LBB1890: .loc 13 499 0 - add x1, x1, :lo12:.LC46 -.LBE1832: -.LBE1835: -.LBE1838: -.LBE1904: -.LBE1907: - .loc 1 3666 0 + add x1, x1, :lo12:.LC45 +.LBE1890: +.LBE1893: +.LBE1896: +.LBE1962: +.LBE1965: + .loc 1 3678 0 stp x2, x0, [x21, 8] -.LBB1908: -.LBB1905: -.LBB1839: -.LBB1836: -.LBB1833: +.LBB1966: +.LBB1963: +.LBB1897: +.LBB1894: +.LBB1891: .loc 13 499 0 mov x3, 1 ldr x0, [x22, 752] add x2, x20, 100 bl of_property_read_variable_u32_array -.LVL1043: +.LVL1033: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1833: -.LBE1836: -.LBE1839: -.LBB1840: -.LBB1841: -.LBB1842: + tbnz w0, #31, .L1009 +.LBE1891: +.LBE1894: +.LBE1897: +.LBB1898: +.LBB1899: +.LBB1900: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC79 @@ -10508,15 +10596,15 @@ add x2, x20, 104 add x1, x1, :lo12:.LC79 bl of_property_read_variable_u32_array -.LVL1044: +.LVL1034: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1842: -.LBE1841: -.LBE1840: -.LBB1843: -.LBB1844: -.LBB1845: + tbnz w0, #31, .L1009 +.LBE1900: +.LBE1899: +.LBE1898: +.LBB1901: +.LBB1902: +.LBB1903: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC80 @@ -10525,15 +10613,15 @@ add x2, x20, 108 add x1, x1, :lo12:.LC80 bl of_property_read_variable_u32_array -.LVL1045: +.LVL1035: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1845: -.LBE1844: -.LBE1843: -.LBB1846: -.LBB1847: -.LBB1848: + tbnz w0, #31, .L1009 +.LBE1903: +.LBE1902: +.LBE1901: +.LBB1904: +.LBB1905: +.LBB1906: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC81 @@ -10542,15 +10630,15 @@ add x2, x20, 112 add x1, x1, :lo12:.LC81 bl of_property_read_variable_u32_array -.LVL1046: +.LVL1036: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1848: -.LBE1847: -.LBE1846: -.LBB1849: -.LBB1850: -.LBB1851: + tbnz w0, #31, .L1009 +.LBE1906: +.LBE1905: +.LBE1904: +.LBB1907: +.LBB1908: +.LBB1909: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC82 @@ -10559,15 +10647,15 @@ add x2, x20, 128 add x1, x1, :lo12:.LC82 bl of_property_read_variable_u32_array -.LVL1047: +.LVL1037: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1851: -.LBE1850: -.LBE1849: -.LBB1852: -.LBB1853: -.LBB1854: + tbnz w0, #31, .L1009 +.LBE1909: +.LBE1908: +.LBE1907: +.LBB1910: +.LBB1911: +.LBB1912: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC83 @@ -10576,15 +10664,15 @@ add x2, x20, 132 add x1, x1, :lo12:.LC83 bl of_property_read_variable_u32_array -.LVL1048: +.LVL1038: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1854: -.LBE1853: -.LBE1852: -.LBB1855: -.LBB1856: -.LBB1857: + tbnz w0, #31, .L1009 +.LBE1912: +.LBE1911: +.LBE1910: +.LBB1913: +.LBB1914: +.LBB1915: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC84 @@ -10593,15 +10681,15 @@ add x2, x20, 136 add x1, x1, :lo12:.LC84 bl of_property_read_variable_u32_array -.LVL1049: +.LVL1039: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1857: -.LBE1856: -.LBE1855: -.LBB1858: -.LBB1859: -.LBB1860: + tbnz w0, #31, .L1009 +.LBE1915: +.LBE1914: +.LBE1913: +.LBB1916: +.LBB1917: +.LBB1918: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC85 @@ -10610,15 +10698,15 @@ add x2, x20, 140 add x1, x1, :lo12:.LC85 bl of_property_read_variable_u32_array -.LVL1050: +.LVL1040: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1860: -.LBE1859: -.LBE1858: -.LBB1861: -.LBB1862: -.LBB1863: + tbnz w0, #31, .L1009 +.LBE1918: +.LBE1917: +.LBE1916: +.LBB1919: +.LBB1920: +.LBB1921: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC86 @@ -10627,15 +10715,15 @@ add x2, x20, 144 add x1, x1, :lo12:.LC86 bl of_property_read_variable_u32_array -.LVL1051: +.LVL1041: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1863: -.LBE1862: -.LBE1861: -.LBB1864: -.LBB1865: -.LBB1866: + tbnz w0, #31, .L1009 +.LBE1921: +.LBE1920: +.LBE1919: +.LBB1922: +.LBB1923: +.LBB1924: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC87 @@ -10644,15 +10732,15 @@ add x2, x20, 148 add x1, x1, :lo12:.LC87 bl of_property_read_variable_u32_array -.LVL1052: +.LVL1042: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1866: -.LBE1865: -.LBE1864: -.LBB1867: -.LBB1868: -.LBB1869: + tbnz w0, #31, .L1009 +.LBE1924: +.LBE1923: +.LBE1922: +.LBB1925: +.LBB1926: +.LBB1927: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC88 @@ -10661,15 +10749,15 @@ add x2, x20, 152 add x1, x1, :lo12:.LC88 bl of_property_read_variable_u32_array -.LVL1053: +.LVL1043: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1869: -.LBE1868: -.LBE1867: -.LBB1870: -.LBB1871: -.LBB1872: + tbnz w0, #31, .L1009 +.LBE1927: +.LBE1926: +.LBE1925: +.LBB1928: +.LBB1929: +.LBB1930: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC89 @@ -10678,15 +10766,15 @@ add x2, x20, 156 add x1, x1, :lo12:.LC89 bl of_property_read_variable_u32_array -.LVL1054: +.LVL1044: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1872: -.LBE1871: -.LBE1870: -.LBB1873: -.LBB1874: -.LBB1875: + tbnz w0, #31, .L1009 +.LBE1930: +.LBE1929: +.LBE1928: +.LBB1931: +.LBB1932: +.LBB1933: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC90 @@ -10695,15 +10783,15 @@ add x2, x20, 160 add x1, x1, :lo12:.LC90 bl of_property_read_variable_u32_array -.LVL1055: +.LVL1045: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1875: -.LBE1874: -.LBE1873: -.LBB1876: -.LBB1877: -.LBB1878: + tbnz w0, #31, .L1009 +.LBE1933: +.LBE1932: +.LBE1931: +.LBB1934: +.LBB1935: +.LBB1936: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC91 @@ -10712,15 +10800,15 @@ add x2, x20, 164 add x1, x1, :lo12:.LC91 bl of_property_read_variable_u32_array -.LVL1056: +.LVL1046: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1878: -.LBE1877: -.LBE1876: -.LBB1879: -.LBB1880: -.LBB1881: + tbnz w0, #31, .L1009 +.LBE1936: +.LBE1935: +.LBE1934: +.LBB1937: +.LBB1938: +.LBB1939: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC92 @@ -10729,15 +10817,15 @@ add x2, x20, 168 add x1, x1, :lo12:.LC92 bl of_property_read_variable_u32_array -.LVL1057: +.LVL1047: .loc 13 501 0 - tbnz w0, #31, .L1004 -.LBE1881: -.LBE1880: -.LBE1879: -.LBB1882: -.LBB1883: -.LBB1884: + tbnz w0, #31, .L1009 +.LBE1939: +.LBE1938: +.LBE1937: +.LBB1940: +.LBB1941: +.LBB1942: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC93 @@ -10746,463 +10834,448 @@ add x2, x20, 172 add x1, x1, :lo12:.LC93 bl of_property_read_variable_u32_array -.LVL1058: +.LVL1048: .loc 13 501 0 - tbz w0, #31, .L1033 -.LBE1884: -.LBE1883: -.LBE1882: - .loc 1 2900 0 + tbz w0, #31, .L1039 +.LBE1942: +.LBE1941: +.LBE1940: + .loc 1 2903 0 str wzr, [x21, 148] -.L1033: -.LBB1885: -.LBB1886: -.LBB1887: +.L1039: +.LBB1943: +.LBB1944: +.LBB1945: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC46 + mov x4, 0 + mov x3, 1 + add x2, x20, 176 + add x1, x1, :lo12:.LC46 + bl of_property_read_variable_u32_array +.LVL1049: + .loc 13 501 0 + tbz w0, #31, .L1040 +.LBE1945: +.LBE1944: +.LBE1943: + .loc 1 2906 0 + str wzr, [x21, 152] +.L1040: +.LBB1946: +.LBB1947: +.LBB1948: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC47 mov x4, 0 mov x3, 1 - add x2, x20, 176 + add x2, x20, 180 add x1, x1, :lo12:.LC47 bl of_property_read_variable_u32_array -.LVL1059: +.LVL1050: .loc 13 501 0 - tbz w0, #31, .L1034 -.LBE1887: -.LBE1886: -.LBE1885: - .loc 1 2903 0 - str wzr, [x21, 152] -.L1034: -.LBB1888: -.LBB1889: -.LBB1890: + tbz w0, #31, .L1041 +.LBE1948: +.LBE1947: +.LBE1946: + .loc 1 2909 0 + str wzr, [x21, 156] +.L1041: +.LBB1949: +.LBB1950: +.LBB1951: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC48 mov x4, 0 mov x3, 1 - add x2, x20, 180 + add x2, x20, 116 add x1, x1, :lo12:.LC48 bl of_property_read_variable_u32_array -.LVL1060: +.LVL1051: .loc 13 501 0 - tbz w0, #31, .L1035 -.LBE1890: -.LBE1889: -.LBE1888: - .loc 1 2906 0 - str wzr, [x21, 156] -.L1035: -.LBB1891: -.LBB1892: -.LBB1893: + tbz w0, #31, .L1042 +.LBE1951: +.LBE1950: +.LBE1949: + .loc 1 2912 0 + str wzr, [x21, 92] +.L1042: +.LBB1952: +.LBB1953: +.LBB1954: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC49 mov x4, 0 mov x3, 1 - add x2, x20, 116 + add x2, x20, 120 add x1, x1, :lo12:.LC49 bl of_property_read_variable_u32_array -.LVL1061: +.LVL1052: .loc 13 501 0 - tbz w0, #31, .L1036 -.LBE1893: -.LBE1892: -.LBE1891: - .loc 1 2909 0 - str wzr, [x21, 92] -.L1036: -.LBB1894: -.LBB1895: -.LBB1896: + tbz w0, #31, .L1043 +.LBE1954: +.LBE1953: +.LBE1952: + .loc 1 2915 0 + str wzr, [x21, 96] +.L1043: +.LBB1955: +.LBB1956: +.LBB1957: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC50 mov x4, 0 mov x3, 1 - add x2, x20, 120 + add x2, x20, 184 add x1, x1, :lo12:.LC50 bl of_property_read_variable_u32_array -.LVL1062: +.LVL1053: .loc 13 501 0 - tbz w0, #31, .L1037 -.LBE1896: -.LBE1895: -.LBE1894: - .loc 1 2912 0 - str wzr, [x21, 96] -.L1037: -.LBB1897: -.LBB1898: -.LBB1899: + tbz w0, #31, .L1044 +.LBE1957: +.LBE1956: +.LBE1955: + .loc 1 2918 0 + str wzr, [x21, 160] +.L1044: +.LBB1958: +.LBB1959: +.LBB1960: .loc 13 499 0 ldr x0, [x22, 752] adrp x1, .LC51 mov x4, 0 mov x3, 1 - add x2, x20, 184 + add x2, x20, 188 add x1, x1, :lo12:.LC51 bl of_property_read_variable_u32_array -.LVL1063: +.LVL1054: .loc 13 501 0 - tbz w0, #31, .L1038 -.LBE1899: -.LBE1898: -.LBE1897: - .loc 1 2915 0 - str wzr, [x21, 160] -.L1038: -.LBB1900: -.LBB1901: -.LBB1902: - .loc 13 499 0 - ldr x0, [x22, 752] - adrp x1, .LC52 - mov x4, 0 - mov x3, 1 - add x2, x20, 188 - add x1, x1, :lo12:.LC52 - bl of_property_read_variable_u32_array -.LVL1064: - .loc 13 501 0 - tbz w0, #31, .L1039 -.LBE1902: -.LBE1901: -.LBE1900: - .loc 1 2918 0 + tbz w0, #31, .L1045 +.LBE1960: +.LBE1959: +.LBE1958: + .loc 1 2921 0 str wzr, [x21, 164] -.L1039: -.LBE1905: -.LBE1908: - .loc 1 3674 0 +.L1045: +.LBE1963: +.LBE1966: + .loc 1 3686 0 ldr w0, [x21, 88] -.LBB1909: -.LBB1910: - .loc 1 3373 0 - mov w2, 0 -.LBE1910: -.LBE1909: - .loc 1 3674 0 str w0, [x19, 92] - .loc 1 3675 0 + .loc 1 3687 0 ldr w1, [x21, 84] str w1, [x19, 96] - .loc 1 3676 0 + .loc 1 3688 0 mul w0, w0, w1 -.LBB1922: -.LBB1915: - .loc 1 3373 0 - adrp x1, .LC53 - add x1, x1, :lo12:.LC53 -.LBE1915: -.LBE1922: - .loc 1 3676 0 - lsr w3, w0, 1 - .loc 1 3677 0 + lsr w1, w0, 1 + .loc 1 3689 0 lsr w0, w0, 2 - stp w3, w0, [x19, 28] -.LBB1923: -.LBB1916: - .loc 1 3363 0 + stp w1, w0, [x19, 28] +.LBB1967: +.LBB1968: + .loc 1 3380 0 + cmp w1, 5242880 + .loc 1 3371 0 ldr x26, [x20] -.LVL1065: - .loc 1 3373 0 +.LVL1055: + .loc 1 3380 0 + bhi .L1089 + .loc 1 3386 0 ldr x0, [x26, 752] + adrp x1, .LC53 + mov w2, 0 + add x1, x1, :lo12:.LC53 bl of_parse_phandle -.LVL1066: - .loc 1 3374 0 - cbz x0, .L1046 - .loc 1 3377 0 +.LVL1056: + .loc 1 3387 0 + cbz x0, .L1052 + .loc 1 3390 0 add x2, x29, 104 mov w1, 0 bl of_address_to_resource -.LVL1067: +.LVL1057: mov w25, w0 - .loc 1 3379 0 - cbnz w0, .L1083 -.LBB1911: -.LBB1912: + .loc 1 3392 0 + cbnz w0, .L1090 +.LBB1969: +.LBB1970: .file 14 "./include/linux/ioport.h" .loc 14 204 0 ldp x1, x2, [x29, 104] -.LBE1912: -.LBE1911: - .loc 1 3384 0 +.LBE1970: +.LBE1969: + .loc 1 3397 0 str x1, [x20, 192] - .loc 1 3386 0 - mov w0, 50331647 -.LBB1914: -.LBB1913: + .loc 1 3399 0 + mov w0, 53477375 +.LBB1972: +.LBB1971: .loc 14 204 0 add x2, x2, 1 sub x2, x2, x1 -.LBE1913: -.LBE1914: - .loc 1 3385 0 +.LBE1971: +.LBE1972: + .loc 1 3398 0 str w2, [x19, 24] - .loc 1 3386 0 + .loc 1 3399 0 cmp w2, w0 - ble .L1084 - .loc 1 3390 0 + ble .L1091 + .loc 1 3403 0 sxtw x2, w2 mov x3, 1 mov x0, x26 bl devm_memremap -.LVL1068: +.LVL1058: str x0, [x19, 8] - .loc 1 3392 0 - cbz x0, .L1085 - .loc 1 3401 0 + .loc 1 3405 0 + cbz x0, .L1092 + .loc 1 3414 0 mov x1, x0 ldr w2, [x19, 24] ldr x0, [x20, 192] mov w4, 4 - mov w3, 4194304 + mov w3, 5242880 bl ebc_buf_init -.LVL1069: - .loc 1 3402 0 - cbnz w0, .L1047 - .loc 1 3405 0 +.LVL1059: + .loc 1 3415 0 + cbnz w0, .L1053 + .loc 1 3418 0 ldr x1, [x19, 8] - mov x0, 16777216 - .loc 1 3410 0 + mov x0, 20971520 + .loc 1 3423 0 mov x4, 2097152 - .loc 1 3409 0 - mov x2, 20971520 - .loc 1 3405 0 + .loc 1 3422 0 + mov x2, 26214400 + .loc 1 3418 0 add x0, x1, x0 str x0, [x19, 16] - .loc 1 3410 0 + .loc 1 3423 0 str x4, [x21, 40] - .loc 1 3409 0 + .loc 1 3422 0 add x6, x1, x2 str x6, [x21, 24] - mov x5, 23068672 + mov x5, 28311552 add x3, x1, x5 - .loc 1 3411 0 + .loc 1 3424 0 ldr x0, [x20, 192] add x2, x0, x2 str x2, [x21, 32] - .loc 1 3412 0 - str x6, [x19, 192] - .loc 1 3411 0 + .loc 1 3425 0 + str x6, [x19, 184] + .loc 1 3424 0 add x0, x0, x5 - .loc 1 3410 0 + .loc 1 3423 0 str x4, [x21, 64] - .loc 1 3417 0 - mov x2, 29360128 - .loc 1 3411 0 + .loc 1 3430 0 + mov x2, 35651584 + .loc 1 3424 0 stp x3, x0, [x21, 48] - .loc 1 3417 0 + .loc 1 3430 0 add x2, x1, x2 - .loc 1 3416 0 - mov x0, 25165824 + .loc 1 3429 0 + mov x0, 30408704 add x0, x1, x0 - .loc 1 3417 0 + .loc 1 3430 0 stp x0, x2, [x19, 152] - .loc 1 3421 0 - mov x2, 37748736 - add x2, x1, x2 - .loc 1 3418 0 - mov x0, 33554432 + .loc 1 3433 0 + mov x0, 40894464 + .loc 1 3437 0 + mov x2, 51380224 + .loc 1 3433 0 add x0, x1, x0 - .loc 1 3421 0 - stp x0, x2, [x19, 168] - .loc 1 3425 0 - mov x2, 48234496 + .loc 1 3437 0 add x2, x1, x2 - .loc 1 3412 0 - str x3, [x19, 200] - .loc 1 3422 0 - mov x0, 42991616 .loc 1 3425 0 + str x3, [x19, 192] + .loc 1 3437 0 str x2, [x19, 128] - .loc 1 3422 0 + .loc 1 3438 0 + mov x2, 52428800 + .loc 1 3433 0 + str x0, [x19, 168] + .loc 1 3434 0 + mov x0, 46137344 add x0, x1, x0 - .loc 1 3426 0 - mov x2, 49283072 - .loc 1 3422 0 - str x0, [x19, 184] - .loc 1 3426 0 + .loc 1 3438 0 add x1, x1, x2 + .loc 1 3434 0 + str x0, [x19, 176] + .loc 1 3438 0 str x1, [x19, 136] - .loc 1 3428 0 + .loc 1 3440 0 ldp w2, w1, [x21, 84] mul w2, w2, w1 mov w1, 0 bl memset -.LVL1070: - .loc 1 3429 0 +.LVL1060: + .loc 1 3441 0 ldp w3, w2, [x21, 84] mov w1, 0 - ldr x0, [x19, 176] + ldr x0, [x19, 168] mul w2, w3, w2 bl memset -.LVL1071: - .loc 1 3430 0 - ldrsw x2, [x19, 28] - mov w1, 255 - ldr x0, [x19, 168] - bl memset -.LVL1072: -.LBE1916: -.LBE1923: -.LBB1924: -.LBB1925: - .loc 1 3320 0 +.LVL1061: +.LBE1968: +.LBE1967: +.LBB1979: +.LBB1980: + .loc 1 3328 0 ldr x26, [x19, 104] -.LVL1073: - .loc 1 3326 0 +.LVL1062: + .loc 1 3334 0 adrp x1, .LC57 mov w2, 0 add x1, x1, :lo12:.LC57 ldr x0, [x26, 752] bl of_parse_phandle -.LVL1074: - .loc 1 3327 0 - cbz x0, .L1048 - .loc 1 3330 0 +.LVL1063: + .loc 1 3335 0 + cbz x0, .L1054 + .loc 1 3338 0 add x2, x29, 104 mov w1, 0 bl of_address_to_resource -.LVL1075: +.LVL1064: mov w25, w0 - .loc 1 3332 0 - cbz w0, .L1086 -.L1015: -.LBE1925: -.LBE1924: - .loc 1 3689 0 + .loc 1 3340 0 + cbz w0, .L1093 +.L1021: +.LBE1980: +.LBE1979: + .loc 1 3701 0 adrp x1, .LC95 mov x0, x22 add x1, x1, :lo12:.LC95 bl _dev_err -.LVL1076: - .loc 1 3690 0 - b .L990 -.LVL1077: +.LVL1065: + .loc 1 3702 0 + b .L995 +.LVL1066: .p2align 3 -.L1004: - .loc 1 3672 0 +.L1009: + .loc 1 3684 0 mov w25, -22 - .loc 1 3671 0 + .loc 1 3683 0 adrp x1, .LC99 mov w2, w25 add x1, x1, :lo12:.LC99 mov x0, x22 bl _dev_err -.LVL1078: - .loc 1 3672 0 - b .L990 -.LVL1079: +.LVL1067: + .loc 1 3684 0 + b .L995 +.LVL1068: .p2align 3 -.L1080: - .loc 1 3645 0 - adrp x1, .LC43 - mov x0, x22 -.LVL1080: - add x1, x1, :lo12:.LC43 - .loc 1 3646 0 - mov w25, -19 - .loc 1 3645 0 - bl _dev_err -.LVL1081: - .loc 1 3646 0 - b .L990 -.LVL1082: - .p2align 3 -.L1002: - .loc 1 3657 0 - adrp x1, .LC45 - mov x0, x22 - add x1, x1, :lo12:.LC45 - .loc 1 3658 0 - mov w25, -517 - .loc 1 3657 0 - bl _dev_err -.LVL1083: - .loc 1 3658 0 - b .L990 -.LVL1084: .L1086: -.LBB1934: -.LBB1930: - .loc 1 3341 0 + .loc 1 3657 0 + adrp x1, .LC42 + mov x0, x22 +.LVL1069: + add x1, x1, :lo12:.LC42 + .loc 1 3658 0 + mov w25, -19 + .loc 1 3657 0 + bl _dev_err +.LVL1070: + .loc 1 3658 0 + b .L995 +.LVL1071: + .p2align 3 +.L1007: + .loc 1 3669 0 + adrp x1, .LC44 + mov x0, x22 + add x1, x1, :lo12:.LC44 + .loc 1 3670 0 + mov w25, -517 + .loc 1 3669 0 + bl _dev_err +.LVL1072: + .loc 1 3670 0 + b .L995 +.LVL1073: +.L1093: +.LBB1989: +.LBB1985: + .loc 1 3349 0 mov x0, x26 mov x3, 1 -.LBB1926: -.LBB1927: +.LBB1981: +.LBB1982: .loc 14 204 0 ldp x1, x26, [x29, 104] -.LVL1085: -.LBE1927: -.LBE1926: - .loc 1 3338 0 +.LVL1074: +.LBE1982: +.LBE1981: + .loc 1 3346 0 str x1, [x19, 40] -.LBB1929: -.LBB1928: +.LBB1984: +.LBB1983: .loc 14 204 0 add x26, x26, 1 sub x26, x26, x1 -.LBE1928: -.LBE1929: - .loc 1 3339 0 +.LBE1983: +.LBE1984: + .loc 1 3347 0 str w26, [x19, 48] - .loc 1 3341 0 + .loc 1 3349 0 sxtw x2, w26 bl devm_memremap -.LVL1086: - str x0, [x19, 216] - .loc 1 3343 0 - cbz x0, .L1087 - .loc 1 3348 0 +.LVL1075: + str x0, [x19, 208] + .loc 1 3351 0 + cbz x0, .L1094 + .loc 1 3356 0 bl epd_lut_from_mem_init -.LVL1087: - .loc 1 3349 0 - tbnz w0, #31, .L1088 -.L1017: -.LBE1930: -.LBE1934: -.LBB1935: -.LBB1936: - .loc 1 3439 0 +.LVL1076: + .loc 1 3357 0 + tbnz w0, #31, .L1095 +.L1023: +.LBE1985: +.LBE1989: +.LBB1990: +.LBB1991: + .loc 1 3450 0 add x24, x24, :lo12:.LANCHOR0 - .loc 1 3437 0 + .loc 1 3448 0 mov w26, 99 - .loc 1 3439 0 + .loc 1 3450 0 adrp x3, .LC96 adrp x0, ebc_auto_tast_function add x3, x3, :lo12:.LC96 add x0, x0, :lo12:ebc_auto_tast_function mov w2, -1 mov x1, x19 - .loc 1 3437 0 + .loc 1 3448 0 str w26, [x29, 104] - .loc 1 3439 0 + .loc 1 3450 0 bl kthread_create_on_node -.LVL1088: +.LVL1077: str x0, [x24, 8] - .loc 1 3440 0 + .loc 1 3451 0 cmn x0, #4096 - bhi .L1089 - .loc 1 3444 0 + bhi .L1096 + .loc 1 3455 0 add x2, x29, 104 mov w1, 1 bl sched_setscheduler_nocheck -.LVL1089: - .loc 1 3445 0 +.LVL1078: + .loc 1 3456 0 ldr x2, [x24, 8] -.LBB1937: -.LBB1938: +.LBB1992: +.LBB1993: .file 15 "./arch/arm64/include/asm/atomic_lse.h" .loc 15 47 0 mov w0, 1 -.LVL1090: +.LVL1079: add x1, x2, 48 -.LVL1091: +.LVL1080: #APP // 47 "./arch/arm64/include/asm/atomic_lse.h" 1 .arch_extension lse @@ -11230,38 +11303,38 @@ .endif // 0 "" 2 -.LVL1092: +.LVL1081: #NO_APP -.LBE1938: -.LBE1937: - .loc 1 3448 0 +.LBE1993: +.LBE1992: + .loc 1 3459 0 adrp x3, .LC62 adrp x0, ebc_auto_assist_tast_function -.LVL1093: +.LVL1082: add x3, x3, :lo12:.LC62 add x0, x0, :lo12:ebc_auto_assist_tast_function mov w2, -1 mov x1, x19 bl kthread_create_on_node -.LVL1094: +.LVL1083: str x0, [x24, 16] - .loc 1 3449 0 + .loc 1 3460 0 cmn x0, #4096 - bhi .L1090 - .loc 1 3453 0 + bhi .L1097 + .loc 1 3464 0 add x2, x29, 104 mov w1, 1 bl sched_setscheduler_nocheck -.LVL1095: - .loc 1 3454 0 +.LVL1084: + .loc 1 3465 0 ldr x2, [x24, 16] -.LBB1939: -.LBB1940: +.LBB1994: +.LBB1995: .loc 15 47 0 mov w0, 1 -.LVL1096: +.LVL1085: add x1, x2, 48 -.LVL1097: +.LVL1086: #APP // 47 "./arch/arm64/include/asm/atomic_lse.h" 1 .arch_extension lse @@ -11289,21 +11362,21 @@ .endif // 0 "" 2 -.LVL1098: +.LVL1087: #NO_APP -.LBE1940: -.LBE1939: - .loc 1 3455 0 +.LBE1995: +.LBE1994: + .loc 1 3466 0 ldr x0, [x19, 104] -.LVL1099: +.LVL1088: adrp x1, .LC64 add x1, x1, :lo12:.LC64 bl _dev_info -.LVL1100: - .loc 1 3458 0 +.LVL1089: + .loc 1 3469 0 str w26, [x29, 104] -.LBB1941: - .loc 1 3459 0 +.LBB1996: + .loc 1 3470 0 adrp x3, .LC65 adrp x0, ebc_thread add x3, x3, :lo12:.LC65 @@ -11311,30 +11384,30 @@ mov w2, -1 mov x1, x19 bl kthread_create_on_node -.LVL1101: +.LVL1090: mov x26, x0 -.LVL1102: +.LVL1091: cmn x0, #4096 - bhi .L1020 + bhi .L1026 bl wake_up_process -.LVL1103: -.LBE1941: +.LVL1092: +.LBE1996: str x26, [x24, 24] - .loc 1 3464 0 + .loc 1 3475 0 add x2, x29, 104 mov x0, x26 mov w1, 1 bl sched_setscheduler_nocheck -.LVL1104: - .loc 1 3465 0 +.LVL1093: + .loc 1 3476 0 ldr x2, [x24, 24] -.LBB1942: -.LBB1943: +.LBB1997: +.LBB1998: .loc 15 47 0 mov w0, 1 -.LVL1105: +.LVL1094: add x1, x2, 48 -.LVL1106: +.LVL1095: #APP // 47 "./arch/arm64/include/asm/atomic_lse.h" 1 .arch_extension lse @@ -11362,72 +11435,62 @@ .endif // 0 "" 2 -.LVL1107: +.LVL1096: #NO_APP -.LBE1943: -.LBE1942: -.LBE1936: -.LBE1935: -.LBB1947: -.LBB1948: -.LBB1949: -.LBB1950: - .loc 11 39 0 - add x0, x20, 464 -.LVL1108: -.LBE1950: -.LBE1949: - .loc 1 3479 0 - str wzr, [x19, 52] - .loc 1 3480 0 - str wzr, [x19, 68] - .loc 1 3481 0 - mov w27, 1 - .loc 1 3478 0 - str wzr, [x19, 100] - .loc 1 3474 0 +.LBE1998: +.LBE1997: +.LBE1991: +.LBE1990: +.LBB2002: +.LBB2003: + .loc 1 3485 0 mov w1, -1 - .loc 1 3473 0 - str wzr, [x19, 208] - .loc 1 3492 0 - add x24, x20, 680 - .loc 1 3475 0 + .loc 1 3486 0 stp w1, wzr, [x19, 84] -.LBB1954: -.LBB1951: + .loc 1 3497 0 + add x1, x19, 512 +.LBB2004: +.LBB2005: + .loc 11 39 0 + add x0, x20, 448 +.LVL1097: +.LBE2005: +.LBE2004: + .loc 1 3490 0 + str wzr, [x19, 52] + .loc 1 3492 0 + mov w27, 1 + .loc 1 3491 0 + str wzr, [x19, 68] + .loc 1 3504 0 + add x24, x20, 664 + .loc 1 3489 0 + str wzr, [x19, 100] + .loc 1 3505 0 + adrp x26, jiffies +.LVL1098: + .loc 1 3484 0 + str wzr, [x19, 200] + .loc 1 3505 0 + mov x28, 268435455 + .loc 1 3492 0 + stp wzr, w27, [x19, 248] + .loc 1 3487 0 + str wzr, [x19, 584] + .loc 1 3488 0 + str wzr, [x19, 588] + .loc 1 3497 0 + stp w27, w27, [x1, 88] + stp w27, wzr, [x1, 96] +.LBB2007: +.LBB2006: .loc 11 43 0 adrp x1, .LC66 -.LBE1951: -.LBE1954: - .loc 1 3482 0 - str wzr, [x19, 260] -.LBB1955: -.LBB1952: - .loc 11 43 0 - add x1, x1, :lo12:.LC66 -.LBE1952: -.LBE1955: - .loc 1 3481 0 - str w27, [x19, 264] - .loc 1 3493 0 - adrp x26, jiffies -.LVL1109: - .loc 1 3476 0 - str wzr, [x19, 600] - .loc 1 3493 0 - mov x28, 268435455 - .loc 1 3477 0 - str wzr, [x19, 604] - .loc 1 3483 0 - str w27, [x19, 616] - .loc 1 3484 0 - str w27, [x19, 620] - .loc 1 3485 0 - str w27, [x19, 624] -.LBB1956: -.LBB1953: .loc 11 42 0 stp xzr, xzr, [x0] + .loc 11 43 0 + add x1, x1, :lo12:.LC66 + .loc 11 42 0 stp xzr, xzr, [x0, 16] stp xzr, xzr, [x0, 32] stp xzr, xzr, [x0, 48] @@ -11441,15 +11504,15 @@ stp xzr, xzr, [x0, 176] stp xzr, xzr, [x0, 192] .loc 11 43 0 - str x1, [x20, 464] + str x1, [x20, 448] .loc 11 45 0 bl wakeup_source_add -.LVL1110: -.LBE1953: -.LBE1956: - .loc 1 3489 0 - str wzr, [x19, 480] - .loc 1 3492 0 +.LVL1099: +.LBE2006: +.LBE2007: + .loc 1 3501 0 + str wzr, [x19, 464] + .loc 1 3504 0 mov x4, 0 mov x3, 0 mov w2, 0 @@ -11457,17 +11520,17 @@ adrp x1, ebc_frame_control_timeout add x1, x1, :lo12:ebc_frame_control_timeout bl init_timer_key -.LVL1111: - .loc 1 3493 0 +.LVL1100: + .loc 1 3505 0 ldr x1, [x26, #:lo12:jiffies] mov x0, x24 - .loc 1 3496 0 - add x24, x20, 736 - .loc 1 3493 0 + .loc 1 3508 0 + add x24, x20, 720 + .loc 1 3505 0 add x1, x1, x28 bl mod_timer -.LVL1112: - .loc 1 3496 0 +.LVL1101: + .loc 1 3508 0 mov x4, 0 mov x3, 0 mov w2, 0 @@ -11475,683 +11538,696 @@ adrp x1, ebc_frame_timeout add x1, x1, :lo12:ebc_frame_timeout bl init_timer_key -.LVL1113: - .loc 1 3497 0 +.LVL1102: + .loc 1 3509 0 ldr x1, [x26, #:lo12:jiffies] mov x0, x24 add x1, x1, x28 bl mod_timer -.LVL1114: -.LBE1948: -.LBE1947: -.LBB1957: -.LBB1958: - .loc 1 3507 0 +.LVL1103: +.LBE2003: +.LBE2002: +.LBB2008: +.LBB2009: + .loc 1 3519 0 adrp x0, saved_command_line adrp x1, .LC67 - .loc 1 3504 0 + .loc 1 3516 0 stp wzr, wzr, [x29, 100] -.LVL1115: - .loc 1 3507 0 +.LVL1104: + .loc 1 3519 0 add x1, x1, :lo12:.LC67 ldr x24, [x0, #:lo12:saved_command_line] mov x0, x24 bl strstr -.LVL1116: - .loc 1 3508 0 +.LVL1105: + .loc 1 3520 0 adrp x1, .LC68 - .loc 1 3507 0 + .loc 1 3519 0 mov x26, x0 -.LVL1117: - .loc 1 3508 0 +.LVL1106: + .loc 1 3520 0 add x1, x1, :lo12:.LC68 mov x0, x24 bl strstr -.LVL1118: +.LVL1107: mov x28, x0 -.LVL1119: - .loc 1 3513 0 - cbz x26, .L1021 - .loc 1 3514 0 +.LVL1108: + .loc 1 3525 0 + cbz x26, .L1027 + .loc 1 3526 0 add x2, x29, 100 mov x0, x26 adrp x1, .LC69 add x1, x1, :lo12:.LC69 bl sscanf -.LVL1120: - .loc 1 3515 0 +.LVL1109: + .loc 1 3527 0 ldr w2, [x29, 100] ldr x0, [x20, 192] cmp x0, x2, uxtw - bls .L1091 -.L1021: - .loc 1 3527 0 + bls .L1098 +.L1027: + .loc 1 3539 0 mov w24, 0 -.LVL1121: +.LVL1110: mov x26, 0 -.LVL1122: - .loc 1 3511 0 +.LVL1111: + .loc 1 3523 0 mov x27, 0 -.LVL1123: - .loc 1 3527 0 - cbz x28, .L1043 -.L1042: - .loc 1 3528 0 +.LVL1112: + .loc 1 3539 0 + cbz x28, .L1049 +.L1048: + .loc 1 3540 0 add x2, x29, 104 mov x0, x28 adrp x1, .LC72 add x1, x1, :lo12:.LC72 bl sscanf -.LVL1124: - .loc 1 3506 0 +.LVL1113: + .loc 1 3518 0 mov w28, 0 -.LVL1125: - .loc 1 3529 0 +.LVL1114: + .loc 1 3541 0 ldr w2, [x29, 104] - .loc 1 3511 0 + .loc 1 3523 0 mov x27, 0 - .loc 1 3529 0 + .loc 1 3541 0 ldr x0, [x20, 192] cmp x0, x2, uxtw - bls .L1092 -.L1025: - .loc 1 3541 0 - cbnz w24, .L1024 -.LVL1126: -.L1043: - .loc 1 3542 0 + bls .L1099 +.L1031: + .loc 1 3553 0 + cbnz w24, .L1030 +.LVL1115: +.L1049: + .loc 1 3554 0 ldr x0, [x19, 104] adrp x1, .LC75 add x1, x1, :lo12:.LC75 bl _dev_info -.LVL1127: - .loc 1 3543 0 +.LVL1116: + .loc 1 3555 0 ldr x0, [x20, 16] bl ebc_pmic_verity_vcom -.LVL1128: -.LBB1959: -.LBB1960: - .loc 1 2821 0 +.LVL1117: +.LBB2010: +.LBB2011: + .loc 1 2824 0 adrp x0, .LC76 add x0, x0, :lo12:.LC76 bl ebc_empty_buf_get -.LVL1129: +.LVL1118: mov x24, x0 -.LVL1130: - .loc 1 2822 0 +.LVL1119: + .loc 1 2825 0 ldp w2, w0, [x20, 108] mov w1, 255 mul w2, w2, w0 ldr x0, [x24, 16] lsr w2, w2, 1 bl memset -.LVL1131: - .loc 1 2825 0 +.LVL1120: + .loc 1 2828 0 stp wzr, wzr, [x24, 48] - .loc 1 2823 0 + .loc 1 2826 0 mov w0, 17 str w0, [x24, 40] - .loc 1 2828 0 + .loc 1 2831 0 mov w2, 1 - .loc 1 2829 0 + .loc 1 2832 0 mov x0, x24 - .loc 1 2826 0 + .loc 1 2829 0 ldr w1, [x20, 108] str w1, [x24, 56] - .loc 1 2827 0 + .loc 1 2830 0 ldr w1, [x20, 112] - .loc 1 2828 0 + .loc 1 2831 0 stp w1, w2, [x24, 60] - .loc 1 2829 0 + .loc 1 2832 0 bl ebc_add_to_dsp_buf_list -.LVL1132: -.L1027: -.LBE1960: -.LBE1959: - .loc 1 3561 0 - cbnz w28, .L1093 -.L1029: - .loc 1 3575 0 +.LVL1121: +.L1033: +.LBE2011: +.LBE2010: + .loc 1 3573 0 + cbnz w28, .L1100 +.L1035: + .loc 1 3587 0 ldr w0, [x19, 100] adrp x21, .LANCHOR1 - cbz w0, .L1094 -.L1031: - .loc 1 3580 0 - cbz x26, .L1032 - .loc 1 3581 0 + cbz w0, .L1101 +.L1037: + .loc 1 3592 0 + cbz x26, .L1038 + .loc 1 3593 0 mov x0, x26 bl kfree -.LVL1133: -.L1032: - .loc 1 3582 0 - cbz x27, .L1023 - .loc 1 3583 0 +.LVL1122: +.L1038: + .loc 1 3594 0 + cbz x27, .L1029 + .loc 1 3595 0 mov x0, x27 bl kfree -.LVL1134: -.L1023: -.LBE1958: -.LBE1957: -.LBB1971: -.LBB1972: -.LBB1973: +.LVL1123: +.L1029: +.LBE2009: +.LBE2008: +.LBB2021: +.LBB2022: +.LBB2023: .loc 2 1186 0 str x20, [x22, 184] -.LBE1973: -.LBE1972: -.LBE1971: -.LBB1974: -.LBB1975: - .loc 1 3302 0 +.LBE2023: +.LBE2022: +.LBE2021: +.LBB2024: +.LBB2025: + .loc 1 3310 0 add x21, x21, :lo12:.LANCHOR1 add x0, x21, 224 bl misc_register -.LVL1135: - .loc 1 3303 0 +.LVL1124: + .loc 1 3311 0 add x0, x21, 376 bl misc_register -.LVL1136: - .loc 1 3305 0 +.LVL1125: + .loc 1 3313 0 ldr x0, [x20, 296] add x1, x21, 456 bl device_create_file -.LVL1137: - .loc 1 3306 0 +.LVL1126: + .loc 1 3314 0 ldr x0, [x20, 296] add x1, x21, 488 bl device_create_file -.LVL1138: - .loc 1 3307 0 +.LVL1127: + .loc 1 3315 0 ldr x0, [x20, 296] add x1, x21, 520 bl device_create_file -.LVL1139: - .loc 1 3308 0 +.LVL1128: + .loc 1 3316 0 ldr x0, [x20, 296] add x1, x21, 552 bl device_create_file -.LVL1140: - .loc 1 3309 0 +.LVL1129: + .loc 1 3317 0 ldr x0, [x20, 296] add x1, x21, 584 bl device_create_file -.LVL1141: - .loc 1 3310 0 +.LVL1130: + .loc 1 3318 0 ldr x0, [x20, 296] add x1, x21, 616 bl device_create_file -.LVL1142: - .loc 1 3311 0 +.LVL1131: + .loc 1 3319 0 ldr x0, [x20, 296] add x1, x21, 648 bl device_create_file -.LVL1143: - .loc 1 3312 0 +.LVL1132: + .loc 1 3320 0 ldr x0, [x20, 296] add x1, x21, 680 bl device_create_file -.LVL1144: -.LBE1975: -.LBE1974: - .loc 1 3711 0 +.LVL1133: +.LBE2025: +.LBE2024: + .loc 1 3723 0 ldr x0, [x19, 104] - adrp x2, .LC27 + adrp x2, .LC26 adrp x1, .LC78 - add x2, x2, :lo12:.LC27 + add x2, x2, :lo12:.LC26 add x1, x1, :lo12:.LC78 bl _dev_info -.LVL1145: - .loc 1 3713 0 - b .L990 -.LVL1146: -.L1083: -.LBB1976: -.LBB1917: - .loc 1 3380 0 +.LVL1134: + .loc 1 3725 0 + b .L995 +.LVL1135: +.L1090: +.LBB2026: +.LBB1973: + .loc 1 3393 0 adrp x1, .LC54 mov x0, x26 add x1, x1, :lo12:.LC54 bl _dev_err -.LVL1147: -.L1011: -.LBE1917: -.LBE1976: - .loc 1 3682 0 +.LVL1136: +.L1017: +.LBE1973: +.LBE2026: + .loc 1 3694 0 adrp x1, .LC94 mov x0, x22 add x1, x1, :lo12:.LC94 bl _dev_err -.LVL1148: - .loc 1 3683 0 - b .L990 -.LVL1149: -.L1094: -.LBB1977: -.LBB1967: - .loc 1 3576 0 +.LVL1137: + .loc 1 3695 0 + b .L995 +.LVL1138: +.L1101: +.LBB2027: +.LBB2018: + .loc 1 3588 0 mov w2, 1 str w2, [x19, 100] - .loc 1 3577 0 + .loc 1 3589 0 add x0, x21, :lo12:.LANCHOR1 mov w1, w2 add x0, x0, 304 bl __wake_up_sync -.LVL1150: - b .L1031 -.LVL1151: -.L1092: - .loc 1 3531 0 +.LVL1139: + b .L1037 +.LVL1140: +.L1098: + .loc 1 3529 0 ldr x0, [x19, 104] - adrp x1, .LC73 - add x1, x1, :lo12:.LC73 + adrp x1, .LC70 + add x1, x1, :lo12:.LC70 bl _dev_info -.LVL1152: - .loc 1 3532 0 +.LVL1141: + .loc 1 3530 0 ldp w0, w1, [x21, 84] mul w0, w0, w1 -.LBB1961: -.LBB1962: -.LBB1963: +.LBB2012: +.LBB2013: +.LBB2014: .file 16 "./include/linux/slab.h" .loc 16 553 0 mov w1, 32960 movk w1, 0x60, lsl 16 lsr w0, w0, 1 bl __kmalloc -.LVL1153: - mov x27, x0 -.LBE1963: -.LBE1962: -.LBE1961: - .loc 1 3533 0 - cbz x0, .L1095 - .loc 1 3537 0 - ldp w2, w1, [x21, 84] - .loc 1 3530 0 - mov w28, 1 - .loc 1 3537 0 - ldr x3, [x20, 192] - mul w2, w2, w1 - ldr w1, [x29, 104] -.LVL1154: - sub x1, x1, x3 -.LVL1155: - ldr x3, [x19, 8] - lsr w2, w2, 1 - add x1, x3, x1 - bl memcpy -.LVL1156: - b .L1025 -.LVL1157: -.L1091: - .loc 1 3517 0 - ldr x0, [x19, 104] - adrp x1, .LC70 - add x1, x1, :lo12:.LC70 - bl _dev_info -.LVL1158: - .loc 1 3518 0 - ldp w0, w1, [x21, 84] - mul w0, w0, w1 -.LBB1964: -.LBB1965: -.LBB1966: - .loc 16 553 0 - mov w1, 32960 - movk w1, 0x60, lsl 16 - lsr w0, w0, 1 - bl __kmalloc -.LVL1159: +.LVL1142: mov x26, x0 -.LVL1160: -.LBE1966: -.LBE1965: -.LBE1964: - .loc 1 3519 0 - cbz x0, .L1096 - .loc 1 3523 0 +.LVL1143: +.LBE2014: +.LBE2013: +.LBE2012: + .loc 1 3531 0 + cbz x0, .L1102 + .loc 1 3535 0 ldp w2, w1, [x21, 84] ldr x3, [x20, 192] mul w2, w2, w1 ldr w1, [x29, 100] -.LVL1161: +.LVL1144: sub x1, x1, x3 -.LVL1162: +.LVL1145: ldr x3, [x19, 8] lsr w2, w2, 1 add x1, x3, x1 bl memcpy -.LVL1163: - .loc 1 3527 0 - cbnz x28, .L1097 - .loc 1 3506 0 +.LVL1146: + .loc 1 3539 0 + cbnz x28, .L1103 + .loc 1 3518 0 mov w28, 0 -.LVL1164: - .loc 1 3511 0 +.LVL1147: + .loc 1 3523 0 mov x27, 0 -.LVL1165: -.L1024: - .loc 1 3548 0 +.LVL1148: +.L1030: + .loc 1 3560 0 adrp x0, .LC77 add x0, x0, :lo12:.LC77 bl ebc_empty_buf_get -.LVL1166: +.LVL1149: mov x24, x0 -.LVL1167: - .loc 1 3549 0 - cbz x0, .L1027 - .loc 1 3550 0 +.LVL1150: + .loc 1 3561 0 + cbz x0, .L1033 + .loc 1 3562 0 ldp w2, w0, [x21, 84] mov x1, x26 mul w2, w2, w0 ldr x0, [x24, 16] lsr w2, w2, 1 bl memcpy -.LVL1168: - .loc 1 3553 0 +.LVL1151: + .loc 1 3565 0 stp wzr, wzr, [x24, 48] - .loc 1 3551 0 + .loc 1 3563 0 mov w0, 7 str w0, [x24, 40] - .loc 1 3556 0 + .loc 1 3568 0 mov w2, 1 - .loc 1 3557 0 + .loc 1 3569 0 mov x0, x24 - .loc 1 3554 0 + .loc 1 3566 0 ldr w1, [x21, 84] str w1, [x24, 56] - .loc 1 3555 0 + .loc 1 3567 0 ldr w1, [x21, 88] - .loc 1 3556 0 + .loc 1 3568 0 stp w1, w2, [x24, 60] - .loc 1 3557 0 + .loc 1 3569 0 bl ebc_add_to_dsp_buf_list -.LVL1169: - b .L1027 -.LVL1170: -.L994: -.LBE1967: -.LBE1977: - .loc 1 3620 0 +.LVL1152: + b .L1033 +.LVL1153: +.L1099: + .loc 1 3543 0 + ldr x0, [x19, 104] + adrp x1, .LC73 + add x1, x1, :lo12:.LC73 + bl _dev_info +.LVL1154: + .loc 1 3544 0 + ldp w0, w1, [x21, 84] + mul w0, w0, w1 +.LBB2015: +.LBB2016: +.LBB2017: + .loc 16 553 0 + mov w1, 32960 + movk w1, 0x60, lsl 16 + lsr w0, w0, 1 + bl __kmalloc +.LVL1155: + mov x27, x0 +.LBE2017: +.LBE2016: +.LBE2015: + .loc 1 3545 0 + cbz x0, .L1104 + .loc 1 3549 0 + ldp w2, w1, [x21, 84] + .loc 1 3542 0 + mov w28, 1 + .loc 1 3549 0 + ldr x3, [x20, 192] + mul w2, w2, w1 + ldr w1, [x29, 104] +.LVL1156: + sub x1, x1, x3 +.LVL1157: + ldr x3, [x19, 8] + lsr w2, w2, 1 + add x1, x3, x1 + bl memcpy +.LVL1158: + b .L1031 +.LVL1159: +.L999: +.LBE2018: +.LBE2027: + .loc 1 3632 0 mov w25, -517 - b .L990 -.LVL1171: -.L1093: -.LBB1978: -.LBB1968: - .loc 1 3562 0 + b .L995 +.LVL1160: +.L1100: +.LBB2028: +.LBB2019: + .loc 1 3574 0 adrp x0, .LC77 add x0, x0, :lo12:.LC77 bl ebc_empty_buf_get -.LVL1172: +.LVL1161: mov x24, x0 -.LVL1173: - .loc 1 3563 0 - cbz x0, .L1029 - .loc 1 3564 0 +.LVL1162: + .loc 1 3575 0 + cbz x0, .L1035 + .loc 1 3576 0 ldp w2, w0, [x21, 84] mov x1, x27 mul w2, w2, w0 ldr x0, [x24, 16] lsr w2, w2, 1 bl memcpy -.LVL1174: - .loc 1 3567 0 +.LVL1163: + .loc 1 3579 0 stp wzr, wzr, [x24, 48] - .loc 1 3565 0 + .loc 1 3577 0 mov w0, 7 str w0, [x24, 40] - .loc 1 3570 0 + .loc 1 3582 0 mov w1, 1 - .loc 1 3568 0 + .loc 1 3580 0 ldr w0, [x21, 84] str w0, [x24, 56] - .loc 1 3569 0 + .loc 1 3581 0 ldr w0, [x21, 88] - .loc 1 3570 0 + .loc 1 3582 0 stp w0, w1, [x24, 60] - .loc 1 3571 0 + .loc 1 3583 0 mov x0, x24 bl ebc_add_to_dsp_buf_list -.LVL1175: - b .L1029 -.LVL1176: -.L1045: -.LBE1968: -.LBE1978: - .loc 1 3606 0 +.LVL1164: + b .L1035 +.LVL1165: +.L1051: +.LBE2019: +.LBE2028: + .loc 1 3618 0 mov w25, -12 - b .L990 -.LVL1177: -.L995: - .loc 1 3630 0 - adrp x1, .LC41 + b .L995 +.LVL1166: +.L1000: + .loc 1 3642 0 + adrp x1, .LC40 mov x0, x22 - add x1, x1, :lo12:.LC41 - .loc 1 3631 0 + add x1, x1, :lo12:.LC40 + .loc 1 3643 0 mov w25, -22 - .loc 1 3630 0 + .loc 1 3642 0 bl _dev_err -.LVL1178: - .loc 1 3631 0 - b .L990 -.LVL1179: -.L1088: -.LBB1979: -.LBB1931: - .loc 1 3350 0 +.LVL1167: + .loc 1 3643 0 + b .L995 +.LVL1168: +.L1095: +.LBB2029: +.LBB1986: + .loc 1 3358 0 ldr x0, [x19, 104] adrp x1, .LC59 add x1, x1, :lo12:.LC59 bl _dev_err -.LVL1180: - .loc 1 3351 0 +.LVL1169: + .loc 1 3359 0 ldr x0, [x19, 104] mov w2, w26 - ldr x1, [x19, 216] + ldr x1, [x19, 208] bl epd_lut_from_file_init -.LVL1181: - .loc 1 3352 0 - tbz w0, #31, .L1017 - .loc 1 3353 0 +.LVL1170: + .loc 1 3360 0 + tbz w0, #31, .L1023 + .loc 1 3361 0 ldr x0, [x19, 104] adrp x1, .LC60 - .loc 1 3354 0 + .loc 1 3362 0 mov w25, -1 - .loc 1 3353 0 + .loc 1 3361 0 add x1, x1, :lo12:.LC60 bl _dev_err -.LVL1182: - b .L1015 +.LVL1171: + b .L1021 +.LVL1172: .p2align 3 .L1089: -.LBE1931: -.LBE1979: -.LBB1980: -.LBB1944: - .loc 1 3441 0 +.LBE1986: +.LBE2029: +.LBB2030: +.LBB1974: + .loc 1 3381 0 + adrp x1, .LC52 + mov x0, x26 + add x1, x1, :lo12:.LC52 + .loc 1 3382 0 + mov w25, -19 + .loc 1 3381 0 + bl _dev_err +.LVL1173: + b .L1017 +.LVL1174: +.L1096: +.LBE1974: +.LBE2030: +.LBB2031: +.LBB1999: + .loc 1 3452 0 ldr x0, [x19, 104] adrp x1, .LC61 add x1, x1, :lo12:.LC61 bl _dev_err -.LVL1183: -.L1018: -.LBE1944: -.LBE1980: - .loc 1 3696 0 +.LVL1175: +.L1024: +.LBE1999: +.LBE2031: + .loc 1 3708 0 adrp x1, .LC98 mov x0, x22 add x1, x1, :lo12:.LC98 - .loc 1 3697 0 + .loc 1 3709 0 mov w25, -1 - .loc 1 3696 0 + .loc 1 3708 0 bl _dev_err -.LVL1184: - .loc 1 3697 0 - b .L990 -.LVL1185: -.L1090: -.LBB1981: -.LBB1945: - .loc 1 3450 0 +.LVL1176: + .loc 1 3709 0 + b .L995 +.LVL1177: +.L1097: +.LBB2032: +.LBB2000: + .loc 1 3461 0 ldr x0, [x19, 104] adrp x1, .LC63 add x1, x1, :lo12:.LC63 bl _dev_err -.LVL1186: - b .L1018 -.LVL1187: -.L1084: -.LBE1945: -.LBE1981: -.LBB1982: -.LBB1918: - .loc 1 3387 0 - adrp x1, .LC55 - mov w2, 50331648 - add x1, x1, :lo12:.LC55 - mov x0, x26 - .loc 1 3388 0 - mov w25, -19 - .loc 1 3387 0 - bl _dev_err -.LVL1188: - b .L1011 -.LVL1189: -.L1020: -.LBE1918: -.LBE1982: -.LBB1983: -.LBB1946: - .loc 1 3461 0 +.LVL1178: + b .L1024 +.LVL1179: +.L1053: +.LBE2000: +.LBE2032: +.LBB2033: +.LBB1975: + .loc 1 3416 0 + mov w25, -12 + b .L1017 +.LVL1180: +.L1026: +.LBE1975: +.LBE2033: +.LBB2034: +.LBB2001: + .loc 1 3472 0 ldr x0, [x19, 104] -.LVL1190: +.LVL1181: adrp x1, .LC97 - .loc 1 3459 0 + .loc 1 3470 0 str x26, [x24, 24] - .loc 1 3461 0 + .loc 1 3472 0 add x1, x1, :lo12:.LC97 bl _dev_err -.LVL1191: - b .L1018 -.LVL1192: -.L1047: -.LBE1946: -.LBE1983: -.LBB1984: -.LBB1919: - .loc 1 3403 0 - mov w25, -12 - b .L1011 -.LVL1193: -.L1079: -.LBE1919: -.LBE1984: - .loc 1 3613 0 - adrp x1, .LC39 - mov x0, x22 - add x1, x1, :lo12:.LC39 - .loc 1 3614 0 +.LVL1182: + b .L1024 +.LVL1183: +.L1091: +.LBE2001: +.LBE2034: +.LBB2035: +.LBB1976: + .loc 1 3400 0 + adrp x1, .LC55 + mov w2, 53477376 + add x1, x1, :lo12:.LC55 + mov x0, x26 + .loc 1 3401 0 mov w25, -19 - .loc 1 3613 0 + .loc 1 3400 0 bl _dev_err -.LVL1194: - .loc 1 3614 0 - b .L990 -.LVL1195: -.L1046: -.LBB1985: -.LBB1920: - .loc 1 3375 0 - mov w25, -19 - b .L1011 -.LVL1196: -.L1048: -.LBE1920: -.LBE1985: -.LBB1986: -.LBB1932: - .loc 1 3328 0 - mov w25, -19 - b .L1015 -.LVL1197: +.LVL1184: + b .L1017 +.LVL1185: .L1085: -.LBE1932: -.LBE1986: +.LBE1976: +.LBE2035: + .loc 1 3625 0 + adrp x1, .LC38 + mov x0, x22 + add x1, x1, :lo12:.LC38 + .loc 1 3626 0 + mov w25, -19 + .loc 1 3625 0 + bl _dev_err +.LVL1186: + .loc 1 3626 0 + b .L995 +.LVL1187: +.L1052: +.LBB2036: +.LBB1977: + .loc 1 3388 0 + mov w25, -19 + b .L1017 +.LVL1188: +.L1054: +.LBE1977: +.LBE2036: +.LBB2037: .LBB1987: -.LBB1921: - .loc 1 3393 0 + .loc 1 3336 0 + mov w25, -19 + b .L1021 +.LVL1189: +.L1092: +.LBE1987: +.LBE2037: +.LBB2038: +.LBB1978: + .loc 1 3406 0 adrp x1, .LC56 mov x0, x26 add x1, x1, :lo12:.LC56 - .loc 1 3394 0 + .loc 1 3407 0 mov w25, -12 - .loc 1 3393 0 + .loc 1 3406 0 bl _dev_err -.LVL1198: - b .L1011 -.LVL1199: -.L1095: -.LBE1921: -.LBE1987: -.LBB1988: -.LBB1969: - .loc 1 3534 0 - ldr x0, [x19, 104] -.LVL1200: - adrp x1, .LC74 - adrp x21, .LANCHOR1 - add x1, x1, :lo12:.LC74 - bl _dev_err -.LVL1201: - b .L1023 -.LVL1202: -.L1082: -.LBE1969: -.LBE1988: - .loc 1 3714 0 +.LVL1190: + b .L1017 +.LVL1191: +.L1088: +.LBE1978: +.LBE2038: + .loc 1 3726 0 bl __stack_chk_fail -.LVL1203: -.L1087: -.LBB1989: -.LBB1933: - .loc 1 3344 0 - ldr x0, [x19, 104] - adrp x2, .LANCHOR3 - add x2, x2, :lo12:.LANCHOR3 - adrp x1, .LC58 - mov w3, 3344 - add x2, x2, 32 - add x1, x1, :lo12:.LC58 - .loc 1 3345 0 - mov w25, -12 - .loc 1 3344 0 - bl _dev_err -.LVL1204: - b .L1015 -.LVL1205: -.L1097: -.LBE1933: -.LBE1989: -.LBB1990: -.LBB1970: - .loc 1 3516 0 +.LVL1192: +.L1103: +.LBB2039: +.LBB2020: + .loc 1 3528 0 mov w24, w27 -.LVL1206: - b .L1042 -.LVL1207: -.L1096: - .loc 1 3520 0 +.LVL1193: + b .L1048 +.LVL1194: +.L1102: + .loc 1 3532 0 ldr x0, [x19, 104] -.LVL1208: +.LVL1195: adrp x1, .LC71 adrp x21, .LANCHOR1 add x1, x1, :lo12:.LC71 bl _dev_err -.LVL1209: - b .L1023 -.LBE1970: -.LBE1990: +.LVL1196: + b .L1029 +.LVL1197: +.L1104: + .loc 1 3546 0 + ldr x0, [x19, 104] +.LVL1198: + adrp x1, .LC74 + adrp x21, .LANCHOR1 + add x1, x1, :lo12:.LC74 + bl _dev_err +.LVL1199: + b .L1029 +.LVL1200: +.L1094: +.LBE2020: +.LBE2039: +.LBB2040: +.LBB1988: + .loc 1 3352 0 + ldr x0, [x19, 104] + adrp x2, .LANCHOR3 + add x2, x2, :lo12:.LANCHOR3 + adrp x1, .LC58 + mov w3, 3352 + add x2, x2, 32 + add x1, x1, :lo12:.LC58 + .loc 1 3353 0 + mov w25, -12 + .loc 1 3352 0 + bl _dev_err +.LVL1201: + b .L1021 +.LBE1988: +.LBE2040: .cfi_endproc .LFE2869: .size ebc_probe, .-ebc_probe @@ -12160,40 +12236,40 @@ .type auto_frame_state_read, %function auto_frame_state_read: .LFB2862: - .loc 1 3284 0 + .loc 1 3292 0 .cfi_startproc -.LVL1210: - .loc 1 3285 0 +.LVL1202: + .loc 1 3293 0 adrp x0, .LANCHOR0 -.LVL1211: +.LVL1203: ldr x1, [x0, #:lo12:.LANCHOR0] -.LVL1212: - .loc 1 3289 0 +.LVL1204: + .loc 1 3297 0 ldp w0, w4, [x1, 108] mul w4, w4, w0 - cbz w4, .L1099 - .loc 1 3290 0 - ldr x5, [x1, 368] + cbz w4, .L1106 + .loc 1 3298 0 + ldr x5, [x1, 360] mov w1, 0 -.LVL1213: +.LVL1205: ldrb w3, [x5] - cbz w3, .L1102 - b .L1100 + cbz w3, .L1109 + b .L1107 .p2align 3 -.L1104: +.L1111: ldrb w3, [x5, w1, sxtw] - cbnz w3, .L1100 -.L1102: - .loc 1 3289 0 discriminator 2 + cbnz w3, .L1107 +.L1109: + .loc 1 3297 0 discriminator 2 add w1, w1, 1 cmp w1, w4 - bne .L1104 -.L1099: -.LBB1993: -.LBB1994: - .loc 1 3295 0 + bne .L1111 +.L1106: +.LBB2043: +.LBB2044: + .loc 1 3303 0 adrp x1, .LC100 -.LVL1214: +.LVL1206: add x1, x1, :lo12:.LC100 mov x0, 2 ldrh w3, [x1] @@ -12201,33 +12277,33 @@ strh w3, [x2] strb w1, [x2, 2] ret -.LVL1215: +.LVL1207: .p2align 3 -.L1100: -.LBE1994: -.LBE1993: - .loc 1 3284 0 +.L1107: +.LBE2044: +.LBE2043: + .loc 1 3292 0 stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 mov x0, x2 - .loc 1 3291 0 - adrp x1, .LC26 -.LVL1216: + .loc 1 3299 0 + adrp x1, .LC25 +.LVL1208: mov w2, w3 -.LVL1217: - .loc 1 3284 0 +.LVL1209: + .loc 1 3292 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 3291 0 - add x1, x1, :lo12:.LC26 - .loc 1 3284 0 - .loc 1 3291 0 + .loc 1 3299 0 + add x1, x1, :lo12:.LC25 + .loc 1 3292 0 + .loc 1 3299 0 bl sprintf -.LVL1218: +.LVL1210: sxtw x0, w0 - .loc 1 3296 0 + .loc 1 3304 0 ldp x29, x30, [sp], 16 .cfi_restore 30 .cfi_restore 29 @@ -12241,9 +12317,9 @@ .type ebc_power_set.constprop.15, %function ebc_power_set.constprop.15: .LFB2892: - .loc 1 390 0 + .loc 1 389 0 .cfi_startproc -.LVL1219: +.LVL1211: stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 @@ -12253,51 +12329,51 @@ stp x19, x20, [sp, 16] .cfi_offset 19, -16 .cfi_offset 20, -8 - .loc 1 396 0 + .loc 1 395 0 add x20, x0, 192 - .loc 1 390 0 + .loc 1 389 0 mov x19, x0 - .loc 1 396 0 - ldr w0, [x20, 480] -.LVL1220: - cbz w0, .L1117 -.L1115: - .loc 1 400 0 + .loc 1 395 0 + ldr w0, [x20, 464] +.LVL1212: + cbz w0, .L1124 +.L1122: + .loc 1 399 0 mov w1, 1 - str w1, [x20, 208] - .loc 1 401 0 + str w1, [x20, 200] + .loc 1 400 0 ldr x2, [x19, 16] -.LBB1995: -.LBB1996: +.LBB2045: +.LBB2046: .loc 3 30 0 mov x0, x2 ldr x2, [x2, 32] blr x2 -.LVL1221: -.LBE1996: -.LBE1995: - .loc 1 402 0 +.LVL1213: +.LBE2046: +.LBE2045: + .loc 1 401 0 ldr x2, [x19, 8] -.LBB1997: -.LBB1998: +.LBB2047: +.LBB2048: .loc 10 45 0 add x1, x19, 24 mov x0, x2 ldr x2, [x2, 48] blr x2 -.LVL1222: -.LBE1998: -.LBE1997: - .loc 1 403 0 +.LVL1214: +.LBE2048: +.LBE2047: + .loc 1 402 0 ldr x0, [x19] adrp x1, .LC101 add x1, x1, :lo12:.LC101 bl _dev_info -.LVL1223: - .loc 1 418 0 +.LVL1215: + .loc 1 417 0 mov w0, 0 ldp x19, x20, [sp, 16] -.LVL1224: +.LVL1216: ldp x29, x30, [sp], 32 .cfi_remember_state .cfi_restore 30 @@ -12306,22 +12382,22 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL1225: +.LVL1217: .p2align 3 -.L1117: +.L1124: .cfi_restore_state - .loc 1 397 0 + .loc 1 396 0 mov w0, 1 - str w0, [x20, 480] -.LBB1999: -.LBB2000: + str w0, [x20, 464] +.LBB2049: +.LBB2050: .loc 11 58 0 - add x0, x19, 464 + add x0, x19, 448 bl __pm_stay_awake -.LVL1226: - b .L1115 -.LBE2000: -.LBE1999: +.LVL1218: + b .L1122 +.LBE2050: +.LBE2049: .cfi_endproc .LFE2892: .size ebc_power_set.constprop.15, .-ebc_power_set.constprop.15 @@ -12343,31 +12419,31 @@ .type refresh_new_image, %function refresh_new_image: .LFB2818: - .loc 1 486 0 + .loc 1 485 0 .cfi_startproc -.LVL1227: - .loc 1 494 0 +.LVL1219: + .loc 1 493 0 ldp w18, w6, [x5, 92] cmp w6, 0 add w12, w6, 7 csel w12, w12, w6, lt -.LVL1228: - .loc 1 496 0 +.LVL1220: + .loc 1 495 0 cmp w18, 0 - ble .L1198 + ble .L1205 asr w12, w12, 3 -.LVL1229: - .loc 1 486 0 +.LVL1221: + .loc 1 485 0 stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 .cfi_offset 30, -24 sub w15, w12, #1 - .loc 1 496 0 + .loc 1 495 0 mov w16, 0 -.LVL1230: +.LVL1222: add x15, x15, 1 - .loc 1 486 0 + .loc 1 485 0 add x29, sp, 0 .cfi_def_cfa_register 29 lsl x17, x15, 3 @@ -12375,157 +12451,157 @@ stp x19, x20, [sp, 16] .cfi_offset 19, -16 .cfi_offset 20, -8 -.LBB2001: - .loc 1 513 0 +.LBB2051: + .loc 1 512 0 mov w14, 251658240 -.LBE2001: -.LBB2002: - .loc 1 514 0 +.LBE2051: +.LBB2052: + .loc 1 513 0 mov w13, -268435456 mov w19, -536870912 -.LBE2002: -.LBB2003: - .loc 1 513 0 +.LBE2052: +.LBB2053: + .loc 1 512 0 mov w30, 234881024 -.LVL1231: +.LVL1223: .p2align 2 -.L1121: -.LBE2003: - .loc 1 497 0 discriminator 1 +.L1128: +.LBE2053: + .loc 1 496 0 discriminator 1 mov x7, 0 cmp w12, 0 - ble .L1185 + ble .L1192 .p2align 2 -.L1193: - .loc 1 498 0 +.L1200: + .loc 1 497 0 ldr x9, [x3, x7, lsl 3] - .loc 1 499 0 + .loc 1 498 0 ldr x11, [x4, x7, lsl 3] -.LVL1232: - .loc 1 500 0 +.LVL1224: + .loc 1 499 0 ldr w6, [x1, x7, lsl 2] - .loc 1 501 0 + .loc 1 500 0 ldr w8, [x0, x7, lsl 2] - .loc 1 502 0 + .loc 1 501 0 ldr w10, [x2, x7, lsl 2] -.LVL1233: - .loc 1 505 0 - cbnz x9, .L1122 -.LVL1234: -.LBB2004: - .loc 1 507 0 +.LVL1225: + .loc 1 504 0 + cbnz x9, .L1129 +.LVL1226: +.LBB2054: + .loc 1 506 0 and w5, w6, 15 -.LVL1235: +.LVL1227: cmp w5, 15 - bne .L1206 -.L1123: -.LBE2004: -.LBB2005: - .loc 1 508 0 - and w11, w6, 240 -.LVL1236: - cmp w11, 240 - bne .L1125 -.L1209: - .loc 1 508 0 is_stmt 0 discriminator 1 - orr w5, w5, 240 -.L1126: -.LBE2005: -.LBB2006: - .loc 1 509 0 is_stmt 1 - and w11, w6, 3840 -.LVL1237: - cmp w11, 3840 - bne .L1129 -.L1210: - .loc 1 509 0 is_stmt 0 discriminator 1 - orr w5, w5, 3840 + bne .L1213 .L1130: -.LBE2006: -.LBB2007: - .loc 1 510 0 is_stmt 1 +.LBE2054: +.LBB2055: + .loc 1 507 0 + and w11, w6, 240 +.LVL1228: + cmp w11, 240 + bne .L1132 +.L1216: + .loc 1 507 0 is_stmt 0 discriminator 1 + orr w5, w5, 240 +.L1133: +.LBE2055: +.LBB2056: + .loc 1 508 0 is_stmt 1 + and w11, w6, 3840 +.LVL1229: + cmp w11, 3840 + bne .L1136 +.L1217: + .loc 1 508 0 is_stmt 0 discriminator 1 + orr w5, w5, 3840 +.L1137: +.LBE2056: +.LBB2057: + .loc 1 509 0 is_stmt 1 and w11, w6, 61440 -.LVL1238: +.LVL1230: cmp w11, 61440 - bne .L1133 -.L1211: - .loc 1 510 0 is_stmt 0 discriminator 1 + bne .L1140 +.L1218: + .loc 1 509 0 is_stmt 0 discriminator 1 orr w5, w5, 61440 -.L1134: -.LBE2007: -.LBB2008: - .loc 1 511 0 is_stmt 1 +.L1141: +.LBE2057: +.LBB2058: + .loc 1 510 0 is_stmt 1 and w11, w6, 983040 -.LVL1239: +.LVL1231: cmp w11, 983040 - bne .L1137 - .loc 1 511 0 is_stmt 0 discriminator 1 + bne .L1144 + .loc 1 510 0 is_stmt 0 discriminator 1 orr w5, w5, 983040 -.L1138: -.LBE2008: -.LBB2009: - .loc 1 512 0 is_stmt 1 +.L1145: +.LBE2058: +.LBB2059: + .loc 1 511 0 is_stmt 1 and w11, w6, 15728640 -.LVL1240: +.LVL1232: cmp w11, 15728640 - bne .L1141 - .loc 1 512 0 is_stmt 0 discriminator 1 + bne .L1148 + .loc 1 511 0 is_stmt 0 discriminator 1 orr w5, w5, 15728640 -.L1142: -.LBE2009: -.LBB2010: - .loc 1 513 0 is_stmt 1 +.L1149: +.LBE2059: +.LBB2060: + .loc 1 512 0 is_stmt 1 and w11, w6, 251658240 -.LVL1241: +.LVL1233: cmp w11, w14 - bne .L1145 - .loc 1 513 0 is_stmt 0 discriminator 1 + bne .L1152 + .loc 1 512 0 is_stmt 0 discriminator 1 orr w5, w5, 251658240 -.L1146: -.LBE2010: -.LBB2011: - .loc 1 514 0 is_stmt 1 +.L1153: +.LBE2060: +.LBB2061: + .loc 1 513 0 is_stmt 1 and w11, w6, -268435456 -.LVL1242: +.LVL1234: cmp w11, w13 - bne .L1180 -.LVL1243: -.L1201: -.LBE2011: -.LBB2012: - .loc 1 523 0 discriminator 2 + bne .L1187 +.LVL1235: +.L1208: +.LBE2061: +.LBB2062: + .loc 1 522 0 discriminator 2 orr w5, w5, -268435456 -.L1150: -.LVL1244: -.LBE2012: - .loc 1 527 0 discriminator 2 +.L1157: +.LVL1236: +.LBE2062: + .loc 1 526 0 discriminator 2 and w6, w6, w10 -.LVL1245: - .loc 1 528 0 discriminator 2 +.LVL1237: + .loc 1 527 0 discriminator 2 str x9, [x4, x7, lsl 3] eor w6, w6, w8 and w5, w6, w5 -.LVL1246: - .loc 1 527 0 discriminator 2 +.LVL1238: + .loc 1 526 0 discriminator 2 eor w5, w8, w5 - .loc 1 529 0 discriminator 2 + .loc 1 528 0 discriminator 2 str w5, [x0, x7, lsl 2] add x7, x7, 1 - .loc 1 497 0 discriminator 2 + .loc 1 496 0 discriminator 2 cmp w12, w7 - bgt .L1193 + bgt .L1200 add x3, x3, x17 add x1, x1, x15 add x2, x2, x15 add x4, x4, x17 add x0, x0, x15 -.LVL1247: -.L1185: - .loc 1 496 0 discriminator 2 +.LVL1239: +.L1192: + .loc 1 495 0 discriminator 2 add w16, w16, 1 cmp w18, w16 - bne .L1121 - .loc 1 532 0 + bne .L1128 + .loc 1 531 0 ldp x19, x20, [sp, 16] ldp x29, x30, [sp], 32 .cfi_remember_state @@ -12535,652 +12611,652 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL1248: +.LVL1240: .p2align 3 -.L1122: +.L1129: .cfi_restore_state - .loc 1 516 0 + .loc 1 515 0 and x20, x9, 255 - .loc 1 503 0 + .loc 1 502 0 mov w5, 0 -.LVL1249: - .loc 1 516 0 - cbnz x20, .L1153 -.LVL1250: -.LBB2013: - .loc 1 516 0 is_stmt 0 discriminator 1 +.LVL1241: + .loc 1 515 0 + cbnz x20, .L1160 +.LVL1242: +.LBB2063: + .loc 1 515 0 is_stmt 0 discriminator 1 and w5, w6, 15 -.LBE2013: +.LBE2063: and x11, x11, -256 -.LBB2014: +.LBB2064: cmp w5, 15 - bne .L1207 -.L1153: -.LBE2014: - .loc 1 517 0 is_stmt 1 - tst x9, 65280 - bne .L1156 -.LBB2015: - .loc 1 517 0 is_stmt 0 discriminator 1 - and w20, w6, 240 -.LVL1251: -.LBE2015: - and x11, x11, -65281 -.LBB2016: - cmp w20, 240 - bne .L1157 - .loc 1 517 0 discriminator 2 - orr w5, w5, 240 -.L1156: -.LBE2016: - .loc 1 518 0 is_stmt 1 - tst x9, 16711680 - bne .L1160 -.LBB2017: - .loc 1 518 0 is_stmt 0 discriminator 1 - and w20, w6, 3840 -.LVL1252: -.LBE2017: - and x11, x11, -16711681 -.LBB2018: - cmp w20, 3840 - bne .L1161 - .loc 1 518 0 discriminator 2 - orr w5, w5, 3840 -.LVL1253: + bne .L1214 .L1160: -.LBE2018: - .loc 1 519 0 is_stmt 1 - tst x9, 4278190080 +.LBE2064: + .loc 1 516 0 is_stmt 1 + tst x9, 65280 + bne .L1163 +.LBB2065: + .loc 1 516 0 is_stmt 0 discriminator 1 + and w20, w6, 240 +.LVL1243: +.LBE2065: + and x11, x11, -65281 +.LBB2066: + cmp w20, 240 bne .L1164 -.LBB2019: - .loc 1 519 0 is_stmt 0 discriminator 1 - and w20, w6, 61440 -.LVL1254: -.LBE2019: - and x11, x11, -4278190081 -.LBB2020: - cmp w20, 61440 - bne .L1165 - .loc 1 519 0 discriminator 2 - orr w5, w5, 61440 -.LVL1255: -.L1164: -.LBE2020: - .loc 1 520 0 is_stmt 1 - tst x9, 1095216660480 + .loc 1 516 0 discriminator 2 + orr w5, w5, 240 +.L1163: +.LBE2066: + .loc 1 517 0 is_stmt 1 + tst x9, 16711680 + bne .L1167 +.LBB2067: + .loc 1 517 0 is_stmt 0 discriminator 1 + and w20, w6, 3840 +.LVL1244: +.LBE2067: + and x11, x11, -16711681 +.LBB2068: + cmp w20, 3840 bne .L1168 -.LBB2021: - .loc 1 520 0 is_stmt 0 discriminator 1 - and w20, w6, 983040 -.LVL1256: -.LBE2021: - and x11, x11, -1095216660481 -.LBB2022: - cmp w20, 983040 - bne .L1169 - .loc 1 520 0 discriminator 2 - orr w5, w5, 983040 -.LVL1257: -.L1168: -.LBE2022: - .loc 1 521 0 is_stmt 1 - tst x9, 280375465082880 + .loc 1 517 0 discriminator 2 + orr w5, w5, 3840 +.LVL1245: +.L1167: +.LBE2068: + .loc 1 518 0 is_stmt 1 + tst x9, 4278190080 + bne .L1171 +.LBB2069: + .loc 1 518 0 is_stmt 0 discriminator 1 + and w20, w6, 61440 +.LVL1246: +.LBE2069: + and x11, x11, -4278190081 +.LBB2070: + cmp w20, 61440 bne .L1172 -.LBB2023: - .loc 1 521 0 is_stmt 0 discriminator 1 - and w20, w6, 15728640 -.LVL1258: -.LBE2023: - and x11, x11, -280375465082881 -.LBB2024: - cmp w20, 15728640 - bne .L1173 - .loc 1 521 0 discriminator 2 - orr w5, w5, 15728640 -.LVL1259: -.L1172: -.LBE2024: - .loc 1 522 0 is_stmt 1 - tst x9, 71776119061217280 + .loc 1 518 0 discriminator 2 + orr w5, w5, 61440 +.LVL1247: +.L1171: +.LBE2070: + .loc 1 519 0 is_stmt 1 + tst x9, 1095216660480 + bne .L1175 +.LBB2071: + .loc 1 519 0 is_stmt 0 discriminator 1 + and w20, w6, 983040 +.LVL1248: +.LBE2071: + and x11, x11, -1095216660481 +.LBB2072: + cmp w20, 983040 bne .L1176 -.LBB2025: - .loc 1 522 0 is_stmt 0 discriminator 1 + .loc 1 519 0 discriminator 2 + orr w5, w5, 983040 +.LVL1249: +.L1175: +.LBE2072: + .loc 1 520 0 is_stmt 1 + tst x9, 280375465082880 + bne .L1179 +.LBB2073: + .loc 1 520 0 is_stmt 0 discriminator 1 + and w20, w6, 15728640 +.LVL1250: +.LBE2073: + and x11, x11, -280375465082881 +.LBB2074: + cmp w20, 15728640 + bne .L1180 + .loc 1 520 0 discriminator 2 + orr w5, w5, 15728640 +.LVL1251: +.L1179: +.LBE2074: + .loc 1 521 0 is_stmt 1 + tst x9, 71776119061217280 + bne .L1183 +.LBB2075: + .loc 1 521 0 is_stmt 0 discriminator 1 and w20, w6, 251658240 -.LVL1260: -.LBE2025: +.LVL1252: +.LBE2075: and x11, x11, -71776119061217281 -.LBB2026: +.LBB2076: cmp w20, w14 - bne .L1177 - .loc 1 522 0 discriminator 2 + bne .L1184 + .loc 1 521 0 discriminator 2 orr w5, w5, 251658240 -.LVL1261: -.L1176: -.LBE2026: - .loc 1 523 0 is_stmt 1 +.LVL1253: +.L1183: +.LBE2076: + .loc 1 522 0 is_stmt 1 and x20, x9, -72057594037927936 -.LVL1262: -.LBB2027: +.LVL1254: +.LBB2077: mov x9, x11 -.LBE2027: - cbnz x20, .L1150 -.LBB2028: - .loc 1 523 0 is_stmt 0 discriminator 1 +.LBE2077: + cbnz x20, .L1157 +.LBB2078: + .loc 1 522 0 is_stmt 0 discriminator 1 and w11, w6, -268435456 -.LVL1263: -.LBE2028: +.LVL1255: +.LBE2078: and x9, x9, 72057594037927935 -.LBB2029: +.LBB2079: cmp w11, w13 - beq .L1201 -.LVL1264: + beq .L1208 +.LVL1256: .p2align 2 -.L1180: - .loc 1 523 0 discriminator 3 - cbnz w11, .L1181 - .loc 1 523 0 discriminator 4 +.L1187: + .loc 1 522 0 discriminator 3 + cbnz w11, .L1188 + .loc 1 522 0 discriminator 4 orr w5, w5, -268435456 orr x9, x9, 72057594037927936 - b .L1150 -.LVL1265: + b .L1157 +.LVL1257: .p2align 3 -.L1145: -.LBE2029: -.LBB2030: - .loc 1 513 0 is_stmt 1 discriminator 2 - cbnz w11, .L1147 - .loc 1 513 0 is_stmt 0 discriminator 3 +.L1152: +.LBE2079: +.LBB2080: + .loc 1 512 0 is_stmt 1 discriminator 2 + cbnz w11, .L1154 + .loc 1 512 0 is_stmt 0 discriminator 3 orr w5, w5, 251658240 orr x9, x9, 281474976710656 - b .L1146 -.LVL1266: + b .L1153 +.LVL1258: .p2align 3 -.L1141: -.LBE2030: -.LBB2031: - .loc 1 512 0 is_stmt 1 discriminator 2 - cbnz w11, .L1143 - .loc 1 512 0 is_stmt 0 discriminator 3 +.L1148: +.LBE2080: +.LBB2081: + .loc 1 511 0 is_stmt 1 discriminator 2 + cbnz w11, .L1150 + .loc 1 511 0 is_stmt 0 discriminator 3 orr w5, w5, 15728640 orr x9, x9, 1099511627776 - b .L1142 -.LVL1267: + b .L1149 +.LVL1259: .p2align 3 -.L1137: -.LBE2031: -.LBB2032: - .loc 1 511 0 is_stmt 1 discriminator 2 - cbnz w11, .L1139 - .loc 1 511 0 is_stmt 0 discriminator 3 +.L1144: +.LBE2081: +.LBB2082: + .loc 1 510 0 is_stmt 1 discriminator 2 + cbnz w11, .L1146 + .loc 1 510 0 is_stmt 0 discriminator 3 orr w5, w5, 983040 orr x9, x9, 4294967296 - b .L1138 -.LVL1268: - .p2align 3 -.L1206: -.LBE2032: -.LBB2033: - .loc 1 507 0 is_stmt 1 discriminator 2 - cbz w5, .L1186 - .loc 1 507 0 is_stmt 0 discriminator 4 - cmp w5, 14 - beq .L1208 - .loc 1 507 0 discriminator 6 - and w8, w8, -16 -.LBE2033: -.LBB2034: - .loc 1 508 0 is_stmt 1 discriminator 6 - and w11, w6, 240 -.LVL1269: -.LBE2034: -.LBB2035: - .loc 1 507 0 discriminator 6 - orr w8, w5, w8 -.LBE2035: -.LBB2036: - .loc 1 508 0 discriminator 6 - cmp w11, 240 -.LBE2036: - .loc 1 503 0 discriminator 6 - mov w5, 0 -.LBB2037: - .loc 1 508 0 discriminator 6 - beq .L1209 - .p2align 2 -.L1125: - .loc 1 508 0 is_stmt 0 discriminator 2 - cbnz w11, .L1127 -.LBE2037: -.LBB2038: - .loc 1 509 0 is_stmt 1 discriminator 3 - and w11, w6, 3840 -.LVL1270: -.LBE2038: -.LBB2039: - .loc 1 508 0 discriminator 3 - orr w5, w5, 240 - orr x9, x9, 256 -.LBE2039: -.LBB2040: - .loc 1 509 0 discriminator 3 - cmp w11, 3840 - beq .L1210 - .p2align 2 -.L1129: - .loc 1 509 0 is_stmt 0 discriminator 2 - cbnz w11, .L1131 -.LBE2040: -.LBB2041: - .loc 1 510 0 is_stmt 1 discriminator 3 - and w11, w6, 61440 -.LVL1271: -.LBE2041: -.LBB2042: - .loc 1 509 0 discriminator 3 - orr w5, w5, 3840 - orr x9, x9, 65536 -.LBE2042: -.LBB2043: - .loc 1 510 0 discriminator 3 - cmp w11, 61440 - beq .L1211 - .p2align 2 -.L1133: - .loc 1 510 0 is_stmt 0 discriminator 2 - cbnz w11, .L1135 - .loc 1 510 0 discriminator 3 - orr w5, w5, 61440 - orr x9, x9, 16777216 - b .L1134 -.LVL1272: - .p2align 3 -.L1181: -.LBE2043: -.LBB2044: - .loc 1 523 0 is_stmt 1 discriminator 5 - cmp w11, w19 - beq .L1212 - .loc 1 523 0 is_stmt 0 discriminator 7 - and w8, w8, 268435455 - orr w8, w11, w8 - b .L1150 -.LVL1273: - .p2align 3 -.L1186: -.LBE2044: -.LBB2045: - .loc 1 507 0 is_stmt 1 - mov w5, 15 - mov x9, 1 - b .L1123 -.LVL1274: - .p2align 3 -.L1131: -.LBE2045: -.LBB2046: - .loc 1 509 0 discriminator 4 - cmp w11, 3584 - beq .L1213 - .loc 1 509 0 is_stmt 0 discriminator 6 - and w8, w8, -3841 - orr w8, w11, w8 - b .L1130 -.LVL1275: - .p2align 3 -.L1147: -.LBE2046: -.LBB2047: - .loc 1 513 0 is_stmt 1 discriminator 4 - cmp w11, w30 - beq .L1214 - .loc 1 513 0 is_stmt 0 discriminator 6 - and w8, w8, -251658241 - orr w8, w11, w8 - b .L1146 -.LVL1276: - .p2align 3 -.L1143: -.LBE2047: -.LBB2048: - .loc 1 512 0 is_stmt 1 discriminator 4 - cmp w11, 14680064 - beq .L1215 - .loc 1 512 0 is_stmt 0 discriminator 6 - and w8, w8, -15728641 - orr w8, w11, w8 - b .L1142 -.LVL1277: - .p2align 3 -.L1139: -.LBE2048: -.LBB2049: - .loc 1 511 0 is_stmt 1 discriminator 4 - cmp w11, 917504 - beq .L1216 - .loc 1 511 0 is_stmt 0 discriminator 6 - and w8, w8, -983041 - orr w8, w11, w8 - b .L1138 -.LVL1278: - .p2align 3 -.L1127: -.LBE2049: -.LBB2050: - .loc 1 508 0 is_stmt 1 discriminator 4 - cmp w11, 224 - beq .L1217 - .loc 1 508 0 is_stmt 0 discriminator 6 - and w8, w8, -241 - orr w8, w11, w8 - b .L1126 -.LVL1279: - .p2align 3 -.L1135: -.LBE2050: -.LBB2051: - .loc 1 510 0 is_stmt 1 discriminator 4 - cmp w11, 57344 - beq .L1218 - .loc 1 510 0 is_stmt 0 discriminator 6 - and w8, w8, -61441 - orr w8, w11, w8 - b .L1134 -.LVL1280: - .p2align 3 -.L1212: -.LBE2051: -.LBB2052: - .loc 1 523 0 is_stmt 1 discriminator 6 - orr w8, w8, -268435456 - orr x9, x9, 72057594037927936 - b .L1150 -.LVL1281: + b .L1145 +.LVL1260: .p2align 3 .L1213: -.LBE2052: -.LBB2053: - .loc 1 509 0 discriminator 5 +.LBE2082: +.LBB2083: + .loc 1 506 0 is_stmt 1 discriminator 2 + cbz w5, .L1193 + .loc 1 506 0 is_stmt 0 discriminator 4 + cmp w5, 14 + beq .L1215 + .loc 1 506 0 discriminator 6 + and w8, w8, -16 +.LBE2083: +.LBB2084: + .loc 1 507 0 is_stmt 1 discriminator 6 + and w11, w6, 240 +.LVL1261: +.LBE2084: +.LBB2085: + .loc 1 506 0 discriminator 6 + orr w8, w5, w8 +.LBE2085: +.LBB2086: + .loc 1 507 0 discriminator 6 + cmp w11, 240 +.LBE2086: + .loc 1 502 0 discriminator 6 + mov w5, 0 +.LBB2087: + .loc 1 507 0 discriminator 6 + beq .L1216 + .p2align 2 +.L1132: + .loc 1 507 0 is_stmt 0 discriminator 2 + cbnz w11, .L1134 +.LBE2087: +.LBB2088: + .loc 1 508 0 is_stmt 1 discriminator 3 + and w11, w6, 3840 +.LVL1262: +.LBE2088: +.LBB2089: + .loc 1 507 0 discriminator 3 + orr w5, w5, 240 + orr x9, x9, 256 +.LBE2089: +.LBB2090: + .loc 1 508 0 discriminator 3 + cmp w11, 3840 + beq .L1217 + .p2align 2 +.L1136: + .loc 1 508 0 is_stmt 0 discriminator 2 + cbnz w11, .L1138 +.LBE2090: +.LBB2091: + .loc 1 509 0 is_stmt 1 discriminator 3 + and w11, w6, 61440 +.LVL1263: +.LBE2091: +.LBB2092: + .loc 1 508 0 discriminator 3 + orr w5, w5, 3840 + orr x9, x9, 65536 +.LBE2092: +.LBB2093: + .loc 1 509 0 discriminator 3 + cmp w11, 61440 + beq .L1218 + .p2align 2 +.L1140: + .loc 1 509 0 is_stmt 0 discriminator 2 + cbnz w11, .L1142 + .loc 1 509 0 discriminator 3 + orr w5, w5, 61440 + orr x9, x9, 16777216 + b .L1141 +.LVL1264: + .p2align 3 +.L1188: +.LBE2093: +.LBB2094: + .loc 1 522 0 is_stmt 1 discriminator 5 + cmp w11, w19 + beq .L1219 + .loc 1 522 0 is_stmt 0 discriminator 7 + and w8, w8, 268435455 + orr w8, w11, w8 + b .L1157 +.LVL1265: + .p2align 3 +.L1193: +.LBE2094: +.LBB2095: + .loc 1 506 0 is_stmt 1 + mov w5, 15 + mov x9, 1 + b .L1130 +.LVL1266: + .p2align 3 +.L1138: +.LBE2095: +.LBB2096: + .loc 1 508 0 discriminator 4 + cmp w11, 3584 + beq .L1220 + .loc 1 508 0 is_stmt 0 discriminator 6 + and w8, w8, -3841 + orr w8, w11, w8 + b .L1137 +.LVL1267: + .p2align 3 +.L1154: +.LBE2096: +.LBB2097: + .loc 1 512 0 is_stmt 1 discriminator 4 + cmp w11, w30 + beq .L1221 + .loc 1 512 0 is_stmt 0 discriminator 6 + and w8, w8, -251658241 + orr w8, w11, w8 + b .L1153 +.LVL1268: + .p2align 3 +.L1150: +.LBE2097: +.LBB2098: + .loc 1 511 0 is_stmt 1 discriminator 4 + cmp w11, 14680064 + beq .L1222 + .loc 1 511 0 is_stmt 0 discriminator 6 + and w8, w8, -15728641 + orr w8, w11, w8 + b .L1149 +.LVL1269: + .p2align 3 +.L1146: +.LBE2098: +.LBB2099: + .loc 1 510 0 is_stmt 1 discriminator 4 + cmp w11, 917504 + beq .L1223 + .loc 1 510 0 is_stmt 0 discriminator 6 + and w8, w8, -983041 + orr w8, w11, w8 + b .L1145 +.LVL1270: + .p2align 3 +.L1134: +.LBE2099: +.LBB2100: + .loc 1 507 0 is_stmt 1 discriminator 4 + cmp w11, 224 + beq .L1224 + .loc 1 507 0 is_stmt 0 discriminator 6 + and w8, w8, -241 + orr w8, w11, w8 + b .L1133 +.LVL1271: + .p2align 3 +.L1142: +.LBE2100: +.LBB2101: + .loc 1 509 0 is_stmt 1 discriminator 4 + cmp w11, 57344 + beq .L1225 + .loc 1 509 0 is_stmt 0 discriminator 6 + and w8, w8, -61441 + orr w8, w11, w8 + b .L1141 +.LVL1272: + .p2align 3 +.L1219: +.LBE2101: +.LBB2102: + .loc 1 522 0 is_stmt 1 discriminator 6 + orr w8, w8, -268435456 + orr x9, x9, 72057594037927936 + b .L1157 +.LVL1273: + .p2align 3 +.L1220: +.LBE2102: +.LBB2103: + .loc 1 508 0 discriminator 5 orr w8, w8, 3840 orr x9, x9, 65536 - b .L1130 -.LVL1282: + b .L1137 +.LVL1274: .p2align 3 -.L1215: -.LBE2053: -.LBB2054: - .loc 1 512 0 discriminator 5 +.L1222: +.LBE2103: +.LBB2104: + .loc 1 511 0 discriminator 5 orr w8, w8, 15728640 orr x9, x9, 1099511627776 - b .L1142 -.LVL1283: + b .L1149 +.LVL1275: .p2align 3 -.L1217: -.LBE2054: -.LBB2055: - .loc 1 508 0 discriminator 5 +.L1224: +.LBE2104: +.LBB2105: + .loc 1 507 0 discriminator 5 orr w8, w8, 240 orr x9, x9, 256 - b .L1126 -.LVL1284: + b .L1133 +.LVL1276: .p2align 3 -.L1214: -.LBE2055: -.LBB2056: - .loc 1 513 0 discriminator 5 +.L1221: +.LBE2105: +.LBB2106: + .loc 1 512 0 discriminator 5 orr w8, w8, 251658240 orr x9, x9, 281474976710656 - b .L1146 -.LVL1285: + b .L1153 +.LVL1277: .p2align 3 -.L1216: -.LBE2056: -.LBB2057: - .loc 1 511 0 discriminator 5 +.L1223: +.LBE2106: +.LBB2107: + .loc 1 510 0 discriminator 5 orr w8, w8, 983040 orr x9, x9, 4294967296 - b .L1138 -.LVL1286: + b .L1145 +.LVL1278: .p2align 3 -.L1208: -.LBE2057: -.LBB2058: - .loc 1 507 0 discriminator 5 +.L1215: +.LBE2107: +.LBB2108: + .loc 1 506 0 discriminator 5 orr w8, w8, 15 -.LBE2058: - .loc 1 503 0 discriminator 5 +.LBE2108: + .loc 1 502 0 discriminator 5 mov w5, 0 -.LBB2059: - .loc 1 507 0 discriminator 5 +.LBB2109: + .loc 1 506 0 discriminator 5 mov x9, 1 - b .L1123 -.LVL1287: + b .L1130 +.LVL1279: .p2align 3 -.L1218: -.LBE2059: -.LBB2060: - .loc 1 510 0 discriminator 5 +.L1225: +.LBE2109: +.LBB2110: + .loc 1 509 0 discriminator 5 orr w8, w8, 61440 orr x9, x9, 16777216 - b .L1134 -.LVL1288: -.L1177: -.LBE2060: -.LBB2061: - .loc 1 522 0 discriminator 3 - cbz w20, .L1219 - .loc 1 522 0 is_stmt 0 discriminator 5 + b .L1141 +.LVL1280: +.L1184: +.LBE2110: +.LBB2111: + .loc 1 521 0 discriminator 3 + cbz w20, .L1226 + .loc 1 521 0 is_stmt 0 discriminator 5 cmp w20, w30 - beq .L1220 - .loc 1 522 0 discriminator 7 + beq .L1227 + .loc 1 521 0 discriminator 7 and w8, w8, -251658241 orr w8, w20, w8 - b .L1176 -.LVL1289: -.L1169: -.LBE2061: -.LBB2062: - .loc 1 520 0 is_stmt 1 discriminator 3 - cbz w20, .L1221 - .loc 1 520 0 is_stmt 0 discriminator 5 + b .L1183 +.LVL1281: +.L1176: +.LBE2111: +.LBB2112: + .loc 1 519 0 is_stmt 1 discriminator 3 + cbz w20, .L1228 + .loc 1 519 0 is_stmt 0 discriminator 5 cmp w20, 917504 - beq .L1222 - .loc 1 520 0 discriminator 7 + beq .L1229 + .loc 1 519 0 discriminator 7 and w8, w8, -983041 orr w8, w20, w8 - b .L1168 -.LVL1290: -.L1173: -.LBE2062: -.LBB2063: - .loc 1 521 0 is_stmt 1 discriminator 3 - cbz w20, .L1223 - .loc 1 521 0 is_stmt 0 discriminator 5 + b .L1175 +.LVL1282: +.L1180: +.LBE2112: +.LBB2113: + .loc 1 520 0 is_stmt 1 discriminator 3 + cbz w20, .L1230 + .loc 1 520 0 is_stmt 0 discriminator 5 cmp w20, 14680064 - beq .L1224 - .loc 1 521 0 discriminator 7 + beq .L1231 + .loc 1 520 0 discriminator 7 and w8, w8, -15728641 orr w8, w20, w8 - b .L1172 -.LVL1291: -.L1207: -.LBE2063: -.LBB2064: - .loc 1 516 0 is_stmt 1 discriminator 3 - cbz w5, .L1225 - .loc 1 516 0 is_stmt 0 discriminator 5 + b .L1179 +.LVL1283: +.L1214: +.LBE2113: +.LBB2114: + .loc 1 515 0 is_stmt 1 discriminator 3 + cbz w5, .L1232 + .loc 1 515 0 is_stmt 0 discriminator 5 cmp w5, 14 - beq .L1226 - .loc 1 516 0 discriminator 7 + beq .L1233 + .loc 1 515 0 discriminator 7 and w8, w8, -16 orr w8, w5, w8 -.LBE2064: - .loc 1 503 0 is_stmt 1 discriminator 7 +.LBE2114: + .loc 1 502 0 is_stmt 1 discriminator 7 mov w5, 0 - b .L1153 -.LVL1292: -.L1157: -.LBB2065: - .loc 1 517 0 discriminator 3 - cbz w20, .L1227 - .loc 1 517 0 is_stmt 0 discriminator 5 + b .L1160 +.LVL1284: +.L1164: +.LBB2115: + .loc 1 516 0 discriminator 3 + cbz w20, .L1234 + .loc 1 516 0 is_stmt 0 discriminator 5 cmp w20, 224 - beq .L1228 - .loc 1 517 0 discriminator 7 + beq .L1235 + .loc 1 516 0 discriminator 7 and w8, w8, -241 orr w8, w20, w8 - b .L1156 -.LVL1293: -.L1161: -.LBE2065: -.LBB2066: - .loc 1 518 0 is_stmt 1 discriminator 3 - cbz w20, .L1229 - .loc 1 518 0 is_stmt 0 discriminator 5 + b .L1163 +.LVL1285: +.L1168: +.LBE2115: +.LBB2116: + .loc 1 517 0 is_stmt 1 discriminator 3 + cbz w20, .L1236 + .loc 1 517 0 is_stmt 0 discriminator 5 cmp w20, 3584 - beq .L1230 - .loc 1 518 0 discriminator 7 + beq .L1237 + .loc 1 517 0 discriminator 7 and w8, w8, -3841 orr w8, w20, w8 - b .L1160 -.LVL1294: -.L1165: -.LBE2066: -.LBB2067: - .loc 1 519 0 is_stmt 1 discriminator 3 - cbz w20, .L1231 - .loc 1 519 0 is_stmt 0 discriminator 5 + b .L1167 +.LVL1286: +.L1172: +.LBE2116: +.LBB2117: + .loc 1 518 0 is_stmt 1 discriminator 3 + cbz w20, .L1238 + .loc 1 518 0 is_stmt 0 discriminator 5 cmp w20, 57344 - beq .L1232 - .loc 1 519 0 discriminator 7 + beq .L1239 + .loc 1 518 0 discriminator 7 and w8, w8, -61441 orr w8, w20, w8 - b .L1164 -.L1231: - .loc 1 519 0 discriminator 4 + b .L1171 +.L1238: + .loc 1 518 0 discriminator 4 orr w5, w5, 61440 orr x11, x11, 16777216 - b .L1164 -.LVL1295: -.L1229: -.LBE2067: -.LBB2068: - .loc 1 518 0 is_stmt 1 discriminator 4 + b .L1171 +.LVL1287: +.L1236: +.LBE2117: +.LBB2118: + .loc 1 517 0 is_stmt 1 discriminator 4 orr w5, w5, 3840 orr x11, x11, 65536 - b .L1160 -.LVL1296: -.L1227: -.LBE2068: -.LBB2069: - .loc 1 517 0 discriminator 4 + b .L1167 +.LVL1288: +.L1234: +.LBE2118: +.LBB2119: + .loc 1 516 0 discriminator 4 orr w5, w5, 240 orr x11, x11, 256 - b .L1156 -.LVL1297: -.L1225: -.LBE2069: -.LBB2070: - .loc 1 516 0 discriminator 4 + b .L1163 +.LVL1289: +.L1232: +.LBE2119: +.LBB2120: + .loc 1 515 0 discriminator 4 orr x11, x11, 1 mov w5, 15 - b .L1153 -.LVL1298: -.L1223: -.LBE2070: -.LBB2071: - .loc 1 521 0 discriminator 4 + b .L1160 +.LVL1290: +.L1230: +.LBE2120: +.LBB2121: + .loc 1 520 0 discriminator 4 orr w5, w5, 15728640 orr x11, x11, 1099511627776 - b .L1172 -.LVL1299: -.L1221: -.LBE2071: -.LBB2072: - .loc 1 520 0 discriminator 4 + b .L1179 +.LVL1291: +.L1228: +.LBE2121: +.LBB2122: + .loc 1 519 0 discriminator 4 orr w5, w5, 983040 orr x11, x11, 4294967296 - b .L1168 -.LVL1300: -.L1219: -.LBE2072: -.LBB2073: - .loc 1 522 0 discriminator 4 + b .L1175 +.LVL1292: +.L1226: +.LBE2122: +.LBB2123: + .loc 1 521 0 discriminator 4 orr w5, w5, 251658240 orr x11, x11, 281474976710656 - b .L1176 -.LVL1301: -.L1198: + b .L1183 +.LVL1293: +.L1205: .cfi_def_cfa 31, 0 .cfi_restore 19 .cfi_restore 20 .cfi_restore 29 .cfi_restore 30 ret -.LVL1302: -.L1220: +.LVL1294: +.L1227: .cfi_def_cfa 29, 32 .cfi_offset 19, -16 .cfi_offset 20, -8 .cfi_offset 29, -32 .cfi_offset 30, -24 - .loc 1 522 0 is_stmt 0 discriminator 6 + .loc 1 521 0 is_stmt 0 discriminator 6 orr w8, w8, 251658240 orr x11, x11, 281474976710656 - b .L1176 -.LVL1303: -.L1222: -.LBE2073: -.LBB2074: - .loc 1 520 0 is_stmt 1 discriminator 6 + b .L1183 +.LVL1295: +.L1229: +.LBE2123: +.LBB2124: + .loc 1 519 0 is_stmt 1 discriminator 6 orr w8, w8, 983040 orr x11, x11, 4294967296 - b .L1168 -.LVL1304: -.L1224: -.LBE2074: -.LBB2075: - .loc 1 521 0 discriminator 6 + b .L1175 +.LVL1296: +.L1231: +.LBE2124: +.LBB2125: + .loc 1 520 0 discriminator 6 orr w8, w8, 15728640 orr x11, x11, 1099511627776 - b .L1172 -.LVL1305: -.L1226: -.LBE2075: -.LBB2076: - .loc 1 516 0 discriminator 6 + b .L1179 +.LVL1297: +.L1233: +.LBE2125: +.LBB2126: + .loc 1 515 0 discriminator 6 orr w8, w8, 15 orr x11, x11, 1 -.LBE2076: - .loc 1 503 0 discriminator 6 +.LBE2126: + .loc 1 502 0 discriminator 6 mov w5, 0 -.LBB2077: - b .L1153 -.LVL1306: -.L1228: -.LBE2077: -.LBB2078: - .loc 1 517 0 discriminator 6 +.LBB2127: + b .L1160 +.LVL1298: +.L1235: +.LBE2127: +.LBB2128: + .loc 1 516 0 discriminator 6 orr w8, w8, 240 orr x11, x11, 256 - b .L1156 -.LVL1307: -.L1230: -.LBE2078: -.LBB2079: - .loc 1 518 0 discriminator 6 + b .L1163 +.LVL1299: +.L1237: +.LBE2128: +.LBB2129: + .loc 1 517 0 discriminator 6 orr w8, w8, 3840 orr x11, x11, 65536 - b .L1160 -.LVL1308: -.L1232: -.LBE2079: -.LBB2080: - .loc 1 519 0 discriminator 6 + b .L1167 +.LVL1300: +.L1239: +.LBE2129: +.LBB2130: + .loc 1 518 0 discriminator 6 orr w8, w8, 61440 orr x11, x11, 16777216 - b .L1164 -.LBE2080: + b .L1171 +.LBE2130: .cfi_endproc .LFE2818: .size refresh_new_image, .-refresh_new_image @@ -13190,113 +13266,113 @@ .type refresh_new_image_auto, %function refresh_new_image_auto: .LFB2819: - .loc 1 535 0 + .loc 1 534 0 .cfi_startproc -.LVL1309: - .loc 1 542 0 +.LVL1301: + .loc 1 541 0 ldp w15, w4, [x3, 92] cmp w4, 0 add w10, w4, 7 csel w10, w10, w4, lt -.LVL1310: - .loc 1 544 0 +.LVL1302: + .loc 1 543 0 cmp w15, 0 - .loc 1 542 0 + .loc 1 541 0 asr w10, w10, 3 -.LVL1311: - .loc 1 544 0 - ble .L1233 +.LVL1303: + .loc 1 543 0 + ble .L1240 sub w14, w10, #1 mov w12, 0 -.LVL1312: +.LVL1304: add x14, x14, 1 - .loc 1 557 0 + .loc 1 556 0 mov w11, 15 lsl x13, x14, 2 lsl x14, x14, 3 -.LVL1313: +.LVL1305: .p2align 2 -.L1235: - .loc 1 545 0 discriminator 1 +.L1242: + .loc 1 544 0 discriminator 1 cmp w10, 0 - ble .L1246 + ble .L1253 add x7, x0, 4 - .loc 1 545 0 is_stmt 0 + .loc 1 544 0 is_stmt 0 mov x5, 0 .p2align 2 -.L1245: - .loc 1 547 0 is_stmt 1 +.L1252: + .loc 1 546 0 is_stmt 1 ldr w3, [x1, x5, lsl 2] -.LVL1314: - .loc 1 548 0 +.LVL1306: + .loc 1 547 0 ldr w8, [x7, -4] -.LVL1315: +.LVL1307: eor w6, w3, w8 - .loc 1 551 0 + .loc 1 550 0 cmp w3, w8 - beq .L1236 - .loc 1 546 0 + beq .L1243 + .loc 1 545 0 ldr x4, [x2, x5, lsl 3] -.LVL1316: - .loc 1 556 0 +.LVL1308: + .loc 1 555 0 and x3, x4, 255 -.LVL1317: - .loc 1 557 0 +.LVL1309: + .loc 1 556 0 cmp x3, 0 csel w3, wzr, w11, ne -.LVL1318: - .loc 1 561 0 +.LVL1310: + .loc 1 560 0 tst x4, 65280 orr w9, w3, 240 csel w3, w9, w3, eq - .loc 1 565 0 + .loc 1 564 0 tst x4, 16711680 orr w9, w3, 3840 csel w3, w9, w3, eq - .loc 1 569 0 + .loc 1 568 0 tst x4, 4278190080 orr w9, w3, 61440 csel w3, w9, w3, eq - .loc 1 573 0 + .loc 1 572 0 tst x4, 1095216660480 orr w9, w3, 983040 csel w3, w9, w3, eq - .loc 1 577 0 + .loc 1 576 0 tst x4, 280375465082880 orr w9, w3, 15728640 csel w3, w9, w3, eq - .loc 1 581 0 + .loc 1 580 0 tst x4, 71776119061217280 orr w9, w3, 251658240 csel w3, w9, w3, eq - .loc 1 585 0 + .loc 1 584 0 tst x4, -72057594037927936 orr w4, w3, -268435456 -.LVL1319: +.LVL1311: csel w3, w4, w3, eq and w3, w6, w3 -.LVL1320: - .loc 1 588 0 +.LVL1312: + .loc 1 587 0 eor w3, w3, w8 - .loc 1 589 0 + .loc 1 588 0 str w3, [x7, -4] -.LVL1321: -.L1236: +.LVL1313: +.L1243: add x5, x5, 1 add x7, x7, 4 - .loc 1 545 0 discriminator 2 + .loc 1 544 0 discriminator 2 cmp w10, w5 - bgt .L1245 + bgt .L1252 add x0, x0, x13 add x2, x2, x14 add x1, x1, x13 -.LVL1322: -.L1246: - .loc 1 544 0 discriminator 2 +.LVL1314: +.L1253: + .loc 1 543 0 discriminator 2 add w12, w12, 1 cmp w15, w12 - bne .L1235 -.L1233: + bne .L1242 +.L1240: ret .cfi_endproc .LFE2819: @@ -13306,957 +13382,139 @@ .type ebc_thread, %function ebc_thread: .LFB2844: - .loc 1 2332 0 + .loc 1 2333 0 .cfi_startproc -.LVL1323: +.LVL1315: stp x29, x30, [sp, -160]! .cfi_def_cfa_offset 160 .cfi_offset 29, -160 .cfi_offset 30, -152 - .loc 1 2333 0 + .loc 1 2334 0 adrp x1, .LANCHOR0 - .loc 1 2332 0 + .loc 1 2333 0 adrp x0, __stack_chk_guard -.LVL1324: +.LVL1316: add x0, x0, :lo12:__stack_chk_guard add x29, sp, 0 .cfi_def_cfa_register 29 stp x19, x20, [sp, 16] .cfi_offset 19, -144 .cfi_offset 20, -136 -.LBB2168: -.LBB2169: -.LBB2170: - .loc 1 2785 0 - adrp x20, .LANCHOR1 -.LBE2170: -.LBE2169: -.LBE2168: - .loc 1 2332 0 - stp x21, x22, [sp, 32] -.LBB2181: -.LBB2177: -.LBB2173: - .loc 1 2785 0 - add x20, x20, :lo12:.LANCHOR1 -.LBE2173: -.LBE2177: -.LBE2181: + .loc 1 2341 0 + mov w19, 0 +.LVL1317: .loc 1 2333 0 - ldr x19, [x1, #:lo12:.LANCHOR0] -.LVL1325: -.LBB2182: -.LBB2178: -.LBB2174: - .loc 1 2785 0 - add x20, x20, 304 -.LBE2174: -.LBE2178: -.LBE2182: - .loc 1 2332 0 - stp x23, x24, [sp, 48] + stp x21, x22, [sp, 32] .cfi_offset 21, -128 .cfi_offset 22, -120 +.LBB2218: +.LBB2219: +.LBB2220: + .loc 1 2788 0 + adrp x21, .LANCHOR1 +.LBE2220: +.LBE2219: +.LBE2218: + .loc 1 2334 0 + ldr x20, [x1, #:lo12:.LANCHOR0] +.LVL1318: +.LBB2229: +.LBB2226: +.LBB2223: + .loc 1 2788 0 + add x21, x21, :lo12:.LANCHOR1 +.LBE2223: +.LBE2226: +.LBE2229: + .loc 1 2333 0 + stp x23, x24, [sp, 48] +.LBB2230: +.LBB2227: +.LBB2224: + .loc 1 2788 0 + add x21, x21, 304 +.LBE2224: +.LBE2227: +.LBE2230: + .loc 1 2333 0 + stp x25, x26, [sp, 64] .cfi_offset 23, -112 .cfi_offset 24, -104 -.LBB2183: -.LBB2179: -.LBB2175: - .loc 1 2785 0 - mov w22, 1 -.LBE2175: -.LBE2179: -.LBE2183: - .loc 1 2332 0 - stp x25, x26, [sp, 64] - .loc 1 2334 0 - add x23, x19, 192 - .loc 1 2332 0 - stp x27, x28, [sp, 80] .cfi_offset 25, -96 .cfi_offset 26, -88 + .loc 1 2335 0 + add x23, x20, 192 + .loc 1 2333 0 + stp x27, x28, [sp, 80] .cfi_offset 27, -80 .cfi_offset 28, -72 - add x21, x19, 24 - .loc 1 2340 0 - stp wzr, wzr, [x29, 104] - .loc 1 2332 0 + add x22, x20, 24 + .loc 1 2339 0 + str wzr, [x29, 108] + .loc 1 2333 0 ldr x1, [x0] str x1, [x29, 152] mov x1,0 -.LVL1326: +.LVL1319: .p2align 2 -.L1250: - .loc 1 2344 0 - ldr w0, [x23, 608] -.LVL1327: - cbz w0, .L1251 - .loc 1 2344 0 is_stmt 0 discriminator 1 - ldr w0, [x21, 160] - cbz w0, .L1639 -.L1251: - .loc 1 2350 0 is_stmt 1 - bl ebc_osd_buf_get -.LVL1328: - mov x24, x0 -.LVL1329: - .loc 1 2351 0 - cbz x0, .L1253 - .loc 1 2352 0 - ldr x0, [x23, 600] - cbnz x0, .L1254 - .loc 1 2352 0 is_stmt 0 discriminator 1 - ldr w0, [x23, 608] - cbnz w0, .L1254 - .loc 1 2358 0 is_stmt 1 - ldr w0, [x23, 264] - sub w1, w0, #1 - cmp w1, 1 - bls .L1640 - .loc 1 2361 0 - cmp w0, 3 - beq .L1641 -.L1258: - .loc 1 2367 0 - str x24, [x23, 248] - .loc 1 2368 0 - mov w0, 4 - str w0, [x23, 264] - .loc 1 2371 0 - ldr x4, [x23, 232] -.LBB2184: -.LBB2185: - .loc 1 437 0 - ldp w0, w14, [x24, 48] - .loc 1 438 0 - ldp w2, w18, [x24, 56] - .loc 1 435 0 - cmp w0, 0 - .loc 1 440 0 - ldr w1, [x19, 288] - .loc 1 435 0 - add w17, w0, 7 - csel w17, w17, w0, lt - .loc 1 436 0 - add w11, w2, 7 - cmp w2, 0 - .loc 1 440 0 - add w0, w1, 7 - .loc 1 436 0 - csel w11, w11, w2, lt - .loc 1 440 0 - cmp w1, 0 - csel w0, w0, w1, lt - .loc 1 436 0 - asr w11, w11, 3 - .loc 1 440 0 - asr w0, w0, 3 -.LVL1330: - ldr w2, [x19, 284] - .loc 1 436 0 - add w11, w11, 1 -.LVL1331: - .loc 1 443 0 - sub w3, w0, #1 -.LBE2185: -.LBE2184: - .loc 1 2373 0 - ldp x10, x6, [x23, 176] -.LVL1332: -.LBB2234: -.LBB2228: - .loc 1 447 0 - mul w1, w14, w0 - .loc 1 443 0 - cmp w11, w0 -.LBE2228: -.LBE2234: - .loc 1 2369 0 - ldr x5, [x23, 152] -.LBB2235: -.LBB2229: - .loc 1 443 0 - csel w11, w3, w11, ge -.LBE2229: -.LBE2235: - .loc 1 2371 0 - ldr x9, [x4, 16] -.LVL1333: -.LBB2236: -.LBB2230: - .loc 1 445 0 - cmp w2, w18 - .loc 1 447 0 - sxtw x1, w1 - .loc 1 445 0 - sub w3, w2, #1 -.LBE2230: -.LBE2236: - .loc 1 2370 0 - ldr x8, [x24, 16] -.LBB2237: -.LBB2231: - .loc 1 447 0 - lsl x2, x1, 2 - .loc 1 445 0 - csel w18, w3, w18, le - .loc 1 450 0 - lsl x1, x1, 3 - .loc 1 435 0 - asr w17, w17, 3 -.LVL1334: - .loc 1 447 0 - add x5, x5, x2 -.LVL1335: - .loc 1 450 0 - add x10, x10, x1 -.LVL1336: - .loc 1 451 0 - add x6, x6, x1 -.LVL1337: - .loc 1 453 0 - cmp w14, w18 - .loc 1 449 0 - add x9, x9, x2 -.LVL1338: - .loc 1 448 0 - add x8, x8, x2 -.LVL1339: - .loc 1 453 0 - bgt .L1265 - sxtw x0, w0 -.LBB2186: - .loc 1 468 0 - mov w13, 251658240 - lsl x16, x0, 2 - lsl x15, x0, 3 - mov w25, 234881024 -.LVL1340: -.LBE2186: -.LBB2187: - .loc 1 469 0 - mov w12, -268435456 - mov w24, -536870912 -.LVL1341: - .p2align 2 -.L1266: -.LBE2187: - .loc 1 454 0 - mov w4, w17 - cmp w17, w11 - bgt .L1300 - .p2align 2 -.L1540: - .loc 1 455 0 - sxtw x1, w4 -.LVL1342: - .loc 1 460 0 - mov w2, 0 - .loc 1 455 0 - add x26, x5, x1, lsl 2 -.LVL1343: - .loc 1 459 0 - add x28, x6, x1, lsl 3 - .loc 1 458 0 - ldr x3, [x10, x1, lsl 3] -.LVL1344: - .loc 1 455 0 - ldr w7, [x5, x1, lsl 2] - .loc 1 456 0 - ldr w0, [x8, x1, lsl 2] -.LVL1345: - .loc 1 462 0 - and x30, x3, 255 -.LVL1346: - .loc 1 457 0 - ldr w27, [x9, x1, lsl 2] -.LVL1347: - .loc 1 459 0 - ldr x1, [x6, x1, lsl 3] -.LVL1348: - .loc 1 462 0 - cbnz x30, .L1267 -.LVL1349: -.LBB2188: - and w2, w0, 15 -.LBE2188: - and x1, x1, -256 -.LBB2189: - cmp w2, 15 - bne .L1642 -.L1267: -.LBE2189: - .loc 1 463 0 - tst x3, 65280 - bne .L1270 -.LBB2190: - and w30, w0, 240 -.LVL1350: -.LBE2190: - and x1, x1, -65281 -.LBB2191: - cmp w30, 240 - bne .L1271 - orr w2, w2, 240 -.L1270: -.LBE2191: - .loc 1 464 0 - tst x3, 16711680 - bne .L1274 -.LBB2192: - and w30, w0, 3840 -.LVL1351: -.LBE2192: - and x1, x1, -16711681 -.LBB2193: - cmp w30, 3840 - bne .L1275 - orr w2, w2, 3840 -.LVL1352: -.L1274: -.LBE2193: - .loc 1 465 0 - tst x3, 4278190080 - bne .L1278 -.LBB2194: - and w30, w0, 61440 -.LVL1353: -.LBE2194: - and x1, x1, -4278190081 -.LBB2195: - cmp w30, 61440 - bne .L1279 - orr w2, w2, 61440 -.LVL1354: -.L1278: -.LBE2195: - .loc 1 466 0 - tst x3, 1095216660480 - bne .L1282 -.LBB2196: - and w30, w0, 983040 -.LVL1355: -.LBE2196: - and x1, x1, -1095216660481 -.LBB2197: - cmp w30, 983040 - bne .L1283 - orr w2, w2, 983040 -.LVL1356: -.L1282: -.LBE2197: - .loc 1 467 0 - tst x3, 280375465082880 - bne .L1286 -.LBB2198: - and w30, w0, 15728640 -.LVL1357: -.LBE2198: - and x1, x1, -280375465082881 -.LBB2199: - cmp w30, 15728640 - bne .L1287 - orr w2, w2, 15728640 -.LVL1358: -.L1286: -.LBE2199: - .loc 1 468 0 - tst x3, 71776119061217280 - bne .L1290 -.LBB2200: - and w30, w0, 251658240 -.LVL1359: -.LBE2200: - and x1, x1, -71776119061217281 -.LBB2201: - cmp w30, w13 - bne .L1291 - orr w2, w2, 251658240 -.LVL1360: -.L1290: -.LBE2201: - .loc 1 469 0 - tst x3, -72057594037927936 - bne .L1294 -.LBB2202: - and w3, w0, -268435456 -.LVL1361: -.LBE2202: - and x1, x1, 72057594037927935 -.LBB2203: - cmp w3, w12 - bne .L1295 - orr w2, w2, -268435456 -.LVL1362: -.L1294: -.LBE2203: - .loc 1 472 0 - and w0, w0, w27 -.LVL1363: - .loc 1 473 0 - str x1, [x28] - eor w0, w0, w7 -.LVL1364: - .loc 1 454 0 - add w4, w4, 1 - and w0, w0, w2 - cmp w4, w11 - .loc 1 472 0 - eor w0, w7, w0 - .loc 1 474 0 - str w0, [x26] - .loc 1 454 0 - ble .L1540 -.LVL1365: -.L1300: - .loc 1 453 0 - add w14, w14, 1 - .loc 1 476 0 - add x5, x5, x16 - .loc 1 477 0 - add x8, x8, x16 - .loc 1 478 0 - add x9, x9, x16 - .loc 1 479 0 - add x10, x10, x15 - .loc 1 480 0 - add x6, x6, x15 - .loc 1 453 0 - cmp w14, w18 - ble .L1266 -.LVL1366: -.L1265: -.LBE2231: -.LBE2237: - .loc 1 2375 0 - ldr w0, [x23, 52] -.LVL1367: - cbnz w0, .L1301 - .loc 1 2377 0 - ldr w0, [x23, 208] - .loc 1 2376 0 - str w22, [x23, 52] - .loc 1 2377 0 - cbz w0, .L1643 -.L1302: - .loc 1 2379 0 - mov w1, 1 -.LVL1368: - mov x0, x19 - bl ebc_lut_update -.LVL1369: - .loc 1 2381 0 - ldr w3, [x23, 112] - .loc 1 2383 0 - adrp x1, .LC105 - ldr x0, [x23, 104] - add x1, x1, :lo12:.LC105 - and w2, w3, 255 - .loc 1 2381 0 - strb w3, [x23, 56] - .loc 1 2382 0 - lsr w4, w3, 8 - strb w4, [x23, 57] - .loc 1 2383 0 - and w3, w4, 255 - bl _dev_info -.LVL1370: - .loc 1 2384 0 - mov x0, x19 - bl ebc_frame_start -.LVL1371: -.L1303: - .loc 1 2388 0 - ldr x0, [x23, 240] - cbz x0, .L1304 - .loc 1 2389 0 - bl ebc_buf_release -.LVL1372: -.L1304: - .loc 1 2390 0 - ldr x0, [x23, 248] - str x0, [x23, 240] - .loc 1 2392 0 - b .L1250 -.LVL1373: - .p2align 3 -.L1287: -.LBB2238: -.LBB2232: -.LBB2204: - .loc 1 467 0 - cbnz w30, .L1288 - orr w2, w2, 15728640 - orr x1, x1, 1099511627776 - b .L1286 -.LVL1374: - .p2align 3 -.L1291: -.LBE2204: -.LBB2205: - .loc 1 468 0 - cbnz w30, .L1292 - orr w2, w2, 251658240 - orr x1, x1, 281474976710656 - b .L1290 -.LVL1375: - .p2align 3 -.L1295: -.LBE2205: -.LBB2206: - .loc 1 469 0 - cbnz w3, .L1296 - orr w2, w2, -268435456 - orr x1, x1, 72057594037927936 - b .L1294 -.LVL1376: - .p2align 3 -.L1271: -.LBE2206: -.LBB2207: - .loc 1 463 0 - cbnz w30, .L1272 - orr w2, w2, 240 - orr x1, x1, 256 - b .L1270 -.LVL1377: - .p2align 3 -.L1642: -.LBE2207: -.LBB2208: - .loc 1 462 0 - cbnz w2, .L1268 - orr x1, x1, 1 - mov w2, 15 - b .L1267 -.LVL1378: - .p2align 3 -.L1279: -.LBE2208: -.LBB2209: - .loc 1 465 0 - cbnz w30, .L1280 - orr w2, w2, 61440 - orr x1, x1, 16777216 - b .L1278 -.LVL1379: - .p2align 3 -.L1275: -.LBE2209: -.LBB2210: - .loc 1 464 0 - cbnz w30, .L1276 - orr w2, w2, 3840 - orr x1, x1, 65536 - b .L1274 -.LVL1380: - .p2align 3 -.L1283: -.LBE2210: -.LBB2211: - .loc 1 466 0 - cbnz w30, .L1284 - orr w2, w2, 983040 - orr x1, x1, 4294967296 - b .L1282 -.LVL1381: - .p2align 3 -.L1288: -.LBE2211: -.LBB2212: - .loc 1 467 0 - cmp w30, 14680064 - beq .L1644 - and w7, w7, -15728641 - orr w7, w30, w7 - b .L1286 -.LVL1382: - .p2align 3 -.L1292: -.LBE2212: -.LBB2213: - .loc 1 468 0 - cmp w30, w25 - beq .L1645 - and w7, w7, -251658241 - orr w7, w30, w7 - b .L1290 -.LVL1383: - .p2align 3 -.L1284: -.LBE2213: -.LBB2214: - .loc 1 466 0 - cmp w30, 917504 - beq .L1646 - and w7, w7, -983041 - orr w7, w30, w7 - b .L1282 -.LVL1384: - .p2align 3 -.L1272: -.LBE2214: -.LBB2215: - .loc 1 463 0 - cmp w30, 224 - beq .L1647 - and w7, w7, -241 - orr w7, w30, w7 - b .L1270 -.LVL1385: - .p2align 3 -.L1296: -.LBE2215: -.LBB2216: - .loc 1 469 0 - cmp w3, w24 - beq .L1648 - and w7, w7, 268435455 - orr w7, w3, w7 - b .L1294 -.LVL1386: - .p2align 3 -.L1268: -.LBE2216: -.LBB2217: - .loc 1 462 0 - cmp w2, 14 - beq .L1649 - and w7, w7, -16 - orr w7, w2, w7 -.LBE2217: - .loc 1 460 0 - mov w2, 0 - b .L1267 -.LVL1387: - .p2align 3 -.L1280: -.LBB2218: - .loc 1 465 0 - cmp w30, 57344 - beq .L1650 - and w7, w7, -61441 - orr w7, w30, w7 - b .L1278 -.LVL1388: - .p2align 3 -.L1276: -.LBE2218: -.LBB2219: - .loc 1 464 0 - cmp w30, 3584 - beq .L1651 - and w7, w7, -3841 - orr w7, w30, w7 - b .L1274 -.LVL1389: - .p2align 3 -.L1254: -.LBE2219: -.LBE2232: -.LBE2238: - .loc 1 2353 0 - ldr x0, [x23, 104] - adrp x1, .LC102 - add x1, x1, :lo12:.LC102 - bl _dev_info -.LVL1390: - .loc 1 2354 0 - mov x0, x24 - bl ebc_buf_release -.LVL1391: - .loc 1 2356 0 - b .L1250 -.LVL1392: -.L1644: -.LBB2239: -.LBB2233: -.LBB2220: - .loc 1 467 0 - orr w7, w7, 15728640 - orr x1, x1, 1099511627776 - b .L1286 -.LVL1393: -.L1645: -.LBE2220: -.LBB2221: - .loc 1 468 0 - orr w7, w7, 251658240 - orr x1, x1, 281474976710656 - b .L1290 -.LVL1394: -.L1647: -.LBE2221: -.LBB2222: - .loc 1 463 0 - orr w7, w7, 240 - orr x1, x1, 256 - b .L1270 -.LVL1395: -.L1649: -.LBE2222: -.LBB2223: - .loc 1 462 0 - orr w7, w7, 15 - orr x1, x1, 1 -.LBE2223: - .loc 1 460 0 - mov w2, 0 - b .L1267 -.LVL1396: -.L1648: -.LBB2224: - .loc 1 469 0 - orr w7, w7, -268435456 - orr x1, x1, 72057594037927936 - b .L1294 -.LVL1397: -.L1650: -.LBE2224: -.LBB2225: - .loc 1 465 0 - orr w7, w7, 61440 - orr x1, x1, 16777216 - b .L1278 -.LVL1398: -.L1646: -.LBE2225: -.LBB2226: - .loc 1 466 0 - orr w7, w7, 983040 - orr x1, x1, 4294967296 - b .L1282 -.LVL1399: -.L1651: -.LBE2226: -.LBB2227: - .loc 1 464 0 - orr w7, w7, 3840 - orr x1, x1, 65536 - b .L1274 -.LVL1400: -.L1253: -.LBE2227: -.LBE2233: -.LBE2239: - .loc 1 2395 0 - ldr w0, [x23, 620] - cbz w0, .L1305 - .loc 1 2395 0 is_stmt 0 discriminator 1 - ldr w0, [x23, 616] - cbnz w0, .L1305 -.L1306: - .loc 1 2784 0 is_stmt 1 - ldr w0, [x23, 100] - cbz w0, .L1652 -.L1442: -.LVL1401: -.L1440: - .loc 1 2810 0 - str wzr, [x23, 100] - b .L1250 -.LVL1402: -.L1305: - .loc 1 2396 0 - bl ebc_dsp_buf_get -.LVL1403: - mov x24, x0 - .loc 1 2397 0 - cbz x0, .L1306 - .loc 1 2398 0 - ldr w1, [x21, 160] - cbnz w1, .L1307 - .loc 1 2399 0 - ldr w1, [x0, 40] - sub w2, w1, #18 - tst w2, -3 - bne .L1308 - .loc 1 2400 0 - adrp x0, .LANCHOR0 - add x0, x0, :lo12:.LANCHOR0 - str wzr, [x0, 32] -.L1309: - .loc 1 2477 0 - ldr w0, [x29, 108] -.LVL1404: - cbz w0, .L1321 - .loc 1 2479 0 - ldr w0, [x24, 64] -.LVL1405: - cbnz w0, .L1322 - .loc 1 2480 0 - mov w0, 21 - .loc 1 2481 0 - str w22, [x24, 64] - .loc 1 2480 0 - str w0, [x24, 40] -.L1323: - .loc 1 2586 0 - ldr w0, [x23, 484] - cbz w0, .L1448 -.L1372: - .loc 1 2649 0 - ldr w0, [x23, 52] - .loc 1 2643 0 - mov w25, 1 -.LVL1406: - .loc 1 2649 0 - cbnz w0, .L1653 -.L1391: -.LVL1407: -.L1388: - .loc 1 2654 0 - ldr w0, [x23, 264] -.LVL1408: - sub w0, w0, #3 - cmp w0, 1 - bls .L1654 -.L1393: - .loc 1 2658 0 - ldr w0, [x24, 40] - sub w1, w0, #7 - .loc 1 2657 0 - cmp w1, 1 - bls .L1655 -.L1394: - .loc 1 2673 0 - sub w0, w0, #2 - .loc 1 2672 0 - cmp w0, 14 - bhi .L1396 - ldr x0, [x23, 224] -.LBB2240: -.LBB2241: - .loc 1 2286 0 - ldr w1, [x23, 28] - ldr x4, [x24, 16] - cmp w1, 0 - ldr x5, [x0, 16] - add w0, w1, 7 - csel w0, w0, w1, lt - asr w0, w0, 3 - cmp w0, 0 - ble .L1398 - .loc 1 2290 0 - ldr x1, [x4] - ldr x2, [x5] - cmp x2, x1 - bne .L1396 - sub w1, w0, #1 - mov x0, 8 - add x1, x1, 1 - lsl x1, x1, 3 - b .L1400 - .p2align 3 -.L1401: - .loc 1 2287 0 - ldr x3, [x4, x0] - add x0, x0, 8 - .loc 1 2288 0 - add x2, x5, x0 - .loc 1 2290 0 - ldr x2, [x2, -8] - cmp x3, x2 - bne .L1396 -.L1400: - .loc 1 2286 0 - cmp x1, x0 - bne .L1401 -.L1398: -.LBE2241: -.LBE2240: - .loc 1 2675 0 - ldr x0, [x23, 104] - adrp x1, .LC118 - add x1, x1, :lo12:.LC118 - bl _dev_info -.LVL1409: - .loc 1 2677 0 - str x24, [x23, 232] - ldr w0, [x24, 40] - .loc 1 2762 0 - cmp w0, 20 - bne .L1422 -.LVL1410: -.L1675: - .loc 1 2764 0 - ldr x0, [x23, 104] - adrp x1, .LC121 - .loc 1 2763 0 - str w22, [x23, 608] - .loc 1 2764 0 - add x1, x1, :lo12:.LC121 - bl _dev_info -.LVL1411: - .loc 1 2774 0 - ldr w0, [x23, 484] - cbz w0, .L1425 -.L1677: - .loc 1 2775 0 - ldr x0, [x23, 224] - bl ebc_buf_release -.LVL1412: - b .L1426 -.LVL1413: -.L1301: - .loc 1 2386 0 - adrp x0, .LANCHOR0 - add x0, x0, :lo12:.LANCHOR0 - ldr x0, [x0, 8] - bl wake_up_process -.LVL1414: - b .L1303 -.L1641: - .loc 1 2361 0 discriminator 1 - ldr w0, [x23, 52] - cbz w0, .L1258 - .loc 1 2363 0 - ldr x0, [x23, 104] - adrp x1, .LC103 - add x1, x1, :lo12:.LC103 - bl _dev_info -.LVL1415: -.LBB2242: - .loc 1 2364 0 - ldr w0, [x23, 52] - cbnz w0, .L1656 -.L1261: -.LVL1416: -.L1259: -.LBE2242: - .loc 1 2365 0 discriminator 11 - ldr x0, [x23, 104] -.LVL1417: - adrp x1, .LC104 - add x1, x1, :lo12:.LC104 - bl _dev_info -.LVL1418: - b .L1258 -.LVL1419: -.L1639: +.L1257: .loc 1 2345 0 - ldr w0, [x23, 208] + ldr w0, [x23, 592] +.LVL1320: + cbz w0, .L1258 + .loc 1 2345 0 is_stmt 0 discriminator 1 + ldr w0, [x22, 160] + cbz w0, .L1602 +.L1258: + .loc 1 2351 0 is_stmt 1 + cbnz w19, .L1260 + .loc 1 2351 0 is_stmt 0 discriminator 1 + ldr w0, [x23, 612] + cbz w0, .L1603 +.L1260: + .loc 1 2397 0 is_stmt 1 + ldr w0, [x23, 604] + cbz w0, .L1312 + .loc 1 2397 0 is_stmt 0 discriminator 1 + ldr w0, [x23, 600] + cbnz w0, .L1312 + .loc 1 2397 0 discriminator 2 + ldr w0, [x23, 612] + cbnz w0, .L1312 +.L1313: + .loc 1 2787 0 is_stmt 1 + ldr w0, [x23, 100] + cbz w0, .L1604 +.L1433: +.LVL1321: +.L1431: + .loc 1 2813 0 + str wzr, [x23, 100] + b .L1257 +.LVL1322: +.L1602: + .loc 1 2346 0 + ldr w0, [x23, 200] cmp w0, 1 - beq .L1657 -.L1252: - .loc 1 2815 0 + beq .L1605 +.L1259: + .loc 1 2818 0 adrp x0, __stack_chk_guard add x1, x0, :lo12:__stack_chk_guard ldr x2, [x29, 152] ldr x1, [x1] eor x1, x2, x1 -.LVL1420: mov w0, 0 - cbnz x1, .L1658 + cbnz x1, .L1606 ldp x19, x20, [sp, 16] -.LVL1421: +.LVL1323: ldp x21, x22, [sp, 32] ldp x23, x24, [sp, 48] -.LVL1422: +.LVL1324: ldp x25, x26, [sp, 64] -.LVL1423: +.LVL1325: ldp x27, x28, [sp, 80] -.LVL1424: +.LVL1326: ldp x29, x30, [sp], 160 .cfi_remember_state .cfi_restore 30 @@ -14273,1730 +13531,2580 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL1425: -.L1307: +.LVL1327: +.L1603: .cfi_restore_state - .loc 1 2435 0 + .loc 1 2352 0 + bl ebc_osd_buf_get +.LVL1328: + mov x24, x0 +.LVL1329: + .loc 1 2353 0 + cbz x0, .L1260 + .loc 1 2354 0 + ldr x0, [x23, 584] + cbnz x0, .L1261 + .loc 1 2354 0 is_stmt 0 discriminator 1 + ldr w19, [x23, 592] +.LVL1330: + cbnz w19, .L1261 + .loc 1 2360 0 is_stmt 1 + ldr w0, [x23, 252] + sub w1, w0, #1 + cmp w1, 1 + bls .L1607 + .loc 1 2363 0 + cmp w0, 3 + beq .L1608 +.L1265: + .loc 1 2369 0 + str x24, [x23, 240] + .loc 1 2370 0 + mov w0, 4 + str w0, [x23, 252] + .loc 1 2373 0 + ldr x4, [x23, 224] +.LBB2231: +.LBB2232: + .loc 1 436 0 + ldp w0, w14, [x24, 48] + .loc 1 437 0 + ldp w2, w18, [x24, 56] + .loc 1 434 0 + cmp w0, 0 + .loc 1 439 0 + ldr w1, [x20, 288] + .loc 1 434 0 + add w17, w0, 7 + csel w17, w17, w0, lt + .loc 1 435 0 + add w11, w2, 7 + cmp w2, 0 + .loc 1 439 0 + add w0, w1, 7 + .loc 1 435 0 + csel w11, w11, w2, lt + .loc 1 439 0 + cmp w1, 0 + csel w0, w0, w1, lt + .loc 1 435 0 + asr w11, w11, 3 + .loc 1 439 0 + asr w0, w0, 3 +.LVL1331: + ldr w2, [x20, 284] + .loc 1 435 0 + add w11, w11, 1 +.LVL1332: + .loc 1 442 0 + sub w3, w0, #1 +.LBE2232: +.LBE2231: + .loc 1 2375 0 + ldp x8, x5, [x23, 168] +.LVL1333: +.LBB2281: +.LBB2275: + .loc 1 446 0 + mul w1, w14, w0 + .loc 1 442 0 + cmp w11, w0 +.LBE2275: +.LBE2281: + .loc 1 2371 0 + ldr x6, [x23, 152] +.LBB2282: +.LBB2276: + .loc 1 442 0 + csel w11, w3, w11, ge +.LBE2276: +.LBE2282: + .loc 1 2373 0 + ldr x9, [x4, 16] +.LVL1334: +.LBB2283: +.LBB2277: + .loc 1 444 0 + cmp w2, w18 + .loc 1 446 0 + sxtw x1, w1 + .loc 1 444 0 + sub w3, w2, #1 +.LBE2277: +.LBE2283: + .loc 1 2372 0 + ldr x10, [x24, 16] +.LBB2284: +.LBB2278: + .loc 1 446 0 + lsl x2, x1, 2 + .loc 1 444 0 + csel w18, w3, w18, le + .loc 1 449 0 + lsl x1, x1, 3 + .loc 1 434 0 + asr w17, w17, 3 +.LVL1335: + .loc 1 446 0 + add x6, x6, x2 +.LVL1336: + .loc 1 449 0 + add x8, x8, x1 +.LVL1337: + .loc 1 450 0 + add x5, x5, x1 +.LVL1338: + .loc 1 452 0 + cmp w14, w18 + .loc 1 448 0 + add x9, x9, x2 +.LVL1339: + .loc 1 447 0 + add x10, x10, x2 +.LVL1340: + .loc 1 452 0 + bgt .L1272 + sxtw x0, w0 +.LBB2233: + .loc 1 467 0 + mov w13, 251658240 + lsl x16, x0, 2 + lsl x15, x0, 3 + mov w25, 234881024 +.LVL1341: +.LBE2233: +.LBB2234: + .loc 1 468 0 + mov w12, -268435456 + mov w24, -536870912 +.LVL1342: + .p2align 2 +.L1273: +.LBE2234: + .loc 1 453 0 + mov w4, w17 + cmp w17, w11 + bgt .L1307 + .p2align 2 +.L1523: + .loc 1 454 0 + sxtw x1, w4 +.LVL1343: + .loc 1 459 0 + mov w2, 0 + .loc 1 454 0 + add x26, x6, x1, lsl 2 + .loc 1 458 0 + add x28, x5, x1, lsl 3 + .loc 1 457 0 + ldr x3, [x8, x1, lsl 3] +.LVL1344: + .loc 1 454 0 + ldr w7, [x6, x1, lsl 2] + .loc 1 455 0 + ldr w0, [x10, x1, lsl 2] +.LVL1345: + .loc 1 461 0 + and x30, x3, 255 +.LVL1346: + .loc 1 456 0 + ldr w27, [x9, x1, lsl 2] +.LVL1347: + .loc 1 458 0 + ldr x1, [x5, x1, lsl 3] +.LVL1348: + .loc 1 461 0 + cbnz x30, .L1274 +.LVL1349: +.LBB2235: + and w2, w0, 15 +.LBE2235: + and x1, x1, -256 +.LBB2236: + cmp w2, 15 + bne .L1609 +.L1274: +.LBE2236: + .loc 1 462 0 + tst x3, 65280 + bne .L1277 +.LBB2237: + and w30, w0, 240 +.LVL1350: +.LBE2237: + and x1, x1, -65281 +.LBB2238: + cmp w30, 240 + bne .L1278 + orr w2, w2, 240 +.L1277: +.LBE2238: + .loc 1 463 0 + tst x3, 16711680 + bne .L1281 +.LBB2239: + and w30, w0, 3840 +.LVL1351: +.LBE2239: + and x1, x1, -16711681 +.LBB2240: + cmp w30, 3840 + bne .L1282 + orr w2, w2, 3840 +.LVL1352: +.L1281: +.LBE2240: + .loc 1 464 0 + tst x3, 4278190080 + bne .L1285 +.LBB2241: + and w30, w0, 61440 +.LVL1353: +.LBE2241: + and x1, x1, -4278190081 +.LBB2242: + cmp w30, 61440 + bne .L1286 + orr w2, w2, 61440 +.LVL1354: +.L1285: +.LBE2242: + .loc 1 465 0 + tst x3, 1095216660480 + bne .L1289 +.LBB2243: + and w30, w0, 983040 +.LVL1355: +.LBE2243: + and x1, x1, -1095216660481 +.LBB2244: + cmp w30, 983040 + bne .L1290 + orr w2, w2, 983040 +.LVL1356: +.L1289: +.LBE2244: + .loc 1 466 0 + tst x3, 280375465082880 + bne .L1293 +.LBB2245: + and w30, w0, 15728640 +.LVL1357: +.LBE2245: + and x1, x1, -280375465082881 +.LBB2246: + cmp w30, 15728640 + bne .L1294 + orr w2, w2, 15728640 +.LVL1358: +.L1293: +.LBE2246: + .loc 1 467 0 + tst x3, 71776119061217280 + bne .L1297 +.LBB2247: + and w30, w0, 251658240 +.LVL1359: +.LBE2247: + and x1, x1, -71776119061217281 +.LBB2248: + cmp w30, w13 + bne .L1298 + orr w2, w2, 251658240 +.LVL1360: +.L1297: +.LBE2248: + .loc 1 468 0 + tst x3, -72057594037927936 + bne .L1301 +.LBB2249: + and w3, w0, -268435456 +.LVL1361: +.LBE2249: + and x1, x1, 72057594037927935 +.LBB2250: + cmp w3, w12 + bne .L1302 + orr w2, w2, -268435456 +.LVL1362: +.L1301: +.LBE2250: + .loc 1 471 0 + and w0, w0, w27 +.LVL1363: + .loc 1 472 0 + str x1, [x28] + eor w0, w0, w7 +.LVL1364: + .loc 1 453 0 + add w4, w4, 1 + and w0, w0, w2 + cmp w4, w11 + .loc 1 471 0 + eor w0, w7, w0 + .loc 1 473 0 + str w0, [x26] + .loc 1 453 0 + ble .L1523 +.LVL1365: +.L1307: + .loc 1 452 0 + add w14, w14, 1 + .loc 1 475 0 + add x6, x6, x16 + .loc 1 476 0 + add x10, x10, x16 + .loc 1 477 0 + add x9, x9, x16 + .loc 1 478 0 + add x8, x8, x15 + .loc 1 479 0 + add x5, x5, x15 + .loc 1 452 0 + cmp w14, w18 + ble .L1273 +.LVL1366: +.L1272: +.LBE2278: +.LBE2284: + .loc 1 2377 0 + ldr w0, [x23, 52] +.LVL1367: + cbnz w0, .L1308 + .loc 1 2379 0 + ldr w0, [x23, 200] + .loc 1 2378 0 + mov w1, 1 +.LVL1368: + str w1, [x23, 52] + .loc 1 2379 0 + cbz w0, .L1610 +.L1309: + .loc 1 2381 0 + mov w1, 1 + mov x0, x20 + bl ebc_lut_update +.LVL1369: + .loc 1 2383 0 + ldr w3, [x23, 112] + .loc 1 2385 0 + adrp x1, .LC105 + ldr x0, [x23, 104] + add x1, x1, :lo12:.LC105 + and w2, w3, 255 + .loc 1 2383 0 + strb w3, [x23, 56] + .loc 1 2384 0 + lsr w4, w3, 8 + strb w4, [x23, 57] + .loc 1 2385 0 + and w3, w4, 255 + bl _dev_info +.LVL1370: + .loc 1 2386 0 + mov x0, x20 + bl ebc_frame_start +.LVL1371: +.L1310: + .loc 1 2390 0 + ldr x0, [x23, 232] + cbz x0, .L1311 + .loc 1 2391 0 + bl ebc_buf_release +.LVL1372: +.L1311: + .loc 1 2392 0 + ldr x0, [x23, 240] + str x0, [x23, 232] + .loc 1 2394 0 + b .L1257 +.LVL1373: + .p2align 3 +.L1278: +.LBB2285: +.LBB2279: +.LBB2251: + .loc 1 462 0 + cbnz w30, .L1279 + orr w2, w2, 240 + orr x1, x1, 256 + b .L1277 +.LVL1374: + .p2align 3 +.L1298: +.LBE2251: +.LBB2252: + .loc 1 467 0 + cbnz w30, .L1299 + orr w2, w2, 251658240 + orr x1, x1, 281474976710656 + b .L1297 +.LVL1375: + .p2align 3 +.L1302: +.LBE2252: +.LBB2253: + .loc 1 468 0 + cbnz w3, .L1303 + orr w2, w2, -268435456 + orr x1, x1, 72057594037927936 + b .L1301 +.LVL1376: + .p2align 3 +.L1282: +.LBE2253: +.LBB2254: + .loc 1 463 0 + cbnz w30, .L1283 + orr w2, w2, 3840 + orr x1, x1, 65536 + b .L1281 +.LVL1377: + .p2align 3 +.L1609: +.LBE2254: +.LBB2255: + .loc 1 461 0 + cbnz w2, .L1275 + orr x1, x1, 1 + mov w2, 15 + b .L1274 +.LVL1378: + .p2align 3 +.L1290: +.LBE2255: +.LBB2256: + .loc 1 465 0 + cbnz w30, .L1291 + orr w2, w2, 983040 + orr x1, x1, 4294967296 + b .L1289 +.LVL1379: + .p2align 3 +.L1286: +.LBE2256: +.LBB2257: + .loc 1 464 0 + cbnz w30, .L1287 + orr w2, w2, 61440 + orr x1, x1, 16777216 + b .L1285 +.LVL1380: + .p2align 3 +.L1294: +.LBE2257: +.LBB2258: + .loc 1 466 0 + cbnz w30, .L1295 + orr w2, w2, 15728640 + orr x1, x1, 1099511627776 + b .L1293 +.LVL1381: + .p2align 3 +.L1279: +.LBE2258: +.LBB2259: + .loc 1 462 0 + cmp w30, 224 + beq .L1611 + and w7, w7, -241 + orr w7, w30, w7 + b .L1277 +.LVL1382: + .p2align 3 +.L1299: +.LBE2259: +.LBB2260: + .loc 1 467 0 + cmp w30, w25 + beq .L1612 + and w7, w7, -251658241 + orr w7, w30, w7 + b .L1297 +.LVL1383: + .p2align 3 +.L1295: +.LBE2260: +.LBB2261: + .loc 1 466 0 + cmp w30, 14680064 + beq .L1613 + and w7, w7, -15728641 + orr w7, w30, w7 + b .L1293 +.LVL1384: + .p2align 3 +.L1283: +.LBE2261: +.LBB2262: + .loc 1 463 0 + cmp w30, 3584 + beq .L1614 + and w7, w7, -3841 + orr w7, w30, w7 + b .L1281 +.LVL1385: + .p2align 3 +.L1303: +.LBE2262: +.LBB2263: + .loc 1 468 0 + cmp w3, w24 + beq .L1615 + and w7, w7, 268435455 + orr w7, w3, w7 + b .L1301 +.LVL1386: + .p2align 3 +.L1275: +.LBE2263: +.LBB2264: + .loc 1 461 0 + cmp w2, 14 + beq .L1616 + and w7, w7, -16 + orr w7, w2, w7 +.LBE2264: + .loc 1 459 0 + mov w2, 0 + b .L1274 +.LVL1387: + .p2align 3 +.L1291: +.LBB2265: + .loc 1 465 0 + cmp w30, 917504 + beq .L1617 + and w7, w7, -983041 + orr w7, w30, w7 + b .L1289 +.LVL1388: + .p2align 3 +.L1287: +.LBE2265: +.LBB2266: + .loc 1 464 0 + cmp w30, 57344 + beq .L1618 + and w7, w7, -61441 + orr w7, w30, w7 + b .L1285 +.LVL1389: + .p2align 3 +.L1261: +.LBE2266: +.LBE2279: +.LBE2285: + .loc 1 2355 0 + ldr x0, [x23, 104] + adrp x1, .LC102 + add x1, x1, :lo12:.LC102 + .loc 1 2358 0 + mov w19, 0 + .loc 1 2355 0 + bl _dev_info +.LVL1390: + .loc 1 2356 0 + mov x0, x24 + bl ebc_buf_release +.LVL1391: + .loc 1 2358 0 + b .L1257 +.LVL1392: +.L1611: +.LBB2286: +.LBB2280: +.LBB2267: + .loc 1 462 0 + orr w7, w7, 240 + orr x1, x1, 256 + b .L1277 +.LVL1393: +.L1612: +.LBE2267: +.LBB2268: + .loc 1 467 0 + orr w7, w7, 251658240 + orr x1, x1, 281474976710656 + b .L1297 +.LVL1394: +.L1614: +.LBE2268: +.LBB2269: + .loc 1 463 0 + orr w7, w7, 3840 + orr x1, x1, 65536 + b .L1281 +.LVL1395: +.L1616: +.LBE2269: +.LBB2270: + .loc 1 461 0 + orr w7, w7, 15 + orr x1, x1, 1 +.LBE2270: + .loc 1 459 0 + mov w2, 0 + b .L1274 +.LVL1396: +.L1615: +.LBB2271: + .loc 1 468 0 + orr w7, w7, -268435456 + orr x1, x1, 72057594037927936 + b .L1301 +.LVL1397: +.L1617: +.LBE2271: +.LBB2272: + .loc 1 465 0 + orr w7, w7, 983040 + orr x1, x1, 4294967296 + b .L1289 +.LVL1398: +.L1613: +.LBE2272: +.LBB2273: + .loc 1 466 0 + orr w7, w7, 15728640 + orr x1, x1, 1099511627776 + b .L1293 +.LVL1399: +.L1618: +.LBE2273: +.LBB2274: + .loc 1 464 0 + orr w7, w7, 61440 + orr x1, x1, 16777216 + b .L1285 +.LVL1400: + .p2align 3 +.L1312: +.LBE2274: +.LBE2280: +.LBE2286: + .loc 1 2398 0 + bl ebc_dsp_buf_get +.LVL1401: + mov x24, x0 +.LVL1402: + .loc 1 2399 0 + cbz x0, .L1313 + .loc 1 2400 0 + ldr w1, [x22, 160] + cbnz w1, .L1314 + .loc 1 2401 0 + ldr w1, [x0, 40] + sub w2, w1, #18 + tst w2, -3 + bne .L1315 + .loc 1 2402 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + str wzr, [x0, 32] +.L1316: + .loc 1 2483 0 + ldr w0, [x24, 64] + .loc 1 2481 0 + cbz w19, .L1328 + .loc 1 2483 0 + cbnz w0, .L1329 + .loc 1 2485 0 + mov w0, 1 + str w0, [x24, 64] + .loc 1 2484 0 + mov w0, 21 + str w0, [x24, 40] +.L1330: + .loc 1 2590 0 + ldr w0, [x23, 468] + cbz w0, .L1435 +.L1370: + .loc 1 2653 0 + ldr w0, [x23, 52] + .loc 1 2647 0 + mov w19, 1 +.LVL1403: + .loc 1 2653 0 + cbnz w0, .L1619 +.L1389: +.LVL1404: +.L1386: + .loc 1 2658 0 + ldr w0, [x23, 252] +.LVL1405: + sub w0, w0, #3 + cmp w0, 1 + bls .L1620 +.L1391: + .loc 1 2662 0 + ldr w0, [x24, 40] + sub w1, w0, #7 + .loc 1 2661 0 + cmp w1, 1 + bls .L1621 +.L1392: + .loc 1 2676 0 + sub w0, w0, #2 + .loc 1 2675 0 + cmp w0, 14 + bhi .L1394 + ldr x0, [x23, 216] +.LBB2287: +.LBB2288: + .loc 1 2287 0 + ldr w1, [x23, 28] + ldr x4, [x24, 16] + cmp w1, 0 + ldr x5, [x0, 16] + add w0, w1, 7 + csel w0, w0, w1, lt + asr w0, w0, 3 + cmp w0, 0 + ble .L1396 + .loc 1 2291 0 + ldr x2, [x4] + ldr x1, [x5] + cmp x2, x1 + bne .L1394 + sub w1, w0, #1 + mov x0, 8 + add x1, x1, 1 + lsl x1, x1, 3 + b .L1398 +.L1399: + .loc 1 2288 0 + ldr x3, [x4, x0] + add x0, x0, 8 + .loc 1 2289 0 + add x2, x5, x0 + .loc 1 2291 0 + ldr x2, [x2, -8] + cmp x3, x2 + bne .L1394 +.L1398: + .loc 1 2287 0 + cmp x1, x0 + bne .L1399 +.L1396: +.LBE2288: +.LBE2287: + .loc 1 2678 0 + ldr x0, [x23, 104] + adrp x1, .LC118 + add x1, x1, :lo12:.LC118 + bl _dev_info +.LVL1406: + .loc 1 2680 0 + str x24, [x23, 224] + ldr w0, [x24, 40] +.LVL1407: +.L1365: + .loc 1 2764 0 + cmp w0, 20 + beq .L1622 +.L1413: + .loc 1 2768 0 + cmp w0, 18 + beq .L1623 +.L1414: + .loc 1 2777 0 + ldr w0, [x23, 468] + cbnz w0, .L1624 +.L1416: + .loc 1 2780 0 + mov w0, 1 + str w0, [x23, 468] +.L1417: + .loc 1 2782 0 + ldr x0, [x23, 224] + mov w19, 0 +.LVL1408: + str x0, [x23, 216] + b .L1257 +.L1630: + .loc 1 2492 0 discriminator 1 + ldr w0, [x23, 252] + cmp w0, 4 + beq .L1625 +.L1331: + .loc 1 2590 0 + ldr w0, [x23, 468] + cbnz w0, .L1436 +.L1435: + .loc 1 2591 0 + str x24, [x23, 216] +.L1436: + .loc 1 2593 0 + ldr w2, [x24, 40] + cmp w2, 11 + bgt .L1367 + cmp w2, 7 + bge .L1441 + cmp w2, 0 + beq .L1369 + blt .L1366 + cmp w2, 2 + bge .L1370 +.L1366: + .loc 1 2755 0 + ldr x0, [x23, 104] + adrp x1, .LC120 + add x1, x1, :lo12:.LC120 + .loc 1 2758 0 + mov w19, 0 + .loc 1 2755 0 + bl _dev_err +.LVL1409: + .loc 1 2756 0 + mov x0, x24 + bl ebc_buf_release +.LVL1410: + .loc 1 2758 0 + b .L1257 +.LVL1411: +.L1308: + .loc 1 2388 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + ldr x0, [x0, 8] + bl wake_up_process +.LVL1412: + b .L1310 +.L1608: + .loc 1 2363 0 discriminator 1 + ldr w0, [x23, 52] + cbz w0, .L1265 + .loc 1 2365 0 + ldr x0, [x23, 104] + adrp x1, .LC103 + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1413: +.LBB2289: + .loc 1 2366 0 + ldr w0, [x23, 52] + cbnz w0, .L1626 +.L1268: +.LVL1414: +.L1266: +.LBE2289: + .loc 1 2367 0 discriminator 11 + ldr x0, [x23, 104] +.LVL1415: + adrp x1, .LC104 + add x1, x1, :lo12:.LC104 + bl _dev_info +.LVL1416: + b .L1265 +.L1314: + .loc 1 2437 0 ldr w0, [x0, 40] cmp w0, 18 - beq .L1659 - .loc 1 2444 0 + beq .L1627 + .loc 1 2447 0 cmp w0, 19 - beq .L1660 - .loc 1 2459 0 + beq .L1628 + .loc 1 2462 0 cmp w0, 20 - beq .L1661 - .loc 1 2466 0 + beq .L1629 + .loc 1 2470 0 adrp x0, .LANCHOR0 add x0, x0, :lo12:.LANCHOR0 ldr w1, [x0, 32] - cbz w1, .L1309 - .loc 1 2467 0 + cbz w1, .L1316 + .loc 1 2471 0 ldr w1, [x0, 36] cmp w1, 5 add w1, w1, 1 str w1, [x0, 36] - ble .L1320 - .loc 1 2468 0 + ble .L1327 + .loc 1 2472 0 str wzr, [x0, 32] -.L1320: - .loc 1 2469 0 - ldr w1, [x19, 220] +.L1327: + .loc 1 2473 0 + ldr w1, [x20, 220] ldr x0, [x24, 16] bl check_black_percent.isra.11 -.LVL1426: - cbz w0, .L1309 -.L1621: - .loc 1 2519 0 +.LVL1417: + cbz w0, .L1316 +.L1587: + .loc 1 2533 0 mov x0, x24 -.L1622: +.L1588: bl ebc_buf_release -.LVL1427: - .loc 1 2521 0 - b .L1250 -.LVL1428: -.L1643: - .loc 1 2378 0 - mov x0, x19 +.LVL1418: + .loc 1 2535 0 + b .L1257 +.LVL1419: +.L1610: + .loc 1 2380 0 + mov x0, x20 bl ebc_power_set.constprop.15 -.LVL1429: - b .L1302 -.LVL1430: -.L1321: - .loc 1 2487 0 - ldr w0, [x24, 64] -.LVL1431: - str w0, [x29, 108] - cbnz w0, .L1324 - .loc 1 2488 0 - ldr w0, [x23, 612] -.LVL1432: - cbz w0, .L1662 - .loc 1 2489 0 - ldr w0, [x23, 264] - sub w1, w0, #1 - cmp w1, 1 - bls .L1663 - .loc 1 2492 0 - cmp w0, 3 - beq .L1664 -.L1326: - .loc 1 2499 0 - ldr w3, [x23, 88] - .loc 1 2500 0 - sub w0, w3, #1 - .loc 1 2499 0 - cmp w0, 99 - bls .L1665 -.L1332: - .loc 1 2517 0 - ldr w0, [x23, 256] - cbnz w0, .L1336 - .loc 1 2517 0 is_stmt 0 discriminator 1 - bl ebc_get_dsp_list_enum_num -.LVL1433: - cbnz w0, .L1336 - .loc 1 2522 0 is_stmt 1 - ldr w2, [x23, 260] - cmp w2, 0 - ble .L1337 - .loc 1 2524 0 - ldr x0, [x23, 104] - adrp x1, .LC112 - .loc 1 2523 0 - str wzr, [x23, 100] - .loc 1 2524 0 - add x1, x1, :lo12:.LC112 - bl _dev_info -.LVL1434: -.LBB2245: -.LBB2246: -.LBB2247: - .file 17 "./include/linux/jiffies.h" - .loc 17 368 0 - ldr w0, [x23, 260] - bl __msecs_to_jiffies -.LVL1435: -.LBE2247: -.LBE2246: -.LBB2248: - .loc 1 2525 0 - ldr w1, [x23, 256] - cbnz w1, .L1358 - .loc 1 2525 0 is_stmt 0 discriminator 2 - ldr w1, [x23, 100] - cbnz w1, .L1339 -.LBE2248: - .loc 1 2525 0 - cbz x0, .L1339 -.LBB2249: -.LBB2250: -.LBB2251: - .loc 17 368 0 is_stmt 1 discriminator 10 - ldr w0, [x23, 260] - bl __msecs_to_jiffies -.LVL1436: - mov x25, x0 -.LVL1437: -.LBE2251: -.LBE2250: - .loc 1 2525 0 discriminator 10 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1438: -.L1344: -.LBB2252: - .loc 1 2525 0 is_stmt 0 discriminator 27 - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1439: -.LBB2253: - ldr w1, [x23, 256] - cbz w1, .L1666 -.L1341: -.LBE2253: -.LBE2252: - .loc 1 2525 0 discriminator 22 - mov x0, x20 - add x1, x29, 112 - bl finish_wait -.LVL1440: - ldr w0, [x23, 256] -.LBE2249: -.LBE2245: - .loc 1 2527 0 is_stmt 1 discriminator 22 - cbnz w0, .L1358 -.LVL1441: -.L1339: - .loc 1 2527 0 is_stmt 0 - bl ebc_get_dsp_list_enum_num -.LVL1442: - cbnz w0, .L1358 -.L1337: - ldr w1, [x24, 40] - sub w1, w1, #12 - cmp w1, 11 - bls .L1345 - .loc 1 2537 0 is_stmt 1 - ldr w0, [x23, 144] - cmp w0, 7 - beq .L1346 - .loc 1 2538 0 - cmp w0, 1 - beq .L1346 - mov w1, 1 -.L1450: - .loc 1 2539 0 - cmp w0, 2 - cset w0, eq - tst w1, w0 - bne .L1346 -.LVL1443: -.L1349: - .loc 1 2553 0 - mov w0, 4 - .loc 1 2554 0 - str x24, [x23, 232] - .loc 1 2553 0 - str w0, [x23, 264] - .loc 1 2555 0 - mov x5, x23 - ldr x0, [x23, 152] - ldr x1, [x23, 16] -.LVL1444: - ldp x3, x4, [x23, 176] - ldr x2, [x24, 16] - bl refresh_new_image -.LVL1445: - .loc 1 2561 0 - ldr w0, [x23, 52] - cbz w0, .L1667 - .loc 1 2571 0 - ldr x0, [x23, 232] - ldr w0, [x0, 40] - .loc 1 2573 0 - cmp w0, 0 - .loc 1 2572 0 - sub w1, w0, #22 - .loc 1 2573 0 - ccmp w1, 1, 0, ne - bls .L1367 - b .L1451 - .p2align 3 -.L1640: - .loc 1 2359 0 - ldr x0, [x23, 224] +.LVL1420: + b .L1309 +.L1607: + .loc 1 2361 0 + ldr x0, [x23, 216] ldrsw x2, [x23, 28] ldr x1, [x0, 16] ldr x0, [x23, 160] bl memcpy -.LVL1446: - .loc 1 2360 0 - ldr x0, [x23, 232] +.LVL1421: + .loc 1 2362 0 + ldr x0, [x23, 224] ldrsw x2, [x23, 28] ldr x1, [x0, 16] ldr x0, [x23, 152] bl memcpy -.LVL1447: - b .L1258 -.L1662: - .loc 1 2488 0 discriminator 1 - ldr w0, [x23, 264] - cmp w0, 4 - beq .L1668 -.LVL1448: -.L1324: - .loc 1 2586 0 - ldr w0, [x23, 484] -.LVL1449: - cbnz w0, .L1449 -.L1448: - .loc 1 2587 0 - str x24, [x23, 224] -.L1449: - .loc 1 2589 0 - ldr w2, [x24, 40] - cmp w2, 11 - bgt .L1369 - cmp w2, 7 - bge .L1454 - cmp w2, 0 - beq .L1371 - blt .L1368 - cmp w2, 2 - bge .L1372 -.L1368: - .loc 1 2753 0 - ldr x0, [x23, 104] - adrp x1, .LC120 - add x1, x1, :lo12:.LC120 - bl _dev_err -.LVL1450: - .loc 1 2754 0 - mov x0, x24 - bl ebc_buf_release -.LVL1451: - .loc 1 2756 0 - str wzr, [x29, 108] - b .L1250 -.L1322: - .loc 1 2482 0 - ldr w0, [x24, 40] - cmp w0, 16 - bne .L1324 - .loc 1 2483 0 - mov w0, 21 - str w0, [x24, 40] - b .L1323 -.L1369: - .loc 1 2589 0 - cmp w2, 21 - ble .L1372 - cmp w2, 23 - bgt .L1368 -.L1371: - .loc 1 2594 0 - ldr w0, [x23, 264] - .loc 1 2593 0 - str x24, [x23, 232] - .loc 1 2594 0 +.LVL1422: + b .L1265 +.L1328: + .loc 1 2491 0 + cbnz w0, .L1331 + .loc 1 2492 0 + ldr w0, [x23, 596] + cbz w0, .L1630 + .loc 1 2493 0 + ldr w0, [x23, 252] sub w1, w0, #1 cmp w1, 1 - bls .L1669 - .loc 1 2597 0 - cmp w0, 4 - beq .L1670 - .loc 1 2603 0 - ldr x0, [x23, 224] + bls .L1631 + .loc 1 2496 0 + cmp w0, 3 + beq .L1632 +.L1333: + .loc 1 2503 0 + ldr w3, [x23, 88] + .loc 1 2504 0 + sub w0, w3, #1 + .loc 1 2503 0 + cmp w0, 99 + bhi .L1339 +.LBB2292: + .loc 1 2505 0 + ldr x0, [x23, 216] + ldr w2, [x20, 220] + ldr x1, [x0, 16] + ldr x0, [x24, 16] + bl check_diff_percent.isra.12 +.LVL1423: + .loc 1 2506 0 + cmp w0, 2 + beq .L1633 +.L1339: +.LBE2292: + .loc 1 2521 0 + bl ebc_get_dsp_list_enum_num +.LVL1424: + mov w19, w0 + cbnz w0, .L1634 + .loc 1 2526 0 + ldr w2, [x23, 248] + cmp w2, 0 + ble .L1341 + .loc 1 2528 0 + ldr x0, [x23, 104] + adrp x1, .LC112 + .loc 1 2527 0 + str wzr, [x23, 100] + .loc 1 2528 0 + add x1, x1, :lo12:.LC112 + bl _dev_info +.LVL1425: +.LBB2293: +.LBB2294: +.LBB2295: + .file 17 "./include/linux/jiffies.h" + .loc 17 368 0 + ldr w0, [x23, 248] + bl __msecs_to_jiffies +.LVL1426: +.LBE2295: +.LBE2294: +.LBB2296: + .loc 1 2529 0 + ldr w1, [x23, 100] + cmp w1, 0 + cset w1, ne +.LVL1427: + cmp x0, 0 + cset w0, eq + tst w1, w0 + beq .L1635 +.L1344: +.LVL1428: +.L1342: +.LBE2296: +.LBE2293: + .loc 1 2531 0 discriminator 17 + bl ebc_get_dsp_list_enum_num +.LVL1429: + cbnz w0, .L1589 +.L1341: ldr w1, [x24, 40] - ldr w0, [x0, 40] - cmp w1, w0 - beq .L1376 - .loc 1 2603 0 is_stmt 0 discriminator 1 - ldr w0, [x23, 52] - cbnz w0, .L1671 -.L1383: -.L1376: - .loc 1 2610 0 is_stmt 1 + sub w1, w1, #12 + cmp w1, 11 + bls .L1346 + .loc 1 2541 0 + ldr w0, [x23, 144] + cmp w0, 7 + beq .L1347 + .loc 1 2542 0 + mov w2, 1 + cmp w0, 1 + beq .L1347 +.LVL1430: +.L1437: + .loc 1 2543 0 + cmp w0, 2 + cset w0, eq + tst w2, w0 + bne .L1347 +.L1350: + .loc 1 2557 0 + mov w0, 4 + .loc 1 2558 0 + str x24, [x23, 224] + .loc 1 2557 0 + str w0, [x23, 252] + .loc 1 2559 0 + mov x5, x23 ldr x0, [x23, 152] - mov x3, x23 - ldr x2, [x23, 176] - ldr x1, [x24, 16] - bl refresh_new_image_auto -.LVL1452: -.L1374: - .loc 1 2616 0 + ldr x1, [x23, 16] +.LVL1431: + ldp x3, x4, [x23, 168] + ldr x2, [x24, 16] + bl refresh_new_image +.LVL1432: + .loc 1 2565 0 ldr w0, [x23, 52] - .loc 1 2615 0 - mov w1, 3 - str w1, [x23, 264] - .loc 1 2616 0 - cbnz w0, .L1628 - .loc 1 2618 0 - ldr w0, [x23, 208] - .loc 1 2617 0 - str w22, [x23, 52] - .loc 1 2618 0 - cbnz w0, .L1386 - .loc 1 2619 0 - mov x0, x19 - bl ebc_power_set.constprop.15 -.LVL1453: -.L1386: - .loc 1 2620 0 - ldr w1, [x24, 40] - mov x0, x19 - bl ebc_lut_update -.LVL1454: - .loc 1 2622 0 - ldr w1, [x23, 112] - .loc 1 2624 0 - ldr x0, [x23, 104] - .loc 1 2622 0 - strb w1, [x23, 56] - .loc 1 2624 0 - and w2, w1, 255 - .loc 1 2623 0 - lsr w1, w1, 8 - strb w1, [x23, 57] - .loc 1 2624 0 - adrp x1, .LC116 - add x1, x1, :lo12:.LC116 - bl _dev_info -.LVL1455: - .loc 1 2625 0 - mov x0, x19 - bl ebc_frame_start -.LVL1456: -.L1628: - ldr x0, [x23, 232] + cbz w0, .L1636 + .loc 1 2575 0 + ldr x0, [x23, 224] ldr w0, [x0, 40] - b .L1367 -.LVL1457: -.L1336: - .loc 1 2518 0 + .loc 1 2577 0 + cmp w0, 0 + .loc 1 2576 0 + sub w1, w0, #22 + .loc 1 2577 0 + ccmp w1, 1, 0, ne + bls .L1365 +.L1438: + .loc 1 2581 0 ldr x0, [x23, 104] -.LVL1458: - adrp x1, .LC111 - add x1, x1, :lo12:.LC111 + adrp x1, .LC115 + .loc 1 2580 0 + str wzr, [x23, 600] + .loc 1 2581 0 + add x1, x1, :lo12:.LC115 bl _dev_info -.LVL1459: - .loc 1 2519 0 - mov x0, x24 - b .L1622 -.L1308: - .loc 1 2401 0 +.LVL1433: + .loc 1 2582 0 + ldrb w1, [x23, 56] + lsl w0, w1, 3 + sub w0, w0, w1 +.LBB2303: +.LBB2304: + .loc 17 368 0 + lsl w0, w0, 1 + bl __msecs_to_jiffies +.LVL1434: +.LBE2304: +.LBE2303: + .loc 1 2582 0 + adrp x1, jiffies + ldr x1, [x1, #:lo12:jiffies] + add x1, x1, x0 + add x0, x20, 664 + bl mod_timer +.LVL1435: + ldr x0, [x23, 224] + ldr w0, [x0, 40] + b .L1365 + .p2align 3 +.L1315: + .loc 1 2403 0 adrp x2, .LANCHOR0 add x25, x2, :lo12:.LANCHOR0 -.LVL1460: +.LVL1436: ldr w2, [x25, 32] - cbz w2, .L1310 - .loc 1 2402 0 + cbz w2, .L1317 + .loc 1 2404 0 ldr w0, [x25, 36] cmp w0, 5 add w0, w0, 1 str w0, [x25, 36] - ble .L1320 - .loc 1 2469 0 - ldr w1, [x19, 220] - ldr x0, [x24, 16] - .loc 1 2403 0 + ble .L1327 + .loc 1 2405 0 str wzr, [x25, 32] - .loc 1 2469 0 - bl check_black_percent.isra.11 -.LVL1461: - cbz w0, .L1309 - b .L1621 -.LVL1462: -.L1655: - .loc 1 2659 0 - ldr w3, [x23, 88] - .loc 1 2660 0 - sub w1, w3, #1 - cmp w1, 99 - bhi .L1394 -.LBB2257: - .loc 1 2661 0 - ldr x0, [x23, 224] - ldr w2, [x19, 220] - ldr x1, [x0, 16] - ldr x0, [x24, 16] - bl check_diff_percent.isra.12 -.LVL1463: - mov w26, w0 - .loc 1 2662 0 - cbz w0, .L1398 - .loc 1 2667 0 - cmp w0, 2 - beq .L1627 -.L1396: -.LBE2257: - .loc 1 2683 0 - cbnz w25, .L1455 - .loc 1 2688 0 - ldr w0, [x23, 84] - .loc 1 2682 0 - mov w26, 1 - .loc 1 2688 0 - cmp w0, 0 - ble .L1397 - .loc 1 2689 0 - ldr w1, [x29, 104] -.LVL1464: - add w1, w1, w26 -.LVL1465: - str w1, [x29, 104] - .loc 1 2690 0 - cmp w0, w1 - bgt .L1397 - .loc 1 2691 0 - mov w26, 2 -.LVL1466: -.L1627: - str w26, [x24, 40] - .loc 1 2692 0 - str wzr, [x29, 104] -.LVL1467: -.L1397: - .loc 1 2697 0 - ldr w0, [x23, 208] - cbz w0, .L1672 -.L1402: - .loc 1 2700 0 - ldr w1, [x24, 40] -.LVL1468: - mov x0, x19 - bl ebc_lut_update -.LVL1469: - .loc 1 2703 0 - ldr w0, [x23, 256] - cbz w0, .L1673 -.LVL1470: -.L1409: - .loc 1 2725 0 + b .L1327 +.LVL1437: +.L1329: + .loc 1 2486 0 ldr w0, [x24, 40] - sub w0, w0, #19 - tst w0, -3 - beq .L1334 - .loc 1 2731 0 - ldr w0, [x24, 64] -.LVL1471: - str w0, [x29, 108] - cbz w0, .L1336 -.L1408: - .loc 1 2743 0 - ldr w3, [x23, 112] - .loc 1 2744 0 - adrp x1, .LC119 - .loc 1 2743 0 - strb w3, [x23, 56] - .loc 1 2744 0 - add x1, x1, :lo12:.LC119 - .loc 1 2742 0 - str x24, [x23, 232] - .loc 1 2744 0 - and w3, w3, 255 - ldr x0, [x23, 104] -.LVL1472: - .loc 1 2748 0 - adrp x25, jiffies -.LVL1473: - .loc 1 2744 0 - ldr w2, [x24, 40] - .loc 1 2748 0 - add x24, x19, 736 - .loc 1 2744 0 - bl _dev_info -.LVL1474: - .loc 1 2745 0 - str w22, [x23, 52] - .loc 1 2746 0 - str w26, [x23, 264] - .loc 1 2747 0 - mov x0, x19 - bl ebc_frame_start -.LVL1475: - .loc 1 2748 0 - ldr x1, [x25, #:lo12:jiffies] - mov x0, x24 - add x1, x1, 900 - bl mod_timer -.LVL1476: -.LBB2258: - .loc 1 2749 0 - ldr w0, [x23, 52] - cbnz w0, .L1674 -.L1420: -.LVL1477: -.L1418: -.LBE2258: - .loc 1 2750 0 discriminator 11 - ldr x2, [x25, #:lo12:jiffies] - mov x0, x24 -.LVL1478: - mov x1, 402653184 - add x1, x2, x1 - bl mod_timer -.LVL1479: - ldr x0, [x23, 232] - ldr w0, [x0, 40] -.LVL1480: -.L1367: - .loc 1 2762 0 - cmp w0, 20 - beq .L1675 -.L1422: - .loc 1 2766 0 - cmp w0, 18 - beq .L1676 -.L1423: - .loc 1 2774 0 - ldr w0, [x23, 484] - cbnz w0, .L1677 -.L1425: - .loc 1 2777 0 - str w22, [x23, 484] -.L1426: - .loc 1 2779 0 - ldr x0, [x23, 232] - str x0, [x23, 224] - str wzr, [x29, 108] - b .L1250 -.LVL1481: -.L1310: - .loc 1 2409 0 - ldr x2, [x23, 600] - cbz x2, .L1309 - .loc 1 2410 0 - cmp w1, 19 - bne .L1622 + cmp w0, 16 + bne .L1331 + .loc 1 2487 0 + mov w0, 21 + str w0, [x24, 40] + b .L1330 +.LVL1438: +.L1317: .loc 1 2411 0 - str wzr, [x23, 600] + ldr x2, [x23, 584] + cbz x2, .L1316 .loc 1 2412 0 + cmp w1, 19 + bne .L1588 + .loc 1 2413 0 + str wzr, [x23, 584] + .loc 1 2414 0 mov x0, 3 bl ebc_notify -.LVL1482: - .loc 1 2413 0 +.LVL1439: + .loc 1 2415 0 ldr x0, [x23, 104] adrp x1, .LC106 add x1, x1, :lo12:.LC106 bl _dev_info -.LVL1483: - .loc 1 2414 0 - ldr w0, [x23, 624] - cbz w0, .L1309 - .loc 1 2417 0 - ldr w1, [x19, 220] - ldr x0, [x24, 16] +.LVL1440: .loc 1 2416 0 - stp w22, wzr, [x25, 32] + ldr w0, [x23, 608] + cbz w0, .L1316 .loc 1 2417 0 + mov w0, 1 + .loc 1 2419 0 + ldr w1, [x20, 220] + .loc 1 2418 0 + stp w0, wzr, [x25, 32] + .loc 1 2419 0 + ldr x0, [x24, 16] bl check_black_percent.isra.11 -.LVL1484: - cbz w0, .L1309 - b .L1617 -.LVL1485: +.LVL1441: + cbz w0, .L1316 + b .L1583 +.LVL1442: .p2align 3 -.L1454: - .loc 1 2649 0 +.L1441: + .loc 1 2653 0 ldr w0, [x23, 52] - .loc 1 2589 0 - mov w25, 0 -.LVL1486: - .loc 1 2649 0 - cbz w0, .L1388 -.L1653: - .loc 1 2650 0 + .loc 1 2593 0 + mov w19, 0 +.LVL1443: + .loc 1 2653 0 + cbz w0, .L1386 +.L1619: + .loc 1 2654 0 ldr x0, [x23, 104] adrp x1, .LC117 add x1, x1, :lo12:.LC117 bl _dev_info -.LVL1487: -.LBB2261: - .loc 1 2651 0 +.LVL1444: +.LBB2305: + .loc 1 2655 0 ldr w0, [x23, 52] - cbz w0, .L1388 -.LBB2262: - .loc 1 2651 0 is_stmt 0 discriminator 1 + cbz w0, .L1386 +.LBB2306: + .loc 1 2655 0 is_stmt 0 discriminator 1 mov w1, 0 add x0, x29, 112 bl init_wait_entry -.LVL1488: - b .L1392 -.L1678: -.LVL1489: -.LBB2263: - .loc 1 2651 0 discriminator 5 - cbnz x0, .L1388 - .loc 1 2651 0 discriminator 7 +.LVL1445: + b .L1390 +.L1637: +.LVL1446: +.LBB2307: + .loc 1 2655 0 discriminator 5 + cbnz x0, .L1386 + .loc 1 2655 0 discriminator 7 bl schedule -.LVL1490: -.L1392: - .loc 1 2651 0 discriminator 9 +.LVL1447: +.L1390: + .loc 1 2655 0 discriminator 9 add x1, x29, 112 mov w2, 1 - mov x0, x20 + mov x0, x21 bl prepare_to_wait_event -.LVL1491: +.LVL1448: ldr w1, [x23, 52] - cbnz w1, .L1678 -.LBE2263: - .loc 1 2651 0 discriminator 4 + cbnz w1, .L1637 +.LBE2307: + .loc 1 2655 0 discriminator 4 add x1, x29, 112 - mov x0, x20 + mov x0, x21 bl finish_wait -.LVL1492: - b .L1388 +.LVL1449: + b .L1386 +.LVL1450: .p2align 3 -.L1455: -.LBE2262: -.LBE2261: - .loc 1 2697 0 is_stmt 1 - ldr w0, [x23, 208] - .loc 1 2686 0 - mov w26, 2 - .loc 1 2684 0 - str wzr, [x29, 104] - .loc 1 2697 0 - cbnz w0, .L1402 -.LVL1493: -.L1672: - .loc 1 2698 0 - mov x0, x19 - bl ebc_power_set.constprop.15 -.LVL1494: - .loc 1 2700 0 - ldr w1, [x24, 40] - mov x0, x19 - bl ebc_lut_update -.LVL1495: - .loc 1 2703 0 - ldr w0, [x23, 256] - cbnz w0, .L1409 -.L1673: - .loc 1 2703 0 is_stmt 0 discriminator 1 - bl ebc_get_dsp_list_enum_num -.LVL1496: - cbnz w0, .L1409 - .loc 1 2717 0 is_stmt 1 - ldr w0, [x24, 40] - .loc 1 2719 0 - and w1, w0, -3 - cmp w1, 16 - ccmp w0, 20, 4, ne - beq .L1408 - .loc 1 2720 0 - ldr w2, [x23, 260] - cmp w2, 0 - ble .L1408 - .loc 1 2721 0 - ldr x0, [x23, 104] - adrp x1, .LC112 - add x1, x1, :lo12:.LC112 - bl _dev_info -.LVL1497: -.LBB2264: -.LBB2265: -.LBB2266: - .loc 17 368 0 - ldr w0, [x23, 260] - bl __msecs_to_jiffies -.LVL1498: -.LBE2266: -.LBE2265: -.LBB2267: - .loc 1 2722 0 - ldr w1, [x23, 256] - cbnz w1, .L1409 - .loc 1 2722 0 is_stmt 0 discriminator 2 - ldr w1, [x23, 612] - cbz w1, .L1679 -.LVL1499: -.L1410: -.LBE2267: -.LBE2264: - .loc 1 2724 0 is_stmt 1 - bl ebc_get_dsp_list_enum_num -.LVL1500: - cbnz w0, .L1409 - b .L1408 -.LVL1501: - .p2align 3 -.L1652: -.LBB2276: -.LBB2180: - .loc 1 2785 0 +.L1604: +.LBE2306: +.LBE2305: +.LBB2308: +.LBB2228: + .loc 1 2788 0 is_stmt 1 mov w1, 0 add x0, x29, 112 bl init_wait_entry -.LVL1502: +.LVL1451: mov x24, 60 -.LVL1503: -.LBB2176: +.LBB2225: mov w2, 1 add x1, x29, 112 - mov x0, x20 + mov x0, x21 bl prepare_to_wait_event -.LVL1504: -.LBB2171: +.LVL1452: +.LBB2221: ldr w1, [x23, 100] + mov w2, 0 cmp w1, 0 - mov w1, 0 - cset w2, ne -.LVL1505: -.L1431: -.LBE2171: - .loc 1 2785 0 is_stmt 0 discriminator 9 + cset w1, ne +.LVL1453: +.L1422: +.LBE2221: + .loc 1 2788 0 is_stmt 0 discriminator 9 orr w1, w1, w2 - cbnz w1, .L1430 -.LVL1506: - .loc 1 2785 0 discriminator 11 - cbnz x0, .L1429 - .loc 1 2785 0 discriminator 13 +.LVL1454: + cbnz w1, .L1421 +.LVL1455: + .loc 1 2788 0 discriminator 11 + cbnz x0, .L1420 + .loc 1 2788 0 discriminator 13 mov x0, x24 -.LVL1507: +.LVL1456: bl schedule_timeout -.LVL1508: +.LVL1457: mov w2, 1 mov x24, x0 add x1, x29, 112 - mov x0, x20 + mov x0, x21 bl prepare_to_wait_event -.LVL1509: -.LBB2172: +.LVL1458: +.LBB2222: ldr w1, [x23, 100] cmp w1, 0 - cset w2, ne -.LVL1510: + cset w1, ne +.LVL1459: cmp x24, 0 - cset w1, eq - tst w2, w1 - beq .L1431 -.L1430: -.LBE2172: -.LBE2176: - .loc 1 2785 0 + cset w2, eq + tst w1, w2 + beq .L1422 +.L1421: +.LBE2222: +.LBE2225: + .loc 1 2788 0 add x1, x29, 112 - mov x0, x20 +.LVL1460: + mov x0, x21 bl finish_wait -.LVL1511: -.L1429: -.LBE2180: -.LBE2276: - .loc 1 2786 0 is_stmt 1 discriminator 16 +.LVL1461: +.L1420: +.LBE2228: +.LBE2308: + .loc 1 2789 0 is_stmt 1 discriminator 16 ldr w0, [x23, 100] -.LVL1512: - cbnz w0, .L1250 - .loc 1 2793 0 +.LVL1462: + cbnz w0, .L1257 + .loc 1 2796 0 ldr w0, [x23, 52] cmp w0, 1 - beq .L1680 - .loc 1 2803 0 + bne .L1424 +.LBB2309: +.LBB2310: + .loc 1 2797 0 discriminator 3 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1463: +.LBB2311: + add x1, x29, 112 + mov w2, 1 + mov x0, x21 + bl prepare_to_wait_event +.LVL1464: + ldr w1, [x23, 52] + cbz w1, .L1425 +.L1638: + .loc 1 2797 0 is_stmt 0 discriminator 7 + ldr w1, [x23, 100] + cbnz w1, .L1425 +.LVL1465: + .loc 1 2797 0 discriminator 9 + cbnz x0, .L1426 + .loc 1 2797 0 discriminator 11 + bl schedule +.LVL1466: + add x1, x29, 112 + mov w2, 1 + mov x0, x21 + bl prepare_to_wait_event +.LVL1467: + ldr w1, [x23, 52] + cbnz w1, .L1638 +.L1425: +.LBE2311: + .loc 1 2797 0 discriminator 8 + add x1, x29, 112 + mov x0, x21 + bl finish_wait +.LVL1468: +.L1426: +.LBE2310: +.LBE2309: + .loc 1 2799 0 is_stmt 1 discriminator 14 bl ebc_get_dsp_list_enum_num -.LVL1513: - cbnz w0, .L1250 - .loc 1 2803 0 is_stmt 0 discriminator 1 +.LVL1469: + cbnz w0, .L1257 + .loc 1 2799 0 is_stmt 0 discriminator 1 bl ebc_get_osd_list_enum_num -.LVL1514: - cbnz w0, .L1250 - b .L1632 -.LVL1515: - .p2align 3 -.L1668: - .loc 1 2488 0 is_stmt 1 discriminator 2 +.LVL1470: + cbnz w0, .L1257 + .loc 1 2801 0 is_stmt 1 ldr w0, [x23, 52] - cbnz w0, .L1326 - b .L1324 -.L1670: - .loc 1 2597 0 discriminator 1 - ldr w0, [x23, 52] - cbz w0, .L1376 - .loc 1 2599 0 - ldr x0, [x23, 104] - adrp x1, .LC103 - add x1, x1, :lo12:.LC103 - bl _dev_info -.LVL1516: -.LBB2277: - .loc 1 2600 0 - ldr w0, [x23, 52] - cbz w0, .L1377 -.LBB2278: - .loc 1 2600 0 is_stmt 0 discriminator 1 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1517: - b .L1380 - .p2align 3 -.L1681: -.LVL1518: -.LBB2279: - .loc 1 2600 0 discriminator 5 - cbnz x0, .L1377 - .loc 1 2600 0 discriminator 7 - bl schedule -.LVL1519: -.L1380: - .loc 1 2600 0 discriminator 9 - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1520: - ldr w1, [x23, 52] - cbnz w1, .L1681 -.L1378: -.LBE2279: - .loc 1 2600 0 discriminator 4 - add x1, x29, 112 - mov x0, x20 - bl finish_wait -.LVL1521: - b .L1377 - .p2align 3 -.L1665: -.LBE2278: -.LBE2277: -.LBB2280: - .loc 1 2501 0 is_stmt 1 - ldr x0, [x23, 224] - ldr w2, [x19, 220] - ldr x1, [x0, 16] - ldr x0, [x24, 16] - bl check_diff_percent.isra.12 -.LVL1522: - .loc 1 2502 0 - cmp w0, 2 - bne .L1332 - .loc 1 2503 0 - mov w0, 21 - .loc 1 2504 0 - str w22, [x24, 64] - .loc 1 2503 0 - str w0, [x24, 40] - .loc 1 2505 0 - ldr w0, [x23, 256] - cbnz w0, .L1334 - .loc 1 2505 0 is_stmt 0 discriminator 1 - bl ebc_get_dsp_list_enum_num -.LVL1523: - cbz w0, .L1324 -.L1334: - .loc 1 2507 0 is_stmt 1 - ldr x0, [x23, 104] - adrp x1, .LC110 - add x1, x1, :lo12:.LC110 - bl _dev_info -.LVL1524: -.L1617: - .loc 1 2508 0 - mov x0, x24 - bl ebc_buf_release -.LVL1525: - .loc 1 2506 0 - mov w0, 1 -.LVL1526: - str w0, [x29, 108] - .loc 1 2510 0 - b .L1250 -.LVL1527: -.L1657: -.LBE2280: -.LBB2281: -.LBB2282: - mov w1, 0 - mov x0, x19 - bl ebc_power_set.part.7 -.LVL1528: - b .L1252 -.LVL1529: -.L1659: -.LBE2282: -.LBE2281: - .loc 1 2436 0 - ldr x0, [x23, 104] - adrp x1, .LC107 - add x1, x1, :lo12:.LC107 - bl _dev_info -.LVL1530: - .loc 1 2437 0 - ldr w0, [x23, 600] - cbz w0, .L1682 -.L1315: - .loc 1 2440 0 - str w22, [x23, 600] -.L1620: - .loc 1 2439 0 - adrp x1, .LANCHOR0 - add x1, x1, :lo12:.LANCHOR0 - .loc 1 2441 0 - mov x0, x24 - .loc 1 2439 0 - str wzr, [x1, 32] - .loc 1 2519 0 - bl ebc_buf_release -.LVL1531: - b .L1250 -.L1682: - .loc 1 2438 0 - mov x0, 2 - bl ebc_notify -.LVL1532: - b .L1315 -.L1661: - .loc 1 2460 0 - ldr x0, [x23, 104] - adrp x1, .LC109 - add x1, x1, :lo12:.LC109 - bl _dev_info -.LVL1533: - .loc 1 2462 0 - str w22, [x23, 608] - b .L1620 -.L1664: - .loc 1 2492 0 discriminator 1 - ldr w0, [x23, 52] - cbz w0, .L1326 - .loc 1 2494 0 - ldr x0, [x23, 104] - adrp x1, .LC103 - add x1, x1, :lo12:.LC103 - bl _dev_info -.LVL1534: -.LBB2283: - .loc 1 2495 0 - ldr w0, [x23, 52] - cbnz w0, .L1683 -.L1330: -.LVL1535: -.L1328: -.LBE2283: - .loc 1 2496 0 discriminator 11 - ldr x0, [x23, 104] -.LVL1536: - adrp x1, .LC104 - add x1, x1, :lo12:.LC104 - bl _dev_info -.LVL1537: - b .L1326 -.L1656: -.LBB2286: -.LBB2243: - .loc 1 2364 0 discriminator 1 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1538: - b .L1262 -.L1684: -.LVL1539: -.LBB2244: - .loc 1 2364 0 is_stmt 0 discriminator 5 - cbnz x0, .L1259 - .loc 1 2364 0 discriminator 7 - bl schedule -.LVL1540: -.L1262: - .loc 1 2364 0 discriminator 9 - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1541: - ldr w1, [x23, 52] - cbnz w1, .L1684 -.LBE2244: - .loc 1 2364 0 discriminator 4 - add x1, x29, 112 - mov x0, x20 - bl finish_wait -.LVL1542: - b .L1259 -.L1660: -.LBE2243: -.LBE2286: - .loc 1 2445 0 is_stmt 1 - ldr x0, [x23, 104] - adrp x1, .LC108 - add x1, x1, :lo12:.LC108 - bl _dev_info -.LVL1543: - .loc 1 2446 0 - ldr w0, [x23, 600] + cbnz w0, .L1429 +.L1600: + .loc 1 2808 0 + ldr w0, [x23, 200] cmp w0, 1 - beq .L1685 -.L1317: - .loc 1 2449 0 - ldr w0, [x23, 624] - .loc 1 2448 0 - str wzr, [x23, 600] - .loc 1 2449 0 - cbz w0, .L1621 - .loc 1 2450 0 - adrp x0, .LANCHOR0 - add x0, x0, :lo12:.LANCHOR0 - .loc 1 2451 0 - stp w22, w22, [x0, 32] - .loc 1 2519 0 - mov x0, x24 - b .L1622 -.L1669: - .loc 1 2595 0 - ldr x0, [x23, 224] - ldrsw x2, [x23, 28] - ldr x1, [x0, 16] - ldr x0, [x23, 160] - bl memcpy -.LVL1544: -.L1626: - .loc 1 2602 0 discriminator 11 - ldr x0, [x23, 232] - ldrsw x2, [x23, 28] - ldr x1, [x0, 16] - ldr x0, [x23, 152] - bl memcpy -.LVL1545: - b .L1374 -.L1354: -.LBB2287: -.LBB2288: - .loc 1 2542 0 discriminator 8 - add x1, x29, 112 + bne .L1429 +.LBB2312: +.LBB2313: + mov w1, 0 mov x0, x20 - bl finish_wait -.LVL1546: + bl ebc_power_set.part.7 +.LVL1471: +.L1429: +.LBE2313: +.LBE2312: + .loc 1 2811 0 + ldr w0, [x23, 100] + cbnz w0, .L1431 +.LBB2314: +.LBB2315: + .loc 1 2812 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1472: +.L1434: +.LBB2316: + .loc 1 2812 0 is_stmt 0 discriminator 9 + add x1, x29, 112 + mov w2, 1 + mov x0, x21 + bl prepare_to_wait_event +.LVL1473: + ldr w1, [x23, 100] + cbnz w1, .L1432 +.LVL1474: + .loc 1 2812 0 discriminator 5 + cbnz x0, .L1431 + .loc 1 2812 0 discriminator 7 + bl schedule +.LVL1475: +.LBE2316: + b .L1434 +.LVL1476: + .p2align 3 .L1625: - ldr w0, [x23, 256] -.LBE2288: -.LBE2287: - .loc 1 2543 0 discriminator 8 - cbz w0, .L1356 -.L1358: - .loc 1 2544 0 - ldr x0, [x23, 104] - adrp x1, .LC111 - add x1, x1, :lo12:.LC111 - bl _dev_info -.LVL1547: - .loc 1 2545 0 - mov x0, x24 - bl ebc_buf_release -.LVL1548: - .loc 1 2547 0 - str wzr, [x29, 108] - b .L1250 -.L1671: - .loc 1 2605 0 - ldr x0, [x23, 104] - adrp x1, .LC103 - add x1, x1, :lo12:.LC103 - bl _dev_info -.LVL1549: -.LBB2291: - .loc 1 2606 0 +.LBE2315: +.LBE2314: + .loc 1 2492 0 is_stmt 1 discriminator 2 ldr w0, [x23, 52] - cbnz w0, .L1686 -.L1379: -.LVL1550: -.L1377: -.LBE2291: - .loc 1 2601 0 discriminator 11 - ldr x0, [x23, 104] -.LVL1551: - adrp x1, .LC104 - add x1, x1, :lo12:.LC104 - bl _dev_info -.LVL1552: - b .L1626 -.L1663: - .loc 1 2490 0 - ldr x0, [x23, 224] - ldrsw x2, [x23, 28] - ldr x1, [x0, 16] - ldr x0, [x23, 160] - bl memcpy -.LVL1553: - .loc 1 2491 0 - ldr x0, [x23, 232] - ldrsw x2, [x23, 28] - ldr x1, [x0, 16] - ldr x0, [x23, 152] - bl memcpy -.LVL1554: - b .L1326 -.L1345: + cbnz w0, .L1333 + .loc 1 2590 0 + ldr w0, [x23, 468] + cbz w0, .L1435 + b .L1436 +.L1346: adrp x0, .LANCHOR3 add x0, x0, :lo12:.LANCHOR3 add x0, x0, 56 ldr w1, [x0, w1, uxtw 2] - .loc 1 2537 0 + .loc 1 2541 0 ldr w0, [x23, 144] cmp w0, 7 - beq .L1687 - .loc 1 2538 0 - cmp w0, 1 - bne .L1350 -.LVL1555: - .loc 1 2538 0 is_stmt 0 discriminator 1 + bne .L1349 +.LVL1477: + .loc 1 2541 0 is_stmt 0 discriminator 1 cmp w1, 7 - ccmp w1, 1, 4, ne - beq .L1349 -.L1346: - .loc 1 2540 0 is_stmt 1 + beq .L1350 +.L1347: + .loc 1 2544 0 is_stmt 1 ldr w0, [x23, 52] - cbz w0, .L1349 - .loc 1 2541 0 + cbz w0, .L1350 + .loc 1 2545 0 ldr x0, [x23, 104] adrp x1, .LC103 -.LVL1556: +.LVL1478: add x1, x1, :lo12:.LC103 bl _dev_info -.LVL1557: -.LBB2294: - .loc 1 2542 0 +.LVL1479: +.LBB2318: + .loc 1 2546 0 ldr w0, [x23, 52] - cbz w0, .L1625 - .loc 1 2542 0 is_stmt 0 discriminator 1 - ldr w0, [x23, 256] - cbnz w0, .L1358 -.LBB2290: - .loc 1 2542 0 discriminator 3 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1558: -.L1357: -.LBB2289: - .loc 1 2542 0 discriminator 13 - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1559: - ldr w1, [x23, 52] - cbz w1, .L1354 - .loc 1 2542 0 discriminator 7 - ldr w1, [x23, 256] - cbnz w1, .L1354 -.LVL1560: - .loc 1 2542 0 discriminator 9 - cbnz x0, .L1356 - .loc 1 2542 0 discriminator 11 - bl schedule -.LVL1561: -.LBE2289: - b .L1357 -.LVL1562: - .p2align 3 -.L1654: -.LBE2290: -.LBE2294: - .loc 1 2655 0 is_stmt 1 - ldr x0, [x23, 224] - ldrsw x2, [x23, 28] - ldr x1, [x23, 160] - ldr x0, [x0, 16] - bl memcpy -.LVL1563: - b .L1393 -.LVL1564: -.L1674: -.LBB2295: -.LBB2259: - .loc 1 2749 0 discriminator 1 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1565: - b .L1421 - .p2align 3 -.L1688: -.LVL1566: -.LBB2260: - .loc 1 2749 0 is_stmt 0 discriminator 5 - cbnz x0, .L1418 - .loc 1 2749 0 discriminator 7 - bl schedule -.LVL1567: -.L1421: - .loc 1 2749 0 discriminator 9 - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1568: - ldr w1, [x23, 52] - cbnz w1, .L1688 -.LBE2260: - .loc 1 2749 0 discriminator 4 - add x1, x29, 112 - mov x0, x20 - bl finish_wait -.LVL1569: - b .L1418 -.LVL1570: -.L1676: -.LBE2259: -.LBE2295: - .loc 1 2767 0 is_stmt 1 - ldr x0, [x23, 104] - adrp x1, .LC122 - add x1, x1, :lo12:.LC122 - bl _dev_info -.LVL1571: - .loc 1 2768 0 - ldr w0, [x23, 600] - cbz w0, .L1689 -.L1424: - .loc 1 2771 0 - adrp x0, .LANCHOR0 - add x0, x0, :lo12:.LANCHOR0 - .loc 1 2770 0 - str w22, [x23, 600] - .loc 1 2771 0 - str wzr, [x0, 32] - b .L1423 -.LVL1572: -.L1680: -.LBB2296: -.LBB2297: - .loc 1 2794 0 discriminator 3 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1573: -.LBB2298: - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1574: - ldr w1, [x23, 52] - cbz w1, .L1434 -.L1690: - .loc 1 2794 0 is_stmt 0 discriminator 7 - ldr w1, [x23, 100] - cbnz w1, .L1434 -.LVL1575: - .loc 1 2794 0 discriminator 9 - cbnz x0, .L1435 - .loc 1 2794 0 discriminator 11 - bl schedule -.LVL1576: - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1577: - ldr w1, [x23, 52] - cbnz w1, .L1690 -.L1434: -.LBE2298: - .loc 1 2794 0 discriminator 8 - add x1, x29, 112 - mov x0, x20 - bl finish_wait -.LVL1578: -.L1435: -.LBE2297: -.LBE2296: - .loc 1 2796 0 is_stmt 1 discriminator 14 + cbnz w0, .L1639 +.L1354: +.LVL1480: +.L1352: +.LBE2318: + .loc 1 2547 0 discriminator 11 bl ebc_get_dsp_list_enum_num -.LVL1579: - cbnz w0, .L1250 - .loc 1 2796 0 is_stmt 0 discriminator 1 - bl ebc_get_osd_list_enum_num -.LVL1580: - cbnz w0, .L1250 - .loc 1 2798 0 is_stmt 1 - ldr w0, [x23, 52] - cbnz w0, .L1438 -.L1632: - .loc 1 2805 0 - ldr w0, [x23, 208] - cmp w0, 1 - bne .L1438 -.LBB2299: -.LBB2300: - mov w1, 0 - mov x0, x19 - bl ebc_power_set.part.7 -.LVL1581: -.L1438: -.LBE2300: -.LBE2299: - .loc 1 2808 0 - ldr w0, [x23, 100] - cbnz w0, .L1440 -.LBB2301: -.LBB2302: - .loc 1 2809 0 discriminator 1 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1582: -.L1443: -.LBB2303: - .loc 1 2809 0 is_stmt 0 discriminator 9 - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1583: - ldr w1, [x23, 100] - cbnz w1, .L1441 -.LVL1584: - .loc 1 2809 0 discriminator 5 - cbnz x0, .L1440 - .loc 1 2809 0 discriminator 7 - bl schedule -.LVL1585: -.LBE2303: - b .L1443 -.L1658: -.LBE2302: -.LBE2301: - .loc 1 2815 0 is_stmt 1 - bl __stack_chk_fail -.LVL1586: -.L1441: -.LBB2305: -.LBB2304: - .loc 1 2809 0 discriminator 4 - add x1, x29, 112 - mov x0, x20 - bl finish_wait -.LVL1587: -.LBE2304: -.LBE2305: - .loc 1 2810 0 discriminator 4 - str wzr, [x23, 100] - b .L1250 -.LVL1588: -.L1689: - .loc 1 2769 0 - mov x0, 2 - bl ebc_notify -.LVL1589: - b .L1424 -.L1350: -.LVL1590: - cmp w1, 12 - cset w1, eq -.LVL1591: - b .L1450 -.L1687: -.LVL1592: - .loc 1 2537 0 discriminator 1 - cmp w1, 7 - bne .L1346 - b .L1349 -.LVL1593: -.L1356: - .loc 1 2543 0 discriminator 1 - bl ebc_get_dsp_list_enum_num -.LVL1594: - cbnz w0, .L1358 - .loc 1 2549 0 +.LVL1481: + cbnz w0, .L1589 + .loc 1 2553 0 ldr x0, [x23, 104] adrp x1, .LC104 add x1, x1, :lo12:.LC104 bl _dev_info -.LVL1595: - b .L1349 -.L1686: -.LBB2306: -.LBB2292: - .loc 1 2606 0 discriminator 1 +.LVL1482: + b .L1350 +.LVL1483: + .p2align 3 +.L1394: + .loc 1 2686 0 + cbnz w19, .L1442 + .loc 1 2690 0 + ldr w0, [x23, 84] + .loc 1 2685 0 + mov w25, 1 +.LVL1484: + .loc 1 2690 0 + cmp w0, 0 + ble .L1395 + .loc 1 2691 0 + ldr w1, [x29, 108] +.LVL1485: + add w1, w1, w25 +.LVL1486: + str w1, [x29, 108] + .loc 1 2692 0 + cmp w0, w1 + bgt .L1395 + .loc 1 2693 0 + mov w25, 2 + .loc 1 2694 0 + str wzr, [x29, 108] + .loc 1 2693 0 + str w25, [x24, 40] +.LVL1487: +.L1395: + .loc 1 2699 0 + ldr w0, [x23, 200] + cbz w0, .L1640 +.L1400: + .loc 1 2702 0 + ldr w1, [x24, 40] +.LVL1488: + mov x0, x20 + bl ebc_lut_update +.LVL1489: + .loc 1 2705 0 + bl ebc_get_dsp_list_enum_num +.LVL1490: + cbnz w0, .L1598 + .loc 1 2719 0 + ldr w0, [x24, 40] + .loc 1 2721 0 + and w1, w0, -3 + cmp w1, 16 + ccmp w0, 20, 4, ne + beq .L1403 + .loc 1 2722 0 + ldr w2, [x23, 248] + cmp w2, 0 + ble .L1403 + .loc 1 2723 0 + ldr x0, [x23, 104] + adrp x1, .LC112 + add x1, x1, :lo12:.LC112 + bl _dev_info +.LVL1491: +.LBB2321: +.LBB2322: +.LBB2323: + .loc 17 368 0 + ldr w0, [x23, 248] + bl __msecs_to_jiffies +.LVL1492: +.LBE2323: +.LBE2322: +.LBB2324: + .loc 1 2724 0 + ldr w1, [x23, 596] + cmp w1, 0 + cset w1, ne +.LVL1493: + cmp x0, 0 + cset w0, eq + tst w1, w0 + beq .L1641 +.L1406: +.LVL1494: +.L1404: +.LBE2324: +.LBE2321: + .loc 1 2726 0 discriminator 17 + bl ebc_get_dsp_list_enum_num +.LVL1495: + cbz w0, .L1403 +.L1598: + .loc 1 2727 0 + ldr w0, [x24, 40] + sub w0, w0, #19 + tst w0, -3 + beq .L1590 + .loc 1 2733 0 + ldr w19, [x24, 64] +.LVL1496: + cbz w19, .L1589 +.LVL1497: +.L1403: + .loc 1 2745 0 + ldr w3, [x23, 112] + .loc 1 2746 0 + adrp x1, .LC119 + .loc 1 2745 0 + strb w3, [x23, 56] + .loc 1 2746 0 + add x1, x1, :lo12:.LC119 + .loc 1 2744 0 + str x24, [x23, 224] + .loc 1 2746 0 + and w3, w3, 255 + ldr x0, [x23, 104] + .loc 1 2750 0 + add x19, x20, 720 +.LVL1498: + .loc 1 2746 0 + ldr w2, [x24, 40] + .loc 1 2750 0 + adrp x24, jiffies + .loc 1 2746 0 + bl _dev_info +.LVL1499: + .loc 1 2748 0 + str w25, [x23, 252] + .loc 1 2747 0 + mov w0, 1 + str w0, [x23, 52] + .loc 1 2749 0 + mov x0, x20 + bl ebc_frame_start +.LVL1500: + .loc 1 2750 0 + ldr x1, [x24, #:lo12:jiffies] + mov x0, x19 + add x1, x1, 900 + bl mod_timer +.LVL1501: +.LBB2331: + .loc 1 2751 0 + ldr w0, [x23, 52] + cbnz w0, .L1642 +.L1411: +.LVL1502: +.L1409: +.LBE2331: + .loc 1 2752 0 discriminator 11 + ldr x2, [x24, #:lo12:jiffies] + mov x0, x19 +.LVL1503: + mov x1, 402653184 + add x1, x2, x1 + bl mod_timer +.LVL1504: + ldr x0, [x23, 224] + ldr w0, [x0, 40] + .loc 1 2764 0 discriminator 11 + cmp w0, 20 + bne .L1413 +.LVL1505: +.L1622: + .loc 1 2765 0 + mov w0, 1 + str w0, [x23, 592] + .loc 1 2767 0 + ldr x0, [x23, 104] + adrp x1, .LC121 + .loc 1 2766 0 + str wzr, [x23, 612] + .loc 1 2767 0 + add x1, x1, :lo12:.LC121 + bl _dev_info +.LVL1506: + .loc 1 2777 0 + ldr w0, [x23, 468] + cbz w0, .L1416 +.L1624: + .loc 1 2778 0 + ldr x0, [x23, 216] + bl ebc_buf_release +.LVL1507: + b .L1417 +.LVL1508: +.L1367: + .loc 1 2593 0 + cmp w2, 21 + ble .L1370 + cmp w2, 23 + bgt .L1366 +.L1369: + .loc 1 2598 0 + ldr w0, [x23, 252] + .loc 1 2597 0 + str x24, [x23, 224] + .loc 1 2598 0 + sub w1, w0, #1 + cmp w1, 1 + bls .L1643 + .loc 1 2601 0 + cmp w0, 4 + beq .L1644 + .loc 1 2607 0 + ldr x0, [x23, 216] + ldr w1, [x24, 40] + ldr w0, [x0, 40] + cmp w1, w0 + beq .L1374 + .loc 1 2607 0 is_stmt 0 discriminator 1 + ldr w0, [x23, 52] + cbnz w0, .L1645 +.L1381: +.L1374: + .loc 1 2614 0 is_stmt 1 + ldr x0, [x23, 152] + mov x3, x23 + ldr x2, [x23, 168] + ldr x1, [x24, 16] + bl refresh_new_image_auto +.LVL1509: +.L1372: + .loc 1 2620 0 + ldr w0, [x23, 52] + .loc 1 2619 0 + mov w1, 3 + str w1, [x23, 252] + .loc 1 2620 0 + cbnz w0, .L1595 + .loc 1 2621 0 + mov w0, 1 + str w0, [x23, 52] + .loc 1 2622 0 + ldr w0, [x23, 200] + cbz w0, .L1646 +.L1384: + .loc 1 2624 0 + ldr w1, [x24, 40] + mov x0, x20 + bl ebc_lut_update +.LVL1510: + .loc 1 2626 0 + ldr w1, [x23, 112] + .loc 1 2628 0 + ldr x0, [x23, 104] + .loc 1 2626 0 + strb w1, [x23, 56] + .loc 1 2628 0 + and w2, w1, 255 + .loc 1 2627 0 + lsr w1, w1, 8 + strb w1, [x23, 57] + .loc 1 2628 0 + adrp x1, .LC116 + add x1, x1, :lo12:.LC116 + bl _dev_info +.LVL1511: + .loc 1 2629 0 + mov x0, x20 + bl ebc_frame_start +.LVL1512: +.L1595: + ldr x0, [x23, 224] + ldr w0, [x0, 40] + b .L1365 +.L1589: + .loc 1 2532 0 + ldr x0, [x23, 104] + adrp x1, .LC111 + add x1, x1, :lo12:.LC111 + bl _dev_info +.LVL1513: + .loc 1 2533 0 + mov x0, x24 + b .L1588 +.LVL1514: +.L1442: + .loc 1 2699 0 + ldr w0, [x23, 200] + .loc 1 2689 0 + mov w25, 2 +.LVL1515: + .loc 1 2687 0 + str wzr, [x29, 108] + .loc 1 2699 0 + cbnz w0, .L1400 +.LVL1516: +.L1640: + .loc 1 2700 0 + mov x0, x20 + bl ebc_power_set.constprop.15 +.LVL1517: + b .L1400 +.LVL1518: +.L1627: + .loc 1 2438 0 + ldr x0, [x23, 104] + adrp x1, .LC107 + add x1, x1, :lo12:.LC107 + bl _dev_info +.LVL1519: + .loc 1 2439 0 + ldr w0, [x23, 584] + cbnz w0, .L1322 + .loc 1 2440 0 + mov x0, 2 + bl ebc_notify +.LVL1520: +.L1322: + .loc 1 2442 0 + mov w0, 1 + str w0, [x23, 584] +.L1586: + .loc 1 2441 0 + adrp x1, .LANCHOR0 + add x1, x1, :lo12:.LANCHOR0 + .loc 1 2443 0 + str wzr, [x23, 612] + .loc 1 2444 0 + mov x0, x24 + .loc 1 2441 0 + str wzr, [x1, 32] + .loc 1 2533 0 + bl ebc_buf_release +.LVL1521: + b .L1257 +.LVL1522: +.L1621: + .loc 1 2663 0 + ldr w3, [x23, 88] + .loc 1 2664 0 + sub w1, w3, #1 + cmp w1, 99 + bhi .L1392 +.LBB2334: + .loc 1 2665 0 + ldr x0, [x23, 216] + ldr w2, [x20, 220] + ldr x1, [x0, 16] + ldr x0, [x24, 16] + bl check_diff_percent.isra.12 +.LVL1523: + mov w25, w0 +.LVL1524: + .loc 1 2666 0 + cbz w0, .L1396 + .loc 1 2671 0 + cmp w0, 2 + bne .L1394 +.LBE2334: + .loc 1 2693 0 + str w25, [x24, 40] + .loc 1 2694 0 + str wzr, [x29, 108] + b .L1395 +.LVL1525: + .p2align 3 +.L1626: +.LBB2335: +.LBB2290: + .loc 1 2366 0 discriminator 1 mov w1, 0 add x0, x29, 112 bl init_wait_entry -.LVL1596: - b .L1384 - .p2align 3 -.L1691: -.LVL1597: -.LBB2293: - .loc 1 2606 0 is_stmt 0 discriminator 5 - cbnz x0, .L1377 - .loc 1 2606 0 discriminator 7 +.LVL1526: + b .L1269 +.L1647: +.LVL1527: +.LBB2291: + .loc 1 2366 0 is_stmt 0 discriminator 5 + cbnz x0, .L1266 + .loc 1 2366 0 discriminator 7 bl schedule -.LVL1598: -.L1384: - .loc 1 2606 0 discriminator 9 +.LVL1528: +.L1269: + .loc 1 2366 0 discriminator 9 add x1, x29, 112 mov w2, 1 - mov x0, x20 + mov x0, x21 bl prepare_to_wait_event -.LVL1599: +.LVL1529: ldr w1, [x23, 52] - cbnz w1, .L1691 -.LBE2293: + cbnz w1, .L1647 +.LBE2291: + .loc 1 2366 0 discriminator 4 + add x1, x29, 112 + mov x0, x21 + bl finish_wait +.LVL1530: + b .L1266 +.LVL1531: +.L1623: +.LBE2290: +.LBE2335: + .loc 1 2769 0 is_stmt 1 + ldr x0, [x23, 104] + adrp x1, .LC122 + add x1, x1, :lo12:.LC122 + bl _dev_info +.LVL1532: + .loc 1 2770 0 + ldr w0, [x23, 584] + cbz w0, .L1648 + .loc 1 2773 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + .loc 1 2772 0 + mov w1, 1 + .loc 1 2774 0 + str wzr, [x23, 612] + .loc 1 2772 0 + str w1, [x23, 584] + .loc 1 2773 0 + str wzr, [x0, 32] + b .L1414 +.LVL1533: +.L1635: +.LBB2336: + .loc 1 2529 0 discriminator 3 + orr w1, w1, w0 +.LVL1534: + cbnz w1, .L1342 +.LBB2297: +.LBB2298: +.LBB2299: + .loc 17 368 0 discriminator 4 + ldr w0, [x23, 248] + bl __msecs_to_jiffies +.LVL1535: + mov x25, x0 +.LVL1536: +.LBE2299: +.LBE2298: + .loc 1 2529 0 discriminator 4 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1537: +.L1345: +.LBB2300: + .loc 1 2529 0 is_stmt 0 discriminator 15 + mov w2, 1 + add x1, x29, 112 + mov x0, x21 + bl prepare_to_wait_event +.LVL1538: +.LBB2301: + ldr w1, [x23, 100] + cmp w1, 0 + cset w1, ne +.LVL1539: + cmp x25, 0 + cset w2, eq + tst w1, w2 + beq .L1649 +.L1343: +.LBE2301: +.LBE2300: + .loc 1 2529 0 discriminator 10 + add x1, x29, 112 +.LVL1540: + mov x0, x21 + bl finish_wait +.LVL1541: + b .L1342 +.LVL1542: +.L1649: +.LBB2302: + .loc 1 2529 0 discriminator 9 + orr w1, w1, w2 +.LVL1543: + cbnz w1, .L1343 +.LVL1544: + .loc 1 2529 0 discriminator 11 + cbnz x0, .L1342 + .loc 1 2529 0 discriminator 13 + mov x0, x25 +.LVL1545: + bl schedule_timeout +.LVL1546: + mov x25, x0 +.LBE2302: + b .L1345 +.LVL1547: +.L1605: +.LBE2297: +.LBE2336: +.LBB2337: +.LBB2338: + mov w1, 0 + mov x0, x20 + bl ebc_power_set.part.7 +.LVL1548: + b .L1259 +.LVL1549: +.L1629: +.LBE2338: +.LBE2337: + .loc 1 2463 0 is_stmt 1 + ldr x0, [x23, 104] + adrp x1, .LC109 + add x1, x1, :lo12:.LC109 + bl _dev_info +.LVL1550: + .loc 1 2465 0 + mov w0, 1 + str w0, [x23, 592] + b .L1586 +.L1628: + .loc 1 2448 0 + ldr x0, [x23, 104] + adrp x1, .LC108 + add x1, x1, :lo12:.LC108 + bl _dev_info +.LVL1551: + .loc 1 2449 0 + ldr w0, [x23, 584] + cmp w0, 1 + beq .L1650 +.L1324: + .loc 1 2452 0 + ldr w0, [x23, 608] + .loc 1 2451 0 + str wzr, [x23, 584] + .loc 1 2452 0 + cbz w0, .L1587 + .loc 1 2453 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + mov w1, 1 + .loc 1 2454 0 + stp w1, w1, [x0, 32] + .loc 1 2533 0 + mov x0, x24 + b .L1588 +.L1632: + .loc 1 2496 0 discriminator 1 + ldr w0, [x23, 52] + cbz w0, .L1333 + .loc 1 2498 0 + ldr x0, [x23, 104] + adrp x1, .LC103 + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1552: +.LBB2339: + .loc 1 2499 0 + ldr w0, [x23, 52] + cbnz w0, .L1651 +.L1337: +.LVL1553: +.L1335: +.LBE2339: + .loc 1 2500 0 discriminator 11 + ldr x0, [x23, 104] +.LVL1554: + adrp x1, .LC104 + add x1, x1, :lo12:.LC104 + bl _dev_info +.LVL1555: + b .L1333 +.L1349: +.LVL1556: + cmp w1, 12 + cset w2, eq + .loc 1 2542 0 + cmp w0, 1 + bne .L1437 + .loc 1 2542 0 is_stmt 0 discriminator 1 + cmp w1, 7 + ccmp w1, 1, 4, ne + beq .L1350 + b .L1347 +.LVL1557: + .p2align 3 +.L1634: + .loc 1 2522 0 is_stmt 1 + ldr x0, [x23, 104] +.LVL1558: + adrp x1, .LC111 + add x1, x1, :lo12:.LC111 + .loc 1 2525 0 + mov w19, 0 + .loc 1 2522 0 + bl _dev_info +.LVL1559: + .loc 1 2523 0 + mov x0, x24 + bl ebc_buf_release +.LVL1560: + .loc 1 2525 0 + b .L1257 +.LVL1561: +.L1642: +.LBB2342: +.LBB2332: + .loc 1 2751 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1562: + b .L1412 +.L1652: +.LVL1563: +.LBB2333: + .loc 1 2751 0 is_stmt 0 discriminator 5 + cbnz x0, .L1409 + .loc 1 2751 0 discriminator 7 + bl schedule +.LVL1564: +.L1412: + .loc 1 2751 0 discriminator 9 + add x1, x29, 112 + mov w2, 1 + mov x0, x21 + bl prepare_to_wait_event +.LVL1565: + ldr w1, [x23, 52] + cbnz w1, .L1652 +.LBE2333: + .loc 1 2751 0 discriminator 4 + add x1, x29, 112 + mov x0, x21 + bl finish_wait +.LVL1566: + b .L1409 +.LVL1567: +.L1648: +.LBE2332: +.LBE2342: + .loc 1 2771 0 is_stmt 1 + mov x0, 2 + bl ebc_notify +.LVL1568: + .loc 1 2773 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + .loc 1 2772 0 + mov w1, 1 + .loc 1 2774 0 + str wzr, [x23, 612] + .loc 1 2772 0 + str w1, [x23, 584] + .loc 1 2773 0 + str wzr, [x0, 32] + b .L1414 +.LVL1569: +.L1631: + .loc 1 2494 0 + ldr x0, [x23, 216] + ldrsw x2, [x23, 28] + ldr x1, [x0, 16] + ldr x0, [x23, 160] + bl memcpy +.LVL1570: + .loc 1 2495 0 + ldr x0, [x23, 224] + ldrsw x2, [x23, 28] + ldr x1, [x0, 16] + ldr x0, [x23, 152] + bl memcpy +.LVL1571: + b .L1333 +.L1646: + .loc 1 2623 0 + mov x0, x20 + bl ebc_power_set.constprop.15 +.LVL1572: + b .L1384 +.L1645: + .loc 1 2609 0 + ldr x0, [x23, 104] + adrp x1, .LC103 + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1573: +.LBB2343: + .loc 1 2610 0 + ldr w0, [x23, 52] + cbnz w0, .L1653 +.L1377: +.LVL1574: +.L1375: +.LBE2343: + .loc 1 2605 0 discriminator 11 + ldr x0, [x23, 104] +.LVL1575: + adrp x1, .LC104 + add x1, x1, :lo12:.LC104 + bl _dev_info +.LVL1576: +.L1593: + .loc 1 2606 0 discriminator 11 + ldr x0, [x23, 224] + ldrsw x2, [x23, 28] + ldr x1, [x0, 16] + ldr x0, [x23, 152] + bl memcpy +.LVL1577: + b .L1372 +.LVL1578: +.L1620: + .loc 1 2659 0 + ldr x0, [x23, 216] + ldrsw x2, [x23, 28] + ldr x1, [x23, 160] + ldr x0, [x0, 16] + bl memcpy +.LVL1579: + b .L1391 +.LVL1580: +.L1633: +.LBB2346: + .loc 1 2508 0 + mov w0, 1 + str w0, [x24, 64] + .loc 1 2507 0 + mov w0, 21 + str w0, [x24, 40] + .loc 1 2509 0 + bl ebc_get_dsp_list_enum_num +.LVL1581: + cbz w0, .L1331 +.LVL1582: +.L1590: + .loc 1 2511 0 + ldr x0, [x23, 104] + adrp x1, .LC110 + add x1, x1, :lo12:.LC110 + bl _dev_info +.LVL1583: +.L1583: + .loc 1 2512 0 + mov x0, x24 + .loc 1 2510 0 + mov w19, 1 +.LVL1584: + .loc 1 2512 0 + bl ebc_buf_release +.LVL1585: + .loc 1 2514 0 + b .L1257 +.L1643: +.LBE2346: + .loc 1 2599 0 + ldr x0, [x23, 216] + ldrsw x2, [x23, 28] + ldr x1, [x0, 16] + ldr x0, [x23, 160] + bl memcpy +.LVL1586: + b .L1593 +.L1644: + .loc 1 2601 0 discriminator 1 + ldr w0, [x23, 52] + cbz w0, .L1374 + .loc 1 2603 0 + ldr x0, [x23, 104] + adrp x1, .LC103 + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1587: +.LBB2347: + .loc 1 2604 0 + ldr w0, [x23, 52] + cbz w0, .L1375 +.LBB2348: + .loc 1 2604 0 is_stmt 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1588: b .L1378 -.L1667: -.LBE2292: -.LBE2306: - .loc 1 2562 0 is_stmt 1 - str w22, [x23, 52] - .loc 1 2565 0 + .p2align 3 +.L1654: +.LVL1589: +.LBB2349: + .loc 1 2604 0 discriminator 5 + cbnz x0, .L1375 + .loc 1 2604 0 discriminator 7 + bl schedule +.LVL1590: +.L1378: + .loc 1 2604 0 discriminator 9 + add x1, x29, 112 + mov w2, 1 + mov x0, x21 + bl prepare_to_wait_event +.LVL1591: + ldr w1, [x23, 52] + cbnz w1, .L1654 +.L1376: +.LBE2349: + .loc 1 2604 0 discriminator 4 + add x1, x29, 112 + mov x0, x21 + bl finish_wait +.LVL1592: + b .L1375 +.LVL1593: + .p2align 3 +.L1641: +.LBE2348: +.LBE2347: +.LBB2350: + .loc 1 2724 0 is_stmt 1 discriminator 3 + orr w1, w1, w0 +.LVL1594: + cbnz w1, .L1404 +.LBB2325: +.LBB2326: +.LBB2327: + .loc 17 368 0 discriminator 4 + ldr w0, [x23, 248] + bl __msecs_to_jiffies +.LVL1595: + mov x19, x0 +.LVL1596: +.LBE2327: +.LBE2326: + .loc 1 2724 0 discriminator 4 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1597: +.L1407: +.LBB2328: + .loc 1 2724 0 is_stmt 0 discriminator 15 + mov w2, 1 + add x1, x29, 112 + mov x0, x21 + bl prepare_to_wait_event +.LVL1598: +.LBB2329: + ldr w1, [x23, 596] + cmp w1, 0 + cset w1, ne +.LVL1599: + cmp x19, 0 + cset w2, eq + tst w1, w2 + beq .L1655 +.L1405: +.LBE2329: +.LBE2328: + .loc 1 2724 0 discriminator 10 + add x1, x29, 112 +.LVL1600: + mov x0, x21 + bl finish_wait +.LVL1601: + b .L1404 +.LVL1602: + .p2align 3 +.L1655: +.LBB2330: + .loc 1 2724 0 discriminator 9 + orr w1, w1, w2 +.LVL1603: + cbnz w1, .L1405 +.LVL1604: + .loc 1 2724 0 discriminator 11 + cbnz x0, .L1404 + .loc 1 2724 0 discriminator 13 mov x0, x19 +.LVL1605: + bl schedule_timeout +.LVL1606: + mov x19, x0 +.LBE2330: + b .L1407 +.LVL1607: +.L1636: +.LBE2325: +.LBE2350: + .loc 1 2566 0 is_stmt 1 + mov w0, 1 + str w0, [x23, 52] + .loc 1 2569 0 + mov x0, x20 ldr w1, [x24, 40] bl ebc_lut_update -.LVL1600: - .loc 1 2566 0 +.LVL1608: + .loc 1 2570 0 ldr w3, [x23, 112] - .loc 1 2568 0 + .loc 1 2572 0 adrp x1, .LC113 - ldr x2, [x23, 232] + ldr x2, [x23, 224] add x1, x1, :lo12:.LC113 - .loc 1 2566 0 + .loc 1 2570 0 strb w3, [x23, 56] - .loc 1 2567 0 + .loc 1 2571 0 lsr w4, w3, 8 strb w4, [x23, 57] - .loc 1 2568 0 + .loc 1 2572 0 ldr x0, [x23, 104] and w3, w3, 255 ldr w2, [x2, 40] bl _dev_info -.LVL1601: -.LBB2307: -.LBB2308: +.LVL1609: +.LBB2351: +.LBB2352: + .loc 1 1594 0 + ldr w0, [x22, 164] .loc 1 1595 0 - ldr w0, [x21, 164] - .loc 1 1596 0 mov w6, 1 ldp x1, x2, [x23, 152] - ldp x3, x4, [x23, 176] + ldp x3, x4, [x23, 168] + .loc 1 1594 0 + cbz w0, .L1358 .loc 1 1595 0 + ldr x0, [x23, 184] + mov x5, x23 + bl get_overlay_image2 +.LVL1610: +.L1359: + .loc 1 1610 0 + ldr w0, [x23, 60] cbz w0, .L1360 - .loc 1 1596 0 + .loc 1 1611 0 + ldr w0, [x23, 200] + cbz w0, .L1656 +.L1361: + .loc 1 1613 0 + ldr w0, [x22, 164] + .loc 1 1614 0 + mov w6, 1 + ldp x1, x2, [x23, 152] + ldp x3, x4, [x23, 168] + .loc 1 1613 0 + cbz w0, .L1362 + .loc 1 1614 0 ldr x0, [x23, 192] mov x5, x23 bl get_overlay_image2 -.LVL1602: -.L1361: - .loc 1 1611 0 - ldr w0, [x23, 60] - cbz w0, .L1362 - .loc 1 1612 0 - ldr w0, [x23, 208] - cbnz w0, .L1363 - .loc 1 1613 0 - mov x0, x19 - bl ebc_power_set.constprop.15 -.LVL1603: +.LVL1611: .L1363: - .loc 1 1614 0 - ldr w0, [x21, 164] - .loc 1 1615 0 - mov w6, 1 - ldp x1, x2, [x23, 152] - ldp x3, x4, [x23, 176] - .loc 1 1614 0 - cbz w0, .L1364 - .loc 1 1615 0 - ldr x0, [x23, 200] - mov x5, x23 - bl get_overlay_image2 -.LVL1604: -.L1365: -.LBB2309: -.LBB2310: +.LBB2353: +.LBB2354: + .loc 1 1585 0 + str wzr, [x22, 72] .loc 1 1586 0 - str wzr, [x21, 72] - .loc 1 1587 0 - mov x0, x21 - ldr w1, [x19, 224] + mov x0, x22 + ldr w1, [x20, 224] bl flip.isra.4 -.LVL1605: -.L1366: -.LBE2310: -.LBE2309: -.LBE2308: -.LBE2307: - .loc 1 2571 0 - ldr x0, [x23, 232] - ldr w0, [x0, 40] - .loc 1 2573 0 - cmp w0, 0 - .loc 1 2572 0 - sub w1, w0, #22 - .loc 1 2573 0 - ccmp w1, 1, 0, ne - bls .L1367 - .loc 1 2574 0 - ldr w1, [x23, 52] - cbz w1, .L1367 -.L1451: - .loc 1 2577 0 - ldr x0, [x23, 104] - adrp x1, .LC115 - .loc 1 2576 0 - str wzr, [x23, 616] - .loc 1 2577 0 - add x1, x1, :lo12:.LC115 - bl _dev_info -.LVL1606: - .loc 1 2578 0 - ldrb w1, [x23, 56] - lsl w0, w1, 3 - sub w0, w0, w1 -.LBB2312: -.LBB2313: - .loc 17 368 0 - lsl w0, w0, 1 - bl __msecs_to_jiffies -.LVL1607: -.LBE2313: -.LBE2312: - .loc 1 2578 0 - adrp x1, jiffies - ldr x1, [x1, #:lo12:jiffies] - add x1, x1, x0 - add x0, x19, 680 - bl mod_timer -.LVL1608: - ldr x0, [x23, 232] - ldr w0, [x0, 40] - b .L1367 +.LVL1612: .L1364: -.LBB2314: -.LBB2311: - .loc 1 1623 0 - ldr x0, [x23, 200] +.LBE2354: +.LBE2353: +.LBE2352: +.LBE2351: + .loc 1 2575 0 + ldr x0, [x23, 224] + ldr w0, [x0, 40] + .loc 1 2577 0 + cmp w0, 0 + .loc 1 2576 0 + sub w1, w0, #22 + .loc 1 2577 0 + ccmp w1, 1, 0, ne + bls .L1365 + .loc 1 2578 0 + ldr w1, [x23, 52] + cbz w1, .L1365 + b .L1438 + .p2align 3 +.L1358: +.LBB2356: +.LBB2355: + .loc 1 1603 0 + ldr x0, [x23, 184] mov x5, x23 bl get_overlay_image -.LVL1609: - b .L1365 +.LVL1613: + b .L1359 .L1362: - .loc 1 1634 0 + .loc 1 1622 0 + ldr x0, [x23, 192] + mov x5, x23 + bl get_overlay_image +.LVL1614: + b .L1363 +.L1656: + .loc 1 1612 0 + mov x0, x20 + bl ebc_power_set.constprop.15 +.LVL1615: + b .L1361 +.L1360: + .loc 1 1632 0 + mov w0, 1 + str w0, [x23, 600] + .loc 1 1633 0 ldr x0, [x23, 104] adrp x2, .LANCHOR3 - .loc 1 1632 0 + .loc 1 1631 0 str wzr, [x23, 52] - .loc 1 1634 0 - add x2, x2, :lo12:.LANCHOR3 .loc 1 1633 0 - str w22, [x23, 616] - .loc 1 1634 0 + add x2, x2, :lo12:.LANCHOR3 add x2, x2, 104 adrp x1, .LC114 add x1, x1, :lo12:.LC114 bl _dev_info -.LVL1610: - b .L1366 -.L1360: - .loc 1 1604 0 - ldr x0, [x23, 192] - mov x5, x23 - bl get_overlay_image -.LVL1611: - b .L1361 -.L1685: -.LBE2311: -.LBE2314: - .loc 1 2447 0 +.LVL1616: + b .L1364 +.L1651: +.LBE2355: +.LBE2356: +.LBB2357: +.LBB2340: + .loc 1 2499 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1617: + b .L1338 + .p2align 3 +.L1657: +.LVL1618: +.LBB2341: + .loc 1 2499 0 is_stmt 0 discriminator 5 + cbnz x0, .L1335 + .loc 1 2499 0 discriminator 7 + bl schedule +.LVL1619: +.L1338: + .loc 1 2499 0 discriminator 9 + add x1, x29, 112 + mov w2, 1 + mov x0, x21 + bl prepare_to_wait_event +.LVL1620: + ldr w1, [x23, 52] + cbnz w1, .L1657 +.LBE2341: + .loc 1 2499 0 discriminator 4 + add x1, x29, 112 + mov x0, x21 + bl finish_wait +.LVL1621: + b .L1335 +.L1650: +.LBE2340: +.LBE2357: + .loc 1 2450 0 is_stmt 1 mov x0, 3 bl ebc_notify -.LVL1612: - b .L1317 -.L1683: -.LBB2315: -.LBB2284: - .loc 1 2495 0 discriminator 1 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1613: - b .L1331 - .p2align 3 -.L1692: -.LVL1614: -.LBB2285: - .loc 1 2495 0 is_stmt 0 discriminator 5 - cbnz x0, .L1328 - .loc 1 2495 0 discriminator 7 - bl schedule -.LVL1615: -.L1331: - .loc 1 2495 0 discriminator 9 - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event -.LVL1616: - ldr w1, [x23, 52] - cbnz w1, .L1692 -.LBE2285: - .loc 1 2495 0 discriminator 4 - add x1, x29, 112 - mov x0, x20 - bl finish_wait -.LVL1617: - b .L1328 -.LVL1618: -.L1679: -.LBE2284: -.LBE2315: -.LBB2316: - .loc 1 2722 0 is_stmt 1 - cbz x0, .L1410 -.LBB2268: -.LBB2269: -.LBB2270: - .loc 17 368 0 discriminator 10 - ldr w0, [x23, 260] - bl __msecs_to_jiffies -.LVL1619: - mov x25, x0 -.LVL1620: -.LBE2270: -.LBE2269: - .loc 1 2722 0 discriminator 10 - mov w1, 0 - add x0, x29, 112 - bl init_wait_entry -.LVL1621: -.L1415: -.LBB2271: - .loc 1 2722 0 is_stmt 0 discriminator 27 - add x1, x29, 112 - mov w2, 1 - mov x0, x20 - bl prepare_to_wait_event .LVL1622: -.LBB2272: - ldr w1, [x23, 256] - cbz w1, .L1693 -.L1412: -.LBE2272: -.LBE2271: - .loc 1 2722 0 discriminator 22 - mov x0, x20 - add x1, x29, 112 - bl finish_wait + b .L1324 .LVL1623: - ldr w0, [x23, 256] -.LBE2268: -.LBE2316: - .loc 1 2724 0 is_stmt 1 discriminator 22 - cbnz w0, .L1409 - b .L1410 - .p2align 3 -.L1693: -.LBB2317: -.LBB2275: -.LBB2274: -.LBB2273: - .loc 1 2722 0 discriminator 14 - ldr w1, [x23, 612] - cbnz w1, .L1412 -.LBE2273: - .loc 1 2722 0 is_stmt 0 - cbz x25, .L1412 +.L1606: + .loc 1 2818 0 + bl __stack_chk_fail .LVL1624: - .loc 1 2722 0 discriminator 23 - cbnz x0, .L1410 - .loc 1 2722 0 discriminator 25 - mov x0, x25 +.L1432: +.LBB2358: +.LBB2317: + .loc 1 2812 0 discriminator 4 + add x1, x29, 112 + mov x0, x21 + bl finish_wait .LVL1625: - bl schedule_timeout -.LVL1626: - mov x25, x0 -.LBE2274: - b .L1415 -.LVL1627: -.L1666: -.LBE2275: .LBE2317: -.LBB2318: -.LBB2256: -.LBB2255: -.LBB2254: - .loc 1 2525 0 is_stmt 1 discriminator 14 - ldr w1, [x23, 100] - cbnz w1, .L1341 -.LBE2254: - .loc 1 2525 0 is_stmt 0 - cbz x25, .L1341 +.LBE2358: + .loc 1 2813 0 discriminator 4 + str wzr, [x23, 100] + b .L1257 +.LVL1626: +.L1639: +.LBB2359: +.LBB2319: + .loc 1 2546 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1627: + b .L1355 + .p2align 3 +.L1658: .LVL1628: - .loc 1 2525 0 discriminator 23 - cbnz x0, .L1339 - .loc 1 2525 0 discriminator 25 - mov x0, x25 +.LBB2320: + .loc 1 2546 0 is_stmt 0 discriminator 5 + cbnz x0, .L1352 + .loc 1 2546 0 discriminator 7 + bl schedule .LVL1629: - bl schedule_timeout +.L1355: + .loc 1 2546 0 discriminator 9 + add x1, x29, 112 + mov w2, 1 + mov x0, x21 + bl prepare_to_wait_event .LVL1630: - mov x25, x0 -.LBE2255: - b .L1344 -.LBE2256: -.LBE2318: + ldr w1, [x23, 52] + cbnz w1, .L1658 +.LBE2320: + .loc 1 2546 0 discriminator 4 + add x1, x29, 112 + mov x0, x21 + bl finish_wait +.LVL1631: + b .L1352 +.L1653: +.LBE2319: +.LBE2359: +.LBB2360: +.LBB2344: + .loc 1 2610 0 is_stmt 1 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1632: + b .L1382 + .p2align 3 +.L1659: +.LVL1633: +.LBB2345: + .loc 1 2610 0 is_stmt 0 discriminator 5 + cbnz x0, .L1375 + .loc 1 2610 0 discriminator 7 + bl schedule +.LVL1634: +.L1382: + .loc 1 2610 0 discriminator 9 + add x1, x29, 112 + mov w2, 1 + mov x0, x21 + bl prepare_to_wait_event +.LVL1635: + ldr w1, [x23, 52] + cbnz w1, .L1659 +.LBE2345: + b .L1376 +.LVL1636: +.L1424: +.LBE2344: +.LBE2360: + .loc 1 2806 0 is_stmt 1 + bl ebc_get_dsp_list_enum_num +.LVL1637: + cbnz w0, .L1257 + .loc 1 2806 0 is_stmt 0 discriminator 1 + bl ebc_get_osd_list_enum_num +.LVL1638: + cbnz w0, .L1257 + b .L1600 .cfi_endproc .LFE2844: .size ebc_thread, .-ebc_thread @@ -16005,34 +16113,34 @@ .type ebc_auto_tast_function, %function ebc_auto_tast_function: .LFB2837: - .loc 1 1875 0 is_stmt 1 + .loc 1 1874 0 is_stmt 1 .cfi_startproc -.LVL1631: +.LVL1639: stp x29, x30, [sp, -112]! .cfi_def_cfa_offset 112 .cfi_offset 29, -112 .cfi_offset 30, -104 adrp x0, __stack_chk_guard -.LVL1632: +.LVL1640: add x0, x0, :lo12:__stack_chk_guard add x29, sp, 0 .cfi_def_cfa_register 29 stp x25, x26, [sp, 64] .cfi_offset 25, -48 .cfi_offset 26, -40 - .loc 1 1876 0 - adrp x26, .LANCHOR0 .loc 1 1875 0 + adrp x26, .LANCHOR0 + .loc 1 1874 0 stp x19, x20, [sp, 16] -.LBB2319: -.LBB2320: -.LBB2321: +.LBB2361: +.LBB2362: +.LBB2363: .loc 12 290 0 mov x25, 2 -.LBE2321: -.LBE2320: -.LBE2319: - .loc 1 1875 0 +.LBE2363: +.LBE2362: +.LBE2361: + .loc 1 1874 0 stp x21, x22, [sp, 32] stp x23, x24, [sp, 48] .cfi_offset 19, -96 @@ -16045,420 +16153,434 @@ stp x27, x28, [sp, 80] .cfi_offset 27, -32 .cfi_offset 28, -24 - .loc 1 1886 0 + .loc 1 1885 0 add x23, x23, :lo12:.LANCHOR1 - .loc 1 1876 0 - ldr x22, [x26, #:lo12:.LANCHOR0] -.LVL1633: - .loc 1 1886 0 - add x21, x23, 712 .loc 1 1875 0 + ldr x22, [x26, #:lo12:.LANCHOR0] +.LVL1641: + .loc 1 1885 0 + add x21, x23, 712 + .loc 1 1874 0 ldr x1, [x0] str x1, [x29, 104] mov x1,0 - .loc 1 1888 0 + .loc 1 1887 0 add x23, x23, 352 - .loc 1 1877 0 + .loc 1 1876 0 add x20, x22, 24 - .loc 1 1878 0 + .loc 1 1877 0 add x19, x22, 192 - add x28, x22, 736 + add x28, x22, 720 adrp x27, jiffies -.LBB2326: -.LBB2323: -.LBB2324: +.LBB2368: +.LBB2365: +.LBB2366: .loc 4 19 0 #APP // 19 "./arch/arm64/include/asm/current.h" 1 mrs x24, sp_el0 // 0 "" 2 -.LVL1634: +.LVL1642: #NO_APP - b .L1716 + b .L1684 .p2align 3 -.L1725: -.LBE2324: -.LBE2323: -.LBE2326: - .loc 1 1894 0 +.L1693: +.LBE2366: +.LBE2365: +.LBE2368: + .loc 1 1893 0 cmp w0, 4 - beq .L1697 + beq .L1663 cmp w0, 1 - beq .L1724 - .loc 1 2038 0 - ldr w1, [x19, 72] + beq .L1692 .loc 1 2039 0 + ldr w1, [x19, 72] + .loc 1 2040 0 mov x0, x20 - .loc 1 2038 0 + .loc 1 2039 0 sub w1, w1, #1 str w1, [x19, 72] - .loc 1 2039 0 + .loc 1 2040 0 ldr w1, [x22, 224] bl flip.isra.4 -.LVL1635: - .loc 1 2041 0 +.LVL1643: + .loc 1 2042 0 add x0, x26, :lo12:.LANCHOR0 ldr x0, [x0, 16] bl wake_up_process -.LVL1636: - .loc 1 2043 0 +.LVL1644: + .loc 1 2044 0 ldr w4, [x19, 72] - cbz w4, .L1703 - .loc 1 2045 0 - ldr w0, [x20, 164] - cbz w0, .L1715 + cbz w4, .L1669 .loc 1 2046 0 + ldr w0, [x20, 164] + cbz w0, .L1683 + .loc 1 2047 0 ldrsw x0, [x20, 72] mov w6, 2 + .loc 1 2048 0 + ldp x2, x1, [x19, 216] .loc 1 2047 0 - ldp x2, x1, [x19, 224] - .loc 1 2046 0 - add x0, x0, 24 + add x0, x19, x0, lsl 3 ldrb w3, [x22, 248] ldr x5, [x22, 320] - ldr x0, [x19, x0, lsl 3] ldr x1, [x1, 16] + ldr x0, [x0, 184] ldr x2, [x2, 16] bl direct_mode_data_change2.isra.3 -.LVL1637: +.LVL1645: .p2align 2 -.L1703: - .loc 1 2059 0 +.L1669: + .loc 1 2060 0 mov x0, x21 bl up -.LVL1638: - .loc 1 2060 0 +.LVL1646: + .loc 1 2061 0 bl schedule -.LVL1639: -.L1716: - .loc 1 1886 0 +.LVL1647: +.L1684: + .loc 1 1885 0 mov x0, x21 bl down -.LVL1640: - .loc 1 1888 0 +.LVL1648: + .loc 1 1887 0 mov x0, x23 bl down -.LVL1641: -.LBB2327: -.LBB2325: -.LBB2322: +.LVL1649: +.LBB2369: +.LBB2367: +.LBB2364: .loc 12 290 0 str x25, [x24, 32] -.LBE2322: -.LBE2325: -.LBE2327: - .loc 1 1893 0 +.LBE2364: +.LBE2367: +.LBE2369: + .loc 1 1892 0 #APP -// 1893 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1 +// 1892 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1 dmb ish // 0 "" 2 - .loc 1 1894 0 + .loc 1 1893 0 #NO_APP - ldr w0, [x19, 264] + ldr w0, [x19, 252] cmp w0, 3 - bne .L1725 + bne .L1693 .loc 1 1971 0 ldr w0, [x19, 60] .loc 1 1970 0 str wzr, [x19, 68] .loc 1 1971 0 - cbnz w0, .L1707 + cbnz w0, .L1674 .loc 1 1971 0 is_stmt 0 discriminator 1 ldr w0, [x19, 64] - cbz w0, .L1708 -.L1707: + cbz w0, .L1675 +.L1674: .loc 1 1972 0 is_stmt 1 ldr w1, [x22, 224] mov x0, x20 bl flip.isra.4 -.LVL1642: +.LVL1650: .loc 1 1974 0 add x0, x26, :lo12:.LANCHOR0 ldr x0, [x0, 16] bl wake_up_process -.LVL1643: +.LVL1651: .loc 1 1976 0 ldr w0, [x20, 164] - cbz w0, .L1709 + cbz w0, .L1676 .loc 1 1977 0 ldrsw x0, [x20, 72] mov w5, 2 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldr x3, [x19, 176] mov x4, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] bl get_auto_image2 -.LVL1644: - b .L1703 +.LVL1652: + b .L1669 .p2align 3 -.L1724: - .loc 1 2017 0 - ldr w1, [x19, 72] +.L1692: .loc 1 2018 0 + ldr w1, [x19, 72] + .loc 1 2019 0 mov x0, x20 - .loc 1 2017 0 + .loc 1 2018 0 sub w1, w1, #1 str w1, [x19, 72] - .loc 1 2018 0 + .loc 1 2019 0 ldr w1, [x22, 224] bl flip.isra.4 -.LVL1645: - .loc 1 2020 0 +.LVL1653: + .loc 1 2021 0 add x0, x26, :lo12:.LANCHOR0 ldr x0, [x0, 16] bl wake_up_process -.LVL1646: - .loc 1 2022 0 +.LVL1654: + .loc 1 2023 0 ldr w4, [x19, 72] - cbz w4, .L1703 - .loc 1 2024 0 - ldr w0, [x20, 164] - cbz w0, .L1713 + cbz w4, .L1669 .loc 1 2025 0 + ldr w0, [x20, 164] + cbz w0, .L1681 + .loc 1 2026 0 ldrsw x0, [x20, 72] mov w6, 2 + .loc 1 2027 0 + ldp x2, x1, [x19, 216] .loc 1 2026 0 - ldp x2, x1, [x19, 224] - .loc 1 2025 0 - add x0, x0, 24 + add x0, x19, x0, lsl 3 ldrb w3, [x22, 248] ldr x5, [x22, 320] - ldr x0, [x19, x0, lsl 3] ldr x1, [x1, 16] + ldr x0, [x0, 184] ldr x2, [x2, 16] bl direct_mode_data_change_part2.isra.8 -.LVL1647: - b .L1703 +.LVL1655: + b .L1669 .p2align 3 -.L1697: - .loc 1 1896 0 +.L1663: + .loc 1 1895 0 ldr w0, [x19, 76] - cbz w0, .L1699 - .loc 1 1899 0 - ldr w0, [x19, 60] + cbz w0, .L1665 .loc 1 1898 0 - str wzr, [x19, 68] + ldr w0, [x19, 60] .loc 1 1897 0 + str wzr, [x19, 68] + .loc 1 1896 0 str wzr, [x19, 76] - .loc 1 1899 0 - cbnz w0, .L1700 - .loc 1 1899 0 is_stmt 0 discriminator 1 + .loc 1 1898 0 + cbnz w0, .L1666 + .loc 1 1898 0 is_stmt 0 discriminator 1 ldr w0, [x19, 64] - cbz w0, .L1701 -.L1700: - .loc 1 1900 0 is_stmt 1 + cbz w0, .L1667 +.L1666: + .loc 1 1899 0 is_stmt 1 ldr w1, [x22, 224] mov x0, x20 bl flip.isra.4 -.LVL1648: - .loc 1 1902 0 +.LVL1656: + .loc 1 1901 0 add x0, x26, :lo12:.LANCHOR0 ldr x0, [x0, 16] bl wake_up_process -.LVL1649: - .loc 1 1904 0 +.LVL1657: + .loc 1 1903 0 ldr w0, [x20, 164] - cbz w0, .L1702 - .loc 1 1905 0 + cbz w0, .L1668 + .loc 1 1904 0 ldrsw x0, [x20, 72] mov w6, 2 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldp x3, x4, [x19, 176] mov x5, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] bl get_overlay_image2 -.LVL1650: - b .L1703 +.LVL1658: + b .L1669 .p2align 3 -.L1709: +.L1676: .loc 1 1984 0 ldrsw x0, [x20, 72] mov w5, 2 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldr x3, [x19, 176] mov x4, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] bl get_auto_image -.LVL1651: - b .L1703 +.LVL1659: + b .L1669 .p2align 3 -.L1699: +.L1665: .loc 1 1951 0 mov x0, x23 bl up -.LVL1652: +.LVL1660: .loc 1 1953 0 ldr w0, [x20, 164] - cbz w0, .L1706 + cbz w0, .L1673 .loc 1 1954 0 ldrsw x0, [x20, 72] mov x4, x19 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldr x3, [x19, 176] - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] bl get_overlay_image_area2.isra.0 -.LVL1653: - b .L1703 +.LVL1661: + b .L1669 .p2align 3 -.L1702: - .loc 1 1913 0 +.L1668: + .loc 1 1912 0 ldrsw x0, [x20, 72] mov w6, 2 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldp x3, x4, [x19, 176] mov x5, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] bl get_overlay_image -.LVL1654: - b .L1703 +.LVL1662: + b .L1669 .p2align 3 -.L1715: - .loc 1 2052 0 +.L1683: + .loc 1 2053 0 ldrsw x0, [x20, 72] mov w6, 2 + .loc 1 2054 0 + ldp x2, x1, [x19, 216] .loc 1 2053 0 - ldp x2, x1, [x19, 224] - .loc 1 2052 0 - add x0, x0, 24 + add x0, x19, x0, lsl 3 ldrb w3, [x22, 248] ldr x5, [x22, 320] - ldr x0, [x19, x0, lsl 3] ldr x1, [x1, 16] + ldr x0, [x0, 184] ldr x2, [x2, 16] bl direct_mode_data_change.isra.2 -.LVL1655: - b .L1703 +.LVL1663: + b .L1669 .p2align 3 -.L1713: - .loc 1 2031 0 +.L1681: + .loc 1 2032 0 ldrsw x0, [x20, 72] mov w6, 2 + .loc 1 2033 0 + ldp x2, x1, [x19, 216] .loc 1 2032 0 - ldp x2, x1, [x19, 224] - .loc 1 2031 0 - add x0, x0, 24 + add x0, x19, x0, lsl 3 ldrb w3, [x22, 248] ldr x5, [x22, 320] - ldr x0, [x19, x0, lsl 3] ldr x1, [x1, 16] + ldr x0, [x0, 184] ldr x2, [x2, 16] bl direct_mode_data_change_part.isra.9 -.LVL1656: - b .L1703 +.LVL1664: + b .L1669 .p2align 3 -.L1708: +.L1675: .loc 1 1992 0 mov x0, x23 bl up -.LVL1657: - .loc 1 1995 0 - ldr x1, [x19, 232] +.LVL1665: .loc 1 1994 0 - mov x3, x19 - ldr x0, [x19, 152] - ldr x2, [x19, 176] - ldr x1, [x1, 16] - bl refresh_new_image_auto -.LVL1658: - .loc 1 1998 0 - ldr w0, [x20, 164] - cbz w0, .L1710 + ldr w0, [x19, 612] + cbz w0, .L1694 +.L1677: .loc 1 1999 0 + ldr w0, [x20, 164] + cbz w0, .L1678 + .loc 1 2000 0 ldrsw x0, [x20, 72] mov w5, 1 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldr x3, [x19, 176] mov x4, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] bl get_auto_image2 -.LVL1659: -.L1711: - .loc 1 2012 0 +.LVL1666: +.L1679: + .loc 1 2013 0 mov w0, 1 - .loc 1 2013 0 + .loc 1 2014 0 ldr x1, [x27, #:lo12:jiffies] - .loc 1 2012 0 - str w0, [x19, 68] .loc 1 2013 0 + str w0, [x19, 68] + .loc 1 2014 0 mov x0, x28 add x1, x1, 1 bl mod_timer -.LVL1660: - b .L1703 +.LVL1667: + b .L1669 .p2align 3 -.L1701: - .loc 1 1922 0 +.L1667: + .loc 1 1921 0 mov x0, x23 bl up -.LVL1661: - .loc 1 1926 0 - ldr x2, [x19, 232] - .loc 1 1924 0 - mov x5, x19 - ldr x0, [x19, 152] - ldr x1, [x19, 16] - ldp x3, x4, [x19, 176] - ldr x2, [x2, 16] - bl refresh_new_image -.LVL1662: +.LVL1668: + .loc 1 1923 0 + ldr w0, [x19, 612] + cbz w0, .L1695 +.L1670: .loc 1 1930 0 ldr w0, [x20, 164] - cbz w0, .L1704 + cbz w0, .L1671 .loc 1 1931 0 ldrsw x0, [x20, 72] mov w6, 1 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldp x3, x4, [x19, 176] mov x5, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] bl get_overlay_image2 -.LVL1663: - b .L1711 +.LVL1669: + b .L1679 .p2align 3 -.L1706: +.L1673: .loc 1 1961 0 ldrsw x0, [x20, 72] mov x5, x19 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldp x3, x4, [x19, 176] - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] bl get_overlay_image_area -.LVL1664: - b .L1703 +.LVL1670: + b .L1669 .p2align 3 -.L1710: - .loc 1 2006 0 +.L1678: + .loc 1 2007 0 ldrsw x0, [x20, 72] mov w5, 1 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldr x3, [x19, 176] mov x4, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] bl get_auto_image -.LVL1665: - b .L1711 +.LVL1671: + b .L1679 .p2align 3 -.L1704: +.L1671: .loc 1 1939 0 ldrsw x0, [x20, 72] mov w6, 1 ldp x1, x2, [x19, 152] - add x0, x0, 24 - ldp x3, x4, [x19, 176] mov x5, x19 - ldr x0, [x19, x0, lsl 3] + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] bl get_overlay_image -.LVL1666: - b .L1711 +.LVL1672: + b .L1679 + .p2align 3 +.L1694: + .loc 1 1996 0 + ldr x1, [x19, 224] + .loc 1 1995 0 + mov x3, x19 + ldr x0, [x19, 152] + ldr x2, [x19, 168] + ldr x1, [x1, 16] + bl refresh_new_image_auto +.LVL1673: + b .L1677 + .p2align 3 +.L1695: + .loc 1 1926 0 + ldr x2, [x19, 224] + .loc 1 1924 0 + mov x5, x19 + ldr x1, [x19, 16] + ldr x0, [x19, 152] + ldp x3, x4, [x19, 168] + ldr x2, [x2, 16] + bl refresh_new_image +.LVL1674: + b .L1670 .cfi_endproc .LFE2837: .size ebc_auto_tast_function, .-ebc_auto_tast_function @@ -16616,29 +16738,29 @@ .section .rodata .align 3 .set .LANCHOR2,. + 0 - .type __func__.35503, %object - .size __func__.35503, 11 -__func__.35503: + .type __func__.35512, %object + .size __func__.35512, 11 +__func__.35512: .string "ebc_io_ctl" .align 3 .set .LANCHOR3,. + 0 - .type __func__.35838, %object - .size __func__.35838, 12 -__func__.35838: + .type __func__.35849, %object + .size __func__.35849, 12 +__func__.35849: .string "ebc_suspend" .zero 4 - .type __func__.35144, %object - .size __func__.35144, 16 -__func__.35144: + .type __func__.35152, %object + .size __func__.35152, 16 +__func__.35152: .string "ebc_frame_start" - .type __func__.35772, %object - .size __func__.35772, 19 -__func__.35772: + .type __func__.35783, %object + .size __func__.35783, 19 +__func__.35783: .string "ebc_lut_table_init" .zero 5 - .type CSWTCH.300, %object - .size CSWTCH.300, 48 -CSWTCH.300: + .type CSWTCH.296, %object + .size CSWTCH.296, 48 +CSWTCH.296: .word 7 .word 7 .word 1 @@ -16651,9 +16773,9 @@ .word 12 .word 1 .word 2 - .type __func__.35137, %object - .size __func__.35137, 27 -__func__.35137: + .type __func__.35145, %object + .size __func__.35145, 27 +__func__.35145: .string "ebc_overlay_bg_frame_start" .zero 5 .type ebc_match, %object @@ -16693,9 +16815,9 @@ .zero 176 .section .discard.addressable,"aw",@progbits .align 3 - .type __addressable_ebc_init3783, %object - .size __addressable_ebc_init3783, 8 -__addressable_ebc_init3783: + .type __addressable_ebc_init3795, %object + .size __addressable_ebc_init3795, 8 +__addressable_ebc_init3795: .xword ebc_init .section .exitcall.exit,"aw",@progbits .align 3 @@ -16741,124 +16863,124 @@ .string "EBC_SET_DIFF_PERCENT failed\n" .zero 3 .LC12: - .string "new_buf_is_comming......\n" - .zero 6 -.LC13: .string "EBC_WAIT_NEW_BUF_TIME failed\n" .zero 2 -.LC14: +.LC13: .string "%s: unknow cmd\n" -.LC15: +.LC14: .string "full_mode_num = %d\n" .zero 4 -.LC16: +.LC15: .string "diff_percent = %d\n" .zero 5 -.LC17: +.LC16: .string "waiting_new_buf_time = %d\n" .zero 5 -.LC18: +.LC17: .string "overlay frame done\n" .zero 4 -.LC19: +.LC18: .string "auto frame done\n" .zero 7 -.LC20: +.LC19: .string "frame done\n" .zero 4 -.LC21: +.LC20: .string "temperature = %d, out of range0~50 ,use 0 \n" .zero 4 -.LC22: +.LC21: .string "temperature = %d, out of range0~50 ,use 50 \n" .zero 3 -.LC23: +.LC22: .string "ebc_pmic_read_temp failed, ret = %d\n" .zero 3 -.LC24: +.LC23: .string "lut update use temperature = %d\n" .zero 7 -.LC25: +.LC24: .string "get lut data failed\n" .zero 3 -.LC26: +.LC25: .string "%d\n" .zero 4 -.LC27: - .string "4.17" +.LC26: + .string "5.02" .zero 3 -.LC28: +.LC27: .string "%s\n" .zero 4 -.LC29: +.LC28: .string "invalid value = %s\n" .zero 4 -.LC30: +.LC29: .string "set vcom value failed\n" .zero 1 -.LC31: +.LC30: .string "ebc hw power off\n" .zero 6 -.LC32: +.LC31: .string "%s: device is busy now...\n" .zero 5 -.LC33: +.LC32: .string "device suspend\n" -.LC34: +.LC33: .string "%s: overlay no need to update\n" .zero 1 -.LC35: +.LC34: .string "%s: auto no need to update\n" .zero 4 -.LC36: +.LC35: .string "black point > 90percent, skip this frame\n" .zero 6 -.LC37: +.LC36: .string "diff point > %d percent, force full\n" .zero 3 -.LC38: +.LC37: .string "ebc_tcon" .zero 7 -.LC39: +.LC38: .string "not find ebc tcon\n" .zero 5 -.LC40: +.LC39: .string "pmic" .zero 3 -.LC41: +.LC40: .string "wrong pmics number\n" .zero 4 -.LC42: +.LC41: .string "not find pmic node\n" .zero 4 -.LC43: +.LC42: .string "not find pmic i2c client\n" .zero 6 -.LC44: +.LC43: .string "use pmic%d\n" .zero 4 -.LC45: +.LC44: .string "get drvdata from pmic client failed\n" .zero 3 -.LC46: +.LC45: .string "panel,width" .zero 4 -.LC47: +.LC46: .string "panel,panel_color" .zero 6 -.LC48: +.LC47: .string "panel,mirror" .zero 3 -.LC49: +.LC48: .string "panel,width-mm" .zero 1 -.LC50: +.LC49: .string "panel,height-mm" -.LC51: +.LC50: .string "panel,disable_logo" .zero 5 -.LC52: +.LC51: .string "panel,rearrange" +.LC52: + .string "too large resolution, not support\n" + .zero 5 .LC53: .string "memory-region" .zero 2 @@ -17291,7 +17413,7 @@ .file 213 "./include/linux/string.h" .section .debug_info,"",@progbits .Ldebug_info0: - .4byte 0x16c94 + .4byte 0x16e85 .2byte 0x4 .4byte .Ldebug_abbrev0 .byte 0x8 @@ -17300,7 +17422,7 @@ .byte 0x1 .4byte .LASF3319 .4byte .LASF3320 - .4byte .Ldebug_ranges0+0x24a0 + .4byte .Ldebug_ranges0+0x2440 .8byte 0 .4byte .Ldebug_line0 .uleb128 0x2 @@ -34747,7 +34869,7 @@ .uleb128 0x3 .4byte 0x914a .uleb128 0x43 - .4byte .LASF3023 + .4byte .LASF3022 .byte 0x1e .2byte 0xba4 .4byte 0x915a @@ -43064,54 +43186,54 @@ .4byte .LASF2791 .byte 0xe0 .byte 0xbd - .byte 0xb7 + .byte 0xba .4byte 0xd631 .uleb128 0xe .4byte .LASF2300 .byte 0xbd - .byte 0xb8 + .byte 0xbb .4byte 0xd646 .byte 0 .uleb128 0xe .4byte .LASF2302 .byte 0xbd - .byte 0xb9 + .byte 0xbc .4byte 0xd646 .byte 0x8 .uleb128 0xe .4byte .LASF2303 .byte 0xbd - .byte 0xba + .byte 0xbd .4byte 0xd657 .byte 0x10 .uleb128 0xe .4byte .LASF2147 .byte 0xbd - .byte 0xbb + .byte 0xbe .4byte 0xd671 .byte 0x18 .uleb128 0xe .4byte .LASF2148 .byte 0xbd - .byte 0xbc + .byte 0xbf .4byte 0xd646 .byte 0x20 .uleb128 0xe .4byte .LASF2170 .byte 0xbd - .byte 0xbd + .byte 0xc0 .4byte 0xae77 .byte 0x28 .uleb128 0xe .4byte .LASF2792 .byte 0xbd - .byte 0xbe + .byte 0xc1 .4byte 0xd59d .byte 0xd0 .uleb128 0xe .4byte .LASF2793 .byte 0xbd - .byte 0xbf + .byte 0xc2 .4byte 0x2b0 .byte 0xd8 .byte 0 @@ -43259,7 +43381,7 @@ .byte 0x4 .4byte 0x6d .byte 0xc1 - .byte 0xc + .byte 0xf .4byte 0xd7b8 .uleb128 0xc .4byte .LASF2811 @@ -43305,24 +43427,24 @@ .4byte .LASF2824 .byte 0x20 .byte 0xc1 - .byte 0x1d + .byte 0x20 .4byte 0xd7e9 .uleb128 0xe .4byte .LASF2825 .byte 0xc1 - .byte 0x1e + .byte 0x21 .4byte 0x6d .byte 0 .uleb128 0xe .4byte .LASF793 .byte 0xc1 - .byte 0x1f + .byte 0x22 .4byte 0x34a7 .byte 0x8 .uleb128 0xe .4byte .LASF2826 .byte 0xc1 - .byte 0x20 + .byte 0x23 .4byte 0xd7e9 .byte 0x10 .byte 0 @@ -43434,7 +43556,7 @@ .byte 0x4 .4byte 0x6d .byte 0xc3 - .byte 0x42 + .byte 0x4a .4byte 0xd95a .uleb128 0xc .4byte .LASF2844 @@ -43513,84 +43635,84 @@ .4byte .LASF2868 .byte 0x40 .byte 0xc3 - .byte 0x60 + .byte 0x68 .4byte 0xda03 .uleb128 0xe .4byte .LASF854 .byte 0xc3 - .byte 0x61 + .byte 0x69 .4byte 0xc6 .byte 0 .uleb128 0xe .4byte .LASF2869 .byte 0xc3 - .byte 0x62 + .byte 0x6a .4byte 0xc6 .byte 0x4 .uleb128 0xe .4byte .LASF2870 .byte 0xc3 - .byte 0x63 + .byte 0x6b .4byte 0xc6 .byte 0x8 .uleb128 0xe .4byte .LASF262 .byte 0xc3 - .byte 0x64 + .byte 0x6c .4byte 0xc6 .byte 0xc .uleb128 0xe .4byte .LASF2871 .byte 0xc3 - .byte 0x65 + .byte 0x6d .4byte 0xc6 .byte 0x10 .uleb128 0xe .4byte .LASF2838 .byte 0xc3 - .byte 0x66 + .byte 0x6e .4byte 0xc6 .byte 0x14 .uleb128 0xe .4byte .LASF2839 .byte 0xc3 - .byte 0x67 + .byte 0x6f .4byte 0xc6 .byte 0x18 .uleb128 0xe .4byte .LASF2840 .byte 0xc3 - .byte 0x68 + .byte 0x70 .4byte 0xc6 .byte 0x1c .uleb128 0xe .4byte .LASF2841 .byte 0xc3 - .byte 0x69 + .byte 0x71 .4byte 0xc6 .byte 0x20 .uleb128 0xe .4byte .LASF2872 .byte 0xc3 - .byte 0x6a + .byte 0x72 .4byte 0xc6 .byte 0x24 .uleb128 0xe .4byte .LASF2873 .byte 0xc3 - .byte 0x6b + .byte 0x73 .4byte 0xc6 .byte 0x28 .uleb128 0xe .4byte .LASF2842 .byte 0xc3 - .byte 0x6c + .byte 0x74 .4byte 0xc6 .byte 0x2c .uleb128 0xe .4byte .LASF2836 .byte 0xc3 - .byte 0x6d + .byte 0x75 .4byte 0x46fe .byte 0x30 .byte 0 @@ -44536,10 +44658,10 @@ .byte 0 .uleb128 0x26 .4byte .LASF2943 - .2byte 0x278 + .2byte 0x268 .byte 0x1 .byte 0x42 - .4byte 0xe470 + .4byte 0xe462 .uleb128 0xe .4byte .LASF2944 .byte 0x1 @@ -44718,144 +44840,138 @@ .4byte .LASF2970 .byte 0x1 .byte 0x60 - .4byte 0xbfee + .4byte 0xe462 .byte 0xb8 .uleb128 0xe .4byte .LASF2971 .byte 0x1 .byte 0x61 - .4byte 0xe470 - .byte 0xc0 + .4byte 0xc6 + .byte 0xc8 .uleb128 0xe .4byte .LASF2972 .byte 0x1 .byte 0x62 - .4byte 0xc6 + .4byte 0x21e .byte 0xd0 .uleb128 0xe .4byte .LASF2973 .byte 0x1 .byte 0x63 - .4byte 0x21e + .4byte 0xe472 .byte 0xd8 .uleb128 0xe .4byte .LASF2974 .byte 0x1 .byte 0x64 - .4byte 0xe480 + .4byte 0xe472 .byte 0xe0 .uleb128 0xe .4byte .LASF2975 .byte 0x1 .byte 0x65 - .4byte 0xe480 + .4byte 0xe472 .byte 0xe8 .uleb128 0xe .4byte .LASF2976 .byte 0x1 .byte 0x66 - .4byte 0xe480 + .4byte 0xe472 .byte 0xf0 .uleb128 0xe .4byte .LASF2977 .byte 0x1 .byte 0x67 - .4byte 0xe480 + .4byte 0xc6 .byte 0xf8 - .uleb128 0x27 + .uleb128 0xe .4byte .LASF2978 .byte 0x1 .byte 0x68 .4byte 0xc6 - .2byte 0x100 + .byte 0xfc .uleb128 0x27 .4byte .LASF2979 .byte 0x1 .byte 0x69 - .4byte 0xc6 - .2byte 0x104 + .4byte 0xd728 + .2byte 0x100 .uleb128 0x27 .4byte .LASF2980 .byte 0x1 .byte 0x6a .4byte 0xc6 - .2byte 0x108 + .2byte 0x1d0 .uleb128 0x27 .4byte .LASF2981 .byte 0x1 - .byte 0x6b - .4byte 0xd728 - .2byte 0x110 + .byte 0x6c + .4byte 0xc6 + .2byte 0x1d4 .uleb128 0x27 .4byte .LASF2982 .byte 0x1 - .byte 0x6c - .4byte 0xc6 - .2byte 0x1e0 + .byte 0x6e + .4byte 0x316c + .2byte 0x1d8 .uleb128 0x27 .4byte .LASF2983 .byte 0x1 - .byte 0x6e - .4byte 0xc6 - .2byte 0x1e4 + .byte 0x71 + .4byte 0x316c + .2byte 0x210 .uleb128 0x27 .4byte .LASF2984 .byte 0x1 - .byte 0x70 - .4byte 0x316c - .2byte 0x1e8 + .byte 0x74 + .4byte 0xc6 + .2byte 0x248 .uleb128 0x27 .4byte .LASF2985 .byte 0x1 - .byte 0x73 - .4byte 0x316c - .2byte 0x220 + .byte 0x76 + .4byte 0xc6 + .2byte 0x24c .uleb128 0x27 .4byte .LASF2986 .byte 0x1 - .byte 0x76 + .byte 0x78 .4byte 0xc6 - .2byte 0x258 + .2byte 0x250 .uleb128 0x27 .4byte .LASF2987 .byte 0x1 - .byte 0x78 + .byte 0x7a .4byte 0xc6 - .2byte 0x25c + .2byte 0x254 .uleb128 0x27 .4byte .LASF2988 .byte 0x1 - .byte 0x7a + .byte 0x7b .4byte 0xc6 - .2byte 0x260 + .2byte 0x258 .uleb128 0x27 .4byte .LASF2989 .byte 0x1 .byte 0x7c .4byte 0xc6 - .2byte 0x264 + .2byte 0x25c .uleb128 0x27 .4byte .LASF2990 .byte 0x1 .byte 0x7d .4byte 0xc6 - .2byte 0x268 + .2byte 0x260 .uleb128 0x27 .4byte .LASF2991 .byte 0x1 .byte 0x7e .4byte 0xc6 - .2byte 0x26c - .uleb128 0x27 - .4byte .LASF2992 - .byte 0x1 - .byte 0x7f - .4byte 0xc6 - .2byte 0x270 + .2byte 0x264 .byte 0 .uleb128 0x5 .4byte 0x458 - .4byte 0xe480 + .4byte 0xe472 .uleb128 0x6 .4byte 0x4f .byte 0x1 @@ -44865,52 +44981,60 @@ .4byte 0xd828 .uleb128 0x47 .string "ebc" - .2byte 0x338 + .2byte 0x328 .byte 0x1 - .byte 0x82 - .4byte 0xe4d0 + .byte 0x81 + .4byte 0xe4c2 .uleb128 0x20 .string "dev" .byte 0x1 - .byte 0x83 + .byte 0x82 .4byte 0xa496 .byte 0 .uleb128 0xe .4byte .LASF2906 .byte 0x1 - .byte 0x84 + .byte 0x83 .4byte 0xe0a4 .byte 0x8 .uleb128 0xe .4byte .LASF2907 .byte 0x1 - .byte 0x85 + .byte 0x84 .4byte 0xda8c .byte 0x10 .uleb128 0xe - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .byte 0x86 + .byte 0x85 .4byte 0xde87 .byte 0x18 .uleb128 0xe .4byte .LASF1742 .byte 0x1 - .byte 0x87 + .byte 0x86 .4byte 0xe1e3 .byte 0xc0 .byte 0 .uleb128 0x48 - .4byte .LASF2994 + .4byte .LASF2993 .byte 0x1 - .byte 0x8c - .4byte 0xe4e5 + .byte 0x8b + .4byte 0xe4d7 .uleb128 0x9 .byte 0x3 .8byte global_ebc .uleb128 0x7 .byte 0x8 - .4byte 0xe486 + .4byte 0xe478 + .uleb128 0x48 + .4byte .LASF2994 + .byte 0x1 + .byte 0x8c + .4byte 0x2eff + .uleb128 0x9 + .byte 0x3 + .8byte ebc_task .uleb128 0x48 .4byte .LASF2995 .byte 0x1 @@ -44918,39 +45042,39 @@ .4byte 0x2eff .uleb128 0x9 .byte 0x3 - .8byte ebc_task + .8byte ebc_auto_task .uleb128 0x48 .4byte .LASF2996 .byte 0x1 .byte 0x8e - .4byte 0x2eff - .uleb128 0x9 - .byte 0x3 - .8byte ebc_auto_task - .uleb128 0x48 - .4byte .LASF2997 - .byte 0x1 - .byte 0x8f .4byte 0x159a .uleb128 0x9 .byte 0x3 .8byte ebc_thread_wq .uleb128 0x48 - .4byte .LASF2998 + .4byte .LASF2997 .byte 0x1 - .byte 0x90 + .byte 0x8f .4byte 0x5a97 .uleb128 0x9 .byte 0x3 .8byte ebc_auto_thread_sem .uleb128 0x48 - .4byte .LASF2999 + .4byte .LASF2998 .byte 0x1 - .byte 0x92 + .byte 0x91 .4byte 0x2eff .uleb128 0x9 .byte 0x3 .8byte ebc_auto_assist_task + .uleb128 0x48 + .4byte .LASF2999 + .byte 0x1 + .byte 0x92 + .4byte 0x5a97 + .uleb128 0x9 + .byte 0x3 + .8byte ebc_auto_assist_thread_sem .uleb128 0x48 .4byte .LASF3000 .byte 0x1 @@ -44958,172 +45082,164 @@ .4byte 0x5a97 .uleb128 0x9 .byte 0x3 - .8byte ebc_auto_assist_thread_sem - .uleb128 0x48 - .4byte .LASF3001 - .byte 0x1 - .byte 0x94 - .4byte 0x5a97 - .uleb128 0x9 - .byte 0x3 .8byte ebc_assist_finished_flag_sem .uleb128 0x49 - .4byte .LASF3002 - .byte 0x1 - .2byte 0x919 - .4byte 0xc6 - .uleb128 0x9 - .byte 0x3 - .8byte resume_frame_count - .uleb128 0x49 - .4byte .LASF3003 + .4byte .LASF3001 .byte 0x1 .2byte 0x91a .4byte 0xc6 .uleb128 0x9 .byte 0x3 + .8byte resume_frame_count + .uleb128 0x49 + .4byte .LASF3002 + .byte 0x1 + .2byte 0x91b + .4byte 0xc6 + .uleb128 0x9 + .byte 0x3 .8byte resume_count_start .uleb128 0x49 - .4byte .LASF3004 + .4byte .LASF3003 .byte 0x1 - .2byte 0xc3b + .2byte 0xc43 .4byte 0x7c9 .uleb128 0x9 .byte 0x3 .8byte ebc_ops .uleb128 0x49 - .4byte .LASF3005 + .4byte .LASF3004 .byte 0x1 - .2byte 0xc45 + .2byte 0xc4d .4byte 0xc536 .uleb128 0x9 .byte 0x3 .8byte ebc_misc .uleb128 0x49 - .4byte .LASF3006 + .4byte .LASF3005 .byte 0x1 - .2byte 0xc62 + .2byte 0xc6a .4byte 0x7c9 .uleb128 0x9 .byte 0x3 .8byte waveform_ops .uleb128 0x49 - .4byte .LASF3007 + .4byte .LASF3006 .byte 0x1 - .2byte 0xc68 + .2byte 0xc70 .4byte 0xc536 .uleb128 0x9 .byte 0x3 .8byte waveform_misc .uleb128 0x49 - .4byte .LASF3008 + .4byte .LASF3007 .byte 0x1 - .2byte 0xc77 + .2byte 0xc7f .4byte 0xb2c3 .uleb128 0x9 .byte 0x3 .8byte dev_attr_waveform_version .uleb128 0x49 - .4byte .LASF3009 + .4byte .LASF3008 .byte 0x1 - .2byte 0xc82 + .2byte 0xc8a .4byte 0xb2c3 .uleb128 0x9 .byte 0x3 .8byte dev_attr_pmic_name .uleb128 0x49 - .4byte .LASF3010 + .4byte .LASF3009 .byte 0x1 - .2byte 0xc90 + .2byte 0xc98 .4byte 0xb2c3 .uleb128 0x9 .byte 0x3 .8byte dev_attr_pmic_temp .uleb128 0x49 - .4byte .LASF3011 + .4byte .LASF3010 .byte 0x1 - .2byte 0xcb3 + .2byte 0xcbb .4byte 0xb2c3 .uleb128 0x9 .byte 0x3 .8byte dev_attr_pmic_vcom .uleb128 0x49 - .4byte .LASF3012 + .4byte .LASF3011 .byte 0x1 - .2byte 0xcbd + .2byte 0xcc5 .4byte 0xb2c3 .uleb128 0x9 .byte 0x3 .8byte dev_attr_ebc_version .uleb128 0x49 - .4byte .LASF3013 + .4byte .LASF3012 .byte 0x1 - .2byte 0xcc6 + .2byte 0xcce .4byte 0xb2c3 .uleb128 0x9 .byte 0x3 .8byte dev_attr_ebc_state .uleb128 0x49 - .4byte .LASF3014 + .4byte .LASF3013 .byte 0x1 - .2byte 0xccf + .2byte 0xcd7 .4byte 0xb2c3 .uleb128 0x9 .byte 0x3 .8byte dev_attr_ebc_buf_state .uleb128 0x49 - .4byte .LASF3015 + .4byte .LASF3014 .byte 0x1 - .2byte 0xce2 + .2byte 0xcea .4byte 0xb2c3 .uleb128 0x9 .byte 0x3 .8byte dev_attr_auto_frame_state .uleb128 0x49 - .4byte .LASF3016 + .4byte .LASF3015 .byte 0x1 - .2byte 0xea8 + .2byte 0xeb4 .4byte 0xa482 .uleb128 0x9 .byte 0x3 .8byte ebc_pm .uleb128 0x5 .4byte 0xb0c1 - .4byte 0xe6d8 + .4byte 0xe6ca .uleb128 0x6 .4byte 0x4f .byte 0x1 .byte 0 .uleb128 0x3 - .4byte 0xe6c8 + .4byte 0xe6ba .uleb128 0x49 - .4byte .LASF3017 + .4byte .LASF3016 .byte 0x1 - .2byte 0xead - .4byte 0xe6d8 + .2byte 0xeb9 + .4byte 0xe6ca .uleb128 0x9 .byte 0x3 .8byte ebc_match .uleb128 0x49 - .4byte .LASF3018 + .4byte .LASF3017 .byte 0x1 - .2byte 0xeb3 + .2byte 0xebf .4byte 0xd5c4 .uleb128 0x9 .byte 0x3 .8byte ebc_driver .uleb128 0x49 - .4byte .LASF3019 + .4byte .LASF3018 .byte 0x1 - .2byte 0xec7 + .2byte 0xed3 .4byte 0x458 .uleb128 0x9 .byte 0x3 - .8byte __addressable_ebc_init3783 + .8byte __addressable_ebc_init3795 .uleb128 0x49 - .4byte .LASF3020 + .4byte .LASF3019 .byte 0x1 - .2byte 0xec8 + .2byte 0xed4 .4byte 0x4ac .uleb128 0x9 .byte 0x3 @@ -45131,2569 +45247,2569 @@ .uleb128 0x4a .4byte .LASF3070 .byte 0x1 - .2byte 0xec2 + .2byte 0xece .8byte .LFB2874 .8byte .LFE2874-.LFB2874 .uleb128 0x1 .byte 0x9c - .4byte 0xe761 + .4byte 0xe753 .uleb128 0x4b .8byte .LVL79 - .4byte 0x16999 + .4byte 0x16b8a .byte 0 .uleb128 0x4c - .4byte .LASF3021 + .4byte .LASF3020 .byte 0x1 - .2byte 0xebd + .2byte 0xec9 .4byte 0xc6 .8byte .LFB2873 .8byte .LFE2873-.LFB2873 .uleb128 0x1 .byte 0x9c - .4byte 0xe791 + .4byte 0xe783 .uleb128 0x4b - .8byte .LVL729 - .4byte 0x169a4 + .8byte .LVL726 + .4byte 0x16b95 .byte 0 .uleb128 0x4d - .4byte .LASF3022 + .4byte .LASF3021 .byte 0x1 - .2byte 0xe9c + .2byte 0xea8 .4byte 0xc6 .8byte .LFB2872 .8byte .LFE2872-.LFB2872 .uleb128 0x1 .byte 0x9c - .4byte 0xe82d + .4byte 0xe81f .uleb128 0x4e .string "dev" .byte 0x1 - .2byte 0xe9c + .2byte 0xea8 .4byte 0xa496 .4byte .LLST23 .uleb128 0x4f .string "ebc" .byte 0x1 - .2byte 0xe9e - .4byte 0xe4e5 + .2byte 0xeaa + .4byte 0xe4d7 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0xe9f - .4byte 0xe82d + .2byte 0xeab + .4byte 0xe81f .uleb128 0x50 - .4byte 0x15c3b - .8byte .LBB1056 - .8byte .LBE1056-.LBB1056 + .4byte 0x15e2c + .8byte .LBB1088 + .8byte .LBE1088-.LBB1088 .byte 0x1 - .2byte 0xe9e - .4byte 0xe7fd + .2byte 0xeaa + .4byte 0xe7ef .uleb128 0x51 - .4byte 0x15c4c + .4byte 0x15e3d .byte 0 .uleb128 0x50 - .4byte 0x1582c - .8byte .LBB1058 - .8byte .LBE1058-.LBB1058 + .4byte 0x15a1d + .8byte .LBB1090 + .8byte .LBE1090-.LBB1090 .byte 0x1 - .2byte 0xea1 - .4byte 0xe81f + .2byte 0xead + .4byte 0xe811 .uleb128 0x51 - .4byte 0x15838 + .4byte 0x15a29 .byte 0 .uleb128 0x4b .8byte .LVL83 - .4byte 0x169af + .4byte 0x16ba0 .byte 0 .uleb128 0x7 .byte 0x8 .4byte 0xe1e3 .uleb128 0x4d - .4byte .LASF3024 + .4byte .LASF3023 .byte 0x1 - .2byte 0xe8b + .2byte 0xe97 .4byte 0xc6 .8byte .LFB2871 .8byte .LFE2871-.LFB2871 .uleb128 0x1 .byte 0x9c - .4byte 0xe93a + .4byte 0xe92c .uleb128 0x4e .string "dev" .byte 0x1 - .2byte 0xe8b + .2byte 0xe97 .4byte 0xa496 - .4byte .LLST261 + .4byte .LLST269 .uleb128 0x4f .string "ebc" .byte 0x1 - .2byte 0xe8d - .4byte 0xe4e5 + .2byte 0xe99 + .4byte 0xe4d7 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0xe8e - .4byte 0xe82d + .2byte 0xe9a + .4byte 0xe81f .uleb128 0x52 - .4byte .LASF3025 - .4byte 0xe94a + .4byte .LASF3024 + .4byte 0xe93c .uleb128 0x9 .byte 0x3 - .8byte __func__.35838 + .8byte __func__.35849 .uleb128 0x50 - .4byte 0x15c3b - .8byte .LBB1528 - .8byte .LBE1528-.LBB1528 + .4byte 0x15e2c + .8byte .LBB1590 + .8byte .LBE1590-.LBB1590 .byte 0x1 - .2byte 0xe8d - .4byte 0xe8b2 + .2byte 0xe99 + .4byte 0xe8a4 .uleb128 0x51 - .4byte 0x15c4c + .4byte 0x15e3d .byte 0 .uleb128 0x50 - .4byte 0x15844 - .8byte .LBB1530 - .8byte .LBE1530-.LBB1530 + .4byte 0x15a35 + .8byte .LBB1592 + .8byte .LBE1592-.LBB1592 .byte 0x1 - .2byte 0xe96 - .4byte 0xe8d4 + .2byte 0xea2 + .4byte 0xe8c6 .uleb128 0x51 - .4byte 0x15850 + .4byte 0x15a41 .byte 0 .uleb128 0x50 - .4byte 0x1547c - .8byte .LBB1532 - .8byte .LBE1532-.LBB1532 + .4byte 0x1566d + .8byte .LBB1594 + .8byte .LBE1594-.LBB1594 .byte 0x1 - .2byte 0xe92 - .4byte 0xe91f + .2byte 0xe9e + .4byte 0xe911 .uleb128 0x51 - .4byte 0x15499 + .4byte 0x1568a .uleb128 0x51 - .4byte 0x1548d + .4byte 0x1567e .uleb128 0x53 - .8byte .LBB1533 - .8byte .LBE1533-.LBB1533 + .8byte .LBB1595 + .8byte .LBE1595-.LBB1595 .uleb128 0x54 - .4byte 0x154a5 + .4byte 0x15696 .uleb128 0x4b - .8byte .LVL898 - .4byte 0x1643d + .8byte .LVL895 + .4byte 0x1662e .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL896 - .4byte 0x169af + .8byte .LVL893 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL897 - .4byte 0x169af + .8byte .LVL894 + .4byte 0x16ba0 .byte 0 .uleb128 0x5 .4byte 0x68 - .4byte 0xe94a + .4byte 0xe93c .uleb128 0x6 .4byte 0x4f .byte 0xb .byte 0 .uleb128 0x3 - .4byte 0xe93a + .4byte 0xe92c .uleb128 0x4c - .4byte .LASF3026 + .4byte .LASF3025 .byte 0x1 - .2byte 0xe84 + .2byte 0xe90 .4byte 0xc6 .8byte .LFB2870 .8byte .LFE2870-.LFB2870 .uleb128 0x1 .byte 0x9c - .4byte 0xe98f + .4byte 0xe981 .uleb128 0x55 - .4byte .LASF3027 + .4byte .LASF3026 .byte 0x1 - .2byte 0xe84 + .2byte 0xe90 .4byte 0xd640 .4byte .LLST25 .uleb128 0x4b .8byte .LVL89 - .4byte 0x169bb + .4byte 0x16bac .byte 0 .uleb128 0x4c - .4byte .LASF3028 + .4byte .LASF3027 .byte 0x1 - .2byte 0xe04 + .2byte 0xe10 .4byte 0xc6 .8byte .LFB2869 .8byte .LFE2869-.LFB2869 .uleb128 0x1 .byte 0x9c - .4byte 0xfe8c + .4byte 0xfe7e .uleb128 0x55 - .4byte .LASF3027 + .4byte .LASF3026 .byte 0x1 - .2byte 0xe04 + .2byte 0xe10 .4byte 0xd640 - .4byte .LLST291 + .4byte .LLST299 .uleb128 0x4f .string "dev" .byte 0x1 - .2byte 0xe06 + .2byte 0xe12 .4byte 0xa496 .uleb128 0x43 + .4byte .LASF3028 + .byte 0x1 + .2byte 0xe13 + .4byte 0xb7ba + .uleb128 0x56 .4byte .LASF3029 .byte 0x1 - .2byte 0xe07 - .4byte 0xb7ba - .uleb128 0x56 + .2byte 0xe14 + .4byte 0xd640 + .4byte .LLST300 + .uleb128 0x43 .4byte .LASF3030 .byte 0x1 - .2byte 0xe08 - .4byte 0xd640 - .4byte .LLST292 - .uleb128 0x43 - .4byte .LASF3031 - .byte 0x1 - .2byte 0xe09 + .2byte 0xe15 .4byte 0xb7ba .uleb128 0x56 - .4byte .LASF3032 + .4byte .LASF3031 .byte 0x1 - .2byte 0xe0a + .2byte 0xe16 .4byte 0xbf69 - .4byte .LLST293 + .4byte .LLST301 .uleb128 0x4f .string "ebc" .byte 0x1 - .2byte 0xe0b - .4byte 0xe4e5 + .2byte 0xe17 + .4byte 0xe4d7 .uleb128 0x56 .4byte .LASF2943 .byte 0x1 - .2byte 0xe0c - .4byte 0xe82d - .4byte .LLST294 + .2byte 0xe18 + .4byte 0xe81f + .4byte .LLST302 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0xe0d + .2byte 0xe19 .4byte 0xe0e4 .uleb128 0x56 .4byte .LASF932 .byte 0x1 - .2byte 0xe0e + .2byte 0xe1a .4byte 0xbbe6 - .4byte .LLST295 + .4byte .LLST303 .uleb128 0x43 .4byte .LASF2389 .byte 0x1 - .2byte 0xe0f + .2byte 0xe1b .4byte 0xbb86 .uleb128 0x4f .string "ret" .byte 0x1 - .2byte 0xe10 + .2byte 0xe1c .4byte 0xc6 .uleb128 0x56 .4byte .LASF957 .byte 0x1 - .2byte 0xe11 + .2byte 0xe1d .4byte 0xc6 - .4byte .LLST296 + .4byte .LLST304 .uleb128 0x57 .string "i" .byte 0x1 - .2byte 0xe12 + .2byte 0xe1e .4byte 0xc6 - .4byte .LLST297 + .4byte .LLST305 .uleb128 0x58 - .4byte 0x15c59 - .8byte .LBB1816 - .4byte .Ldebug_ranges0+0x1370 + .4byte 0x15e4a + .8byte .LBB1874 + .4byte .Ldebug_ranges0+0x1440 .byte 0x1 - .2byte 0xe14 - .4byte 0xeaa8 + .2byte 0xe20 + .4byte 0xea9a .uleb128 0x51 - .4byte 0x15c82 + .4byte 0x15e73 .uleb128 0x51 - .4byte 0x15c76 + .4byte 0x15e67 .uleb128 0x51 - .4byte 0x15c6a + .4byte 0x15e5b .uleb128 0x4b - .8byte .LVL1018 - .4byte 0x169c6 + .8byte .LVL1008 + .4byte 0x16bb7 .byte 0 .uleb128 0x50 - .4byte 0x15b36 - .8byte .LBB1820 - .8byte .LBE1820-.LBB1820 + .4byte 0x15d27 + .8byte .LBB1878 + .8byte .LBE1878-.LBB1878 .byte 0x1 - .2byte 0xe26 - .4byte 0xeae7 + .2byte 0xe32 + .4byte 0xead9 .uleb128 0x51 - .4byte 0x15b46 + .4byte 0x15d37 .uleb128 0x59 - .4byte 0x15c3b - .8byte .LBB1821 - .8byte .LBE1821-.LBB1821 + .4byte 0x15e2c + .8byte .LBB1879 + .8byte .LBE1879-.LBB1879 .byte 0xbd - .byte 0xd8 + .byte 0xdb .uleb128 0x51 - .4byte 0x15c4c + .4byte 0x15e3d .byte 0 .byte 0 .uleb128 0x50 - .4byte 0x15b58 - .8byte .LBB1823 - .8byte .LBE1823-.LBB1823 + .4byte 0x15d49 + .8byte .LBB1881 + .8byte .LBE1881-.LBB1881 .byte 0x1 - .2byte 0xe41 - .4byte 0xeb27 + .2byte 0xe4d + .4byte 0xeb19 .uleb128 0x51 - .4byte 0x15b69 + .4byte 0x15d5a .uleb128 0x5a - .4byte 0x15c3b - .8byte .LBB1824 - .8byte .LBE1824-.LBB1824 + .4byte 0x15e2c + .8byte .LBB1882 + .8byte .LBE1882-.LBB1882 .byte 0xa1 .2byte 0x166 .uleb128 0x51 - .4byte 0x15c4c + .4byte 0x15e3d .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x11df6 - .8byte .LBB1826 - .4byte .Ldebug_ranges0+0x13a0 + .4byte 0x12011 + .8byte .LBB1884 + .4byte .Ldebug_ranges0+0x1470 .byte 0x1 - .2byte 0xe55 - .4byte 0xf5f6 + .2byte 0xe61 + .4byte 0xf5e8 .uleb128 0x51 - .4byte 0x11e07 + .4byte 0x12022 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x13a0 + .4byte .Ldebug_ranges0+0x1470 .uleb128 0x54 - .4byte 0x11e13 + .4byte 0x1202e .uleb128 0x58 - .4byte 0x15b7c - .8byte .LBB1828 - .4byte .Ldebug_ranges0+0x13f0 - .byte 0x1 - .2byte 0xb26 - .4byte 0xebb7 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5c - .4byte 0x15bb1 - .8byte .LBB1829 - .4byte .Ldebug_ranges0+0x13f0 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x13f0 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1043 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1840 - .8byte .LBE1840-.LBB1840 + .4byte 0x15d6d + .8byte .LBB1886 + .4byte .Ldebug_ranges0+0x14c0 .byte 0x1 .2byte 0xb29 - .4byte 0xec34 + .4byte 0xeba9 .uleb128 0x51 - .4byte 0x15ba4 + .4byte 0x15d95 .uleb128 0x51 - .4byte 0x15b98 + .4byte 0x15d89 .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1841 - .8byte .LBE1841-.LBB1841 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1842 - .8byte .LBE1842-.LBB1842 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1044 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1843 - .8byte .LBE1843-.LBB1843 - .byte 0x1 - .2byte 0xb2c - .4byte 0xecb1 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1844 - .8byte .LBE1844-.LBB1844 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1845 - .8byte .LBE1845-.LBB1845 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1045 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1846 - .8byte .LBE1846-.LBB1846 - .byte 0x1 - .2byte 0xb2f - .4byte 0xed2e - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1847 - .8byte .LBE1847-.LBB1847 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1848 - .8byte .LBE1848-.LBB1848 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1046 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1849 - .8byte .LBE1849-.LBB1849 - .byte 0x1 - .2byte 0xb32 - .4byte 0xedab - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1850 - .8byte .LBE1850-.LBB1850 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1851 - .8byte .LBE1851-.LBB1851 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1047 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1852 - .8byte .LBE1852-.LBB1852 - .byte 0x1 - .2byte 0xb35 - .4byte 0xee28 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1853 - .8byte .LBE1853-.LBB1853 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1854 - .8byte .LBE1854-.LBB1854 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1048 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1855 - .8byte .LBE1855-.LBB1855 - .byte 0x1 - .2byte 0xb38 - .4byte 0xeea5 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1856 - .8byte .LBE1856-.LBB1856 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1857 - .8byte .LBE1857-.LBB1857 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1049 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1858 - .8byte .LBE1858-.LBB1858 - .byte 0x1 - .2byte 0xb3b - .4byte 0xef22 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1859 - .8byte .LBE1859-.LBB1859 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1860 - .8byte .LBE1860-.LBB1860 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1050 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1861 - .8byte .LBE1861-.LBB1861 - .byte 0x1 - .2byte 0xb3e - .4byte 0xef9f - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1862 - .8byte .LBE1862-.LBB1862 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1863 - .8byte .LBE1863-.LBB1863 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1051 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1864 - .8byte .LBE1864-.LBB1864 - .byte 0x1 - .2byte 0xb41 - .4byte 0xf01c - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1865 - .8byte .LBE1865-.LBB1865 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1866 - .8byte .LBE1866-.LBB1866 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1052 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1867 - .8byte .LBE1867-.LBB1867 - .byte 0x1 - .2byte 0xb44 - .4byte 0xf099 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1868 - .8byte .LBE1868-.LBB1868 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1869 - .8byte .LBE1869-.LBB1869 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1053 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1870 - .8byte .LBE1870-.LBB1870 - .byte 0x1 - .2byte 0xb47 - .4byte 0xf116 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1871 - .8byte .LBE1871-.LBB1871 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1872 - .8byte .LBE1872-.LBB1872 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1054 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1873 - .8byte .LBE1873-.LBB1873 - .byte 0x1 - .2byte 0xb4a - .4byte 0xf193 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1874 - .8byte .LBE1874-.LBB1874 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1875 - .8byte .LBE1875-.LBB1875 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1055 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1876 - .8byte .LBE1876-.LBB1876 - .byte 0x1 - .2byte 0xb4d - .4byte 0xf210 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1877 - .8byte .LBE1877-.LBB1877 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1878 - .8byte .LBE1878-.LBB1878 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1056 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1879 - .8byte .LBE1879-.LBB1879 - .byte 0x1 - .2byte 0xb50 - .4byte 0xf28d - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1880 - .8byte .LBE1880-.LBB1880 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1881 - .8byte .LBE1881-.LBB1881 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1057 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1882 - .8byte .LBE1882-.LBB1882 - .byte 0x1 - .2byte 0xb53 - .4byte 0xf30a - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1883 - .8byte .LBE1883-.LBB1883 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1884 - .8byte .LBE1884-.LBB1884 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1058 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1885 - .8byte .LBE1885-.LBB1885 - .byte 0x1 - .2byte 0xb56 - .4byte 0xf387 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1886 - .8byte .LBE1886-.LBB1886 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 + .4byte 0x15d7e + .uleb128 0x5c + .4byte 0x15da2 .8byte .LBB1887 - .8byte .LBE1887-.LBB1887 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1059 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1888 - .8byte .LBE1888-.LBB1888 - .byte 0x1 - .2byte 0xb59 - .4byte 0xf404 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1889 - .8byte .LBE1889-.LBB1889 + .4byte .Ldebug_ranges0+0x14c0 .byte 0xd .2byte 0x49c .uleb128 0x51 - .4byte 0x15be5 + .4byte 0x15dd6 .uleb128 0x51 - .4byte 0x15bd9 + .4byte 0x15dca .uleb128 0x51 - .4byte 0x15bcd + .4byte 0x15dbe .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1890 - .8byte .LBE1890-.LBB1890 + .4byte 0x15db3 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x14c0 .uleb128 0x54 - .4byte 0x15bf0 + .4byte 0x15de1 .uleb128 0x4b - .8byte .LVL1060 - .4byte 0x169d2 + .8byte .LVL1033 + .4byte 0x16bc3 .byte 0 .byte 0 .byte 0 .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1891 - .8byte .LBE1891-.LBB1891 - .byte 0x1 - .2byte 0xb5c - .4byte 0xf481 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1892 - .8byte .LBE1892-.LBB1892 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1893 - .8byte .LBE1893-.LBB1893 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1061 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1894 - .8byte .LBE1894-.LBB1894 - .byte 0x1 - .2byte 0xb5f - .4byte 0xf4fe - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1895 - .8byte .LBE1895-.LBB1895 - .byte 0xd - .2byte 0x49c - .uleb128 0x51 - .4byte 0x15be5 - .uleb128 0x51 - .4byte 0x15bd9 - .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 - .8byte .LBB1896 - .8byte .LBE1896-.LBB1896 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1062 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b7c - .8byte .LBB1897 - .8byte .LBE1897-.LBB1897 - .byte 0x1 - .2byte 0xb62 - .4byte 0xf57b - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 + .4byte 0x15d6d .8byte .LBB1898 .8byte .LBE1898-.LBB1898 - .byte 0xd - .2byte 0x49c + .byte 0x1 + .2byte 0xb2c + .4byte 0xec26 .uleb128 0x51 - .4byte 0x15be5 + .4byte 0x15d95 .uleb128 0x51 - .4byte 0x15bd9 + .4byte 0x15d89 .uleb128 0x51 - .4byte 0x15bcd - .uleb128 0x51 - .4byte 0x15bc2 - .uleb128 0x53 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 .8byte .LBB1899 .8byte .LBE1899-.LBB1899 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1063 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x5a - .4byte 0x15b7c - .8byte .LBB1900 - .8byte .LBE1900-.LBB1900 - .byte 0x1 - .2byte 0xb65 - .uleb128 0x51 - .4byte 0x15ba4 - .uleb128 0x51 - .4byte 0x15b98 - .uleb128 0x51 - .4byte 0x15b8d - .uleb128 0x5a - .4byte 0x15bb1 - .8byte .LBB1901 - .8byte .LBE1901-.LBB1901 .byte 0xd .2byte 0x49c .uleb128 0x51 - .4byte 0x15be5 + .4byte 0x15dd6 .uleb128 0x51 - .4byte 0x15bd9 + .4byte 0x15dca .uleb128 0x51 - .4byte 0x15bcd + .4byte 0x15dbe .uleb128 0x51 - .4byte 0x15bc2 + .4byte 0x15db3 .uleb128 0x53 + .8byte .LBB1900 + .8byte .LBE1900-.LBB1900 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1034 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1901 + .8byte .LBE1901-.LBB1901 + .byte 0x1 + .2byte 0xb2f + .4byte 0xeca3 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 .8byte .LBB1902 .8byte .LBE1902-.LBB1902 - .uleb128 0x54 - .4byte 0x15bf0 - .uleb128 0x4b - .8byte .LVL1064 - .4byte 0x169d2 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x58 - .4byte 0xff80 - .8byte .LBB1909 - .4byte .Ldebug_ranges0+0x1440 - .byte 0x1 - .2byte 0xe60 - .4byte 0xf6ef + .byte 0xd + .2byte 0x49c .uleb128 0x51 - .4byte 0xff91 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1440 - .uleb128 0x5d - .4byte 0xff9d - .4byte .LLST298 - .uleb128 0x54 - .4byte 0xffa9 - .uleb128 0x54 - .4byte 0xffb5 - .uleb128 0x54 - .4byte 0xffc1 - .uleb128 0x5e - .4byte 0xffcd - .uleb128 0x3 - .byte 0x91 - .sleb128 -104 - .uleb128 0x54 - .4byte 0xffd7 - .uleb128 0x54 - .4byte 0xffe3 - .uleb128 0x54 - .4byte 0xffef - .uleb128 0x54 - .4byte 0xfff9 - .uleb128 0x58 - .4byte 0x15c8f - .8byte .LBB1911 - .4byte .Ldebug_ranges0+0x14d0 - .byte 0x1 - .2byte 0xd39 - .4byte 0xf66b + .4byte 0x15dd6 .uleb128 0x51 - .4byte 0x15c9f - .byte 0 - .uleb128 0x4b - .8byte .LVL1066 - .4byte 0x169de - .uleb128 0x4b - .8byte .LVL1067 - .4byte 0x169ea - .uleb128 0x4b - .8byte .LVL1068 - .4byte 0x169f5 - .uleb128 0x4b - .8byte .LVL1069 - .4byte 0x16a00 - .uleb128 0x4b - .8byte .LVL1070 - .4byte 0x16a0b - .uleb128 0x4b - .8byte .LVL1071 - .4byte 0x16a0b - .uleb128 0x4b - .8byte .LVL1072 - .4byte 0x16a15 - .uleb128 0x4b - .8byte .LVL1147 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1188 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1198 - .4byte 0x16a20 - .byte 0 - .byte 0 - .uleb128 0x58 - .4byte 0x10006 - .8byte .LBB1924 - .4byte .Ldebug_ranges0+0x1500 - .byte 0x1 - .2byte 0xe67 - .4byte 0xf7c8 + .4byte 0x15dca .uleb128 0x51 - .4byte 0x10017 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1500 - .uleb128 0x54 - .4byte 0x10023 - .uleb128 0x5d - .4byte 0x1002f - .4byte .LLST299 - .uleb128 0x54 - .4byte 0x1003b - .uleb128 0x5e - .4byte 0x10047 - .uleb128 0x3 - .byte 0x91 - .sleb128 -104 - .uleb128 0x5d - .4byte 0x10051 - .4byte .LLST300 - .uleb128 0x54 - .4byte 0x1005d - .uleb128 0x54 - .4byte 0x10069 - .uleb128 0x58 - .4byte 0x15c8f - .8byte .LBB1926 - .4byte .Ldebug_ranges0+0x1560 - .byte 0x1 - .2byte 0xd08 - .4byte 0xf75e + .4byte 0x15dbe .uleb128 0x51 - .4byte 0x15c9f - .byte 0 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1903 + .8byte .LBE1903-.LBB1903 + .uleb128 0x54 + .4byte 0x15de1 .uleb128 0x4b - .8byte .LVL1074 - .4byte 0x169de - .uleb128 0x4b - .8byte .LVL1075 - .4byte 0x169ea - .uleb128 0x4b - .8byte .LVL1086 - .4byte 0x169f5 - .uleb128 0x4b - .8byte .LVL1087 - .4byte 0x16a2c - .uleb128 0x4b - .8byte .LVL1180 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1181 - .4byte 0x16a37 - .uleb128 0x4b - .8byte .LVL1182 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1204 - .4byte 0x16a20 + .8byte .LVL1035 + .4byte 0x16bc3 .byte 0 .byte 0 - .uleb128 0x58 - .4byte 0xff48 - .8byte .LBB1935 - .4byte .Ldebug_ranges0+0x1590 - .byte 0x1 - .2byte 0xe6e - .4byte 0xf984 - .uleb128 0x51 - .4byte 0xff59 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1590 - .uleb128 0x5e - .4byte 0xff65 - .uleb128 0x3 - .byte 0x91 - .sleb128 -104 + .byte 0 .uleb128 0x50 - .4byte 0x15ed2 + .4byte 0x15d6d + .8byte .LBB1904 + .8byte .LBE1904-.LBB1904 + .byte 0x1 + .2byte 0xb32 + .4byte 0xed20 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1905 + .8byte .LBE1905-.LBB1905 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1906 + .8byte .LBE1906-.LBB1906 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1036 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1907 + .8byte .LBE1907-.LBB1907 + .byte 0x1 + .2byte 0xb35 + .4byte 0xed9d + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1908 + .8byte .LBE1908-.LBB1908 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1909 + .8byte .LBE1909-.LBB1909 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1037 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1910 + .8byte .LBE1910-.LBB1910 + .byte 0x1 + .2byte 0xb38 + .4byte 0xee1a + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1911 + .8byte .LBE1911-.LBB1911 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1912 + .8byte .LBE1912-.LBB1912 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1038 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1913 + .8byte .LBE1913-.LBB1913 + .byte 0x1 + .2byte 0xb3b + .4byte 0xee97 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1914 + .8byte .LBE1914-.LBB1914 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1915 + .8byte .LBE1915-.LBB1915 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1039 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1916 + .8byte .LBE1916-.LBB1916 + .byte 0x1 + .2byte 0xb3e + .4byte 0xef14 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1917 + .8byte .LBE1917-.LBB1917 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1918 + .8byte .LBE1918-.LBB1918 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1040 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1919 + .8byte .LBE1919-.LBB1919 + .byte 0x1 + .2byte 0xb41 + .4byte 0xef91 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1920 + .8byte .LBE1920-.LBB1920 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1921 + .8byte .LBE1921-.LBB1921 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1041 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1922 + .8byte .LBE1922-.LBB1922 + .byte 0x1 + .2byte 0xb44 + .4byte 0xf00e + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1923 + .8byte .LBE1923-.LBB1923 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1924 + .8byte .LBE1924-.LBB1924 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1042 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1925 + .8byte .LBE1925-.LBB1925 + .byte 0x1 + .2byte 0xb47 + .4byte 0xf08b + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1926 + .8byte .LBE1926-.LBB1926 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1927 + .8byte .LBE1927-.LBB1927 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1043 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1928 + .8byte .LBE1928-.LBB1928 + .byte 0x1 + .2byte 0xb4a + .4byte 0xf108 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1929 + .8byte .LBE1929-.LBB1929 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1930 + .8byte .LBE1930-.LBB1930 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1044 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1931 + .8byte .LBE1931-.LBB1931 + .byte 0x1 + .2byte 0xb4d + .4byte 0xf185 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1932 + .8byte .LBE1932-.LBB1932 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1933 + .8byte .LBE1933-.LBB1933 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1045 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1934 + .8byte .LBE1934-.LBB1934 + .byte 0x1 + .2byte 0xb50 + .4byte 0xf202 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1935 + .8byte .LBE1935-.LBB1935 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1936 + .8byte .LBE1936-.LBB1936 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1046 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d .8byte .LBB1937 .8byte .LBE1937-.LBB1937 .byte 0x1 - .2byte 0xd75 - .4byte 0xf83e + .2byte 0xb53 + .4byte 0xf27f .uleb128 0x51 - .4byte 0x15ee7 + .4byte 0x15d95 .uleb128 0x51 - .4byte 0x15ede - .uleb128 0x53 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 .8byte .LBB1938 .8byte .LBE1938-.LBB1938 - .uleb128 0x5d - .4byte 0x15ef0 - .4byte .LLST301 - .uleb128 0x5d - .4byte 0x15efa - .4byte .LLST302 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15ed2 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 .8byte .LBB1939 .8byte .LBE1939-.LBB1939 - .byte 0x1 - .2byte 0xd7e - .4byte 0xf889 - .uleb128 0x51 - .4byte 0x15ee7 - .uleb128 0x51 - .4byte 0x15ede - .uleb128 0x53 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1047 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d .8byte .LBB1940 .8byte .LBE1940-.LBB1940 - .uleb128 0x5d - .4byte 0x15ef0 - .4byte .LLST303 - .uleb128 0x5d - .4byte 0x15efa - .4byte .LLST304 - .byte 0 - .byte 0 - .uleb128 0x5f + .byte 0x1 + .2byte 0xb56 + .4byte 0xf2fc + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 .8byte .LBB1941 .8byte .LBE1941-.LBB1941 - .4byte 0xf8c2 - .uleb128 0x5d - .4byte 0xff72 - .4byte .LLST305 - .uleb128 0x4b - .8byte .LVL1101 - .4byte 0x16a42 - .uleb128 0x4b - .8byte .LVL1103 - .4byte 0x16a4d - .byte 0 - .uleb128 0x50 - .4byte 0x15ed2 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 .8byte .LBB1942 .8byte .LBE1942-.LBB1942 - .byte 0x1 - .2byte 0xd89 - .4byte 0xf90d - .uleb128 0x51 - .4byte 0x15ee7 - .uleb128 0x51 - .4byte 0x15ede - .uleb128 0x53 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1048 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d .8byte .LBB1943 .8byte .LBE1943-.LBB1943 - .uleb128 0x5d - .4byte 0x15ef0 - .4byte .LLST306 - .uleb128 0x5d - .4byte 0x15efa - .4byte .LLST307 + .byte 0x1 + .2byte 0xb59 + .4byte 0xf379 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1944 + .8byte .LBE1944-.LBB1944 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1945 + .8byte .LBE1945-.LBB1945 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1049 + .4byte 0x16bc3 .byte 0 - .byte 0 - .uleb128 0x4b - .8byte .LVL1088 - .4byte 0x16a42 - .uleb128 0x4b - .8byte .LVL1089 - .4byte 0x16a59 - .uleb128 0x4b - .8byte .LVL1094 - .4byte 0x16a42 - .uleb128 0x4b - .8byte .LVL1095 - .4byte 0x16a59 - .uleb128 0x4b - .8byte .LVL1100 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1104 - .4byte 0x16a59 - .uleb128 0x4b - .8byte .LVL1183 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1186 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1191 - .4byte 0x16a20 .byte 0 .byte 0 .uleb128 0x50 - .4byte 0xff2e + .4byte 0x15d6d + .8byte .LBB1946 + .8byte .LBE1946-.LBB1946 + .byte 0x1 + .2byte 0xb5c + .4byte 0xf3f6 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 .8byte .LBB1947 .8byte .LBE1947-.LBB1947 - .byte 0x1 - .2byte 0xe75 - .4byte 0xfa1e + .byte 0xd + .2byte 0x49c .uleb128 0x51 - .4byte 0xff3b - .uleb128 0x58 - .4byte 0x158c2 - .8byte .LBB1949 - .4byte .Ldebug_ranges0+0x15e0 - .byte 0x1 - .2byte 0xda0 - .4byte 0xf9e9 + .4byte 0x15dd6 .uleb128 0x51 - .4byte 0x158e4 + .4byte 0x15dca .uleb128 0x51 - .4byte 0x158d9 + .4byte 0x15dbe .uleb128 0x51 - .4byte 0x158ce - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x15e0 - .uleb128 0x5d - .4byte 0x158ef - .4byte .LLST308 - .uleb128 0x4b - .8byte .LVL1110 - .4byte 0x16a65 - .byte 0 - .byte 0 - .uleb128 0x4b - .8byte .LVL1111 - .4byte 0x16a70 - .uleb128 0x4b - .8byte .LVL1112 - .4byte 0x16a7b - .uleb128 0x4b - .8byte .LVL1113 - .4byte 0x16a70 - .uleb128 0x4b - .8byte .LVL1114 - .4byte 0x16a7b - .byte 0 - .uleb128 0x58 - .4byte 0xfe8c - .8byte .LBB1957 - .4byte .Ldebug_ranges0+0x1630 - .byte 0x1 - .2byte 0xe78 - .4byte 0xfcc1 - .uleb128 0x51 - .4byte 0xfea9 - .uleb128 0x51 - .4byte 0xfe9d - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1630 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1948 + .8byte .LBE1948-.LBB1948 .uleb128 0x54 - .4byte 0xfeb5 - .uleb128 0x5d - .4byte 0xfec1 - .4byte .LLST309 - .uleb128 0x5d - .4byte 0xfecd - .4byte .LLST310 - .uleb128 0x5d - .4byte 0xfed9 - .4byte .LLST311 - .uleb128 0x5d - .4byte 0xfee5 - .4byte .LLST312 - .uleb128 0x5d - .4byte 0xfef1 - .4byte .LLST313 - .uleb128 0x5d - .4byte 0xfefd - .4byte .LLST314 - .uleb128 0x54 - .4byte 0xff09 - .uleb128 0x5d - .4byte 0xff15 - .4byte .LLST315 - .uleb128 0x5d - .4byte 0xff21 - .4byte .LLST316 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1050 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 .uleb128 0x50 - .4byte 0x11ea0 + .4byte 0x15d6d + .8byte .LBB1949 + .8byte .LBE1949-.LBB1949 + .byte 0x1 + .2byte 0xb5f + .4byte 0xf473 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1950 + .8byte .LBE1950-.LBB1950 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1951 + .8byte .LBE1951-.LBB1951 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1051 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1952 + .8byte .LBE1952-.LBB1952 + .byte 0x1 + .2byte 0xb62 + .4byte 0xf4f0 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1953 + .8byte .LBE1953-.LBB1953 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1954 + .8byte .LBE1954-.LBB1954 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1052 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d6d + .8byte .LBB1955 + .8byte .LBE1955-.LBB1955 + .byte 0x1 + .2byte 0xb65 + .4byte 0xf56d + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 + .8byte .LBB1956 + .8byte .LBE1956-.LBB1956 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 + .uleb128 0x53 + .8byte .LBB1957 + .8byte .LBE1957-.LBB1957 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1053 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x5a + .4byte 0x15d6d + .8byte .LBB1958 + .8byte .LBE1958-.LBB1958 + .byte 0x1 + .2byte 0xb68 + .uleb128 0x51 + .4byte 0x15d95 + .uleb128 0x51 + .4byte 0x15d89 + .uleb128 0x51 + .4byte 0x15d7e + .uleb128 0x5a + .4byte 0x15da2 .8byte .LBB1959 .8byte .LBE1959-.LBB1959 - .byte 0x1 - .2byte 0xdd8 - .4byte 0xfb00 + .byte 0xd + .2byte 0x49c .uleb128 0x51 - .4byte 0x11eb1 + .4byte 0x15dd6 .uleb128 0x51 - .4byte 0x11eb1 + .4byte 0x15dca + .uleb128 0x51 + .4byte 0x15dbe + .uleb128 0x51 + .4byte 0x15db3 .uleb128 0x53 .8byte .LBB1960 .8byte .LBE1960-.LBB1960 + .uleb128 0x54 + .4byte 0x15de1 + .uleb128 0x4b + .8byte .LVL1054 + .4byte 0x16bc3 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0xff72 + .8byte .LBB1967 + .4byte .Ldebug_ranges0+0x1510 + .byte 0x1 + .2byte 0xe6c + .4byte 0xf6e1 + .uleb128 0x51 + .4byte 0xff83 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1510 .uleb128 0x5d - .4byte 0x11ebd - .4byte .LLST317 - .uleb128 0x4b - .8byte .LVL1129 - .4byte 0x16a86 - .uleb128 0x4b - .8byte .LVL1131 - .4byte 0x16a15 - .uleb128 0x4b - .8byte .LVL1132 - .4byte 0x16a91 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15a3f - .8byte .LBB1961 - .8byte .LBE1961-.LBB1961 + .4byte 0xff8f + .4byte .LLST306 + .uleb128 0x54 + .4byte 0xff9b + .uleb128 0x54 + .4byte 0xffa7 + .uleb128 0x54 + .4byte 0xffb3 + .uleb128 0x5e + .4byte 0xffbf + .uleb128 0x3 + .byte 0x91 + .sleb128 -104 + .uleb128 0x54 + .4byte 0xffc9 + .uleb128 0x54 + .4byte 0xffd5 + .uleb128 0x54 + .4byte 0xffe1 + .uleb128 0x54 + .4byte 0xffeb + .uleb128 0x58 + .4byte 0x15e80 + .8byte .LBB1969 + .4byte .Ldebug_ranges0+0x1590 .byte 0x1 - .2byte 0xdcc - .4byte 0xfb57 + .2byte 0xd46 + .4byte 0xf65d .uleb128 0x51 - .4byte 0x15a5c - .uleb128 0x51 - .4byte 0x15a50 - .uleb128 0x5a - .4byte 0x15a69 - .8byte .LBB1962 - .8byte .LBE1962-.LBB1962 - .byte 0x10 - .2byte 0x2e7 - .uleb128 0x51 - .4byte 0x15a86 - .uleb128 0x51 - .4byte 0x15a7a - .uleb128 0x4b - .8byte .LVL1153 - .4byte 0x16a9c - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15a3f - .8byte .LBB1964 - .8byte .LBE1964-.LBB1964 - .byte 0x1 - .2byte 0xdbe - .4byte 0xfbae - .uleb128 0x51 - .4byte 0x15a5c - .uleb128 0x51 - .4byte 0x15a50 - .uleb128 0x5a - .4byte 0x15a69 - .8byte .LBB1965 - .8byte .LBE1965-.LBB1965 - .byte 0x10 - .2byte 0x2e7 - .uleb128 0x51 - .4byte 0x15a86 - .uleb128 0x51 - .4byte 0x15a7a - .uleb128 0x4b - .8byte .LVL1159 - .4byte 0x16a9c - .byte 0 + .4byte 0x15e90 .byte 0 .uleb128 0x4b - .8byte .LVL1116 - .4byte 0x16aa8 + .8byte .LVL1056 + .4byte 0x16bcf .uleb128 0x4b - .8byte .LVL1118 - .4byte 0x16aa8 + .8byte .LVL1057 + .4byte 0x16bdb .uleb128 0x4b - .8byte .LVL1120 - .4byte 0x16ab3 + .8byte .LVL1058 + .4byte 0x16be6 .uleb128 0x4b - .8byte .LVL1124 - .4byte 0x16ab3 + .8byte .LVL1059 + .4byte 0x16bf1 .uleb128 0x4b - .8byte .LVL1127 - .4byte 0x169af + .8byte .LVL1060 + .4byte 0x16bfc .uleb128 0x4b - .8byte .LVL1128 - .4byte 0x16abf - .uleb128 0x4b - .8byte .LVL1133 - .4byte 0x16aca - .uleb128 0x4b - .8byte .LVL1134 - .4byte 0x16aca - .uleb128 0x4b - .8byte .LVL1150 - .4byte 0x16ad5 - .uleb128 0x4b - .8byte .LVL1152 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1156 - .4byte 0x16ae0 - .uleb128 0x4b - .8byte .LVL1158 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1163 - .4byte 0x16ae0 - .uleb128 0x4b - .8byte .LVL1166 - .4byte 0x16a86 - .uleb128 0x4b - .8byte .LVL1168 - .4byte 0x16ae0 - .uleb128 0x4b - .8byte .LVL1169 - .4byte 0x16a91 - .uleb128 0x4b - .8byte .LVL1172 - .4byte 0x16a86 - .uleb128 0x4b - .8byte .LVL1174 - .4byte 0x16ae0 - .uleb128 0x4b - .8byte .LVL1175 - .4byte 0x16a91 - .uleb128 0x4b - .8byte .LVL1201 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1209 - .4byte 0x16a20 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x15b13 - .8byte .LBB1971 - .8byte .LBE1971-.LBB1971 - .byte 0x1 - .2byte 0xe7a - .4byte 0xfd0a - .uleb128 0x51 - .4byte 0x15b2a - .uleb128 0x51 - .4byte 0x15b1f - .uleb128 0x59 - .4byte 0x15c15 - .8byte .LBB1972 - .8byte .LBE1972-.LBB1972 - .byte 0xbd - .byte 0xde - .uleb128 0x51 - .4byte 0x15c2e - .uleb128 0x51 - .4byte 0x15c22 - .byte 0 - .byte 0 - .uleb128 0x50 - .4byte 0x1008c - .8byte .LBB1974 - .8byte .LBE1974-.LBB1974 - .byte 0x1 - .2byte 0xe7d - .4byte 0xfdae - .uleb128 0x51 - .4byte 0x1009d - .uleb128 0x4b - .8byte .LVL1135 - .4byte 0x16aea + .8byte .LVL1061 + .4byte 0x16bfc .uleb128 0x4b .8byte .LVL1136 - .4byte 0x16aea + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL1137 - .4byte 0x16af5 - .uleb128 0x4b - .8byte .LVL1138 - .4byte 0x16af5 - .uleb128 0x4b - .8byte .LVL1139 - .4byte 0x16af5 - .uleb128 0x4b - .8byte .LVL1140 - .4byte 0x16af5 - .uleb128 0x4b - .8byte .LVL1141 - .4byte 0x16af5 - .uleb128 0x4b - .8byte .LVL1142 - .4byte 0x16af5 - .uleb128 0x4b - .8byte .LVL1143 - .4byte 0x16af5 - .uleb128 0x4b - .8byte .LVL1144 - .4byte 0x16af5 - .byte 0 - .uleb128 0x4b - .8byte .LVL1019 - .4byte 0x169de - .uleb128 0x4b - .8byte .LVL1020 - .4byte 0x16b01 - .uleb128 0x4b - .8byte .LVL1022 - .4byte 0x16b0c - .uleb128 0x4b - .8byte .LVL1028 - .4byte 0x16b18 - .uleb128 0x4b - .8byte .LVL1031 - .4byte 0x16b24 - .uleb128 0x4b - .8byte .LVL1032 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1040 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1076 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1078 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1081 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1083 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1145 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1148 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1178 - .4byte 0x16a20 + .8byte .LVL1173 + .4byte 0x16c06 .uleb128 0x4b .8byte .LVL1184 - .4byte 0x16a20 + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL1194 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1203 - .4byte 0x16b30 + .8byte .LVL1190 + .4byte 0x16c06 .byte 0 - .uleb128 0x60 - .4byte .LASF3041 + .byte 0 + .uleb128 0x58 + .4byte 0xfff8 + .8byte .LBB1979 + .4byte .Ldebug_ranges0+0x15c0 + .byte 0x1 + .2byte 0xe73 + .4byte 0xf7ba + .uleb128 0x51 + .4byte 0x10009 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x15c0 + .uleb128 0x54 + .4byte 0x10015 + .uleb128 0x5d + .4byte 0x10021 + .4byte .LLST307 + .uleb128 0x54 + .4byte 0x1002d + .uleb128 0x5e + .4byte 0x10039 + .uleb128 0x3 + .byte 0x91 + .sleb128 -104 + .uleb128 0x5d + .4byte 0x10043 + .4byte .LLST308 + .uleb128 0x54 + .4byte 0x1004f + .uleb128 0x54 + .4byte 0x1005b + .uleb128 0x58 + .4byte 0x15e80 + .8byte .LBB1981 + .4byte .Ldebug_ranges0+0x1620 + .byte 0x1 + .2byte 0xd10 + .4byte 0xf750 + .uleb128 0x51 + .4byte 0x15e90 + .byte 0 + .uleb128 0x4b + .8byte .LVL1063 + .4byte 0x16bcf + .uleb128 0x4b + .8byte .LVL1064 + .4byte 0x16bdb + .uleb128 0x4b + .8byte .LVL1075 + .4byte 0x16be6 + .uleb128 0x4b + .8byte .LVL1076 + .4byte 0x16c12 + .uleb128 0x4b + .8byte .LVL1169 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1170 + .4byte 0x16c1d + .uleb128 0x4b + .8byte .LVL1171 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1201 + .4byte 0x16c06 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0xff3a + .8byte .LBB1990 + .4byte .Ldebug_ranges0+0x1650 + .byte 0x1 + .2byte 0xe7a + .4byte 0xf976 + .uleb128 0x51 + .4byte 0xff4b + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1650 + .uleb128 0x5e + .4byte 0xff57 + .uleb128 0x3 + .byte 0x91 + .sleb128 -104 + .uleb128 0x50 + .4byte 0x160c3 + .8byte .LBB1992 + .8byte .LBE1992-.LBB1992 + .byte 0x1 + .2byte 0xd80 + .4byte 0xf830 + .uleb128 0x51 + .4byte 0x160d8 + .uleb128 0x51 + .4byte 0x160cf + .uleb128 0x53 + .8byte .LBB1993 + .8byte .LBE1993-.LBB1993 + .uleb128 0x5d + .4byte 0x160e1 + .4byte .LLST309 + .uleb128 0x5d + .4byte 0x160eb + .4byte .LLST310 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x160c3 + .8byte .LBB1994 + .8byte .LBE1994-.LBB1994 + .byte 0x1 + .2byte 0xd89 + .4byte 0xf87b + .uleb128 0x51 + .4byte 0x160d8 + .uleb128 0x51 + .4byte 0x160cf + .uleb128 0x53 + .8byte .LBB1995 + .8byte .LBE1995-.LBB1995 + .uleb128 0x5d + .4byte 0x160e1 + .4byte .LLST311 + .uleb128 0x5d + .4byte 0x160eb + .4byte .LLST312 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1996 + .8byte .LBE1996-.LBB1996 + .4byte 0xf8b4 + .uleb128 0x5d + .4byte 0xff64 + .4byte .LLST313 + .uleb128 0x4b + .8byte .LVL1090 + .4byte 0x16c28 + .uleb128 0x4b + .8byte .LVL1092 + .4byte 0x16c33 + .byte 0 + .uleb128 0x50 + .4byte 0x160c3 + .8byte .LBB1997 + .8byte .LBE1997-.LBB1997 + .byte 0x1 + .2byte 0xd94 + .4byte 0xf8ff + .uleb128 0x51 + .4byte 0x160d8 + .uleb128 0x51 + .4byte 0x160cf + .uleb128 0x53 + .8byte .LBB1998 + .8byte .LBE1998-.LBB1998 + .uleb128 0x5d + .4byte 0x160e1 + .4byte .LLST314 + .uleb128 0x5d + .4byte 0x160eb + .4byte .LLST315 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1077 + .4byte 0x16c28 + .uleb128 0x4b + .8byte .LVL1078 + .4byte 0x16c3f + .uleb128 0x4b + .8byte .LVL1083 + .4byte 0x16c28 + .uleb128 0x4b + .8byte .LVL1084 + .4byte 0x16c3f + .uleb128 0x4b + .8byte .LVL1089 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1093 + .4byte 0x16c3f + .uleb128 0x4b + .8byte .LVL1175 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1178 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1182 + .4byte 0x16c06 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0xff20 + .8byte .LBB2002 + .8byte .LBE2002-.LBB2002 + .byte 0x1 + .2byte 0xe81 + .4byte 0xfa10 + .uleb128 0x51 + .4byte 0xff2d + .uleb128 0x58 + .4byte 0x15ab3 + .8byte .LBB2004 + .4byte .Ldebug_ranges0+0x16a0 .byte 0x1 .2byte 0xdac + .4byte 0xf9db + .uleb128 0x51 + .4byte 0x15ad5 + .uleb128 0x51 + .4byte 0x15aca + .uleb128 0x51 + .4byte 0x15abf + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x16a0 + .uleb128 0x5d + .4byte 0x15ae0 + .4byte .LLST316 + .uleb128 0x4b + .8byte .LVL1099 + .4byte 0x16c4b + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1100 + .4byte 0x16c56 + .uleb128 0x4b + .8byte .LVL1101 + .4byte 0x16c61 + .uleb128 0x4b + .8byte .LVL1102 + .4byte 0x16c56 + .uleb128 0x4b + .8byte .LVL1103 + .4byte 0x16c61 + .byte 0 + .uleb128 0x58 + .4byte 0xfe7e + .8byte .LBB2008 + .4byte .Ldebug_ranges0+0x16d0 + .byte 0x1 + .2byte 0xe84 + .4byte 0xfcb3 + .uleb128 0x51 + .4byte 0xfe9b + .uleb128 0x51 + .4byte 0xfe8f + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x16d0 + .uleb128 0x54 + .4byte 0xfea7 + .uleb128 0x5d + .4byte 0xfeb3 + .4byte .LLST317 + .uleb128 0x5d + .4byte 0xfebf + .4byte .LLST318 + .uleb128 0x5d + .4byte 0xfecb + .4byte .LLST319 + .uleb128 0x5d + .4byte 0xfed7 + .4byte .LLST320 + .uleb128 0x5d + .4byte 0xfee3 + .4byte .LLST321 + .uleb128 0x5d + .4byte 0xfeef + .4byte .LLST322 + .uleb128 0x54 + .4byte 0xfefb + .uleb128 0x5d + .4byte 0xff07 + .4byte .LLST323 + .uleb128 0x5d + .4byte 0xff13 + .4byte .LLST324 + .uleb128 0x50 + .4byte 0x120bb + .8byte .LBB2010 + .8byte .LBE2010-.LBB2010 + .byte 0x1 + .2byte 0xde4 + .4byte 0xfaf2 + .uleb128 0x51 + .4byte 0x120cc + .uleb128 0x51 + .4byte 0x120cc + .uleb128 0x53 + .8byte .LBB2011 + .8byte .LBE2011-.LBB2011 + .uleb128 0x5d + .4byte 0x120d8 + .4byte .LLST325 + .uleb128 0x4b + .8byte .LVL1118 + .4byte 0x16c6c + .uleb128 0x4b + .8byte .LVL1120 + .4byte 0x16c77 + .uleb128 0x4b + .8byte .LVL1121 + .4byte 0x16c82 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15c30 + .8byte .LBB2012 + .8byte .LBE2012-.LBB2012 + .byte 0x1 + .2byte 0xdca + .4byte 0xfb49 + .uleb128 0x51 + .4byte 0x15c4d + .uleb128 0x51 + .4byte 0x15c41 + .uleb128 0x5a + .4byte 0x15c5a + .8byte .LBB2013 + .8byte .LBE2013-.LBB2013 + .byte 0x10 + .2byte 0x2e7 + .uleb128 0x51 + .4byte 0x15c77 + .uleb128 0x51 + .4byte 0x15c6b + .uleb128 0x4b + .8byte .LVL1142 + .4byte 0x16c8d + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15c30 + .8byte .LBB2015 + .8byte .LBE2015-.LBB2015 + .byte 0x1 + .2byte 0xdd8 + .4byte 0xfba0 + .uleb128 0x51 + .4byte 0x15c4d + .uleb128 0x51 + .4byte 0x15c41 + .uleb128 0x5a + .4byte 0x15c5a + .8byte .LBB2016 + .8byte .LBE2016-.LBB2016 + .byte 0x10 + .2byte 0x2e7 + .uleb128 0x51 + .4byte 0x15c77 + .uleb128 0x51 + .4byte 0x15c6b + .uleb128 0x4b + .8byte .LVL1155 + .4byte 0x16c8d + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1105 + .4byte 0x16c99 + .uleb128 0x4b + .8byte .LVL1107 + .4byte 0x16c99 + .uleb128 0x4b + .8byte .LVL1109 + .4byte 0x16ca4 + .uleb128 0x4b + .8byte .LVL1113 + .4byte 0x16ca4 + .uleb128 0x4b + .8byte .LVL1116 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1117 + .4byte 0x16cb0 + .uleb128 0x4b + .8byte .LVL1122 + .4byte 0x16cbb + .uleb128 0x4b + .8byte .LVL1123 + .4byte 0x16cbb + .uleb128 0x4b + .8byte .LVL1139 + .4byte 0x16cc6 + .uleb128 0x4b + .8byte .LVL1141 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1146 + .4byte 0x16cd1 + .uleb128 0x4b + .8byte .LVL1149 + .4byte 0x16c6c + .uleb128 0x4b + .8byte .LVL1151 + .4byte 0x16cd1 + .uleb128 0x4b + .8byte .LVL1152 + .4byte 0x16c82 + .uleb128 0x4b + .8byte .LVL1154 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1158 + .4byte 0x16cd1 + .uleb128 0x4b + .8byte .LVL1161 + .4byte 0x16c6c + .uleb128 0x4b + .8byte .LVL1163 + .4byte 0x16cd1 + .uleb128 0x4b + .8byte .LVL1164 + .4byte 0x16c82 + .uleb128 0x4b + .8byte .LVL1196 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1199 + .4byte 0x16c06 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15d04 + .8byte .LBB2021 + .8byte .LBE2021-.LBB2021 + .byte 0x1 + .2byte 0xe86 + .4byte 0xfcfc + .uleb128 0x51 + .4byte 0x15d1b + .uleb128 0x51 + .4byte 0x15d10 + .uleb128 0x59 + .4byte 0x15e06 + .8byte .LBB2022 + .8byte .LBE2022-.LBB2022 + .byte 0xbd + .byte 0xe1 + .uleb128 0x51 + .4byte 0x15e1f + .uleb128 0x51 + .4byte 0x15e13 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x1007e + .8byte .LBB2024 + .8byte .LBE2024-.LBB2024 + .byte 0x1 + .2byte 0xe89 + .4byte 0xfda0 + .uleb128 0x51 + .4byte 0x1008f + .uleb128 0x4b + .8byte .LVL1124 + .4byte 0x16cdb + .uleb128 0x4b + .8byte .LVL1125 + .4byte 0x16cdb + .uleb128 0x4b + .8byte .LVL1126 + .4byte 0x16ce6 + .uleb128 0x4b + .8byte .LVL1127 + .4byte 0x16ce6 + .uleb128 0x4b + .8byte .LVL1128 + .4byte 0x16ce6 + .uleb128 0x4b + .8byte .LVL1129 + .4byte 0x16ce6 + .uleb128 0x4b + .8byte .LVL1130 + .4byte 0x16ce6 + .uleb128 0x4b + .8byte .LVL1131 + .4byte 0x16ce6 + .uleb128 0x4b + .8byte .LVL1132 + .4byte 0x16ce6 + .uleb128 0x4b + .8byte .LVL1133 + .4byte 0x16ce6 + .byte 0 + .uleb128 0x4b + .8byte .LVL1009 + .4byte 0x16bcf + .uleb128 0x4b + .8byte .LVL1010 + .4byte 0x16cf2 + .uleb128 0x4b + .8byte .LVL1012 + .4byte 0x16cfd + .uleb128 0x4b + .8byte .LVL1018 + .4byte 0x16d09 + .uleb128 0x4b + .8byte .LVL1021 + .4byte 0x16d15 + .uleb128 0x4b + .8byte .LVL1022 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1030 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1065 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1067 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1070 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1072 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1134 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1137 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1167 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1176 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1186 + .4byte 0x16c06 + .uleb128 0x4b + .8byte .LVL1192 + .4byte 0x16d21 + .byte 0 + .uleb128 0x60 + .4byte .LASF3040 + .byte 0x1 + .2byte 0xdb8 .4byte 0xc6 .byte 0x1 - .4byte 0xff2e + .4byte 0xff20 .uleb128 0x61 .string "ebc" .byte 0x1 - .2byte 0xdac - .4byte 0xe4e5 + .2byte 0xdb8 + .4byte 0xe4d7 .uleb128 0x62 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0xdac + .2byte 0xdb8 .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0xdae - .4byte 0xe82d + .2byte 0xdba + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF3032 + .byte 0x1 + .2byte 0xdbb + .4byte 0x6d .uleb128 0x43 .4byte .LASF3033 .byte 0x1 - .2byte 0xdaf + .2byte 0xdbc .4byte 0x6d .uleb128 0x43 .4byte .LASF3034 .byte 0x1 - .2byte 0xdb0 - .4byte 0x6d + .2byte 0xdbd + .4byte 0xc6 .uleb128 0x43 .4byte .LASF3035 .byte 0x1 - .2byte 0xdb1 + .2byte 0xdbe .4byte 0xc6 .uleb128 0x43 .4byte .LASF3036 .byte 0x1 - .2byte 0xdb2 - .4byte 0xc6 + .2byte 0xdbf + .4byte 0x21e .uleb128 0x43 .4byte .LASF3037 .byte 0x1 - .2byte 0xdb3 - .4byte 0x21e - .uleb128 0x43 - .4byte .LASF3038 - .byte 0x1 - .2byte 0xdb4 + .2byte 0xdc0 .4byte 0x21e .uleb128 0x4f .string "buf" .byte 0x1 - .2byte 0xdb5 - .4byte 0xe480 + .2byte 0xdc1 + .4byte 0xe472 + .uleb128 0x43 + .4byte .LASF3038 + .byte 0x1 + .2byte 0xdc2 + .4byte 0x458 .uleb128 0x43 .4byte .LASF3039 .byte 0x1 - .2byte 0xdb6 - .4byte 0x458 - .uleb128 0x43 - .4byte .LASF3040 - .byte 0x1 - .2byte 0xdb7 + .2byte 0xdc3 .4byte 0x458 .byte 0 .uleb128 0x63 - .4byte .LASF3061 + .4byte .LASF3060 .byte 0x1 - .2byte 0xd8e + .2byte 0xd99 .byte 0x1 - .4byte 0xff48 + .4byte 0xff3a .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0xd8e - .4byte 0xe82d + .2byte 0xd99 + .4byte 0xe81f .byte 0 .uleb128 0x60 - .4byte .LASF3042 + .4byte .LASF3041 .byte 0x1 - .2byte 0xd6b + .2byte 0xd76 .4byte 0xc6 .byte 0x1 - .4byte 0xff80 + .4byte 0xff72 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0xd6b - .4byte 0xe82d + .2byte 0xd76 + .4byte 0xe81f .uleb128 0x43 .4byte .LASF2434 .byte 0x1 - .2byte 0xd6d + .2byte 0xd78 .4byte 0xd740 .uleb128 0x64 .uleb128 0x4f .string "__k" .byte 0x1 - .2byte 0xd83 + .2byte 0xd8e .4byte 0x2eff .byte 0 .byte 0 .uleb128 0x60 - .4byte .LASF3043 + .4byte .LASF3042 .byte 0x1 - .2byte 0xd21 + .2byte 0xd29 .4byte 0xc6 .byte 0x1 - .4byte 0x10006 + .4byte 0xfff8 .uleb128 0x61 .string "ebc" .byte 0x1 - .2byte 0xd21 - .4byte 0xe4e5 + .2byte 0xd29 + .4byte 0xe4d7 .uleb128 0x4f .string "dev" .byte 0x1 - .2byte 0xd23 + .2byte 0xd2b .4byte 0xa496 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0xd24 + .2byte 0xd2c .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0xd25 - .4byte 0xe82d + .2byte 0xd2d + .4byte 0xe81f .uleb128 0x43 - .4byte .LASF3044 + .4byte .LASF3043 .byte 0x1 - .2byte 0xd26 + .2byte 0xd2e .4byte 0xb7ba .uleb128 0x4f .string "r" .byte 0x1 - .2byte 0xd27 + .2byte 0xd2f .4byte 0x9672 .uleb128 0x43 - .4byte .LASF3045 + .4byte .LASF3044 .byte 0x1 - .2byte 0xd28 + .2byte 0xd30 .4byte 0xc6 .uleb128 0x4f .string "ret" .byte 0x1 - .2byte 0xd29 + .2byte 0xd31 .4byte 0xc6 .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0xd29 + .2byte 0xd31 .4byte 0xc6 .uleb128 0x43 - .4byte .LASF3046 + .4byte .LASF3045 .byte 0x1 - .2byte 0xd2a + .2byte 0xd32 .4byte 0xc6 .byte 0 .uleb128 0x60 - .4byte .LASF3047 + .4byte .LASF3046 .byte 0x1 - .2byte 0xcf5 + .2byte 0xcfd .4byte 0xc6 .byte 0x1 - .4byte 0x10077 + .4byte 0x10069 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0xcf5 - .4byte 0xe82d + .2byte 0xcfd + .4byte 0xe81f .uleb128 0x4f .string "ret" .byte 0x1 - .2byte 0xcf7 + .2byte 0xcff .4byte 0xc6 .uleb128 0x4f .string "dev" .byte 0x1 - .2byte 0xcf8 + .2byte 0xd00 .4byte 0xa496 .uleb128 0x43 - .4byte .LASF3044 + .4byte .LASF3043 .byte 0x1 - .2byte 0xcf9 + .2byte 0xd01 .4byte 0xb7ba .uleb128 0x4f .string "r" .byte 0x1 - .2byte 0xcfa + .2byte 0xd02 .4byte 0x9672 .uleb128 0x43 .4byte .LASF2950 .byte 0x1 - .2byte 0xcfb + .2byte 0xd03 .4byte 0x29 .uleb128 0x43 .4byte .LASF2951 .byte 0x1 - .2byte 0xcfc + .2byte 0xd04 .4byte 0xc6 .uleb128 0x65 - .4byte .LASF3025 - .4byte 0x10087 - .4byte .LASF3047 + .4byte .LASF3024 + .4byte 0x10079 + .4byte .LASF3046 .byte 0 .uleb128 0x5 .4byte 0x68 - .4byte 0x10087 + .4byte 0x10079 .uleb128 0x6 .4byte 0x4f .byte 0x12 .byte 0 .uleb128 0x3 - .4byte 0x10077 + .4byte 0x10069 .uleb128 0x60 - .4byte .LASF3048 + .4byte .LASF3047 .byte 0x1 - .2byte 0xce4 + .2byte 0xcec .4byte 0xc6 .byte 0x1 - .4byte 0x100aa + .4byte 0x1009c .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0xce4 - .4byte 0xe82d + .2byte 0xcec + .4byte 0xe81f .byte 0 .uleb128 0x60 - .4byte .LASF3049 + .4byte .LASF3048 .byte 0x1 - .2byte 0xcd1 + .2byte 0xcd9 .4byte 0x2ee .byte 0x1 - .4byte 0x10102 + .4byte 0x100f4 .uleb128 0x62 .4byte .LASF2168 .byte 0x1 - .2byte 0xcd1 + .2byte 0xcd9 .4byte 0xa496 .uleb128 0x62 .4byte .LASF2083 .byte 0x1 - .2byte 0xcd2 + .2byte 0xcda .4byte 0xb311 .uleb128 0x61 .string "buf" .byte 0x1 - .2byte 0xcd3 + .2byte 0xcdb .4byte 0x21e .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0xcd5 + .2byte 0xcdd .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0xcd6 - .4byte 0xe82d + .2byte 0xcde + .4byte 0xe81f .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0xcd7 + .2byte 0xcdf .4byte 0xc6 .byte 0 .uleb128 0x4c - .4byte .LASF3050 + .4byte .LASF3049 .byte 0x1 - .2byte 0xcc8 + .2byte 0xcd0 .4byte 0x2ee .8byte .LFB2861 .8byte .LFE2861-.LFB2861 .uleb128 0x1 .byte 0x9c - .4byte 0x10162 + .4byte 0x10154 .uleb128 0x55 .4byte .LASF2168 .byte 0x1 - .2byte 0xcc8 + .2byte 0xcd0 .4byte 0xa496 - .4byte .LLST204 + .4byte .LLST212 .uleb128 0x55 .4byte .LASF2083 .byte 0x1 - .2byte 0xcc9 + .2byte 0xcd1 .4byte 0xb311 - .4byte .LLST205 + .4byte .LLST213 .uleb128 0x4e .string "buf" .byte 0x1 - .2byte 0xcca + .2byte 0xcd2 .4byte 0x21e - .4byte .LLST206 + .4byte .LLST214 .uleb128 0x4b - .8byte .LVL707 - .4byte 0x16b3a + .8byte .LVL704 + .4byte 0x16d2b .byte 0 .uleb128 0x4c - .4byte .LASF3051 + .4byte .LASF3050 .byte 0x1 - .2byte 0xcbf + .2byte 0xcc7 .4byte 0x2ee .8byte .LFB2860 .8byte .LFE2860-.LFB2860 .uleb128 0x1 .byte 0x9c - .4byte 0x101c2 + .4byte 0x101b4 .uleb128 0x55 .4byte .LASF2168 .byte 0x1 - .2byte 0xcbf + .2byte 0xcc7 .4byte 0xa496 - .4byte .LLST189 + .4byte .LLST197 .uleb128 0x55 .4byte .LASF2083 .byte 0x1 - .2byte 0xcc0 + .2byte 0xcc8 .4byte 0xb311 - .4byte .LLST190 + .4byte .LLST198 .uleb128 0x4e .string "buf" .byte 0x1 - .2byte 0xcc1 + .2byte 0xcc9 .4byte 0x21e - .4byte .LLST191 + .4byte .LLST199 .uleb128 0x4b - .8byte .LVL679 - .4byte 0x16b45 + .8byte .LVL676 + .4byte 0x16d36 .byte 0 .uleb128 0x4c - .4byte .LASF3052 + .4byte .LASF3051 .byte 0x1 - .2byte 0xcb6 + .2byte 0xcbe .4byte 0x2ee .8byte .LFB2859 .8byte .LFE2859-.LFB2859 .uleb128 0x1 .byte 0x9c - .4byte 0x10222 + .4byte 0x10214 .uleb128 0x55 .4byte .LASF2168 .byte 0x1 - .2byte 0xcb6 + .2byte 0xcbe .4byte 0xa496 - .4byte .LLST192 + .4byte .LLST200 .uleb128 0x55 .4byte .LASF2083 .byte 0x1 - .2byte 0xcb7 + .2byte 0xcbf .4byte 0xb311 - .4byte .LLST193 + .4byte .LLST201 .uleb128 0x4e .string "buf" .byte 0x1 - .2byte 0xcb8 + .2byte 0xcc0 .4byte 0x21e - .4byte .LLST194 + .4byte .LLST202 .uleb128 0x4b - .8byte .LVL684 - .4byte 0x16b45 + .8byte .LVL681 + .4byte 0x16d36 .byte 0 .uleb128 0x4c - .4byte .LASF3053 + .4byte .LASF3052 .byte 0x1 - .2byte 0xc9e + .2byte 0xca6 .4byte 0x2ee .8byte .LFB2858 .8byte .LFE2858-.LFB2858 .uleb128 0x1 .byte 0x9c - .4byte 0x102f2 + .4byte 0x102e4 .uleb128 0x55 .4byte .LASF2168 .byte 0x1 - .2byte 0xc9e + .2byte 0xca6 .4byte 0xa496 - .4byte .LLST207 + .4byte .LLST215 .uleb128 0x55 .4byte .LASF2083 .byte 0x1 - .2byte 0xc9f + .2byte 0xca7 .4byte 0xb311 - .4byte .LLST208 + .4byte .LLST216 .uleb128 0x4e .string "buf" .byte 0x1 - .2byte 0xca0 + .2byte 0xca8 .4byte 0x56 - .4byte .LLST209 + .4byte .LLST217 .uleb128 0x55 .4byte .LASF383 .byte 0x1 - .2byte 0xca0 + .2byte 0xca8 .4byte 0x2e3 - .4byte .LLST210 + .4byte .LLST218 .uleb128 0x57 .string "ebc" .byte 0x1 - .2byte 0xca2 - .4byte 0xe4e5 - .4byte .LLST211 + .2byte 0xcaa + .4byte 0xe4d7 + .4byte .LLST219 .uleb128 0x56 .4byte .LASF2424 .byte 0x1 - .2byte 0xca3 + .2byte 0xcab .4byte 0xc6 - .4byte .LLST212 + .4byte .LLST220 .uleb128 0x4f .string "ret" .byte 0x1 - .2byte 0xca3 + .2byte 0xcab .4byte 0xc6 .uleb128 0x4b - .8byte .LVL713 - .4byte 0x16b51 + .8byte .LVL710 + .4byte 0x16d42 .uleb128 0x4b - .8byte .LVL715 - .4byte 0x16b5d + .8byte .LVL712 + .4byte 0x16d4e + .uleb128 0x4b + .8byte .LVL717 + .4byte 0x16c06 .uleb128 0x4b .8byte .LVL720 - .4byte 0x16a20 + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL723 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL724 - .4byte 0x16b30 + .8byte .LVL721 + .4byte 0x16d21 .byte 0 .uleb128 0x4d - .4byte .LASF3054 + .4byte .LASF3053 .byte 0x1 - .2byte 0xc92 + .2byte 0xc9a .4byte 0x2ee .8byte .LFB2857 .8byte .LFE2857-.LFB2857 .uleb128 0x1 .byte 0x9c - .4byte 0x1038c + .4byte 0x1037e .uleb128 0x55 .4byte .LASF2168 .byte 0x1 - .2byte 0xc92 + .2byte 0xc9a .4byte 0xa496 - .4byte .LLST195 + .4byte .LLST203 .uleb128 0x55 .4byte .LASF2083 .byte 0x1 - .2byte 0xc93 + .2byte 0xc9b .4byte 0xb311 - .4byte .LLST196 + .4byte .LLST204 .uleb128 0x4e .string "buf" .byte 0x1 - .2byte 0xc94 + .2byte 0xc9c .4byte 0x21e - .4byte .LLST197 + .4byte .LLST205 .uleb128 0x4f .string "ebc" .byte 0x1 - .2byte 0xc96 - .4byte 0xe4e5 + .2byte 0xc9e + .4byte 0xe4d7 .uleb128 0x43 .4byte .LASF2424 .byte 0x1 - .2byte 0xc97 + .2byte 0xc9f .4byte 0xc6 .uleb128 0x50 - .4byte 0x157eb - .8byte .LBB1478 - .8byte .LBE1478-.LBB1478 + .4byte 0x159dc + .8byte .LBB1540 + .8byte .LBE1540-.LBB1540 .byte 0x1 - .2byte 0xc99 - .4byte 0x1037e + .2byte 0xca1 + .4byte 0x10370 .uleb128 0x51 - .4byte 0x157fb + .4byte 0x159ec .byte 0 .uleb128 0x4b - .8byte .LVL689 - .4byte 0x16b45 + .8byte .LVL686 + .4byte 0x16d36 .byte 0 .uleb128 0x4d - .4byte .LASF3055 + .4byte .LASF3054 .byte 0x1 - .2byte 0xc84 + .2byte 0xc8c .4byte 0x2ee .8byte .LFB2856 .8byte .LFE2856-.LFB2856 .uleb128 0x1 .byte 0x9c - .4byte 0x10435 + .4byte 0x10427 .uleb128 0x55 .4byte .LASF2168 .byte 0x1 - .2byte 0xc84 + .2byte 0xc8c .4byte 0xa496 - .4byte .LLST198 + .4byte .LLST206 .uleb128 0x55 .4byte .LASF2083 .byte 0x1 - .2byte 0xc85 + .2byte 0xc8d .4byte 0xb311 - .4byte .LLST199 + .4byte .LLST207 .uleb128 0x4e .string "buf" .byte 0x1 - .2byte 0xc86 + .2byte 0xc8e .4byte 0x21e - .4byte .LLST200 + .4byte .LLST208 .uleb128 0x4f .string "ebc" .byte 0x1 - .2byte 0xc88 - .4byte 0xe4e5 + .2byte 0xc90 + .4byte 0xe4d7 .uleb128 0x66 .string "t" .byte 0x1 - .2byte 0xc89 + .2byte 0xc91 .4byte 0xc6 .uleb128 0x2 .byte 0x91 .sleb128 4 .uleb128 0x58 - .4byte 0x15807 - .8byte .LBB1480 - .4byte .Ldebug_ranges0+0xdb0 + .4byte 0x159f8 + .8byte .LBB1542 + .4byte .Ldebug_ranges0+0xe80 .byte 0x1 - .2byte 0xc8b - .4byte 0x1041a + .2byte 0xc93 + .4byte 0x1040c .uleb128 0x51 - .4byte 0x15822 + .4byte 0x15a13 .uleb128 0x51 - .4byte 0x15817 + .4byte 0x15a08 .byte 0 + .uleb128 0x4b + .8byte .LVL693 + .4byte 0x16d36 .uleb128 0x4b .8byte .LVL696 - .4byte 0x16b45 - .uleb128 0x4b - .8byte .LVL699 - .4byte 0x16b30 + .4byte 0x16d21 .byte 0 .uleb128 0x4c - .4byte .LASF3056 + .4byte .LASF3055 .byte 0x1 - .2byte 0xc79 + .2byte 0xc81 .4byte 0x2ee .8byte .LFB2855 .8byte .LFE2855-.LFB2855 .uleb128 0x1 .byte 0x9c - .4byte 0x104a1 + .4byte 0x10493 .uleb128 0x55 .4byte .LASF2168 .byte 0x1 - .2byte 0xc79 + .2byte 0xc81 .4byte 0xa496 - .4byte .LLST201 + .4byte .LLST209 .uleb128 0x55 .4byte .LASF2083 .byte 0x1 - .2byte 0xc7a + .2byte 0xc82 .4byte 0xb311 - .4byte .LLST202 + .4byte .LLST210 .uleb128 0x4e .string "buf" .byte 0x1 - .2byte 0xc7b + .2byte 0xc83 .4byte 0x21e - .4byte .LLST203 + .4byte .LLST211 .uleb128 0x4f .string "ebc" .byte 0x1 - .2byte 0xc7d - .4byte 0xe4e5 + .2byte 0xc85 + .4byte 0xe4d7 .uleb128 0x4b - .8byte .LVL704 - .4byte 0x16b45 + .8byte .LVL701 + .4byte 0x16d36 .byte 0 .uleb128 0x4c - .4byte .LASF3057 + .4byte .LASF3056 .byte 0x1 - .2byte 0xc6e + .2byte 0xc76 .4byte 0x2ee .8byte .LFB2854 .8byte .LFE2854-.LFB2854 .uleb128 0x1 .byte 0x9c - .4byte 0x1051a + .4byte 0x1050c .uleb128 0x55 .4byte .LASF2168 .byte 0x1 - .2byte 0xc6e + .2byte 0xc76 .4byte 0xa496 - .4byte .LLST213 + .4byte .LLST221 .uleb128 0x55 .4byte .LASF2083 .byte 0x1 - .2byte 0xc6f + .2byte 0xc77 .4byte 0xb311 - .4byte .LLST214 + .4byte .LLST222 .uleb128 0x4e .string "buf" .byte 0x1 - .2byte 0xc70 + .2byte 0xc78 .4byte 0x21e - .4byte .LLST215 + .4byte .LLST223 .uleb128 0x43 - .4byte .LASF3058 + .4byte .LASF3057 .byte 0x1 - .2byte 0xc72 + .2byte 0xc7a .4byte 0x56 .uleb128 0x4b - .8byte .LVL726 - .4byte 0x16b68 + .8byte .LVL723 + .4byte 0x16d59 .uleb128 0x4b - .8byte .LVL727 - .4byte 0x16b45 + .8byte .LVL724 + .4byte 0x16d36 .byte 0 .uleb128 0x60 - .4byte .LASF3059 + .4byte .LASF3058 .byte 0x1 - .2byte 0xc5b + .2byte 0xc63 .4byte 0xc6 .byte 0x1 - .4byte 0x10544 + .4byte 0x10536 .uleb128 0x62 .4byte .LASF418 .byte 0x1 - .2byte 0xc5b + .2byte 0xc63 .4byte 0x1c7f .uleb128 0x62 .4byte .LASF1241 .byte 0x1 - .2byte 0xc5b + .2byte 0xc63 .4byte 0x5482 .byte 0 .uleb128 0x4c - .4byte .LASF3060 + .4byte .LASF3059 .byte 0x1 - .2byte 0xc4b + .2byte 0xc53 .4byte 0xc6 .8byte .LFB2852 .8byte .LFE2852-.LFB2852 .uleb128 0x1 .byte 0x9c - .4byte 0x105ac + .4byte 0x1059e .uleb128 0x55 .4byte .LASF1241 .byte 0x1 - .2byte 0xc4b + .2byte 0xc53 .4byte 0x5482 .4byte .LLST28 .uleb128 0x4e .string "vma" .byte 0x1 - .2byte 0xc4b + .2byte 0xc53 .4byte 0x3be9 .4byte .LLST29 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0xc4d - .4byte 0xe82d + .2byte 0xc55 + .4byte 0xe81f .uleb128 0x43 .4byte .LASF854 .byte 0x1 - .2byte 0xc4e + .2byte 0xc56 .4byte 0x29 .uleb128 0x4b .8byte .LVL97 - .4byte 0x16b73 + .4byte 0x16d64 .byte 0 .uleb128 0x67 - .4byte .LASF3062 + .4byte .LASF3061 .byte 0x1 - .2byte 0xc34 + .2byte 0xc3c .4byte 0xc6 - .4byte 0x105d5 + .4byte 0x105c7 .uleb128 0x62 .4byte .LASF418 .byte 0x1 - .2byte 0xc34 + .2byte 0xc3c .4byte 0x1c7f .uleb128 0x62 .4byte .LASF1241 .byte 0x1 - .2byte 0xc34 + .2byte 0xc3c .4byte 0x5482 .byte 0 .uleb128 0x4c - .4byte .LASF3063 + .4byte .LASF3062 .byte 0x1 - .2byte 0xc25 + .2byte 0xc2d .4byte 0xc6 .8byte .LFB2850 .8byte .LFE2850-.LFB2850 .uleb128 0x1 .byte 0x9c - .4byte 0x1063e + .4byte 0x10630 .uleb128 0x55 .4byte .LASF1241 .byte 0x1 - .2byte 0xc25 + .2byte 0xc2d .4byte 0x5482 .4byte .LLST26 .uleb128 0x4e .string "vma" .byte 0x1 - .2byte 0xc25 + .2byte 0xc2d .4byte 0x3be9 .4byte .LLST27 .uleb128 0x43 .4byte .LASF854 .byte 0x1 - .2byte 0xc27 + .2byte 0xc2f .4byte 0x29 .uleb128 0x4b .8byte .LVL91 - .4byte 0x16b7f + .4byte 0x16d70 .uleb128 0x4b .8byte .LVL92 - .4byte 0x16b73 + .4byte 0x16d64 .byte 0 .uleb128 0x4c - .4byte .LASF3064 + .4byte .LASF3063 .byte 0x1 - .2byte 0xb6b + .2byte 0xb6e .4byte 0x199 .8byte .LFB2849 .8byte .LFE2849-.LFB2849 .uleb128 0x1 .byte 0x9c - .4byte 0x11de1 + .4byte 0x11ffc .uleb128 0x55 .4byte .LASF1241 .byte 0x1 - .2byte 0xb6b + .2byte 0xb6e .4byte 0x5482 .4byte .LLST30 .uleb128 0x4e .string "cmd" .byte 0x1 - .2byte 0xb6b + .2byte 0xb6e .4byte 0x6d .4byte .LLST31 .uleb128 0x4e .string "arg" .byte 0x1 - .2byte 0xb6b + .2byte 0xb6e .4byte 0x29 .4byte .LLST32 .uleb128 0x43 - .4byte .LASF3065 + .4byte .LASF3064 .byte 0x1 - .2byte 0xb6d + .2byte 0xb70 .4byte 0x458 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0xb6e + .2byte 0xb71 .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0xb6f - .4byte 0xe82d + .2byte 0xb72 + .4byte 0xe81f .uleb128 0x49 - .4byte .LASF3066 + .4byte .LASF3065 .byte 0x1 - .2byte 0xb70 + .2byte 0xb73 .4byte 0xd95a .uleb128 0x3 .byte 0x91 @@ -47701,1185 +47817,1223 @@ .uleb128 0x4f .string "buf" .byte 0x1 - .2byte 0xb71 - .4byte 0xe480 + .2byte 0xb74 + .4byte 0xe472 + .uleb128 0x43 + .4byte .LASF3066 + .byte 0x1 + .2byte 0xb75 + .4byte 0xc6 .uleb128 0x43 .4byte .LASF3067 .byte 0x1 - .2byte 0xb72 - .4byte 0xc6 - .uleb128 0x43 - .4byte .LASF3068 - .byte 0x1 - .2byte 0xb73 + .2byte 0xb76 .4byte 0x29 .uleb128 0x4f .string "ret" .byte 0x1 - .2byte 0xb74 + .2byte 0xb77 .4byte 0xc6 .uleb128 0x52 - .4byte .LASF3025 - .4byte 0x11df1 + .4byte .LASF3024 + .4byte 0x1200c .uleb128 0x9 .byte 0x3 - .8byte __func__.35503 + .8byte __func__.35512 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x7b0 + .4byte 0x1092f + .uleb128 0x56 + .4byte .LASF3068 + .byte 0x1 + .2byte 0xbfd + .4byte 0xc6 + .4byte .LLST107 + .uleb128 0x5c + .4byte 0x15aeb + .8byte .LBB1418 + .4byte .Ldebug_ranges0+0x7e0 + .byte 0x1 + .2byte 0xbfe + .uleb128 0x51 + .4byte 0x15b10 + .uleb128 0x51 + .4byte 0x15b05 + .uleb128 0x51 + .4byte 0x15afb + .uleb128 0x69 + .4byte 0x15b49 + .8byte .LBB1419 + .4byte .Ldebug_ranges0+0x7e0 + .byte 0x8 + .byte 0x9b + .uleb128 0x51 + .4byte 0x15b6e + .uleb128 0x51 + .4byte 0x15b63 + .uleb128 0x51 + .4byte 0x15b59 + .uleb128 0x6a + .4byte 0x15be6 + .8byte .LBB1421 + .4byte .Ldebug_ranges0+0x820 + .byte 0x8 + .byte 0x84 + .4byte 0x10864 + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 + .4byte .LLST108 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x820 + .uleb128 0x5d + .4byte 0x15c0c + .4byte .LLST109 + .uleb128 0x5d + .4byte 0x15c17 + .4byte .LLST110 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1423 + .8byte .LBE1423-.LBB1423 + .byte 0x5 + .byte 0x4d + .4byte 0x107ca + .uleb128 0x53 + .8byte .LBB1424 + .8byte .LBE1424-.LBB1424 + .uleb128 0x5d + .4byte 0x15fe0 + .4byte .LLST111 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1425 + .8byte .LBE1425-.LBB1425 + .4byte 0x1081e + .uleb128 0x54 + .4byte 0x15c23 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1426 + .8byte .LBE1426-.LBB1426 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1427 + .8byte .LBE1427-.LBB1427 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fa4 + .8byte .LBB1428 + .8byte .LBE1428-.LBB1428 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x15fbe + .uleb128 0x51 + .4byte 0x15fb4 + .uleb128 0x59 + .4byte 0x16097 + .8byte .LBB1429 + .8byte .LBE1429-.LBB1429 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x160b1 + .uleb128 0x51 + .4byte 0x160a7 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15bb2 + .8byte .LBB1435 + .8byte .LBE1435-.LBB1435 + .byte 0x8 + .byte 0x86 + .4byte 0x1091f + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1436 + .8byte .LBE1436-.LBB1436 + .uleb128 0x5d + .4byte 0x15bcd + .4byte .LLST112 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x870 + .4byte 0x108ea + .uleb128 0x5d + .4byte 0x15bd9 + .4byte .LLST113 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1438 + .8byte .LBE1438-.LBB1438 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1439 + .8byte .LBE1439-.LBB1439 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fd0 + .8byte .LBB1440 + .8byte .LBE1440-.LBB1440 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1441 + .8byte .LBE1441-.LBB1441 + .uleb128 0x5d + .4byte 0x15fe0 + .4byte .LLST114 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL266 + .4byte 0x16d7b + .byte 0 + .byte 0 + .byte 0 .uleb128 0x58 - .4byte 0x15929 - .8byte .LBB1060 + .4byte 0x15b1a + .8byte .LBB1092 .4byte .Ldebug_ranges0+0 .byte 0x1 - .2byte 0xb9a - .4byte 0x10943 + .2byte 0xc1f + .4byte 0x10b6b .uleb128 0x51 - .4byte 0x1594e + .4byte 0x15b3f .uleb128 0x51 - .4byte 0x15943 + .4byte 0x15b34 .uleb128 0x51 - .4byte 0x15939 - .uleb128 0x68 - .4byte 0x15987 - .8byte .LBB1061 + .4byte 0x15b2a + .uleb128 0x69 + .4byte 0x15b78 + .8byte .LBB1093 .4byte .Ldebug_ranges0+0 - .byte 0x7 + .byte 0x8 .byte 0x93 .uleb128 0x51 - .4byte 0x159ac + .4byte 0x15b9d .uleb128 0x51 - .4byte 0x159a1 + .4byte 0x15b92 .uleb128 0x51 - .4byte 0x15997 + .4byte 0x15b88 .uleb128 0x5b .4byte .Ldebug_ranges0+0 .uleb128 0x5d - .4byte 0x159b5 + .4byte 0x15ba6 .4byte .LLST33 - .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1063 - .4byte .Ldebug_ranges0+0x50 - .byte 0x7 - .byte 0x72 - .4byte 0x1086b - .uleb128 0x51 - .4byte 0x15a10 .uleb128 0x6a - .4byte 0x15a05 + .4byte 0x15be6 + .8byte .LBB1095 + .4byte .Ldebug_ranges0+0x50 + .byte 0x8 + .byte 0x72 + .4byte 0x10a93 + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 .4byte .LLST34 .uleb128 0x5b .4byte .Ldebug_ranges0+0x50 .uleb128 0x5d - .4byte 0x15a1b + .4byte 0x15c0c .4byte .LLST35 .uleb128 0x5d - .4byte 0x15a26 + .4byte 0x15c17 .4byte .LLST36 - .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1065 - .8byte .LBE1065-.LBB1065 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1097 + .8byte .LBE1097-.LBB1097 .byte 0x5 .byte 0x4d - .4byte 0x107d1 + .4byte 0x109f9 .uleb128 0x53 - .8byte .LBB1066 - .8byte .LBE1066-.LBB1066 + .8byte .LBB1098 + .8byte .LBE1098-.LBB1098 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 .4byte .LLST37 .byte 0 .byte 0 - .uleb128 0x5f - .8byte .LBB1067 - .8byte .LBE1067-.LBB1067 - .4byte 0x10825 - .uleb128 0x54 - .4byte 0x15a32 - .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1068 - .8byte .LBE1068-.LBB1068 - .byte 0x5 - .byte 0x56 - .uleb128 0x51 - .4byte 0x15e39 - .uleb128 0x51 - .4byte 0x15e2e - .uleb128 0x53 - .8byte .LBB1069 - .8byte .LBE1069-.LBB1069 - .uleb128 0x54 - .4byte 0x15e44 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x59 - .4byte 0x15db3 - .8byte .LBB1070 - .8byte .LBE1070-.LBB1070 + .uleb128 0x6c + .4byte 0x15fa4 + .8byte .LBB1099 + .8byte .LBE1099-.LBB1099 .byte 0x5 .byte 0x55 + .4byte 0x10a41 .uleb128 0x51 - .4byte 0x15dcd + .4byte 0x15fbe .uleb128 0x51 - .4byte 0x15dc3 + .4byte 0x15fb4 .uleb128 0x59 - .4byte 0x15ea6 - .8byte .LBB1071 - .8byte .LBE1071-.LBB1071 + .4byte 0x16097 + .8byte .LBB1100 + .8byte .LBE1100-.LBB1100 .byte 0xc9 .byte 0x61 .uleb128 0x51 - .4byte 0x15ec0 + .4byte 0x160b1 .uleb128 0x51 - .4byte 0x15eb6 + .4byte 0x160a7 .byte 0 .byte 0 - .byte 0 - .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1075 - .8byte .LBE1075-.LBB1075 - .byte 0x7 - .byte 0x74 - .4byte 0x10926 - .uleb128 0x51 - .4byte 0x159d1 .uleb128 0x53 - .8byte .LBB1076 - .8byte .LBE1076-.LBB1076 - .uleb128 0x5d - .4byte 0x159dc - .4byte .LLST38 + .8byte .LBB1102 + .8byte .LBE1102-.LBB1102 + .uleb128 0x54 + .4byte 0x15c23 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1103 + .8byte .LBE1103-.LBB1103 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1104 + .8byte .LBE1104-.LBB1104 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 .uleb128 0x6c - .4byte .Ldebug_ranges0+0x90 - .4byte 0x108f1 + .4byte 0x15bb2 + .8byte .LBB1109 + .8byte .LBE1109-.LBB1109 + .byte 0x8 + .byte 0x74 + .4byte 0x10b4e + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1110 + .8byte .LBE1110-.LBB1110 .uleb128 0x5d - .4byte 0x159e8 + .4byte 0x15bcd + .4byte .LLST38 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x90 + .4byte 0x10b19 + .uleb128 0x5d + .4byte 0x15bd9 .4byte .LLST39 .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1078 - .8byte .LBE1078-.LBB1078 + .4byte 0x1600f + .8byte .LBB1112 + .8byte .LBE1112-.LBB1112 .byte 0x5 .byte 0xfe .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 - .8byte .LBB1079 - .8byte .LBE1079-.LBB1079 + .8byte .LBB1113 + .8byte .LBE1113-.LBB1113 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15ddf - .8byte .LBB1080 - .8byte .LBE1080-.LBB1080 + .4byte 0x15fd0 + .8byte .LBB1114 + .8byte .LBE1114-.LBB1114 .byte 0x5 .byte 0xfd .uleb128 0x53 - .8byte .LBB1081 - .8byte .LBE1081-.LBB1081 + .8byte .LBB1115 + .8byte .LBE1115-.LBB1115 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 .4byte .LLST40 .byte 0 .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL124 - .4byte 0x16b8a + .8byte .LVL115 + .4byte 0x16d87 .uleb128 0x4b - .8byte .LVL337 - .4byte 0x16a0b + .8byte .LVL324 + .4byte 0x16bfc .byte 0 .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x158fa - .8byte .LBB1091 + .4byte 0x15aeb + .8byte .LBB1125 .4byte .Ldebug_ranges0+0xc0 .byte 0x1 - .2byte 0xbaa - .4byte 0x10afd + .2byte 0xbf9 + .4byte 0x10d8b .uleb128 0x51 - .4byte 0x1591f + .4byte 0x15b10 .uleb128 0x51 - .4byte 0x15914 + .4byte 0x15b05 .uleb128 0x51 - .4byte 0x1590a - .uleb128 0x68 - .4byte 0x15958 - .8byte .LBB1092 + .4byte 0x15afb + .uleb128 0x69 + .4byte 0x15b49 + .8byte .LBB1126 .4byte .Ldebug_ranges0+0xc0 - .byte 0x7 + .byte 0x8 .byte 0x9b .uleb128 0x51 - .4byte 0x1597d + .4byte 0x15b6e .uleb128 0x51 - .4byte 0x15972 + .4byte 0x15b63 .uleb128 0x51 - .4byte 0x15968 - .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1094 - .4byte .Ldebug_ranges0+0x120 - .byte 0x7 - .byte 0x84 - .4byte 0x10a60 - .uleb128 0x51 - .4byte 0x15a10 + .4byte 0x15b59 .uleb128 0x6a - .4byte 0x15a05 + .4byte 0x15be6 + .8byte .LBB1128 + .4byte .Ldebug_ranges0+0x100 + .byte 0x8 + .byte 0x84 + .4byte 0x10cc1 + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 .4byte .LLST41 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x120 + .4byte .Ldebug_ranges0+0x100 .uleb128 0x5d - .4byte 0x15a1b + .4byte 0x15c0c .4byte .LLST42 .uleb128 0x5d - .4byte 0x15a26 + .4byte 0x15c17 .4byte .LLST43 - .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1096 - .8byte .LBE1096-.LBB1096 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1130 + .8byte .LBE1130-.LBB1130 .byte 0x5 .byte 0x4d - .4byte 0x109ff + .4byte 0x10c27 .uleb128 0x53 - .8byte .LBB1097 - .8byte .LBE1097-.LBB1097 + .8byte .LBB1131 + .8byte .LBE1131-.LBB1131 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 .4byte .LLST44 .byte 0 .byte 0 - .uleb128 0x6b - .4byte 0x15db3 - .8byte .LBB1098 - .8byte .LBE1098-.LBB1098 + .uleb128 0x5f + .8byte .LBB1132 + .8byte .LBE1132-.LBB1132 + .4byte 0x10c7b + .uleb128 0x54 + .4byte 0x15c23 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1133 + .8byte .LBE1133-.LBB1133 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1134 + .8byte .LBE1134-.LBB1134 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fa4 + .8byte .LBB1135 + .8byte .LBE1135-.LBB1135 .byte 0x5 .byte 0x55 - .4byte 0x10a47 .uleb128 0x51 - .4byte 0x15dcd + .4byte 0x15fbe .uleb128 0x51 - .4byte 0x15dc3 + .4byte 0x15fb4 .uleb128 0x59 - .4byte 0x15ea6 - .8byte .LBB1099 - .8byte .LBE1099-.LBB1099 + .4byte 0x16097 + .8byte .LBB1136 + .8byte .LBE1136-.LBB1136 .byte 0xc9 .byte 0x61 .uleb128 0x51 - .4byte 0x15ec0 + .4byte 0x160b1 .uleb128 0x51 - .4byte 0x15eb6 - .byte 0 - .byte 0 - .uleb128 0x53 - .8byte .LBB1101 - .8byte .LBE1101-.LBB1101 - .uleb128 0x54 - .4byte 0x15a32 + .4byte 0x160a7 .byte 0 .byte 0 .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1108 - .8byte .LBE1108-.LBB1108 - .byte 0x7 + .byte 0 + .uleb128 0x6c + .4byte 0x15bb2 + .8byte .LBB1140 + .8byte .LBE1140-.LBB1140 + .byte 0x8 .byte 0x86 - .4byte 0x10aee + .4byte 0x10d7c .uleb128 0x51 - .4byte 0x159d1 + .4byte 0x15bc2 .uleb128 0x53 - .8byte .LBB1109 - .8byte .LBE1109-.LBB1109 + .8byte .LBB1141 + .8byte .LBE1141-.LBB1141 .uleb128 0x5d - .4byte 0x159dc + .4byte 0x15bcd .4byte .LLST45 - .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1110 - .8byte .LBE1110-.LBB1110 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x140 + .4byte 0x10d47 + .uleb128 0x5d + .4byte 0x15bd9 + .4byte .LLST46 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1143 + .8byte .LBE1143-.LBB1143 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1144 + .8byte .LBE1144-.LBB1144 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fd0 + .8byte .LBB1145 + .8byte .LBE1145-.LBB1145 .byte 0x5 .byte 0xfd - .4byte 0x10ad1 .uleb128 0x53 - .8byte .LBB1111 - .8byte .LBE1111-.LBB1111 + .8byte .LBB1146 + .8byte .LBE1146-.LBB1146 .uleb128 0x5d - .4byte 0x15def - .4byte .LLST46 - .byte 0 - .byte 0 - .uleb128 0x53 - .8byte .LBB1112 - .8byte .LBE1112-.LBB1112 - .uleb128 0x5d - .4byte 0x159e8 + .4byte 0x15fe0 .4byte .LLST47 .byte 0 .byte 0 .byte 0 + .byte 0 .uleb128 0x4b - .8byte .LVL316 - .4byte 0x16b96 + .8byte .LVL140 + .4byte 0x16d7b .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x15929 - .8byte .LBB1123 + .4byte 0x15b1a + .8byte .LBB1154 .4byte .Ldebug_ranges0+0x170 .byte 0x1 - .2byte 0xbc9 - .4byte 0x10d28 + .2byte 0xc16 + .4byte 0x10fc7 .uleb128 0x51 - .4byte 0x1594e + .4byte 0x15b3f .uleb128 0x51 - .4byte 0x15943 + .4byte 0x15b34 .uleb128 0x51 - .4byte 0x15939 - .uleb128 0x68 - .4byte 0x15987 - .8byte .LBB1124 + .4byte 0x15b2a + .uleb128 0x69 + .4byte 0x15b78 + .8byte .LBB1155 .4byte .Ldebug_ranges0+0x170 - .byte 0x7 + .byte 0x8 .byte 0x93 .uleb128 0x51 - .4byte 0x159ac + .4byte 0x15b9d .uleb128 0x51 - .4byte 0x159a1 + .4byte 0x15b92 .uleb128 0x51 - .4byte 0x15997 + .4byte 0x15b88 .uleb128 0x5b .4byte .Ldebug_ranges0+0x170 - .uleb128 0x54 - .4byte 0x159b5 - .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1126 - .4byte .Ldebug_ranges0+0x1b0 - .byte 0x7 - .byte 0x72 - .4byte 0x10c5d - .uleb128 0x51 - .4byte 0x15a10 - .uleb128 0x6a - .4byte 0x15a05 + .uleb128 0x5d + .4byte 0x15ba6 .4byte .LLST48 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1b0 - .uleb128 0x5d - .4byte 0x15a1b - .4byte .LLST49 - .uleb128 0x5d - .4byte 0x15a26 - .4byte .LLST50 - .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1128 - .8byte .LBE1128-.LBB1128 - .byte 0x5 - .byte 0x4d - .4byte 0x10bc3 - .uleb128 0x53 - .8byte .LBB1129 - .8byte .LBE1129-.LBB1129 - .uleb128 0x5d - .4byte 0x15def - .4byte .LLST51 - .byte 0 - .byte 0 - .uleb128 0x5f - .8byte .LBB1130 - .8byte .LBE1130-.LBB1130 - .4byte 0x10c17 - .uleb128 0x54 - .4byte 0x15a32 - .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1131 - .8byte .LBE1131-.LBB1131 - .byte 0x5 - .byte 0x56 - .uleb128 0x51 - .4byte 0x15e39 - .uleb128 0x51 - .4byte 0x15e2e - .uleb128 0x53 - .8byte .LBB1132 - .8byte .LBE1132-.LBB1132 - .uleb128 0x54 - .4byte 0x15e44 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x59 - .4byte 0x15db3 - .8byte .LBB1133 - .8byte .LBE1133-.LBB1133 - .byte 0x5 - .byte 0x55 - .uleb128 0x51 - .4byte 0x15dcd - .uleb128 0x51 - .4byte 0x15dc3 - .uleb128 0x59 - .4byte 0x15ea6 - .8byte .LBB1134 - .8byte .LBE1134-.LBB1134 - .byte 0xc9 - .byte 0x61 - .uleb128 0x51 - .4byte 0x15ec0 - .uleb128 0x51 - .4byte 0x15eb6 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1138 - .8byte .LBE1138-.LBB1138 - .byte 0x7 - .byte 0x74 - .4byte 0x10d18 - .uleb128 0x51 - .4byte 0x159d1 - .uleb128 0x53 - .8byte .LBB1139 - .8byte .LBE1139-.LBB1139 - .uleb128 0x5d - .4byte 0x159dc - .4byte .LLST52 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1f0 - .4byte 0x10ce3 - .uleb128 0x5d - .4byte 0x159e8 - .4byte .LLST53 - .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1141 - .8byte .LBE1141-.LBB1141 - .byte 0x5 - .byte 0xfe - .uleb128 0x51 - .4byte 0x15e39 - .uleb128 0x51 - .4byte 0x15e2e - .uleb128 0x53 - .8byte .LBB1142 - .8byte .LBE1142-.LBB1142 - .uleb128 0x54 - .4byte 0x15e44 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x59 - .4byte 0x15ddf - .8byte .LBB1143 - .8byte .LBE1143-.LBB1143 - .byte 0x5 - .byte 0xfd - .uleb128 0x53 - .8byte .LBB1144 - .8byte .LBE1144-.LBB1144 - .uleb128 0x5d - .4byte 0x15def - .4byte .LLST54 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x4b - .8byte .LVL158 - .4byte 0x16b8a - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x58 - .4byte 0x158fa - .8byte .LBB1152 - .4byte .Ldebug_ranges0+0x220 - .byte 0x1 - .2byte 0xbf4 - .4byte 0x10f48 - .uleb128 0x51 - .4byte 0x1591f - .uleb128 0x51 - .4byte 0x15914 - .uleb128 0x51 - .4byte 0x1590a - .uleb128 0x68 - .4byte 0x15958 - .8byte .LBB1153 - .4byte .Ldebug_ranges0+0x220 - .byte 0x7 - .byte 0x9b - .uleb128 0x51 - .4byte 0x1597d - .uleb128 0x51 - .4byte 0x15972 - .uleb128 0x51 - .4byte 0x15968 - .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1155 - .4byte .Ldebug_ranges0+0x260 - .byte 0x7 - .byte 0x84 - .4byte 0x10e7e - .uleb128 0x51 - .4byte 0x15a10 .uleb128 0x6a - .4byte 0x15a05 - .4byte .LLST55 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x260 - .uleb128 0x5d - .4byte 0x15a1b - .4byte .LLST56 - .uleb128 0x5d - .4byte 0x15a26 - .4byte .LLST57 - .uleb128 0x6b - .4byte 0x15ddf + .4byte 0x15be6 .8byte .LBB1157 - .8byte .LBE1157-.LBB1157 - .byte 0x5 - .byte 0x4d - .4byte 0x10de4 - .uleb128 0x53 - .8byte .LBB1158 - .8byte .LBE1158-.LBB1158 + .4byte .Ldebug_ranges0+0x1d0 + .byte 0x8 + .byte 0x72 + .4byte 0x10eef + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 + .4byte .LLST49 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1d0 .uleb128 0x5d - .4byte 0x15def - .4byte .LLST58 - .byte 0 - .byte 0 - .uleb128 0x5f + .4byte 0x15c0c + .4byte .LLST50 + .uleb128 0x5d + .4byte 0x15c17 + .4byte .LLST51 + .uleb128 0x6c + .4byte 0x15fd0 .8byte .LBB1159 .8byte .LBE1159-.LBB1159 - .4byte 0x10e38 - .uleb128 0x54 - .4byte 0x15a32 - .uleb128 0x59 - .4byte 0x15e1e + .byte 0x5 + .byte 0x4d + .4byte 0x10e55 + .uleb128 0x53 .8byte .LBB1160 .8byte .LBE1160-.LBB1160 - .byte 0x5 - .byte 0x56 - .uleb128 0x51 - .4byte 0x15e39 - .uleb128 0x51 - .4byte 0x15e2e - .uleb128 0x53 + .uleb128 0x5d + .4byte 0x15fe0 + .4byte .LLST52 + .byte 0 + .byte 0 + .uleb128 0x5f .8byte .LBB1161 .8byte .LBE1161-.LBB1161 + .4byte 0x10ea9 .uleb128 0x54 - .4byte 0x15e44 - .byte 0 - .byte 0 - .byte 0 + .4byte 0x15c23 .uleb128 0x59 - .4byte 0x15db3 + .4byte 0x1600f .8byte .LBB1162 .8byte .LBE1162-.LBB1162 .byte 0x5 - .byte 0x55 + .byte 0x56 .uleb128 0x51 - .4byte 0x15dcd + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15dc3 - .uleb128 0x59 - .4byte 0x15ea6 + .4byte 0x1601f + .uleb128 0x53 .8byte .LBB1163 .8byte .LBE1163-.LBB1163 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fa4 + .8byte .LBB1164 + .8byte .LBE1164-.LBB1164 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x15fbe + .uleb128 0x51 + .4byte 0x15fb4 + .uleb128 0x59 + .4byte 0x16097 + .8byte .LBB1165 + .8byte .LBE1165-.LBB1165 .byte 0xc9 .byte 0x61 .uleb128 0x51 - .4byte 0x15ec0 + .4byte 0x160b1 .uleb128 0x51 - .4byte 0x15eb6 + .4byte 0x160a7 .byte 0 .byte 0 .byte 0 .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1167 - .8byte .LBE1167-.LBB1167 - .byte 0x7 - .byte 0x86 - .4byte 0x10f39 - .uleb128 0x51 - .4byte 0x159d1 - .uleb128 0x53 - .8byte .LBB1168 - .8byte .LBE1168-.LBB1168 - .uleb128 0x5d - .4byte 0x159dc - .4byte .LLST59 .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2a0 - .4byte 0x10f04 + .4byte 0x15bb2 + .8byte .LBB1171 + .8byte .LBE1171-.LBB1171 + .byte 0x8 + .byte 0x74 + .4byte 0x10faa + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1172 + .8byte .LBE1172-.LBB1172 .uleb128 0x5d - .4byte 0x159e8 - .4byte .LLST60 + .4byte 0x15bcd + .4byte .LLST53 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x220 + .4byte 0x10f75 + .uleb128 0x5d + .4byte 0x15bd9 + .4byte .LLST54 .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1170 - .8byte .LBE1170-.LBB1170 + .4byte 0x1600f + .8byte .LBB1174 + .8byte .LBE1174-.LBB1174 .byte 0x5 .byte 0xfe .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 - .8byte .LBB1171 - .8byte .LBE1171-.LBB1171 + .8byte .LBB1175 + .8byte .LBE1175-.LBB1175 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15ddf - .8byte .LBB1172 - .8byte .LBE1172-.LBB1172 + .4byte 0x15fd0 + .8byte .LBB1176 + .8byte .LBE1176-.LBB1176 .byte 0x5 .byte 0xfd .uleb128 0x53 - .8byte .LBB1173 - .8byte .LBE1173-.LBB1173 + .8byte .LBB1177 + .8byte .LBE1177-.LBB1177 .uleb128 0x5d - .4byte 0x15def - .4byte .LLST61 + .4byte 0x15fe0 + .4byte .LLST55 .byte 0 .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL175 - .4byte 0x16b96 + .8byte .LVL151 + .4byte 0x16d87 + .uleb128 0x4b + .8byte .LVL318 + .4byte 0x16bfc + .byte 0 .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x15929 - .8byte .LBB1181 - .4byte .Ldebug_ranges0+0x2d0 + .4byte 0x15b1a + .8byte .LBB1190 + .4byte .Ldebug_ranges0+0x250 .byte 0x1 - .2byte 0xc17 - .4byte 0x11184 + .2byte 0xbce + .4byte 0x111f2 .uleb128 0x51 - .4byte 0x1594e + .4byte 0x15b3f .uleb128 0x51 - .4byte 0x15943 + .4byte 0x15b34 .uleb128 0x51 - .4byte 0x15939 - .uleb128 0x68 - .4byte 0x15987 - .8byte .LBB1182 - .4byte .Ldebug_ranges0+0x2d0 - .byte 0x7 + .4byte 0x15b2a + .uleb128 0x69 + .4byte 0x15b78 + .8byte .LBB1191 + .4byte .Ldebug_ranges0+0x250 + .byte 0x8 .byte 0x93 .uleb128 0x51 - .4byte 0x159ac + .4byte 0x15b9d .uleb128 0x51 - .4byte 0x159a1 + .4byte 0x15b92 .uleb128 0x51 - .4byte 0x15997 + .4byte 0x15b88 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x2d0 - .uleb128 0x5d - .4byte 0x159b5 - .4byte .LLST62 - .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1184 - .4byte .Ldebug_ranges0+0x330 - .byte 0x7 - .byte 0x72 - .4byte 0x110ac - .uleb128 0x51 - .4byte 0x15a10 + .4byte .Ldebug_ranges0+0x250 + .uleb128 0x54 + .4byte 0x15ba6 .uleb128 0x6a - .4byte 0x15a05 - .4byte .LLST63 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x330 - .uleb128 0x5d - .4byte 0x15a1b - .4byte .LLST64 - .uleb128 0x5d - .4byte 0x15a26 - .4byte .LLST65 + .4byte 0x15be6 + .8byte .LBB1193 + .4byte .Ldebug_ranges0+0x290 + .byte 0x8 + .byte 0x72 + .4byte 0x11127 + .uleb128 0x51 + .4byte 0x15c01 .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1186 - .8byte .LBE1186-.LBB1186 + .4byte 0x15bf6 + .4byte .LLST56 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x290 + .uleb128 0x5d + .4byte 0x15c0c + .4byte .LLST57 + .uleb128 0x5d + .4byte 0x15c17 + .4byte .LLST58 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1195 + .8byte .LBE1195-.LBB1195 .byte 0x5 .byte 0x4d - .4byte 0x11012 + .4byte 0x1108d .uleb128 0x53 - .8byte .LBB1187 - .8byte .LBE1187-.LBB1187 + .8byte .LBB1196 + .8byte .LBE1196-.LBB1196 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 + .4byte .LLST59 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1197 + .8byte .LBE1197-.LBB1197 + .4byte 0x110e1 + .uleb128 0x54 + .4byte 0x15c23 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1198 + .8byte .LBE1198-.LBB1198 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1199 + .8byte .LBE1199-.LBB1199 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fa4 + .8byte .LBB1200 + .8byte .LBE1200-.LBB1200 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x15fbe + .uleb128 0x51 + .4byte 0x15fb4 + .uleb128 0x59 + .4byte 0x16097 + .8byte .LBB1201 + .8byte .LBE1201-.LBB1201 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x160b1 + .uleb128 0x51 + .4byte 0x160a7 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15bb2 + .8byte .LBB1205 + .8byte .LBE1205-.LBB1205 + .byte 0x8 + .byte 0x74 + .4byte 0x111e2 + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1206 + .8byte .LBE1206-.LBB1206 + .uleb128 0x5d + .4byte 0x15bcd + .4byte .LLST60 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2d0 + .4byte 0x111ad + .uleb128 0x5d + .4byte 0x15bd9 + .4byte .LLST61 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1208 + .8byte .LBE1208-.LBB1208 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1209 + .8byte .LBE1209-.LBB1209 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fd0 + .8byte .LBB1210 + .8byte .LBE1210-.LBB1210 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1211 + .8byte .LBE1211-.LBB1211 + .uleb128 0x5d + .4byte 0x15fe0 + .4byte .LLST62 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL165 + .4byte 0x16d87 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15aeb + .8byte .LBB1219 + .4byte .Ldebug_ranges0+0x300 + .byte 0x1 + .2byte 0xb9b + .4byte 0x11412 + .uleb128 0x51 + .4byte 0x15b10 + .uleb128 0x51 + .4byte 0x15b05 + .uleb128 0x51 + .4byte 0x15afb + .uleb128 0x69 + .4byte 0x15b49 + .8byte .LBB1220 + .4byte .Ldebug_ranges0+0x300 + .byte 0x8 + .byte 0x9b + .uleb128 0x51 + .4byte 0x15b6e + .uleb128 0x51 + .4byte 0x15b63 + .uleb128 0x51 + .4byte 0x15b59 + .uleb128 0x6a + .4byte 0x15be6 + .8byte .LBB1222 + .4byte .Ldebug_ranges0+0x350 + .byte 0x8 + .byte 0x84 + .4byte 0x11348 + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 + .4byte .LLST63 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x350 + .uleb128 0x5d + .4byte 0x15c0c + .4byte .LLST64 + .uleb128 0x5d + .4byte 0x15c17 + .4byte .LLST65 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1224 + .8byte .LBE1224-.LBB1224 + .byte 0x5 + .byte 0x4d + .4byte 0x112ae + .uleb128 0x53 + .8byte .LBB1225 + .8byte .LBE1225-.LBB1225 + .uleb128 0x5d + .4byte 0x15fe0 .4byte .LLST66 .byte 0 .byte 0 .uleb128 0x5f - .8byte .LBB1188 - .8byte .LBE1188-.LBB1188 - .4byte 0x11066 + .8byte .LBB1226 + .8byte .LBE1226-.LBB1226 + .4byte 0x11302 .uleb128 0x54 - .4byte 0x15a32 + .4byte 0x15c23 .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1189 - .8byte .LBE1189-.LBB1189 + .4byte 0x1600f + .8byte .LBB1227 + .8byte .LBE1227-.LBB1227 .byte 0x5 .byte 0x56 .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 - .8byte .LBB1190 - .8byte .LBE1190-.LBB1190 + .8byte .LBB1228 + .8byte .LBE1228-.LBB1228 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15db3 - .8byte .LBB1191 - .8byte .LBE1191-.LBB1191 + .4byte 0x15fa4 + .8byte .LBB1229 + .8byte .LBE1229-.LBB1229 .byte 0x5 .byte 0x55 .uleb128 0x51 - .4byte 0x15dcd + .4byte 0x15fbe .uleb128 0x51 - .4byte 0x15dc3 + .4byte 0x15fb4 .uleb128 0x59 - .4byte 0x15ea6 - .8byte .LBB1192 - .8byte .LBE1192-.LBB1192 + .4byte 0x16097 + .8byte .LBB1230 + .8byte .LBE1230-.LBB1230 .byte 0xc9 .byte 0x61 .uleb128 0x51 - .4byte 0x15ec0 + .4byte 0x160b1 .uleb128 0x51 - .4byte 0x15eb6 + .4byte 0x160a7 .byte 0 .byte 0 .byte 0 .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1198 - .8byte .LBE1198-.LBB1198 - .byte 0x7 - .byte 0x74 - .4byte 0x11167 - .uleb128 0x51 - .4byte 0x159d1 - .uleb128 0x53 - .8byte .LBB1199 - .8byte .LBE1199-.LBB1199 - .uleb128 0x5d - .4byte 0x159dc - .4byte .LLST67 .uleb128 0x6c - .4byte .Ldebug_ranges0+0x380 - .4byte 0x11132 + .4byte 0x15bb2 + .8byte .LBB1236 + .8byte .LBE1236-.LBB1236 + .byte 0x8 + .byte 0x86 + .4byte 0x11403 + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1237 + .8byte .LBE1237-.LBB1237 .uleb128 0x5d - .4byte 0x159e8 + .4byte 0x15bcd + .4byte .LLST67 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x3a0 + .4byte 0x113ce + .uleb128 0x5d + .4byte 0x15bd9 .4byte .LLST68 .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1201 - .8byte .LBE1201-.LBB1201 + .4byte 0x1600f + .8byte .LBB1239 + .8byte .LBE1239-.LBB1239 .byte 0x5 .byte 0xfe .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 - .8byte .LBB1202 - .8byte .LBE1202-.LBB1202 + .8byte .LBB1240 + .8byte .LBE1240-.LBB1240 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15ddf - .8byte .LBB1203 - .8byte .LBE1203-.LBB1203 + .4byte 0x15fd0 + .8byte .LBB1241 + .8byte .LBE1241-.LBB1241 .byte 0x5 .byte 0xfd .uleb128 0x53 - .8byte .LBB1204 - .8byte .LBE1204-.LBB1204 + .8byte .LBB1242 + .8byte .LBE1242-.LBB1242 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 .4byte .LLST69 .byte 0 .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL187 - .4byte 0x16b8a - .uleb128 0x4b - .8byte .LVL299 - .4byte 0x16a0b - .byte 0 + .8byte .LVL184 + .4byte 0x16d7b .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x15929 - .8byte .LBB1217 - .4byte .Ldebug_ranges0+0x3b0 + .4byte 0x15b1a + .8byte .LBB1253 + .4byte .Ldebug_ranges0+0x3d0 .byte 0x1 - .2byte 0xc0b - .4byte 0x113c0 + .2byte 0xc02 + .4byte 0x1164e .uleb128 0x51 - .4byte 0x1594e + .4byte 0x15b3f .uleb128 0x51 - .4byte 0x15943 + .4byte 0x15b34 .uleb128 0x51 - .4byte 0x15939 - .uleb128 0x68 - .4byte 0x15987 - .8byte .LBB1218 - .4byte .Ldebug_ranges0+0x3b0 - .byte 0x7 + .4byte 0x15b2a + .uleb128 0x69 + .4byte 0x15b78 + .8byte .LBB1254 + .4byte .Ldebug_ranges0+0x3d0 + .byte 0x8 .byte 0x93 .uleb128 0x51 - .4byte 0x159ac + .4byte 0x15b9d .uleb128 0x51 - .4byte 0x159a1 + .4byte 0x15b92 .uleb128 0x51 - .4byte 0x15997 + .4byte 0x15b88 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x3b0 + .4byte .Ldebug_ranges0+0x3d0 .uleb128 0x5d - .4byte 0x159b5 + .4byte 0x15ba6 .4byte .LLST70 - .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1220 - .4byte .Ldebug_ranges0+0x410 - .byte 0x7 - .byte 0x72 - .4byte 0x112e8 - .uleb128 0x51 - .4byte 0x15a10 .uleb128 0x6a - .4byte 0x15a05 + .4byte 0x15be6 + .8byte .LBB1256 + .4byte .Ldebug_ranges0+0x430 + .byte 0x8 + .byte 0x72 + .4byte 0x11576 + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 .4byte .LLST71 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x410 + .4byte .Ldebug_ranges0+0x430 .uleb128 0x5d - .4byte 0x15a1b + .4byte 0x15c0c .4byte .LLST72 .uleb128 0x5d - .4byte 0x15a26 + .4byte 0x15c17 .4byte .LLST73 - .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1222 - .8byte .LBE1222-.LBB1222 - .byte 0x5 - .byte 0x4d - .4byte 0x1124e - .uleb128 0x53 - .8byte .LBB1223 - .8byte .LBE1223-.LBB1223 - .uleb128 0x5d - .4byte 0x15def - .4byte .LLST74 - .byte 0 - .byte 0 - .uleb128 0x5f - .8byte .LBB1224 - .8byte .LBE1224-.LBB1224 - .4byte 0x112a2 - .uleb128 0x54 - .4byte 0x15a32 - .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1225 - .8byte .LBE1225-.LBB1225 - .byte 0x5 - .byte 0x56 - .uleb128 0x51 - .4byte 0x15e39 - .uleb128 0x51 - .4byte 0x15e2e - .uleb128 0x53 - .8byte .LBB1226 - .8byte .LBE1226-.LBB1226 - .uleb128 0x54 - .4byte 0x15e44 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x59 - .4byte 0x15db3 - .8byte .LBB1227 - .8byte .LBE1227-.LBB1227 - .byte 0x5 - .byte 0x55 - .uleb128 0x51 - .4byte 0x15dcd - .uleb128 0x51 - .4byte 0x15dc3 - .uleb128 0x59 - .4byte 0x15ea6 - .8byte .LBB1228 - .8byte .LBE1228-.LBB1228 - .byte 0xc9 - .byte 0x61 - .uleb128 0x51 - .4byte 0x15ec0 - .uleb128 0x51 - .4byte 0x15eb6 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1234 - .8byte .LBE1234-.LBB1234 - .byte 0x7 - .byte 0x74 - .4byte 0x113a3 - .uleb128 0x51 - .4byte 0x159d1 - .uleb128 0x53 - .8byte .LBB1235 - .8byte .LBE1235-.LBB1235 - .uleb128 0x5d - .4byte 0x159dc - .4byte .LLST75 .uleb128 0x6c - .4byte .Ldebug_ranges0+0x460 - .4byte 0x1136e - .uleb128 0x5d - .4byte 0x159e8 - .4byte .LLST76 - .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1237 - .8byte .LBE1237-.LBB1237 - .byte 0x5 - .byte 0xfe - .uleb128 0x51 - .4byte 0x15e39 - .uleb128 0x51 - .4byte 0x15e2e - .uleb128 0x53 - .8byte .LBB1238 - .8byte .LBE1238-.LBB1238 - .uleb128 0x54 - .4byte 0x15e44 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x59 - .4byte 0x15ddf - .8byte .LBB1239 - .8byte .LBE1239-.LBB1239 - .byte 0x5 - .byte 0xfd - .uleb128 0x53 - .8byte .LBB1240 - .8byte .LBE1240-.LBB1240 - .uleb128 0x5d - .4byte 0x15def - .4byte .LLST77 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x4b - .8byte .LVL201 - .4byte 0x16b8a - .uleb128 0x4b - .8byte .LVL327 - .4byte 0x16a0b - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x58 - .4byte 0x158fa - .8byte .LBB1253 - .4byte .Ldebug_ranges0+0x490 - .byte 0x1 - .2byte 0xb97 - .4byte 0x115e0 - .uleb128 0x51 - .4byte 0x1591f - .uleb128 0x51 - .4byte 0x15914 - .uleb128 0x51 - .4byte 0x1590a - .uleb128 0x68 - .4byte 0x15958 - .8byte .LBB1254 - .4byte .Ldebug_ranges0+0x490 - .byte 0x7 - .byte 0x9b - .uleb128 0x51 - .4byte 0x1597d - .uleb128 0x51 - .4byte 0x15972 - .uleb128 0x51 - .4byte 0x15968 - .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1256 - .4byte .Ldebug_ranges0+0x4e0 - .byte 0x7 - .byte 0x84 - .4byte 0x11516 - .uleb128 0x51 - .4byte 0x15a10 - .uleb128 0x6a - .4byte 0x15a05 - .4byte .LLST78 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x4e0 - .uleb128 0x5d - .4byte 0x15a1b - .4byte .LLST79 - .uleb128 0x5d - .4byte 0x15a26 - .4byte .LLST80 - .uleb128 0x6b - .4byte 0x15ddf + .4byte 0x15fd0 .8byte .LBB1258 .8byte .LBE1258-.LBB1258 .byte 0x5 .byte 0x4d - .4byte 0x1147c + .4byte 0x114dc .uleb128 0x53 .8byte .LBB1259 .8byte .LBE1259-.LBB1259 .uleb128 0x5d - .4byte 0x15def - .4byte .LLST81 + .4byte 0x15fe0 + .4byte .LLST74 .byte 0 .byte 0 .uleb128 0x5f .8byte .LBB1260 .8byte .LBE1260-.LBB1260 - .4byte 0x114d0 + .4byte 0x11530 .uleb128 0x54 - .4byte 0x15a32 + .4byte 0x15c23 .uleb128 0x59 - .4byte 0x15e1e + .4byte 0x1600f .8byte .LBB1261 .8byte .LBE1261-.LBB1261 .byte 0x5 .byte 0x56 .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 .8byte .LBB1262 .8byte .LBE1262-.LBB1262 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15db3 + .4byte 0x15fa4 .8byte .LBB1263 .8byte .LBE1263-.LBB1263 .byte 0x5 .byte 0x55 .uleb128 0x51 - .4byte 0x15dcd + .4byte 0x15fbe .uleb128 0x51 - .4byte 0x15dc3 + .4byte 0x15fb4 .uleb128 0x59 - .4byte 0x15ea6 + .4byte 0x16097 .8byte .LBB1264 .8byte .LBE1264-.LBB1264 .byte 0xc9 .byte 0x61 .uleb128 0x51 - .4byte 0x15ec0 + .4byte 0x160b1 .uleb128 0x51 - .4byte 0x15eb6 + .4byte 0x160a7 .byte 0 .byte 0 .byte 0 .byte 0 - .uleb128 0x6b - .4byte 0x159c1 + .uleb128 0x6c + .4byte 0x15bb2 .8byte .LBB1270 .8byte .LBE1270-.LBB1270 - .byte 0x7 - .byte 0x86 - .4byte 0x115d1 + .byte 0x8 + .byte 0x74 + .4byte 0x11631 .uleb128 0x51 - .4byte 0x159d1 + .4byte 0x15bc2 .uleb128 0x53 .8byte .LBB1271 .8byte .LBE1271-.LBB1271 .uleb128 0x5d - .4byte 0x159dc - .4byte .LLST82 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x530 - .4byte 0x1159c + .4byte 0x15bcd + .4byte .LLST75 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x480 + .4byte 0x115fc .uleb128 0x5d - .4byte 0x159e8 - .4byte .LLST83 + .4byte 0x15bd9 + .4byte .LLST76 .uleb128 0x59 - .4byte 0x15e1e + .4byte 0x1600f .8byte .LBB1273 .8byte .LBE1273-.LBB1273 .byte 0x5 .byte 0xfe .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 .8byte .LBB1274 .8byte .LBE1274-.LBB1274 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15ddf + .4byte 0x15fd0 .8byte .LBB1275 .8byte .LBE1275-.LBB1275 .byte 0x5 @@ -48888,807 +49042,943 @@ .8byte .LBB1276 .8byte .LBE1276-.LBB1276 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 + .4byte .LLST77 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL197 + .4byte 0x16d87 + .uleb128 0x4b + .8byte .LVL294 + .4byte 0x16bfc + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15aeb + .8byte .LBB1289 + .4byte .Ldebug_ranges0+0x4b0 + .byte 0x1 + .2byte 0xc10 + .4byte 0x1186e + .uleb128 0x51 + .4byte 0x15b10 + .uleb128 0x51 + .4byte 0x15b05 + .uleb128 0x51 + .4byte 0x15afb + .uleb128 0x69 + .4byte 0x15b49 + .8byte .LBB1290 + .4byte .Ldebug_ranges0+0x4b0 + .byte 0x8 + .byte 0x9b + .uleb128 0x51 + .4byte 0x15b6e + .uleb128 0x51 + .4byte 0x15b63 + .uleb128 0x51 + .4byte 0x15b59 + .uleb128 0x6a + .4byte 0x15be6 + .8byte .LBB1292 + .4byte .Ldebug_ranges0+0x510 + .byte 0x8 + .byte 0x84 + .4byte 0x117a4 + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 + .4byte .LLST78 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x510 + .uleb128 0x5d + .4byte 0x15c0c + .4byte .LLST79 + .uleb128 0x5d + .4byte 0x15c17 + .4byte .LLST80 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1294 + .8byte .LBE1294-.LBB1294 + .byte 0x5 + .byte 0x4d + .4byte 0x1170a + .uleb128 0x53 + .8byte .LBB1295 + .8byte .LBE1295-.LBB1295 + .uleb128 0x5d + .4byte 0x15fe0 + .4byte .LLST81 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1296 + .8byte .LBE1296-.LBB1296 + .4byte 0x1175e + .uleb128 0x54 + .4byte 0x15c23 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1297 + .8byte .LBE1297-.LBB1297 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1298 + .8byte .LBE1298-.LBB1298 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fa4 + .8byte .LBB1299 + .8byte .LBE1299-.LBB1299 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x15fbe + .uleb128 0x51 + .4byte 0x15fb4 + .uleb128 0x59 + .4byte 0x16097 + .8byte .LBB1300 + .8byte .LBE1300-.LBB1300 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x160b1 + .uleb128 0x51 + .4byte 0x160a7 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15bb2 + .8byte .LBB1308 + .8byte .LBE1308-.LBB1308 + .byte 0x8 + .byte 0x86 + .4byte 0x1185f + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1309 + .8byte .LBE1309-.LBB1309 + .uleb128 0x5d + .4byte 0x15bcd + .4byte .LLST82 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x560 + .4byte 0x1182a + .uleb128 0x5d + .4byte 0x15bd9 + .4byte .LLST83 + .uleb128 0x59 + .4byte 0x1600f + .8byte .LBB1311 + .8byte .LBE1311-.LBB1311 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x1602a + .uleb128 0x51 + .4byte 0x1601f + .uleb128 0x53 + .8byte .LBB1312 + .8byte .LBE1312-.LBB1312 + .uleb128 0x54 + .4byte 0x16035 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x15fd0 + .8byte .LBB1313 + .8byte .LBE1313-.LBB1313 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1314 + .8byte .LBE1314-.LBB1314 + .uleb128 0x5d + .4byte 0x15fe0 .4byte .LLST84 .byte 0 .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL226 - .4byte 0x16b96 + .8byte .LVL304 + .4byte 0x16d7b .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x15929 - .8byte .LBB1287 - .4byte .Ldebug_ranges0+0x560 + .4byte 0x15b1a + .8byte .LBB1325 + .4byte .Ldebug_ranges0+0x590 .byte 0x1 - .2byte 0xbf7 - .4byte 0x1181c + .2byte 0xbb6 + .4byte 0x11a99 .uleb128 0x51 - .4byte 0x1594e + .4byte 0x15b3f .uleb128 0x51 - .4byte 0x15943 + .4byte 0x15b34 .uleb128 0x51 - .4byte 0x15939 - .uleb128 0x68 - .4byte 0x15987 - .8byte .LBB1288 - .4byte .Ldebug_ranges0+0x560 - .byte 0x7 + .4byte 0x15b2a + .uleb128 0x69 + .4byte 0x15b78 + .8byte .LBB1326 + .4byte .Ldebug_ranges0+0x590 + .byte 0x8 .byte 0x93 .uleb128 0x51 - .4byte 0x159ac + .4byte 0x15b9d .uleb128 0x51 - .4byte 0x159a1 + .4byte 0x15b92 .uleb128 0x51 - .4byte 0x15997 + .4byte 0x15b88 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x560 - .uleb128 0x5d - .4byte 0x159b5 - .4byte .LLST85 - .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1290 - .4byte .Ldebug_ranges0+0x5c0 - .byte 0x7 - .byte 0x72 - .4byte 0x11744 - .uleb128 0x51 - .4byte 0x15a10 + .4byte .Ldebug_ranges0+0x590 + .uleb128 0x54 + .4byte 0x15ba6 .uleb128 0x6a - .4byte 0x15a05 - .4byte .LLST86 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x5c0 - .uleb128 0x5d - .4byte 0x15a1b - .4byte .LLST87 - .uleb128 0x5d - .4byte 0x15a26 - .4byte .LLST88 + .4byte 0x15be6 + .8byte .LBB1328 + .4byte .Ldebug_ranges0+0x5d0 + .byte 0x8 + .byte 0x72 + .4byte 0x119ce + .uleb128 0x51 + .4byte 0x15c01 .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1292 - .8byte .LBE1292-.LBB1292 + .4byte 0x15bf6 + .4byte .LLST85 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x5d0 + .uleb128 0x5d + .4byte 0x15c0c + .4byte .LLST86 + .uleb128 0x5d + .4byte 0x15c17 + .4byte .LLST87 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1330 + .8byte .LBE1330-.LBB1330 .byte 0x5 .byte 0x4d - .4byte 0x116aa + .4byte 0x11934 .uleb128 0x53 - .8byte .LBB1293 - .8byte .LBE1293-.LBB1293 + .8byte .LBB1331 + .8byte .LBE1331-.LBB1331 .uleb128 0x5d - .4byte 0x15def - .4byte .LLST89 + .4byte 0x15fe0 + .4byte .LLST88 .byte 0 .byte 0 .uleb128 0x5f - .8byte .LBB1294 - .8byte .LBE1294-.LBB1294 - .4byte 0x116fe + .8byte .LBB1332 + .8byte .LBE1332-.LBB1332 + .4byte 0x11988 .uleb128 0x54 - .4byte 0x15a32 + .4byte 0x15c23 .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1295 - .8byte .LBE1295-.LBB1295 + .4byte 0x1600f + .8byte .LBB1333 + .8byte .LBE1333-.LBB1333 .byte 0x5 .byte 0x56 .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 - .8byte .LBB1296 - .8byte .LBE1296-.LBB1296 + .8byte .LBB1334 + .8byte .LBE1334-.LBB1334 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15db3 - .8byte .LBB1297 - .8byte .LBE1297-.LBB1297 + .4byte 0x15fa4 + .8byte .LBB1335 + .8byte .LBE1335-.LBB1335 .byte 0x5 .byte 0x55 .uleb128 0x51 - .4byte 0x15dcd + .4byte 0x15fbe .uleb128 0x51 - .4byte 0x15dc3 + .4byte 0x15fb4 .uleb128 0x59 - .4byte 0x15ea6 - .8byte .LBB1298 - .8byte .LBE1298-.LBB1298 + .4byte 0x16097 + .8byte .LBB1336 + .8byte .LBE1336-.LBB1336 .byte 0xc9 .byte 0x61 .uleb128 0x51 - .4byte 0x15ec0 + .4byte 0x160b1 .uleb128 0x51 - .4byte 0x15eb6 + .4byte 0x160a7 .byte 0 .byte 0 .byte 0 .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1304 - .8byte .LBE1304-.LBB1304 - .byte 0x7 - .byte 0x74 - .4byte 0x117ff - .uleb128 0x51 - .4byte 0x159d1 - .uleb128 0x53 - .8byte .LBB1305 - .8byte .LBE1305-.LBB1305 - .uleb128 0x5d - .4byte 0x159dc - .4byte .LLST90 .uleb128 0x6c - .4byte .Ldebug_ranges0+0x610 - .4byte 0x117ca + .4byte 0x15bb2 + .8byte .LBB1340 + .8byte .LBE1340-.LBB1340 + .byte 0x8 + .byte 0x74 + .4byte 0x11a89 + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1341 + .8byte .LBE1341-.LBB1341 .uleb128 0x5d - .4byte 0x159e8 - .4byte .LLST91 + .4byte 0x15bcd + .4byte .LLST89 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x610 + .4byte 0x11a54 + .uleb128 0x5d + .4byte 0x15bd9 + .4byte .LLST90 .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1307 - .8byte .LBE1307-.LBB1307 + .4byte 0x1600f + .8byte .LBB1343 + .8byte .LBE1343-.LBB1343 .byte 0x5 .byte 0xfe .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 - .8byte .LBB1308 - .8byte .LBE1308-.LBB1308 + .8byte .LBB1344 + .8byte .LBE1344-.LBB1344 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15ddf - .8byte .LBB1309 - .8byte .LBE1309-.LBB1309 + .4byte 0x15fd0 + .8byte .LBB1345 + .8byte .LBE1345-.LBB1345 .byte 0x5 .byte 0xfd .uleb128 0x53 - .8byte .LBB1310 - .8byte .LBE1310-.LBB1310 + .8byte .LBB1346 + .8byte .LBE1346-.LBB1346 .uleb128 0x5d - .4byte 0x15def - .4byte .LLST92 + .4byte 0x15fe0 + .4byte .LLST91 .byte 0 .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL241 - .4byte 0x16b8a - .uleb128 0x4b - .8byte .LVL321 - .4byte 0x16a0b + .8byte .LVL220 + .4byte 0x16d87 .byte 0 .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x158fa - .8byte .LBB1323 + .4byte 0x15b1a + .8byte .LBB1354 .4byte .Ldebug_ranges0+0x640 .byte 0x1 - .2byte 0xc05 - .4byte 0x11a3c + .2byte 0xb9e + .4byte 0x11cd5 .uleb128 0x51 - .4byte 0x1591f + .4byte 0x15b3f .uleb128 0x51 - .4byte 0x15914 + .4byte 0x15b34 .uleb128 0x51 - .4byte 0x1590a - .uleb128 0x68 - .4byte 0x15958 - .8byte .LBB1324 - .4byte .Ldebug_ranges0+0x640 - .byte 0x7 - .byte 0x9b - .uleb128 0x51 - .4byte 0x1597d - .uleb128 0x51 - .4byte 0x15972 - .uleb128 0x51 - .4byte 0x15968 + .4byte 0x15b2a .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1326 - .4byte .Ldebug_ranges0+0x6a0 - .byte 0x7 - .byte 0x84 - .4byte 0x11972 + .4byte 0x15b78 + .8byte .LBB1355 + .4byte .Ldebug_ranges0+0x640 + .byte 0x8 + .byte 0x93 .uleb128 0x51 - .4byte 0x15a10 + .4byte 0x15b9d + .uleb128 0x51 + .4byte 0x15b92 + .uleb128 0x51 + .4byte 0x15b88 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x640 + .uleb128 0x5d + .4byte 0x15ba6 + .4byte .LLST92 .uleb128 0x6a - .4byte 0x15a05 + .4byte 0x15be6 + .8byte .LBB1357 + .4byte .Ldebug_ranges0+0x690 + .byte 0x8 + .byte 0x72 + .4byte 0x11bfd + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 .4byte .LLST93 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x6a0 + .4byte .Ldebug_ranges0+0x690 .uleb128 0x5d - .4byte 0x15a1b + .4byte 0x15c0c .4byte .LLST94 .uleb128 0x5d - .4byte 0x15a26 + .4byte 0x15c17 .4byte .LLST95 - .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1328 - .8byte .LBE1328-.LBB1328 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1359 + .8byte .LBE1359-.LBB1359 .byte 0x5 .byte 0x4d - .4byte 0x118d8 + .4byte 0x11b63 .uleb128 0x53 - .8byte .LBB1329 - .8byte .LBE1329-.LBB1329 + .8byte .LBB1360 + .8byte .LBE1360-.LBB1360 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 .4byte .LLST96 .byte 0 .byte 0 .uleb128 0x5f - .8byte .LBB1330 - .8byte .LBE1330-.LBB1330 - .4byte 0x1192c + .8byte .LBB1361 + .8byte .LBE1361-.LBB1361 + .4byte 0x11bb7 .uleb128 0x54 - .4byte 0x15a32 + .4byte 0x15c23 .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1331 - .8byte .LBE1331-.LBB1331 + .4byte 0x1600f + .8byte .LBB1362 + .8byte .LBE1362-.LBB1362 .byte 0x5 .byte 0x56 .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 - .8byte .LBB1332 - .8byte .LBE1332-.LBB1332 + .8byte .LBB1363 + .8byte .LBE1363-.LBB1363 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15db3 - .8byte .LBB1333 - .8byte .LBE1333-.LBB1333 + .4byte 0x15fa4 + .8byte .LBB1364 + .8byte .LBE1364-.LBB1364 .byte 0x5 .byte 0x55 .uleb128 0x51 - .4byte 0x15dcd + .4byte 0x15fbe .uleb128 0x51 - .4byte 0x15dc3 + .4byte 0x15fb4 .uleb128 0x59 - .4byte 0x15ea6 - .8byte .LBB1334 - .8byte .LBE1334-.LBB1334 + .4byte 0x16097 + .8byte .LBB1365 + .8byte .LBE1365-.LBB1365 .byte 0xc9 .byte 0x61 .uleb128 0x51 - .4byte 0x15ec0 + .4byte 0x160b1 .uleb128 0x51 - .4byte 0x15eb6 + .4byte 0x160a7 .byte 0 .byte 0 .byte 0 .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1342 - .8byte .LBE1342-.LBB1342 - .byte 0x7 - .byte 0x86 - .4byte 0x11a2d - .uleb128 0x51 - .4byte 0x159d1 - .uleb128 0x53 - .8byte .LBB1343 - .8byte .LBE1343-.LBB1343 - .uleb128 0x5d - .4byte 0x159dc - .4byte .LLST97 .uleb128 0x6c - .4byte .Ldebug_ranges0+0x6f0 - .4byte 0x119f8 + .4byte 0x15bb2 + .8byte .LBB1369 + .8byte .LBE1369-.LBB1369 + .byte 0x8 + .byte 0x74 + .4byte 0x11cb8 + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1370 + .8byte .LBE1370-.LBB1370 .uleb128 0x5d - .4byte 0x159e8 + .4byte 0x15bcd + .4byte .LLST97 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x6d0 + .4byte 0x11c83 + .uleb128 0x5d + .4byte 0x15bd9 .4byte .LLST98 .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1345 - .8byte .LBE1345-.LBB1345 + .4byte 0x1600f + .8byte .LBB1372 + .8byte .LBE1372-.LBB1372 .byte 0x5 .byte 0xfe .uleb128 0x51 - .4byte 0x15e39 + .4byte 0x1602a .uleb128 0x51 - .4byte 0x15e2e + .4byte 0x1601f .uleb128 0x53 - .8byte .LBB1346 - .8byte .LBE1346-.LBB1346 + .8byte .LBB1373 + .8byte .LBE1373-.LBB1373 .uleb128 0x54 - .4byte 0x15e44 + .4byte 0x16035 .byte 0 .byte 0 .byte 0 .uleb128 0x59 - .4byte 0x15ddf - .8byte .LBB1347 - .8byte .LBE1347-.LBB1347 + .4byte 0x15fd0 + .8byte .LBB1374 + .8byte .LBE1374-.LBB1374 .byte 0x5 .byte 0xfd .uleb128 0x53 - .8byte .LBB1348 - .8byte .LBE1348-.LBB1348 + .8byte .LBB1375 + .8byte .LBE1375-.LBB1375 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 .4byte .LLST99 .byte 0 .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL309 - .4byte 0x16b96 + .8byte .LVL237 + .4byte 0x16d87 + .uleb128 0x4b + .8byte .LVL330 + .4byte 0x16bfc + .byte 0 .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x15929 - .8byte .LBB1359 - .4byte .Ldebug_ranges0+0x720 + .4byte 0x15aeb + .8byte .LBB1385 + .4byte .Ldebug_ranges0+0x700 .byte 0x1 - .2byte 0xbb2 - .4byte 0x11c67 + .2byte 0xbae + .4byte 0x11e8f .uleb128 0x51 - .4byte 0x1594e + .4byte 0x15b10 .uleb128 0x51 - .4byte 0x15943 + .4byte 0x15b05 .uleb128 0x51 - .4byte 0x15939 - .uleb128 0x68 - .4byte 0x15987 - .8byte .LBB1360 - .4byte .Ldebug_ranges0+0x720 - .byte 0x7 - .byte 0x93 - .uleb128 0x51 - .4byte 0x159ac - .uleb128 0x51 - .4byte 0x159a1 - .uleb128 0x51 - .4byte 0x15997 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x720 - .uleb128 0x54 - .4byte 0x159b5 + .4byte 0x15afb .uleb128 0x69 - .4byte 0x159f5 - .8byte .LBB1362 - .4byte .Ldebug_ranges0+0x760 - .byte 0x7 - .byte 0x72 - .4byte 0x11b9c + .4byte 0x15b49 + .8byte .LBB1386 + .4byte .Ldebug_ranges0+0x700 + .byte 0x8 + .byte 0x9b .uleb128 0x51 - .4byte 0x15a10 + .4byte 0x15b6e + .uleb128 0x51 + .4byte 0x15b63 + .uleb128 0x51 + .4byte 0x15b59 .uleb128 0x6a - .4byte 0x15a05 + .4byte 0x15be6 + .8byte .LBB1388 + .4byte .Ldebug_ranges0+0x760 + .byte 0x8 + .byte 0x84 + .4byte 0x11df2 + .uleb128 0x51 + .4byte 0x15c01 + .uleb128 0x6b + .4byte 0x15bf6 .4byte .LLST100 .uleb128 0x5b .4byte .Ldebug_ranges0+0x760 .uleb128 0x5d - .4byte 0x15a1b + .4byte 0x15c0c .4byte .LLST101 .uleb128 0x5d - .4byte 0x15a26 + .4byte 0x15c17 .4byte .LLST102 - .uleb128 0x6b - .4byte 0x15ddf - .8byte .LBB1364 - .8byte .LBE1364-.LBB1364 + .uleb128 0x6c + .4byte 0x15fd0 + .8byte .LBB1390 + .8byte .LBE1390-.LBB1390 .byte 0x5 .byte 0x4d - .4byte 0x11b02 + .4byte 0x11d91 .uleb128 0x53 - .8byte .LBB1365 - .8byte .LBE1365-.LBB1365 + .8byte .LBB1391 + .8byte .LBE1391-.LBB1391 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 .4byte .LLST103 .byte 0 .byte 0 - .uleb128 0x5f - .8byte .LBB1366 - .8byte .LBE1366-.LBB1366 - .4byte 0x11b56 - .uleb128 0x54 - .4byte 0x15a32 - .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1367 - .8byte .LBE1367-.LBB1367 - .byte 0x5 - .byte 0x56 - .uleb128 0x51 - .4byte 0x15e39 - .uleb128 0x51 - .4byte 0x15e2e - .uleb128 0x53 - .8byte .LBB1368 - .8byte .LBE1368-.LBB1368 - .uleb128 0x54 - .4byte 0x15e44 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x59 - .4byte 0x15db3 - .8byte .LBB1369 - .8byte .LBE1369-.LBB1369 + .uleb128 0x6c + .4byte 0x15fa4 + .8byte .LBB1392 + .8byte .LBE1392-.LBB1392 .byte 0x5 .byte 0x55 + .4byte 0x11dd9 .uleb128 0x51 - .4byte 0x15dcd + .4byte 0x15fbe .uleb128 0x51 - .4byte 0x15dc3 + .4byte 0x15fb4 .uleb128 0x59 - .4byte 0x15ea6 - .8byte .LBB1370 - .8byte .LBE1370-.LBB1370 + .4byte 0x16097 + .8byte .LBB1393 + .8byte .LBE1393-.LBB1393 .byte 0xc9 .byte 0x61 .uleb128 0x51 - .4byte 0x15ec0 + .4byte 0x160b1 .uleb128 0x51 - .4byte 0x15eb6 + .4byte 0x160a7 .byte 0 .byte 0 - .byte 0 - .byte 0 - .uleb128 0x6b - .4byte 0x159c1 - .8byte .LBB1374 - .8byte .LBE1374-.LBB1374 - .byte 0x7 - .byte 0x74 - .4byte 0x11c57 - .uleb128 0x51 - .4byte 0x159d1 .uleb128 0x53 - .8byte .LBB1375 - .8byte .LBE1375-.LBB1375 + .8byte .LBB1395 + .8byte .LBE1395-.LBB1395 + .uleb128 0x54 + .4byte 0x15c23 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15bb2 + .8byte .LBB1402 + .8byte .LBE1402-.LBB1402 + .byte 0x8 + .byte 0x86 + .4byte 0x11e80 + .uleb128 0x51 + .4byte 0x15bc2 + .uleb128 0x53 + .8byte .LBB1403 + .8byte .LBE1403-.LBB1403 .uleb128 0x5d - .4byte 0x159dc + .4byte 0x15bcd .4byte .LLST104 .uleb128 0x6c - .4byte .Ldebug_ranges0+0x7a0 - .4byte 0x11c22 - .uleb128 0x5d - .4byte 0x159e8 - .4byte .LLST105 - .uleb128 0x59 - .4byte 0x15e1e - .8byte .LBB1377 - .8byte .LBE1377-.LBB1377 - .byte 0x5 - .byte 0xfe - .uleb128 0x51 - .4byte 0x15e39 - .uleb128 0x51 - .4byte 0x15e2e - .uleb128 0x53 - .8byte .LBB1378 - .8byte .LBE1378-.LBB1378 - .uleb128 0x54 - .4byte 0x15e44 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x59 - .4byte 0x15ddf - .8byte .LBB1379 - .8byte .LBE1379-.LBB1379 + .4byte 0x15fd0 + .8byte .LBB1404 + .8byte .LBE1404-.LBB1404 .byte 0x5 .byte 0xfd + .4byte 0x11e63 .uleb128 0x53 - .8byte .LBB1380 - .8byte .LBE1380-.LBB1380 + .8byte .LBB1405 + .8byte .LBE1405-.LBB1405 .uleb128 0x5d - .4byte 0x15def + .4byte 0x15fe0 + .4byte .LLST105 + .byte 0 + .byte 0 + .uleb128 0x53 + .8byte .LBB1406 + .8byte .LBE1406-.LBB1406 + .uleb128 0x5d + .4byte 0x15bd9 .4byte .LLST106 .byte 0 .byte 0 .byte 0 - .byte 0 .uleb128 0x4b - .8byte .LVL270 - .4byte 0x16b8a - .byte 0 + .8byte .LVL311 + .4byte 0x16d7b .byte 0 .byte 0 .uleb128 0x4b .8byte .LVL101 - .4byte 0x169af + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL104 - .4byte 0x16a20 + .8byte .LVL117 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL107 - .4byte 0x169af + .8byte .LVL123 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL124 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL125 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL126 - .4byte 0x16a86 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL128 - .4byte 0x16b7f + .8byte .LVL153 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL137 - .4byte 0x16ba2 + .8byte .LVL166 + .4byte 0x16d93 .uleb128 0x4b - .8byte .LVL140 - .4byte 0x169af + .8byte .LVL167 + .4byte 0x16d9e .uleb128 0x4b - .8byte .LVL144 - .4byte 0x169af + .8byte .LVL168 + .4byte 0x16cc6 .uleb128 0x4b - .8byte .LVL145 - .4byte 0x16ad5 + .8byte .LVL169 + .4byte 0x16da9 .uleb128 0x4b - .8byte .LVL159 - .4byte 0x16bad + .8byte .LVL170 + .4byte 0x16d70 .uleb128 0x4b - .8byte .LVL160 - .4byte 0x16bb8 + .8byte .LVL185 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL189 - .4byte 0x169af + .8byte .LVL186 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL203 - .4byte 0x169af + .8byte .LVL199 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL206 - .4byte 0x169af + .8byte .LVL208 + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL209 - .4byte 0x169af + .8byte .LVL221 + .4byte 0x16d70 .uleb128 0x4b - .8byte .LVL211 - .4byte 0x16bc3 + .8byte .LVL222 + .4byte 0x16db4 .uleb128 0x4b - .8byte .LVL212 - .4byte 0x16b7f + .8byte .LVL224 + .4byte 0x16c82 .uleb128 0x4b - .8byte .LVL229 - .4byte 0x169af + .8byte .LVL239 + .4byte 0x16c6c .uleb128 0x4b - .8byte .LVL243 - .4byte 0x169af + .8byte .LVL241 + .4byte 0x16d70 .uleb128 0x4b - .8byte .LVL246 - .4byte 0x16a20 + .8byte .LVL250 + .4byte 0x16dbf .uleb128 0x4b - .8byte .LVL257 - .4byte 0x16a20 + .8byte .LVL289 + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL271 - .4byte 0x16b7f + .8byte .LVL295 + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL272 - .4byte 0x16bce + .8byte .LVL313 + .4byte 0x16cc6 .uleb128 0x4b - .8byte .LVL273 - .4byte 0x16a91 + .8byte .LVL319 + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL274 - .4byte 0x16ad5 - .uleb128 0x4b - .8byte .LVL300 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL322 - .4byte 0x16a20 + .8byte .LVL325 + .4byte 0x16c06 .uleb128 0x4b .8byte .LVL328 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL331 - .4byte 0x16b30 + .4byte 0x16d21 .byte 0 .uleb128 0x5 .4byte 0x68 - .4byte 0x11df1 + .4byte 0x1200c .uleb128 0x6 .4byte 0x4f .byte 0xa .byte 0 .uleb128 0x3 - .4byte 0x11de1 + .4byte 0x11ffc .uleb128 0x60 .4byte .LASF3069 .byte 0x1 - .2byte 0xb22 + .2byte 0xb25 .4byte 0xc6 .byte 0x1 - .4byte 0x11e20 + .4byte 0x1203b .uleb128 0x62 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0xb22 + .2byte 0xb25 .4byte 0xe0e4 .uleb128 0x4f .string "dev" .byte 0x1 - .2byte 0xb24 + .2byte 0xb27 .4byte 0xa496 .byte 0 .uleb128 0x4a .4byte .LASF3071 .byte 0x1 - .2byte 0xb1c + .2byte 0xb1f .8byte .LFB2847 .8byte .LFE2847-.LFB2847 .uleb128 0x1 .byte 0x9c - .4byte 0x11e5a + .4byte 0x12075 .uleb128 0x4e .string "t" .byte 0x1 - .2byte 0xb1c + .2byte 0xb1f .4byte 0x31cc - .4byte .LLST185 + .4byte .LLST193 .uleb128 0x4b - .8byte .LVL655 - .4byte 0x13351 + .8byte .LVL652 + .4byte 0x135aa .byte 0 .uleb128 0x4a .4byte .LASF3072 .byte 0x1 - .2byte 0xb12 + .2byte 0xb15 .8byte .LFB2846 .8byte .LFE2846-.LFB2846 .uleb128 0x1 .byte 0x9c - .4byte 0x11ea0 + .4byte 0x120bb .uleb128 0x4e .string "t" .byte 0x1 - .2byte 0xb12 + .2byte 0xb15 .4byte 0x31cc .4byte .LLST24 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0xb14 - .4byte 0xe82d + .2byte 0xb17 + .4byte 0xe81f .uleb128 0x4b .8byte .LVL86 - .4byte 0x169af + .4byte 0x16ba0 .byte 0 .uleb128 0x60 .4byte .LASF3073 .byte 0x1 - .2byte 0xb01 + .2byte 0xb04 .4byte 0xc6 .byte 0x1 - .4byte 0x11eca + .4byte 0x120e5 .uleb128 0x62 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0xb01 + .2byte 0xb04 .4byte 0xe0e4 .uleb128 0x4f .string "buf" .byte 0x1 - .2byte 0xb03 - .4byte 0xe480 + .2byte 0xb06 + .4byte 0xe472 .byte 0 .uleb128 0x4c .4byte .LASF3074 .byte 0x1 - .2byte 0x91b + .2byte 0x91c .4byte 0xc6 .8byte .LFB2844 .8byte .LFE2844-.LFB2844 .uleb128 0x1 .byte 0x9c - .4byte 0x1308c + .4byte 0x132e5 .uleb128 0x4e .string "ptr" .byte 0x1 - .2byte 0x91b + .2byte 0x91c .4byte 0x458 - .4byte .LLST348 + .4byte .LLST356 .uleb128 0x57 .string "ebc" .byte 0x1 - .2byte 0x91d - .4byte 0xe4e5 - .4byte .LLST349 + .2byte 0x91e + .4byte 0xe4d7 + .4byte .LLST357 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0x91e - .4byte 0xe82d - .uleb128 0x43 - .4byte .LASF2993 - .byte 0x1 .2byte 0x91f + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x920 .4byte 0xe0e4 .uleb128 0x4f .string "buf" .byte 0x1 - .2byte 0x920 - .4byte 0xe480 + .2byte 0x921 + .4byte 0xe472 .uleb128 0x56 .4byte .LASF3075 .byte 0x1 - .2byte 0x921 + .2byte 0x922 .4byte 0xc6 - .4byte .LLST350 + .4byte .LLST358 .uleb128 0x56 .4byte .LASF2960 .byte 0x1 - .2byte 0x922 + .2byte 0x923 .4byte 0xc6 - .4byte .LLST351 + .4byte .LLST359 .uleb128 0x49 .4byte .LASF874 .byte 0x1 - .2byte 0x923 + .2byte 0x924 .4byte 0xc6 .uleb128 0x1 - .byte 0x6a + .byte 0x69 .uleb128 0x56 .4byte .LASF3076 .byte 0x1 - .2byte 0x924 + .2byte 0x925 .4byte 0xc6 - .4byte .LLST352 + .4byte .LLST360 .uleb128 0x43 .4byte .LASF3077 .byte 0x1 - .2byte 0x925 + .2byte 0x926 .4byte 0xc6 .uleb128 0x6d - .4byte .LASF3084 + .4byte .LASF3097 .byte 0x1 - .2byte 0xa19 + .2byte 0xa1d .uleb128 0x6e .4byte .LASF3079 .byte 0x1 - .2byte 0xac9 - .8byte .L1367 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2120 - .4byte 0x1203f + .2byte 0xacb + .8byte .L1365 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2190 + .4byte 0x1225a .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0x93c + .2byte 0x93e .4byte 0xc6 .uleb128 0x53 - .8byte .LBB2243 - .8byte .LBE2243-.LBB2243 + .8byte .LBB2290 + .8byte .LBE2290-.LBB2290 .uleb128 0x6e .4byte .LASF3080 .byte 0x1 - .2byte 0x93c - .8byte .L1261 + .2byte 0x93e + .8byte .L1268 .uleb128 0x49 .4byte .LASF3081 .byte 0x1 - .2byte 0x93c + .2byte 0x93e .4byte 0x1528 .uleb128 0x2 .byte 0x91 @@ -49696,333 +49986,53 @@ .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0x93c + .2byte 0x93e .4byte 0x199 .uleb128 0x5f - .8byte .LBB2244 - .8byte .LBE2244-.LBB2244 - .4byte 0x12023 + .8byte .LBB2291 + .8byte .LBE2291-.LBB2291 + .4byte 0x1223e .uleb128 0x56 .4byte .LASF3082 .byte 0x1 - .2byte 0x93c - .4byte 0x199 - .4byte .LLST379 - .uleb128 0x4b - .8byte .LVL1540 - .4byte 0x16bd9 - .uleb128 0x4b - .8byte .LVL1541 - .4byte 0x16be4 - .byte 0 - .uleb128 0x4b - .8byte .LVL1538 - .4byte 0x16bf0 - .uleb128 0x4b - .8byte .LVL1542 - .4byte 0x16bfc - .byte 0 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2310 - .4byte 0x120ec - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0x9bf - .4byte 0xc6 - .uleb128 0x53 - .8byte .LBB2284 - .8byte .LBE2284-.LBB2284 - .uleb128 0x6e - .4byte .LASF3080 - .byte 0x1 - .2byte 0x9bf - .8byte .L1330 - .uleb128 0x49 - .4byte .LASF3081 - .byte 0x1 - .2byte 0x9bf - .4byte 0x1528 - .uleb128 0x2 - .byte 0x91 - .sleb128 -48 - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0x9bf - .4byte 0x199 - .uleb128 0x5f - .8byte .LBB2285 - .8byte .LBE2285-.LBB2285 - .4byte 0x120d0 - .uleb128 0x56 - .4byte .LASF3082 - .byte 0x1 - .2byte 0x9bf - .4byte 0x199 - .4byte .LLST388 - .uleb128 0x4b - .8byte .LVL1615 - .4byte 0x16bd9 - .uleb128 0x4b - .8byte .LVL1616 - .4byte 0x16be4 - .byte 0 - .uleb128 0x4b - .8byte .LVL1613 - .4byte 0x16bf0 - .uleb128 0x4b - .8byte .LVL1617 - .4byte 0x16bfc - .byte 0 - .byte 0 - .uleb128 0x5f - .8byte .LBB2280 - .8byte .LBE2280-.LBB2280 - .4byte 0x12142 - .uleb128 0x4f - .string "ret" - .byte 0x1 - .2byte 0x9c5 - .4byte 0xc6 - .uleb128 0x4b - .8byte .LVL1522 - .4byte 0x167d4 - .uleb128 0x4b - .8byte .LVL1523 - .4byte 0x16c08 - .uleb128 0x4b - .8byte .LVL1524 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1525 - .4byte 0x16ba2 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2150 - .4byte 0x12269 - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0x9dd - .4byte 0x199 - .uleb128 0x5f - .8byte .LBB2248 - .8byte .LBE2248-.LBB2248 - .4byte 0x12179 - .uleb128 0x43 - .4byte .LASF3083 - .byte 0x1 - .2byte 0x9dd - .4byte 0x2b0 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2180 - .4byte 0x1223d - .uleb128 0x6d - .4byte .LASF3080 - .byte 0x1 - .2byte 0x9dd - .uleb128 0x49 - .4byte .LASF3081 - .byte 0x1 - .2byte 0x9dd - .4byte 0x1528 - .uleb128 0x2 - .byte 0x91 - .sleb128 -48 - .uleb128 0x56 - .4byte .LASF3078 - .byte 0x1 - .2byte 0x9dd - .4byte 0x199 - .4byte .LLST380 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x21b0 - .4byte 0x121f3 - .uleb128 0x56 - .4byte .LASF3082 - .byte 0x1 - .2byte 0x9dd - .4byte 0x199 - .4byte .LLST381 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x21e0 - .4byte 0x121d8 - .uleb128 0x43 - .4byte .LASF3083 - .byte 0x1 - .2byte 0x9dd - .4byte 0x2b0 - .byte 0 - .uleb128 0x4b - .8byte .LVL1439 - .4byte 0x16be4 - .uleb128 0x4b - .8byte .LVL1630 - .4byte 0x16c13 - .byte 0 - .uleb128 0x50 - .4byte 0x15ce3 - .8byte .LBB2250 - .8byte .LBE2250-.LBB2250 - .byte 0x1 - .2byte 0x9dd - .4byte 0x12222 - .uleb128 0x51 - .4byte 0x15cf4 - .uleb128 0x4b - .8byte .LVL1436 - .4byte 0x16c1e - .byte 0 - .uleb128 0x4b - .8byte .LVL1438 - .4byte 0x16bf0 - .uleb128 0x4b - .8byte .LVL1440 - .4byte 0x16bfc - .byte 0 - .uleb128 0x5a - .4byte 0x15ce3 - .8byte .LBB2246 - .8byte .LBE2246-.LBB2246 - .byte 0x1 - .2byte 0x9dd - .uleb128 0x51 - .4byte 0x15cf4 - .uleb128 0x4b - .8byte .LVL1435 - .4byte 0x16c1e - .byte 0 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2340 - .4byte 0x12302 - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0x9ee - .4byte 0xc6 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x2370 - .uleb128 0x6d - .4byte .LASF3080 - .byte 0x1 - .2byte 0x9ee - .uleb128 0x49 - .4byte .LASF3081 - .byte 0x1 - .2byte 0x9ee - .4byte 0x1528 - .uleb128 0x2 - .byte 0x91 - .sleb128 -48 - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0x9ee - .4byte 0x199 - .uleb128 0x5f - .8byte .LBB2289 - .8byte .LBE2289-.LBB2289 - .4byte 0x122e6 - .uleb128 0x56 - .4byte .LASF3082 - .byte 0x1 - .2byte 0x9ee - .4byte 0x199 - .4byte .LLST389 - .uleb128 0x4b - .8byte .LVL1559 - .4byte 0x16be4 - .uleb128 0x4b - .8byte .LVL1561 - .4byte 0x16bd9 - .byte 0 - .uleb128 0x4b - .8byte .LVL1546 - .4byte 0x16bfc - .uleb128 0x4b - .8byte .LVL1558 - .4byte 0x16bf0 - .byte 0 - .byte 0 - .uleb128 0x5f - .8byte .LBB2277 - .8byte .LBE2277-.LBB2277 - .4byte 0x123bb - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0xa28 - .4byte 0xc6 - .uleb128 0x53 - .8byte .LBB2278 - .8byte .LBE2278-.LBB2278 - .uleb128 0x6e - .4byte .LASF3080 - .byte 0x1 - .2byte 0xa28 - .8byte .L1379 - .uleb128 0x49 - .4byte .LASF3081 - .byte 0x1 - .2byte 0xa28 - .4byte 0x1528 - .uleb128 0x2 - .byte 0x91 - .sleb128 -48 - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0xa28 - .4byte 0x199 - .uleb128 0x5f - .8byte .LBB2279 - .8byte .LBE2279-.LBB2279 - .4byte 0x1239f - .uleb128 0x56 - .4byte .LASF3082 - .byte 0x1 - .2byte 0xa28 + .2byte 0x93e .4byte 0x199 .4byte .LLST387 .uleb128 0x4b - .8byte .LVL1519 - .4byte 0x16bd9 + .8byte .LVL1528 + .4byte 0x16dca .uleb128 0x4b - .8byte .LVL1520 - .4byte 0x16be4 + .8byte .LVL1529 + .4byte 0x16dd5 .byte 0 .uleb128 0x4b - .8byte .LVL1517 - .4byte 0x16bf0 + .8byte .LVL1526 + .4byte 0x16de1 .uleb128 0x4b - .8byte .LVL1521 - .4byte 0x16bfc + .8byte .LVL1530 + .4byte 0x16ded .byte 0 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x23a0 - .4byte 0x1245b + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2340 + .4byte 0x12307 .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xa2e + .2byte 0x9c3 .4byte 0xc6 .uleb128 0x53 - .8byte .LBB2292 - .8byte .LBE2292-.LBB2292 + .8byte .LBB2340 + .8byte .LBE2340-.LBB2340 .uleb128 0x6e .4byte .LASF3080 .byte 0x1 - .2byte 0xa2e - .8byte .L1383 + .2byte 0x9c3 + .8byte .L1337 .uleb128 0x49 .4byte .LASF3081 .byte 0x1 - .2byte 0xa2e + .2byte 0x9c3 .4byte 0x1528 .uleb128 0x2 .byte 0x91 @@ -50030,51 +50040,176 @@ .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xa2e + .2byte 0x9c3 .4byte 0x199 .uleb128 0x5f - .8byte .LBB2293 - .8byte .LBE2293-.LBB2293 - .4byte 0x1244c + .8byte .LBB2341 + .8byte .LBE2341-.LBB2341 + .4byte 0x122eb .uleb128 0x56 .4byte .LASF3082 .byte 0x1 - .2byte 0xa2e + .2byte 0x9c3 + .4byte 0x199 + .4byte .LLST402 + .uleb128 0x4b + .8byte .LVL1619 + .4byte 0x16dca + .uleb128 0x4b + .8byte .LVL1620 + .4byte 0x16dd5 + .byte 0 + .uleb128 0x4b + .8byte .LVL1617 + .4byte 0x16de1 + .uleb128 0x4b + .8byte .LVL1621 + .4byte 0x16ded + .byte 0 + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x21c0 + .4byte 0x12351 + .uleb128 0x4f + .string "ret" + .byte 0x1 + .2byte 0x9c9 + .4byte 0xc6 + .uleb128 0x4b + .8byte .LVL1423 + .4byte 0x169c5 + .uleb128 0x4b + .8byte .LVL1581 + .4byte 0x16df9 + .uleb128 0x4b + .8byte .LVL1583 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1585 + .4byte 0x16dbf + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x21f0 + .4byte 0x124a0 + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0x9e1 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2296 + .8byte .LBE2296-.LBB2296 + .4byte 0x1238c + .uleb128 0x56 + .4byte .LASF3083 + .byte 0x1 + .2byte 0x9e1 + .4byte 0x2b0 + .4byte .LLST388 + .byte 0 + .uleb128 0x5f + .8byte .LBB2297 + .8byte .LBE2297-.LBB2297 + .4byte 0x12474 + .uleb128 0x6e + .4byte .LASF3080 + .byte 0x1 + .2byte 0x9e1 + .8byte .L1344 + .uleb128 0x49 + .4byte .LASF3081 + .byte 0x1 + .2byte 0x9e1 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x56 + .4byte .LASF3078 + .byte 0x1 + .2byte 0x9e1 + .4byte 0x199 + .4byte .LLST389 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2220 + .4byte 0x1242a + .uleb128 0x56 + .4byte .LASF3082 + .byte 0x1 + .2byte 0x9e1 .4byte 0x199 .4byte .LLST390 - .uleb128 0x4b - .8byte .LVL1598 - .4byte 0x16bd9 - .uleb128 0x4b - .8byte .LVL1599 - .4byte 0x16be4 - .byte 0 - .uleb128 0x4b - .8byte .LVL1596 - .4byte 0x16bf0 - .byte 0 - .byte 0 .uleb128 0x5f - .8byte .LBB2261 - .8byte .LBE2261-.LBB2261 - .4byte 0x12514 + .8byte .LBB2301 + .8byte .LBE2301-.LBB2301 + .4byte 0x1240f + .uleb128 0x56 + .4byte .LASF3083 + .byte 0x1 + .2byte 0x9e1 + .4byte 0x2b0 + .4byte .LLST391 + .byte 0 + .uleb128 0x4b + .8byte .LVL1538 + .4byte 0x16dd5 + .uleb128 0x4b + .8byte .LVL1546 + .4byte 0x16e04 + .byte 0 + .uleb128 0x50 + .4byte 0x15ed4 + .8byte .LBB2298 + .8byte .LBE2298-.LBB2298 + .byte 0x1 + .2byte 0x9e1 + .4byte 0x12459 + .uleb128 0x51 + .4byte 0x15ee5 + .uleb128 0x4b + .8byte .LVL1535 + .4byte 0x16e0f + .byte 0 + .uleb128 0x4b + .8byte .LVL1537 + .4byte 0x16de1 + .uleb128 0x4b + .8byte .LVL1541 + .4byte 0x16ded + .byte 0 + .uleb128 0x5a + .4byte 0x15ed4 + .8byte .LBB2294 + .8byte .LBE2294-.LBB2294 + .byte 0x1 + .2byte 0x9e1 + .uleb128 0x51 + .4byte 0x15ee5 + .uleb128 0x4b + .8byte .LVL1426 + .4byte 0x16e0f + .byte 0 + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2280 + .4byte 0x1254d .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xa5b + .2byte 0x9f2 .4byte 0xc6 .uleb128 0x53 - .8byte .LBB2262 - .8byte .LBE2262-.LBB2262 + .8byte .LBB2319 + .8byte .LBE2319-.LBB2319 .uleb128 0x6e .4byte .LASF3080 .byte 0x1 - .2byte 0xa5b - .8byte .L1391 + .2byte 0x9f2 + .8byte .L1354 .uleb128 0x49 .4byte .LASF3081 .byte 0x1 - .2byte 0xa5b + .2byte 0x9f2 .4byte 0x1528 .uleb128 0x2 .byte 0x91 @@ -50082,76 +50217,240 @@ .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xa5b + .2byte 0x9f2 .4byte 0x199 .uleb128 0x5f - .8byte .LBB2263 - .8byte .LBE2263-.LBB2263 - .4byte 0x124f8 + .8byte .LBB2320 + .8byte .LBE2320-.LBB2320 + .4byte 0x12531 .uleb128 0x56 .4byte .LASF3082 .byte 0x1 - .2byte 0xa5b + .2byte 0x9f2 .4byte 0x199 - .4byte .LLST384 + .4byte .LLST395 .uleb128 0x4b - .8byte .LVL1490 - .4byte 0x16bd9 + .8byte .LVL1629 + .4byte 0x16dca .uleb128 0x4b - .8byte .LVL1491 - .4byte 0x16be4 + .8byte .LVL1630 + .4byte 0x16dd5 .byte 0 .uleb128 0x4b - .8byte .LVL1488 - .4byte 0x16bf0 + .8byte .LVL1627 + .4byte 0x16de1 .uleb128 0x4b - .8byte .LVL1492 - .4byte 0x16bfc + .8byte .LVL1631 + .4byte 0x16ded .byte 0 .byte 0 .uleb128 0x5f - .8byte .LBB2257 - .8byte .LBE2257-.LBB2257 - .4byte 0x12547 + .8byte .LBB2347 + .8byte .LBE2347-.LBB2347 + .4byte 0x12606 + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0xa2c + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2348 + .8byte .LBE2348-.LBB2348 + .uleb128 0x6e + .4byte .LASF3080 + .byte 0x1 + .2byte 0xa2c + .8byte .L1377 + .uleb128 0x49 + .4byte .LASF3081 + .byte 0x1 + .2byte 0xa2c + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0xa2c + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2349 + .8byte .LBE2349-.LBB2349 + .4byte 0x125ea + .uleb128 0x56 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa2c + .4byte 0x199 + .4byte .LLST404 + .uleb128 0x4b + .8byte .LVL1590 + .4byte 0x16dca + .uleb128 0x4b + .8byte .LVL1591 + .4byte 0x16dd5 + .byte 0 + .uleb128 0x4b + .8byte .LVL1588 + .4byte 0x16de1 + .uleb128 0x4b + .8byte .LVL1592 + .4byte 0x16ded + .byte 0 + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2370 + .4byte 0x126a6 + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0xa32 + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2344 + .8byte .LBE2344-.LBB2344 + .uleb128 0x6e + .4byte .LASF3080 + .byte 0x1 + .2byte 0xa32 + .8byte .L1381 + .uleb128 0x49 + .4byte .LASF3081 + .byte 0x1 + .2byte 0xa32 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0xa32 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2345 + .8byte .LBE2345-.LBB2345 + .4byte 0x12697 + .uleb128 0x56 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa32 + .4byte 0x199 + .4byte .LLST403 + .uleb128 0x4b + .8byte .LVL1634 + .4byte 0x16dca + .uleb128 0x4b + .8byte .LVL1635 + .4byte 0x16dd5 + .byte 0 + .uleb128 0x4b + .8byte .LVL1632 + .4byte 0x16de1 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB2305 + .8byte .LBE2305-.LBB2305 + .4byte 0x1275f + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0xa5f + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2306 + .8byte .LBE2306-.LBB2306 + .uleb128 0x6e + .4byte .LASF3080 + .byte 0x1 + .2byte 0xa5f + .8byte .L1389 + .uleb128 0x49 + .4byte .LASF3081 + .byte 0x1 + .2byte 0xa5f + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0xa5f + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2307 + .8byte .LBE2307-.LBB2307 + .4byte 0x12743 + .uleb128 0x56 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa5f + .4byte 0x199 + .4byte .LLST392 + .uleb128 0x4b + .8byte .LVL1447 + .4byte 0x16dca + .uleb128 0x4b + .8byte .LVL1448 + .4byte 0x16dd5 + .byte 0 + .uleb128 0x4b + .8byte .LVL1445 + .4byte 0x16de1 + .uleb128 0x4b + .8byte .LVL1449 + .4byte 0x16ded + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB2334 + .8byte .LBE2334-.LBB2334 + .4byte 0x12792 .uleb128 0x57 .string "ret" .byte 0x1 - .2byte 0xa65 + .2byte 0xa69 .4byte 0xc6 - .4byte .LLST382 + .4byte .LLST401 .uleb128 0x4b - .8byte .LVL1463 - .4byte 0x167d4 + .8byte .LVL1523 + .4byte 0x169c5 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2240 - .4byte 0x1266e + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x22b0 + .4byte 0x128e1 .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xaa2 + .2byte 0xaa4 .4byte 0x199 .uleb128 0x5f - .8byte .LBB2267 - .8byte .LBE2267-.LBB2267 - .4byte 0x1257e - .uleb128 0x43 + .8byte .LBB2324 + .8byte .LBE2324-.LBB2324 + .4byte 0x127cd + .uleb128 0x56 .4byte .LASF3083 .byte 0x1 - .2byte 0xaa2 + .2byte 0xaa4 .4byte 0x2b0 + .4byte .LLST396 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2280 - .4byte 0x12642 - .uleb128 0x6d + .uleb128 0x5f + .8byte .LBB2325 + .8byte .LBE2325-.LBB2325 + .4byte 0x128b5 + .uleb128 0x6e .4byte .LASF3080 .byte 0x1 - .2byte 0xaa2 + .2byte 0xaa4 + .8byte .L1406 .uleb128 0x49 .4byte .LASF3081 .byte 0x1 - .2byte 0xaa2 + .2byte 0xaa4 .4byte 0x1528 .uleb128 0x2 .byte 0x91 @@ -50159,148 +50458,150 @@ .uleb128 0x56 .4byte .LASF3078 .byte 0x1 - .2byte 0xaa2 + .2byte 0xaa4 .4byte 0x199 - .4byte .LLST385 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x22b0 - .4byte 0x125f8 + .4byte .LLST397 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x22e0 + .4byte 0x1286b .uleb128 0x56 .4byte .LASF3082 .byte 0x1 - .2byte 0xaa2 + .2byte 0xaa4 .4byte 0x199 - .4byte .LLST386 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x22e0 - .4byte 0x125dd - .uleb128 0x43 + .4byte .LLST398 + .uleb128 0x5f + .8byte .LBB2329 + .8byte .LBE2329-.LBB2329 + .4byte 0x12850 + .uleb128 0x56 .4byte .LASF3083 .byte 0x1 - .2byte 0xaa2 + .2byte 0xaa4 .4byte 0x2b0 + .4byte .LLST399 .byte 0 .uleb128 0x4b - .8byte .LVL1622 - .4byte 0x16be4 + .8byte .LVL1598 + .4byte 0x16dd5 .uleb128 0x4b - .8byte .LVL1626 - .4byte 0x16c13 + .8byte .LVL1606 + .4byte 0x16e04 .byte 0 .uleb128 0x50 - .4byte 0x15ce3 - .8byte .LBB2269 - .8byte .LBE2269-.LBB2269 + .4byte 0x15ed4 + .8byte .LBB2326 + .8byte .LBE2326-.LBB2326 .byte 0x1 - .2byte 0xaa2 - .4byte 0x12627 + .2byte 0xaa4 + .4byte 0x1289a .uleb128 0x51 - .4byte 0x15cf4 + .4byte 0x15ee5 .uleb128 0x4b - .8byte .LVL1619 - .4byte 0x16c1e + .8byte .LVL1595 + .4byte 0x16e0f .byte 0 .uleb128 0x4b - .8byte .LVL1621 - .4byte 0x16bf0 + .8byte .LVL1597 + .4byte 0x16de1 .uleb128 0x4b - .8byte .LVL1623 - .4byte 0x16bfc + .8byte .LVL1601 + .4byte 0x16ded .byte 0 .uleb128 0x5a - .4byte 0x15ce3 - .8byte .LBB2265 - .8byte .LBE2265-.LBB2265 + .4byte 0x15ed4 + .8byte .LBB2322 + .8byte .LBE2322-.LBB2322 .byte 0x1 - .2byte 0xaa2 + .2byte 0xaa4 .uleb128 0x51 - .4byte 0x15cf4 + .4byte 0x15ee5 .uleb128 0x4b - .8byte .LVL1498 - .4byte 0x16c1e + .8byte .LVL1492 + .4byte 0x16e0f .byte 0 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2210 - .4byte 0x1271b + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2310 + .4byte 0x1298e .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xabd + .2byte 0xabf .4byte 0xc6 .uleb128 0x53 - .8byte .LBB2259 - .8byte .LBE2259-.LBB2259 + .8byte .LBB2332 + .8byte .LBE2332-.LBB2332 .uleb128 0x6e .4byte .LASF3080 .byte 0x1 - .2byte 0xabd + .2byte 0xabf + .8byte .L1411 + .uleb128 0x49 + .4byte .LASF3081 + .byte 0x1 + .2byte 0xabf + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0xabf + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2333 + .8byte .LBE2333-.LBB2333 + .4byte 0x12972 + .uleb128 0x56 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xabf + .4byte 0x199 + .4byte .LLST400 + .uleb128 0x4b + .8byte .LVL1564 + .4byte 0x16dca + .uleb128 0x4b + .8byte .LVL1565 + .4byte 0x16dd5 + .byte 0 + .uleb128 0x4b + .8byte .LVL1562 + .4byte 0x16de1 + .uleb128 0x4b + .8byte .LVL1566 + .4byte 0x16ded + .byte 0 + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1d20 + .4byte 0x12a60 + .uleb128 0x43 + .4byte .LASF3078 + .byte 0x1 + .2byte 0xae4 + .4byte 0x199 + .uleb128 0x6f + .4byte 0x129b5 + .uleb128 0x43 + .4byte .LASF3083 + .byte 0x1 + .2byte 0xae4 + .4byte 0x2b0 + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1d20 + .uleb128 0x6e + .4byte .LASF3080 + .byte 0x1 + .2byte 0xae4 .8byte .L1420 .uleb128 0x49 .4byte .LASF3081 .byte 0x1 - .2byte 0xabd - .4byte 0x1528 - .uleb128 0x2 - .byte 0x91 - .sleb128 -48 - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0xabd - .4byte 0x199 - .uleb128 0x5f - .8byte .LBB2260 - .8byte .LBE2260-.LBB2260 - .4byte 0x126ff - .uleb128 0x56 - .4byte .LASF3082 - .byte 0x1 - .2byte 0xabd - .4byte 0x199 - .4byte .LLST383 - .uleb128 0x4b - .8byte .LVL1567 - .4byte 0x16bd9 - .uleb128 0x4b - .8byte .LVL1568 - .4byte 0x16be4 - .byte 0 - .uleb128 0x4b - .8byte .LVL1565 - .4byte 0x16bf0 - .uleb128 0x4b - .8byte .LVL1569 - .4byte 0x16bfc - .byte 0 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1c90 - .4byte 0x127ed - .uleb128 0x43 - .4byte .LASF3078 - .byte 0x1 - .2byte 0xae1 - .4byte 0x199 - .uleb128 0x6f - .4byte 0x12742 - .uleb128 0x43 - .4byte .LASF3083 - .byte 0x1 - .2byte 0xae1 - .4byte 0x2b0 - .byte 0 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1c90 - .uleb128 0x6e - .4byte .LASF3080 - .byte 0x1 - .2byte 0xae1 - .8byte .L1429 - .uleb128 0x49 - .4byte .LASF3081 - .byte 0x1 - .2byte 0xae1 + .2byte 0xae4 .4byte 0x1528 .uleb128 0x2 .byte 0x91 @@ -50308,67 +50609,67 @@ .uleb128 0x56 .4byte .LASF3078 .byte 0x1 - .2byte 0xae1 + .2byte 0xae4 .4byte 0x199 - .4byte .LLST353 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1cf0 - .4byte 0x127d1 + .4byte .LLST361 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1d70 + .4byte 0x12a44 .uleb128 0x56 .4byte .LASF3082 .byte 0x1 - .2byte 0xae1 + .2byte 0xae4 .4byte 0x199 - .4byte .LLST354 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1d50 - .4byte 0x127a9 + .4byte .LLST362 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1dc0 + .4byte 0x12a1c .uleb128 0x56 .4byte .LASF3083 .byte 0x1 - .2byte 0xae1 + .2byte 0xae4 .4byte 0x2b0 - .4byte .LLST355 + .4byte .LLST363 .byte 0 .uleb128 0x4b - .8byte .LVL1504 - .4byte 0x16be4 + .8byte .LVL1452 + .4byte 0x16dd5 .uleb128 0x4b - .8byte .LVL1508 - .4byte 0x16c13 + .8byte .LVL1457 + .4byte 0x16e04 .uleb128 0x4b - .8byte .LVL1509 - .4byte 0x16be4 + .8byte .LVL1458 + .4byte 0x16dd5 .byte 0 .uleb128 0x4b - .8byte .LVL1502 - .4byte 0x16bf0 + .8byte .LVL1451 + .4byte 0x16de1 .uleb128 0x4b - .8byte .LVL1511 - .4byte 0x16bfc + .8byte .LVL1461 + .4byte 0x16ded .byte 0 .byte 0 .uleb128 0x5f - .8byte .LBB2296 - .8byte .LBE2296-.LBB2296 - .4byte 0x128b3 + .8byte .LBB2309 + .8byte .LBE2309-.LBB2309 + .4byte 0x12b26 .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xaea + .2byte 0xaed .4byte 0xc6 .uleb128 0x53 - .8byte .LBB2297 - .8byte .LBE2297-.LBB2297 + .8byte .LBB2310 + .8byte .LBE2310-.LBB2310 .uleb128 0x6e .4byte .LASF3080 .byte 0x1 - .2byte 0xaea - .8byte .L1435 + .2byte 0xaed + .8byte .L1426 .uleb128 0x49 .4byte .LASF3081 .byte 0x1 - .2byte 0xaea + .2byte 0xaed .4byte 0x1528 .uleb128 0x2 .byte 0x91 @@ -50376,55 +50677,55 @@ .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xaea + .2byte 0xaed .4byte 0x199 .uleb128 0x5f - .8byte .LBB2298 - .8byte .LBE2298-.LBB2298 - .4byte 0x12897 + .8byte .LBB2311 + .8byte .LBE2311-.LBB2311 + .4byte 0x12b0a .uleb128 0x56 .4byte .LASF3082 .byte 0x1 - .2byte 0xaea + .2byte 0xaed .4byte 0x199 - .4byte .LLST391 + .4byte .LLST393 .uleb128 0x4b - .8byte .LVL1574 - .4byte 0x16be4 + .8byte .LVL1464 + .4byte 0x16dd5 .uleb128 0x4b - .8byte .LVL1576 - .4byte 0x16bd9 + .8byte .LVL1466 + .4byte 0x16dca .uleb128 0x4b - .8byte .LVL1577 - .4byte 0x16be4 + .8byte .LVL1467 + .4byte 0x16dd5 .byte 0 .uleb128 0x4b - .8byte .LVL1573 - .4byte 0x16bf0 + .8byte .LVL1463 + .4byte 0x16de1 .uleb128 0x4b - .8byte .LVL1578 - .4byte 0x16bfc + .8byte .LVL1468 + .4byte 0x16ded .byte 0 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x23d0 - .4byte 0x12954 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2250 + .4byte 0x12bc7 .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xaf9 + .2byte 0xafc .4byte 0xc6 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x23d0 + .4byte .Ldebug_ranges0+0x2250 .uleb128 0x6e .4byte .LASF3080 .byte 0x1 - .2byte 0xaf9 - .8byte .L1442 + .2byte 0xafc + .8byte .L1433 .uleb128 0x49 .4byte .LASF3081 .byte 0x1 - .2byte 0xaf9 + .2byte 0xafc .4byte 0x1528 .uleb128 0x2 .byte 0x91 @@ -50432,1053 +50733,1047 @@ .uleb128 0x43 .4byte .LASF3078 .byte 0x1 - .2byte 0xaf9 + .2byte 0xafc .4byte 0x199 .uleb128 0x5f - .8byte .LBB2303 - .8byte .LBE2303-.LBB2303 - .4byte 0x12938 + .8byte .LBB2316 + .8byte .LBE2316-.LBB2316 + .4byte 0x12bab .uleb128 0x56 .4byte .LASF3082 .byte 0x1 - .2byte 0xaf9 + .2byte 0xafc .4byte 0x199 - .4byte .LLST392 + .4byte .LLST394 .uleb128 0x4b - .8byte .LVL1583 - .4byte 0x16be4 + .8byte .LVL1473 + .4byte 0x16dd5 .uleb128 0x4b - .8byte .LVL1585 - .4byte 0x16bd9 + .8byte .LVL1475 + .4byte 0x16dca .byte 0 .uleb128 0x4b - .8byte .LVL1582 - .4byte 0x16bf0 + .8byte .LVL1472 + .4byte 0x16de1 .uleb128 0x4b - .8byte .LVL1587 - .4byte 0x16bfc + .8byte .LVL1625 + .4byte 0x16ded .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x152f6 - .8byte .LBB2184 - .4byte .Ldebug_ranges0+0x1d80 + .4byte 0x154e7 + .8byte .LBB2231 + .4byte .Ldebug_ranges0+0x1df0 .byte 0x1 - .2byte 0x941 - .4byte 0x12ab5 + .2byte 0x943 + .4byte 0x12d28 .uleb128 0x51 - .4byte 0x1533f + .4byte 0x15530 .uleb128 0x51 - .4byte 0x1533f + .4byte 0x15530 .uleb128 0x51 - .4byte 0x1533f - .uleb128 0x6a - .4byte 0x15333 - .4byte .LLST356 - .uleb128 0x6a - .4byte 0x15327 - .4byte .LLST357 - .uleb128 0x6a - .4byte 0x1531b - .4byte .LLST358 - .uleb128 0x6a - .4byte 0x1530f - .4byte .LLST359 - .uleb128 0x6a - .4byte 0x15303 - .4byte .LLST360 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1d80 - .uleb128 0x54 - .4byte 0x1534b - .uleb128 0x5d - .4byte 0x15357 - .4byte .LLST361 - .uleb128 0x54 - .4byte 0x15363 - .uleb128 0x5d - .4byte 0x1536f - .4byte .LLST362 - .uleb128 0x5d - .4byte 0x1537b - .4byte .LLST363 - .uleb128 0x5d - .4byte 0x15387 + .4byte 0x15530 + .uleb128 0x6b + .4byte 0x15524 .4byte .LLST364 - .uleb128 0x5d - .4byte 0x15393 + .uleb128 0x6b + .4byte 0x15518 .4byte .LLST365 + .uleb128 0x6b + .4byte 0x1550c + .4byte .LLST366 + .uleb128 0x6b + .4byte 0x15500 + .4byte .LLST367 + .uleb128 0x6b + .4byte 0x154f4 + .4byte .LLST368 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1df0 + .uleb128 0x54 + .4byte 0x1553c + .uleb128 0x5d + .4byte 0x15548 + .4byte .LLST369 + .uleb128 0x54 + .4byte 0x15554 + .uleb128 0x5d + .4byte 0x15560 + .4byte .LLST370 + .uleb128 0x5d + .4byte 0x1556c + .4byte .LLST371 + .uleb128 0x5d + .4byte 0x15578 + .4byte .LLST372 + .uleb128 0x5d + .4byte 0x15584 + .4byte .LLST373 .uleb128 0x5e - .4byte 0x1539f + .4byte 0x15590 .uleb128 0x1 .byte 0x52 .uleb128 0x5e - .4byte 0x153ab + .4byte 0x1559c .uleb128 0x1 .byte 0x5e .uleb128 0x5d - .4byte 0x153b5 - .4byte .LLST366 - .uleb128 0x5d - .4byte 0x153bf - .4byte .LLST367 - .uleb128 0x5d - .4byte 0x153cb - .4byte .LLST368 - .uleb128 0x5d - .4byte 0x153d7 - .4byte .LLST369 - .uleb128 0x5d - .4byte 0x153e3 - .4byte .LLST370 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1e00 - .4byte 0x12a32 - .uleb128 0x5d - .4byte 0x15460 - .4byte .LLST371 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1e70 - .4byte 0x12a45 - .uleb128 0x5d - .4byte 0x1546e - .4byte .LLST372 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1ee0 - .4byte 0x12a58 - .uleb128 0x5d - .4byte 0x153f4 - .4byte .LLST373 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1f40 - .4byte 0x12a6b - .uleb128 0x5d - .4byte 0x15406 + .4byte 0x155a6 .4byte .LLST374 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1fa0 - .4byte 0x12a7e .uleb128 0x5d - .4byte 0x15418 + .4byte 0x155b0 .4byte .LLST375 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2000 - .4byte 0x12a91 .uleb128 0x5d - .4byte 0x1542a + .4byte 0x155bc .4byte .LLST376 - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2060 - .4byte 0x12aa4 .uleb128 0x5d - .4byte 0x1543c + .4byte 0x155c8 .4byte .LLST377 - .byte 0 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x20c0 .uleb128 0x5d - .4byte 0x1544e + .4byte 0x155d4 .4byte .LLST378 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1e70 + .4byte 0x12ca5 + .uleb128 0x5d + .4byte 0x15651 + .4byte .LLST379 .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1ee0 + .4byte 0x12cb8 + .uleb128 0x5d + .4byte 0x1565f + .4byte .LLST380 .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1f50 + .4byte 0x12ccb + .uleb128 0x5d + .4byte 0x155e5 + .4byte .LLST381 .byte 0 - .uleb128 0x50 - .4byte 0x1312c - .8byte .LBB2240 - .8byte .LBE2240-.LBB2240 - .byte 0x1 - .2byte 0xa72 - .4byte 0x12b1b - .uleb128 0x51 - .4byte 0x1313d - .uleb128 0x51 - .4byte 0x13149 - .uleb128 0x51 - .4byte 0x13155 - .uleb128 0x53 - .8byte .LBB2241 - .8byte .LBE2241-.LBB2241 - .uleb128 0x54 - .4byte 0x13161 - .uleb128 0x54 - .4byte 0x1316b - .uleb128 0x54 - .4byte 0x13177 - .uleb128 0x54 - .4byte 0x13183 - .uleb128 0x54 - .4byte 0x1318f - .uleb128 0x54 - .4byte 0x1319b - .uleb128 0x54 - .4byte 0x131a7 - .uleb128 0x70 - .4byte 0x131b3 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1fb0 + .4byte 0x12cde + .uleb128 0x5d + .4byte 0x155f7 + .4byte .LLST382 .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2010 + .4byte 0x12cf1 + .uleb128 0x5d + .4byte 0x15609 + .4byte .LLST383 .byte 0 - .uleb128 0x50 - .4byte 0x1547c - .8byte .LBB2281 - .8byte .LBE2281-.LBB2281 - .byte 0x1 - .2byte 0x92a - .4byte 0x12b66 - .uleb128 0x51 - .4byte 0x15499 - .uleb128 0x51 - .4byte 0x1548d - .uleb128 0x53 - .8byte .LBB2282 - .8byte .LBE2282-.LBB2282 - .uleb128 0x54 - .4byte 0x154a5 - .uleb128 0x4b - .8byte .LVL1528 - .4byte 0x1643d + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x2070 + .4byte 0x12d04 + .uleb128 0x5d + .4byte 0x1561b + .4byte .LLST384 .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x20d0 + .4byte 0x12d17 + .uleb128 0x5d + .4byte 0x1562d + .4byte .LLST385 .byte 0 - .uleb128 0x50 - .4byte 0x1547c - .8byte .LBB2299 - .8byte .LBE2299-.LBB2299 - .byte 0x1 - .2byte 0xaf6 - .4byte 0x12bb1 - .uleb128 0x51 - .4byte 0x15499 - .uleb128 0x51 - .4byte 0x1548d - .uleb128 0x53 - .8byte .LBB2300 - .8byte .LBE2300-.LBB2300 - .uleb128 0x54 - .4byte 0x154a5 - .uleb128 0x4b - .8byte .LVL1581 - .4byte 0x1643d - .byte 0 - .byte 0 - .uleb128 0x58 - .4byte 0x13a67 - .8byte .LBB2307 - .4byte .Ldebug_ranges0+0x2400 - .byte 0x1 - .2byte 0xa09 - .4byte 0x12c66 - .uleb128 0x51 - .4byte 0x13a74 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x2400 - .uleb128 0x54 - .4byte 0x13a80 - .uleb128 0x54 - .4byte 0x13a8c - .uleb128 0x54 - .4byte 0x13a98 + .4byte .Ldebug_ranges0+0x2130 + .uleb128 0x5d + .4byte 0x1563f + .4byte .LLST386 + .byte 0 + .byte 0 + .byte 0 .uleb128 0x50 - .4byte 0x13abb - .8byte .LBB2309 - .8byte .LBE2309-.LBB2309 + .4byte 0x13385 + .8byte .LBB2287 + .8byte .LBE2287-.LBB2287 .byte 0x1 - .2byte 0x65e - .4byte 0x12c16 + .2byte 0xa75 + .4byte 0x12d8e .uleb128 0x51 - .4byte 0x13ad4 + .4byte 0x13396 .uleb128 0x51 - .4byte 0x13ac8 - .uleb128 0x4b - .8byte .LVL1605 - .4byte 0x1633b - .byte 0 - .uleb128 0x4b - .8byte .LVL1602 - .4byte 0x1450f - .uleb128 0x4b - .8byte .LVL1603 - .4byte 0x168e5 - .uleb128 0x4b - .8byte .LVL1604 - .4byte 0x1450f - .uleb128 0x4b - .8byte .LVL1609 - .4byte 0x14bc3 - .uleb128 0x4b - .8byte .LVL1610 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1611 - .4byte 0x14bc3 + .4byte 0x133a2 + .uleb128 0x51 + .4byte 0x133ae + .uleb128 0x53 + .8byte .LBB2288 + .8byte .LBE2288-.LBB2288 + .uleb128 0x54 + .4byte 0x133ba + .uleb128 0x54 + .4byte 0x133c4 + .uleb128 0x54 + .4byte 0x133d0 + .uleb128 0x54 + .4byte 0x133dc + .uleb128 0x54 + .4byte 0x133e8 + .uleb128 0x54 + .4byte 0x133f4 + .uleb128 0x54 + .4byte 0x13400 + .uleb128 0x70 + .4byte 0x1340c .byte 0 .byte 0 .uleb128 0x50 - .4byte 0x15ce3 + .4byte 0x15ed4 + .8byte .LBB2303 + .8byte .LBE2303-.LBB2303 + .byte 0x1 + .2byte 0xa16 + .4byte 0x12dbd + .uleb128 0x51 + .4byte 0x15ee5 + .uleb128 0x4b + .8byte .LVL1434 + .4byte 0x16e0f + .byte 0 + .uleb128 0x50 + .4byte 0x1566d .8byte .LBB2312 .8byte .LBE2312-.LBB2312 .byte 0x1 - .2byte 0xa12 - .4byte 0x12c95 + .2byte 0xaf9 + .4byte 0x12e08 .uleb128 0x51 - .4byte 0x15cf4 + .4byte 0x1568a + .uleb128 0x51 + .4byte 0x1567e + .uleb128 0x53 + .8byte .LBB2313 + .8byte .LBE2313-.LBB2313 + .uleb128 0x54 + .4byte 0x15696 .uleb128 0x4b - .8byte .LVL1607 - .4byte 0x16c1e + .8byte .LVL1471 + .4byte 0x1662e + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x1566d + .8byte .LBB2337 + .8byte .LBE2337-.LBB2337 + .byte 0x1 + .2byte 0x92b + .4byte 0x12e53 + .uleb128 0x51 + .4byte 0x1568a + .uleb128 0x51 + .4byte 0x1567e + .uleb128 0x53 + .8byte .LBB2338 + .8byte .LBE2338-.LBB2338 + .uleb128 0x54 + .4byte 0x15696 + .uleb128 0x4b + .8byte .LVL1548 + .4byte 0x1662e + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x13c58 + .8byte .LBB2351 + .4byte .Ldebug_ranges0+0x23a0 + .byte 0x1 + .2byte 0xa0d + .4byte 0x12f08 + .uleb128 0x51 + .4byte 0x13c65 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x23a0 + .uleb128 0x54 + .4byte 0x13c71 + .uleb128 0x54 + .4byte 0x13c7d + .uleb128 0x54 + .4byte 0x13c89 + .uleb128 0x50 + .4byte 0x13cac + .8byte .LBB2353 + .8byte .LBE2353-.LBB2353 + .byte 0x1 + .2byte 0x65d + .4byte 0x12eb8 + .uleb128 0x51 + .4byte 0x13cc5 + .uleb128 0x51 + .4byte 0x13cb9 + .uleb128 0x4b + .8byte .LVL1612 + .4byte 0x1652c + .byte 0 + .uleb128 0x4b + .8byte .LVL1610 + .4byte 0x14700 + .uleb128 0x4b + .8byte .LVL1611 + .4byte 0x14700 + .uleb128 0x4b + .8byte .LVL1613 + .4byte 0x14db4 + .uleb128 0x4b + .8byte .LVL1614 + .4byte 0x14db4 + .uleb128 0x4b + .8byte .LVL1615 + .4byte 0x16ad6 + .uleb128 0x4b + .8byte .LVL1616 + .4byte 0x16ba0 + .byte 0 .byte 0 .uleb128 0x4b .8byte .LVL1328 - .4byte 0x16c2a + .4byte 0x16e1b .uleb128 0x4b .8byte .LVL1369 - .4byte 0x1322c + .4byte 0x13485 .uleb128 0x4b .8byte .LVL1370 - .4byte 0x169af + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1371 - .4byte 0x13839 + .4byte 0x13a92 .uleb128 0x4b .8byte .LVL1372 - .4byte 0x16ba2 + .4byte 0x16dbf .uleb128 0x4b .8byte .LVL1390 - .4byte 0x169af + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1391 - .4byte 0x16ba2 + .4byte 0x16dbf .uleb128 0x4b - .8byte .LVL1403 - .4byte 0x16c35 + .8byte .LVL1401 + .4byte 0x16e26 + .uleb128 0x4b + .8byte .LVL1406 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1409 - .4byte 0x169af + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL1411 - .4byte 0x169af + .8byte .LVL1410 + .4byte 0x16dbf .uleb128 0x4b .8byte .LVL1412 - .4byte 0x16ba2 + .4byte 0x16c33 .uleb128 0x4b - .8byte .LVL1414 - .4byte 0x16a4d + .8byte .LVL1413 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1415 - .4byte 0x169af + .8byte .LVL1416 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1417 + .4byte 0x1696c .uleb128 0x4b .8byte .LVL1418 - .4byte 0x169af + .4byte 0x16dbf .uleb128 0x4b - .8byte .LVL1426 - .4byte 0x1677b + .8byte .LVL1420 + .4byte 0x16ad6 .uleb128 0x4b - .8byte .LVL1427 - .4byte 0x16ba2 + .8byte .LVL1421 + .4byte 0x16cd1 + .uleb128 0x4b + .8byte .LVL1422 + .4byte 0x16cd1 + .uleb128 0x4b + .8byte .LVL1424 + .4byte 0x16df9 + .uleb128 0x4b + .8byte .LVL1425 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1429 - .4byte 0x168e5 + .4byte 0x16df9 + .uleb128 0x4b + .8byte .LVL1432 + .4byte 0x1524c .uleb128 0x4b .8byte .LVL1433 - .4byte 0x16c08 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1434 - .4byte 0x169af + .8byte .LVL1435 + .4byte 0x16c61 .uleb128 0x4b - .8byte .LVL1442 - .4byte 0x16c08 + .8byte .LVL1439 + .4byte 0x16e31 .uleb128 0x4b - .8byte .LVL1445 - .4byte 0x1505b + .8byte .LVL1440 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1446 - .4byte 0x16ae0 + .8byte .LVL1441 + .4byte 0x1696c .uleb128 0x4b - .8byte .LVL1447 - .4byte 0x16ae0 - .uleb128 0x4b - .8byte .LVL1450 - .4byte 0x16a20 - .uleb128 0x4b - .8byte .LVL1451 - .4byte 0x16ba2 - .uleb128 0x4b - .8byte .LVL1452 - .4byte 0x14f94 - .uleb128 0x4b - .8byte .LVL1453 - .4byte 0x168e5 - .uleb128 0x4b - .8byte .LVL1454 - .4byte 0x1322c - .uleb128 0x4b - .8byte .LVL1455 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1456 - .4byte 0x13839 - .uleb128 0x4b - .8byte .LVL1459 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1461 - .4byte 0x1677b + .8byte .LVL1444 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1469 - .4byte 0x1322c + .4byte 0x16df9 .uleb128 0x4b - .8byte .LVL1474 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1475 - .4byte 0x13839 - .uleb128 0x4b - .8byte .LVL1476 - .4byte 0x16a7b + .8byte .LVL1470 + .4byte 0x16e3c .uleb128 0x4b .8byte .LVL1479 - .4byte 0x16a7b + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1481 + .4byte 0x16df9 .uleb128 0x4b .8byte .LVL1482 - .4byte 0x16c40 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1483 - .4byte 0x169af + .8byte .LVL1489 + .4byte 0x13485 .uleb128 0x4b - .8byte .LVL1484 - .4byte 0x1677b + .8byte .LVL1490 + .4byte 0x16df9 .uleb128 0x4b - .8byte .LVL1487 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1494 - .4byte 0x168e5 + .8byte .LVL1491 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1495 - .4byte 0x1322c + .4byte 0x16df9 .uleb128 0x4b - .8byte .LVL1496 - .4byte 0x16c08 - .uleb128 0x4b - .8byte .LVL1497 - .4byte 0x169af + .8byte .LVL1499 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1500 - .4byte 0x16c08 + .4byte 0x13a92 + .uleb128 0x4b + .8byte .LVL1501 + .4byte 0x16c61 + .uleb128 0x4b + .8byte .LVL1504 + .4byte 0x16c61 + .uleb128 0x4b + .8byte .LVL1506 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1507 + .4byte 0x16dbf + .uleb128 0x4b + .8byte .LVL1509 + .4byte 0x15185 + .uleb128 0x4b + .8byte .LVL1510 + .4byte 0x13485 + .uleb128 0x4b + .8byte .LVL1511 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1512 + .4byte 0x13a92 .uleb128 0x4b .8byte .LVL1513 - .4byte 0x16c08 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1514 - .4byte 0x16c4b + .8byte .LVL1517 + .4byte 0x16ad6 .uleb128 0x4b - .8byte .LVL1516 - .4byte 0x169af + .8byte .LVL1519 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1530 - .4byte 0x169af + .8byte .LVL1520 + .4byte 0x16e31 .uleb128 0x4b - .8byte .LVL1531 - .4byte 0x16ba2 + .8byte .LVL1521 + .4byte 0x16dbf .uleb128 0x4b .8byte .LVL1532 - .4byte 0x16c40 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1533 - .4byte 0x169af + .8byte .LVL1550 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1534 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1537 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1543 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1544 - .4byte 0x16ae0 - .uleb128 0x4b - .8byte .LVL1545 - .4byte 0x16ae0 - .uleb128 0x4b - .8byte .LVL1547 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1548 - .4byte 0x16ba2 - .uleb128 0x4b - .8byte .LVL1549 - .4byte 0x169af + .8byte .LVL1551 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1552 - .4byte 0x169af + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1553 - .4byte 0x16ae0 + .8byte .LVL1555 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1554 - .4byte 0x16ae0 + .8byte .LVL1559 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL1557 - .4byte 0x169af + .8byte .LVL1560 + .4byte 0x16dbf .uleb128 0x4b - .8byte .LVL1563 - .4byte 0x16ae0 + .8byte .LVL1568 + .4byte 0x16e31 + .uleb128 0x4b + .8byte .LVL1570 + .4byte 0x16cd1 .uleb128 0x4b .8byte .LVL1571 - .4byte 0x169af + .4byte 0x16cd1 + .uleb128 0x4b + .8byte .LVL1572 + .4byte 0x16ad6 + .uleb128 0x4b + .8byte .LVL1573 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1576 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1577 + .4byte 0x16cd1 .uleb128 0x4b .8byte .LVL1579 - .4byte 0x16c08 - .uleb128 0x4b - .8byte .LVL1580 - .4byte 0x16c4b + .4byte 0x16cd1 .uleb128 0x4b .8byte .LVL1586 - .4byte 0x16b30 + .4byte 0x16cd1 .uleb128 0x4b - .8byte .LVL1589 - .4byte 0x16c40 - .uleb128 0x4b - .8byte .LVL1594 - .4byte 0x16c08 - .uleb128 0x4b - .8byte .LVL1595 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1600 - .4byte 0x1322c - .uleb128 0x4b - .8byte .LVL1601 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL1606 - .4byte 0x169af + .8byte .LVL1587 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL1608 - .4byte 0x16a7b + .4byte 0x13485 .uleb128 0x4b - .8byte .LVL1612 - .4byte 0x16c40 + .8byte .LVL1609 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL1622 + .4byte 0x16e31 + .uleb128 0x4b + .8byte .LVL1624 + .4byte 0x16d21 + .uleb128 0x4b + .8byte .LVL1637 + .4byte 0x16df9 + .uleb128 0x4b + .8byte .LVL1638 + .4byte 0x16e3c .byte 0 .uleb128 0x60 - .4byte .LASF3085 + .4byte .LASF3084 .byte 0x1 - .2byte 0x8fc + .2byte 0x8fd .4byte 0xc6 .byte 0x1 - .4byte 0x1312c + .4byte 0x13385 + .uleb128 0x62 + .4byte .LASF3085 + .byte 0x1 + .2byte 0x8fd + .4byte 0xe472 .uleb128 0x62 .4byte .LASF3086 .byte 0x1 - .2byte 0x8fc - .4byte 0xe480 - .uleb128 0x62 - .4byte .LASF3087 - .byte 0x1 - .2byte 0x8fc - .4byte 0xe480 + .2byte 0x8fd + .4byte 0xe472 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x8fc - .4byte 0xe82d + .2byte 0x8fd + .4byte 0xe81f .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0x8fe + .2byte 0x8ff .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3087 + .byte 0x1 + .2byte 0x900 + .4byte 0x15a .uleb128 0x43 .4byte .LASF3088 .byte 0x1 - .2byte 0x8ff + .2byte 0x900 .4byte 0x15a .uleb128 0x43 .4byte .LASF3089 - .byte 0x1 - .2byte 0x8ff - .4byte 0x15a - .uleb128 0x43 - .4byte .LASF3090 - .byte 0x1 - .2byte 0x900 - .4byte 0xc6 - .uleb128 0x43 - .4byte .LASF3091 .byte 0x1 .2byte 0x901 .4byte 0xc6 .uleb128 0x43 - .4byte .LASF3092 - .byte 0x1 - .2byte 0x902 - .4byte 0x45aa - .uleb128 0x43 - .4byte .LASF3093 - .byte 0x1 - .2byte 0x903 - .4byte 0x45aa - .uleb128 0x43 - .4byte .LASF3094 - .byte 0x1 - .2byte 0x904 - .4byte 0xc6 - .uleb128 0x43 - .4byte .LASF3095 - .byte 0x1 - .2byte 0x905 - .4byte 0xc6 - .byte 0 - .uleb128 0x60 - .4byte .LASF3096 - .byte 0x1 - .2byte 0x8e5 - .4byte 0xc6 - .byte 0x1 - .4byte 0x131bc - .uleb128 0x62 - .4byte .LASF3086 - .byte 0x1 - .2byte 0x8e5 - .4byte 0xe480 - .uleb128 0x62 - .4byte .LASF3087 - .byte 0x1 - .2byte 0x8e5 - .4byte 0xe480 - .uleb128 0x62 - .4byte .LASF3097 - .byte 0x1 - .2byte 0x8e5 - .4byte 0xc6 - .uleb128 0x4f - .string "i" - .byte 0x1 - .2byte 0x8e7 - .4byte 0xc6 - .uleb128 0x43 - .4byte .LASF3088 - .byte 0x1 - .2byte 0x8e8 - .4byte 0x15a - .uleb128 0x43 - .4byte .LASF3089 - .byte 0x1 - .2byte 0x8e8 - .4byte 0x15a - .uleb128 0x43 .4byte .LASF3090 .byte 0x1 - .2byte 0x8e9 + .2byte 0x902 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3091 .byte 0x1 - .2byte 0x8ea - .4byte 0xc6 + .2byte 0x903 + .4byte 0x45aa .uleb128 0x43 .4byte .LASF3092 .byte 0x1 - .2byte 0x8eb + .2byte 0x904 .4byte 0x45aa .uleb128 0x43 .4byte .LASF3093 .byte 0x1 + .2byte 0x905 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3094 + .byte 0x1 + .2byte 0x906 + .4byte 0xc6 + .byte 0 + .uleb128 0x60 + .4byte .LASF3095 + .byte 0x1 + .2byte 0x8e6 + .4byte 0xc6 + .byte 0x1 + .4byte 0x13415 + .uleb128 0x62 + .4byte .LASF3085 + .byte 0x1 + .2byte 0x8e6 + .4byte 0xe472 + .uleb128 0x62 + .4byte .LASF3086 + .byte 0x1 + .2byte 0x8e6 + .4byte 0xe472 + .uleb128 0x62 + .4byte .LASF3096 + .byte 0x1 + .2byte 0x8e6 + .4byte 0xc6 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x8e8 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3087 + .byte 0x1 + .2byte 0x8e9 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3088 + .byte 0x1 + .2byte 0x8e9 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3089 + .byte 0x1 + .2byte 0x8ea + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3090 + .byte 0x1 + .2byte 0x8eb + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3091 + .byte 0x1 .2byte 0x8ec + .4byte 0x45aa + .uleb128 0x43 + .4byte .LASF3092 + .byte 0x1 + .2byte 0x8ed .4byte 0x45aa .uleb128 0x6d .4byte .LASF3098 .byte 0x1 - .2byte 0x8f8 + .2byte 0x8f9 .byte 0 .uleb128 0x60 .4byte .LASF3099 .byte 0x1 - .2byte 0x8cc + .2byte 0x8cd .4byte 0xc6 .byte 0x1 - .4byte 0x1322c + .4byte 0x13485 .uleb128 0x61 .string "buf" .byte 0x1 - .2byte 0x8cc - .4byte 0xe480 + .2byte 0x8cd + .4byte 0xe472 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x8cc - .4byte 0xe82d + .2byte 0x8cd + .4byte 0xe81f .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0x8ce + .2byte 0x8cf .4byte 0xc6 .uleb128 0x43 - .4byte .LASF3088 - .byte 0x1 - .2byte 0x8cf - .4byte 0x15a - .uleb128 0x43 - .4byte .LASF3092 + .4byte .LASF3087 .byte 0x1 .2byte 0x8d0 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3091 + .byte 0x1 + .2byte 0x8d1 .4byte 0x45aa .uleb128 0x43 .4byte .LASF3100 .byte 0x1 - .2byte 0x8d1 - .4byte 0xc6 - .uleb128 0x43 - .4byte .LASF3097 - .byte 0x1 .2byte 0x8d2 .4byte 0xc6 .uleb128 0x43 - .4byte .LASF3095 + .4byte .LASF3096 .byte 0x1 .2byte 0x8d3 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3094 + .byte 0x1 + .2byte 0x8d4 .4byte 0xc6 .byte 0 .uleb128 0x4d .4byte .LASF3101 .byte 0x1 - .2byte 0x86e + .2byte 0x86f .4byte 0xc6 .8byte .LFB2840 .8byte .LFE2840-.LFB2840 .uleb128 0x1 .byte 0x9c - .4byte 0x13327 + .4byte 0x13580 .uleb128 0x4e .string "ebc" .byte 0x1 - .2byte 0x86e - .4byte 0xe4e5 - .4byte .LLST186 + .2byte 0x86f + .4byte 0xe4d7 + .4byte .LLST194 .uleb128 0x55 .4byte .LASF2837 .byte 0x1 - .2byte 0x86e + .2byte 0x86f .4byte 0xc6 - .4byte .LLST187 + .4byte .LLST195 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0x870 - .4byte 0xe82d + .2byte 0x871 + .4byte 0xe81f .uleb128 0x56 .4byte .LASF3102 .byte 0x1 - .2byte 0x871 + .2byte 0x872 .4byte 0xc6 - .4byte .LLST188 + .4byte .LLST196 .uleb128 0x66 .string "ret" .byte 0x1 - .2byte 0x872 + .2byte 0x873 .4byte 0xc6 .uleb128 0x1 .byte 0x64 .uleb128 0x43 .4byte .LASF3103 .byte 0x1 - .2byte 0x873 + .2byte 0x874 .4byte 0xc6 .uleb128 0x50 - .4byte 0x15807 - .8byte .LBB1476 - .8byte .LBE1476-.LBB1476 + .4byte 0x159f8 + .8byte .LBB1538 + .8byte .LBE1538-.LBB1538 .byte 0x1 - .2byte 0x876 - .4byte 0x132cb + .2byte 0x877 + .4byte 0x13524 .uleb128 0x51 - .4byte 0x15822 + .4byte 0x15a13 .uleb128 0x51 - .4byte 0x15817 + .4byte 0x15a08 .byte 0 .uleb128 0x4b + .8byte .LVL659 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL660 + .4byte 0x16e47 + .uleb128 0x4b .8byte .LVL662 - .4byte 0x169af + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL663 - .4byte 0x16c56 + .8byte .LVL666 + .4byte 0x16c06 .uleb128 0x4b - .8byte .LVL665 - .4byte 0x16a20 + .8byte .LVL667 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL669 - .4byte 0x16a20 + .4byte 0x16ba0 .uleb128 0x4b - .8byte .LVL670 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL672 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL674 - .4byte 0x16b30 + .8byte .LVL671 + .4byte 0x16d21 .byte 0 .uleb128 0x60 .4byte .LASF3104 .byte 0x1 - .2byte 0x843 + .2byte 0x844 .4byte 0xc6 .byte 0x1 - .4byte 0x13351 + .4byte 0x135aa .uleb128 0x62 .4byte .LASF874 .byte 0x1 - .2byte 0x843 + .2byte 0x844 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3103 .byte 0x1 - .2byte 0x845 + .2byte 0x846 .4byte 0xc6 .byte 0 .uleb128 0x4a .4byte .LASF3105 .byte 0x1 - .2byte 0x812 + .2byte 0x813 .8byte .LFB2838 .8byte .LFE2838-.LFB2838 .uleb128 0x1 .byte 0x9c - .4byte 0x1340b + .4byte 0x13664 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0x814 - .4byte 0xe82d + .2byte 0x815 + .4byte 0xe81f + .uleb128 0x4b + .8byte .LVL640 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL641 + .4byte 0x16cc6 + .uleb128 0x4b + .8byte .LVL642 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL643 - .4byte 0x169af + .4byte 0x16bfc .uleb128 0x4b .8byte .LVL644 - .4byte 0x16ad5 + .4byte 0x16c61 .uleb128 0x4b .8byte .LVL645 - .4byte 0x169af + .4byte 0x16cc6 .uleb128 0x4b .8byte .LVL646 - .4byte 0x16a0b + .4byte 0x16c33 .uleb128 0x4b .8byte .LVL647 - .4byte 0x16a7b + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL648 - .4byte 0x16ad5 + .4byte 0x16bfc .uleb128 0x4b .8byte .LVL649 - .4byte 0x16a4d + .4byte 0x16c61 .uleb128 0x4b .8byte .LVL650 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL651 - .4byte 0x16a0b - .uleb128 0x4b - .8byte .LVL652 - .4byte 0x16a7b - .uleb128 0x4b - .8byte .LVL653 - .4byte 0x16a4d + .4byte 0x16c33 .byte 0 .uleb128 0x4c .4byte .LASF3106 .byte 0x1 - .2byte 0x752 + .2byte 0x751 .4byte 0xc6 .8byte .LFB2837 .8byte .LFE2837-.LFB2837 .uleb128 0x1 .byte 0x9c - .4byte 0x136a2 + .4byte 0x138fb .uleb128 0x55 .4byte .LASF793 .byte 0x1 - .2byte 0x752 + .2byte 0x751 .4byte 0x458 - .4byte .LLST393 + .4byte .LLST405 .uleb128 0x66 .string "ebc" .byte 0x1 - .2byte 0x754 - .4byte 0xe4e5 + .2byte 0x753 + .4byte 0xe4d7 .uleb128 0x1 .byte 0x66 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x755 + .2byte 0x754 .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0x756 - .4byte 0xe82d + .2byte 0x755 + .4byte 0xe81f .uleb128 0x43 .4byte .LASF3107 .byte 0x1 - .2byte 0x757 + .2byte 0x756 .4byte 0xe1ba - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x2430 - .4byte 0x13501 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x23d0 + .4byte 0x1375a .uleb128 0x3c .byte 0x8 .byte 0x1 - .2byte 0x765 - .4byte 0x1349a + .2byte 0x764 + .4byte 0x136f3 .uleb128 0x3e .4byte .LASF3108 .byte 0x1 - .2byte 0x765 + .2byte 0x764 .4byte 0x1a0 .uleb128 0x3a .string "__c" .byte 0x1 - .2byte 0x765 - .4byte 0x136a2 + .2byte 0x764 + .4byte 0x138fb .byte 0 .uleb128 0x4f .string "__u" .byte 0x1 - .2byte 0x765 - .4byte 0x13478 + .2byte 0x764 + .4byte 0x136d1 .uleb128 0x58 - .4byte 0x15f8f - .8byte .LBB2320 - .4byte .Ldebug_ranges0+0x2470 + .4byte 0x16180 + .8byte .LBB2362 + .4byte .Ldebug_ranges0+0x2410 .byte 0x1 - .2byte 0x765 - .4byte 0x134ce + .2byte 0x764 + .4byte 0x13727 .uleb128 0x51 - .4byte 0x15fb2 + .4byte 0x161a3 .uleb128 0x51 - .4byte 0x15fa6 + .4byte 0x16197 .uleb128 0x51 - .4byte 0x15f9c + .4byte 0x1618d .byte 0 .uleb128 0x5a - .4byte 0x15ddf - .8byte .LBB2323 - .8byte .LBE2323-.LBB2323 + .4byte 0x15fd0 + .8byte .LBB2365 + .8byte .LBE2365-.LBB2365 .byte 0x1 - .2byte 0x765 + .2byte 0x764 .uleb128 0x53 - .8byte .LBB2324 - .8byte .LBE2324-.LBB2324 + .8byte .LBB2366 + .8byte .LBE2366-.LBB2366 .uleb128 0x5e - .4byte 0x15def + .4byte 0x15fe0 .uleb128 0x1 .byte 0x68 .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL1635 - .4byte 0x1633b - .uleb128 0x4b - .8byte .LVL1636 - .4byte 0x16a4d - .uleb128 0x4b - .8byte .LVL1637 - .4byte 0x16251 - .uleb128 0x4b - .8byte .LVL1638 - .4byte 0x16c61 - .uleb128 0x4b - .8byte .LVL1639 - .4byte 0x16bd9 - .uleb128 0x4b - .8byte .LVL1640 - .4byte 0x16c6b - .uleb128 0x4b - .8byte .LVL1641 - .4byte 0x16c6b - .uleb128 0x4b - .8byte .LVL1642 - .4byte 0x1633b - .uleb128 0x4b .8byte .LVL1643 - .4byte 0x16a4d + .4byte 0x1652c .uleb128 0x4b .8byte .LVL1644 - .4byte 0x13e29 + .4byte 0x16c33 .uleb128 0x4b .8byte .LVL1645 - .4byte 0x1633b + .4byte 0x16442 .uleb128 0x4b .8byte .LVL1646 - .4byte 0x16a4d + .4byte 0x16e52 .uleb128 0x4b .8byte .LVL1647 - .4byte 0x164fd + .4byte 0x16dca .uleb128 0x4b .8byte .LVL1648 - .4byte 0x1633b + .4byte 0x16e5c .uleb128 0x4b .8byte .LVL1649 - .4byte 0x16a4d + .4byte 0x16e5c .uleb128 0x4b .8byte .LVL1650 - .4byte 0x1450f + .4byte 0x1652c .uleb128 0x4b .8byte .LVL1651 - .4byte 0x14005 + .4byte 0x16c33 .uleb128 0x4b .8byte .LVL1652 - .4byte 0x16c61 + .4byte 0x1401a .uleb128 0x4b .8byte .LVL1653 - .4byte 0x15ff1 + .4byte 0x1652c .uleb128 0x4b .8byte .LVL1654 - .4byte 0x14bc3 + .4byte 0x16c33 .uleb128 0x4b .8byte .LVL1655 - .4byte 0x16192 + .4byte 0x166ee .uleb128 0x4b .8byte .LVL1656 - .4byte 0x16664 + .4byte 0x1652c .uleb128 0x4b .8byte .LVL1657 - .4byte 0x16c61 + .4byte 0x16c33 .uleb128 0x4b .8byte .LVL1658 - .4byte 0x14f94 + .4byte 0x14700 .uleb128 0x4b .8byte .LVL1659 - .4byte 0x13e29 + .4byte 0x141f6 .uleb128 0x4b .8byte .LVL1660 - .4byte 0x16a7b + .4byte 0x16e52 .uleb128 0x4b .8byte .LVL1661 - .4byte 0x16c61 + .4byte 0x161e2 .uleb128 0x4b .8byte .LVL1662 - .4byte 0x1505b + .4byte 0x14db4 .uleb128 0x4b .8byte .LVL1663 - .4byte 0x1450f + .4byte 0x16383 .uleb128 0x4b .8byte .LVL1664 - .4byte 0x14330 + .4byte 0x16855 .uleb128 0x4b .8byte .LVL1665 - .4byte 0x14005 + .4byte 0x16e52 .uleb128 0x4b .8byte .LVL1666 - .4byte 0x14bc3 + .4byte 0x1401a + .uleb128 0x4b + .8byte .LVL1667 + .4byte 0x16c61 + .uleb128 0x4b + .8byte .LVL1668 + .4byte 0x16e52 + .uleb128 0x4b + .8byte .LVL1669 + .4byte 0x14700 + .uleb128 0x4b + .8byte .LVL1670 + .4byte 0x14521 + .uleb128 0x4b + .8byte .LVL1671 + .4byte 0x141f6 + .uleb128 0x4b + .8byte .LVL1672 + .4byte 0x14db4 + .uleb128 0x4b + .8byte .LVL1673 + .4byte 0x15185 + .uleb128 0x4b + .8byte .LVL1674 + .4byte 0x1524c .byte 0 .uleb128 0x5 .4byte 0x61 - .4byte 0x136b2 + .4byte 0x1390b .uleb128 0x6 .4byte 0x4f .byte 0 @@ -51486,352 +51781,322 @@ .uleb128 0x4c .4byte .LASF3109 .byte 0x1 - .2byte 0x6f9 + .2byte 0x6f8 .4byte 0xc6 .8byte .LFB2836 .8byte .LFE2836-.LFB2836 .uleb128 0x1 .byte 0x9c - .4byte 0x13839 + .4byte 0x13a92 .uleb128 0x55 .4byte .LASF793 .byte 0x1 - .2byte 0x6f9 + .2byte 0x6f8 .4byte 0x458 - .4byte .LLST286 + .4byte .LLST294 .uleb128 0x66 .string "ebc" .byte 0x1 - .2byte 0x6fb - .4byte 0xe4e5 + .2byte 0x6fa + .4byte 0xe4d7 .uleb128 0x1 .byte 0x69 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x6fc + .2byte 0x6fb .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0x6fd - .4byte 0xe82d - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1300 - .4byte 0x1379c + .2byte 0x6fc + .4byte 0xe81f + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x13d0 + .4byte 0x139f5 .uleb128 0x3c .byte 0x8 .byte 0x1 - .2byte 0x704 - .4byte 0x13735 + .2byte 0x703 + .4byte 0x1398e .uleb128 0x3e .4byte .LASF3108 .byte 0x1 - .2byte 0x704 + .2byte 0x703 .4byte 0x1a0 .uleb128 0x3a .string "__c" .byte 0x1 - .2byte 0x704 - .4byte 0x136a2 + .2byte 0x703 + .4byte 0x138fb .byte 0 .uleb128 0x4f .string "__u" .byte 0x1 - .2byte 0x704 - .4byte 0x13713 + .2byte 0x703 + .4byte 0x1396c .uleb128 0x58 - .4byte 0x15f8f - .8byte .LBB1661 - .4byte .Ldebug_ranges0+0x1340 + .4byte 0x16180 + .8byte .LBB1719 + .4byte .Ldebug_ranges0+0x1410 .byte 0x1 - .2byte 0x704 - .4byte 0x13769 + .2byte 0x703 + .4byte 0x139c2 .uleb128 0x51 - .4byte 0x15fb2 + .4byte 0x161a3 .uleb128 0x51 - .4byte 0x15fa6 + .4byte 0x16197 .uleb128 0x51 - .4byte 0x15f9c + .4byte 0x1618d .byte 0 .uleb128 0x5a - .4byte 0x15ddf - .8byte .LBB1664 - .8byte .LBE1664-.LBB1664 + .4byte 0x15fd0 + .8byte .LBB1722 + .8byte .LBE1722-.LBB1722 .byte 0x1 - .2byte 0x704 + .2byte 0x703 .uleb128 0x53 - .8byte .LBB1665 - .8byte .LBE1665-.LBB1665 + .8byte .LBB1723 + .8byte .LBE1723-.LBB1723 .uleb128 0x5e - .4byte 0x15def + .4byte 0x15fe0 .uleb128 0x1 .byte 0x67 .byte 0 .byte 0 .byte 0 .uleb128 0x4b + .8byte .LVL986 + .4byte 0x16442 + .uleb128 0x4b + .8byte .LVL987 + .4byte 0x16e52 + .uleb128 0x4b + .8byte .LVL988 + .4byte 0x16e52 + .uleb128 0x4b + .8byte .LVL989 + .4byte 0x16dca + .uleb128 0x4b + .8byte .LVL990 + .4byte 0x16e5c + .uleb128 0x4b + .8byte .LVL991 + .4byte 0x1401a + .uleb128 0x4b + .8byte .LVL992 + .4byte 0x166ee + .uleb128 0x4b + .8byte .LVL993 + .4byte 0x14700 + .uleb128 0x4b + .8byte .LVL994 + .4byte 0x141f6 + .uleb128 0x4b + .8byte .LVL995 + .4byte 0x14db4 + .uleb128 0x4b .8byte .LVL996 - .4byte 0x16251 + .4byte 0x16383 .uleb128 0x4b .8byte .LVL997 - .4byte 0x16c61 - .uleb128 0x4b - .8byte .LVL998 - .4byte 0x16c61 - .uleb128 0x4b - .8byte .LVL999 - .4byte 0x16bd9 - .uleb128 0x4b - .8byte .LVL1000 - .4byte 0x16c6b - .uleb128 0x4b - .8byte .LVL1001 - .4byte 0x13e29 - .uleb128 0x4b - .8byte .LVL1002 - .4byte 0x164fd - .uleb128 0x4b - .8byte .LVL1003 - .4byte 0x1450f - .uleb128 0x4b - .8byte .LVL1004 - .4byte 0x14005 - .uleb128 0x4b - .8byte .LVL1005 - .4byte 0x14bc3 - .uleb128 0x4b - .8byte .LVL1006 - .4byte 0x16192 - .uleb128 0x4b - .8byte .LVL1007 - .4byte 0x16664 + .4byte 0x16855 .byte 0 .uleb128 0x4a .4byte .LASF3110 .byte 0x1 - .2byte 0x668 + .2byte 0x667 .8byte .LFB2835 .8byte .LFE2835-.LFB2835 .uleb128 0x1 .byte 0x9c - .4byte 0x13a67 + .4byte 0x13c58 .uleb128 0x4e .string "ebc" .byte 0x1 - .2byte 0x668 - .4byte 0xe4e5 - .4byte .LLST285 + .2byte 0x667 + .4byte 0xe4d7 + .4byte .LLST293 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x66a + .2byte 0x669 .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0x66b - .4byte 0xe82d + .2byte 0x66a + .4byte 0xe81f .uleb128 0x52 - .4byte .LASF3025 + .4byte .LASF3024 .4byte 0xb866 .uleb128 0x9 .byte 0x3 - .8byte __func__.35144 + .8byte __func__.35152 .uleb128 0x50 - .4byte 0x13abb - .8byte .LBB1652 - .8byte .LBE1652-.LBB1652 + .4byte 0x13cac + .8byte .LBB1714 + .8byte .LBE1714-.LBB1714 .byte 0x1 - .2byte 0x6e4 - .4byte 0x138c6 + .2byte 0x67e + .4byte 0x13b1f .uleb128 0x51 - .4byte 0x13ad4 + .4byte 0x13cc5 .uleb128 0x51 - .4byte 0x13ac8 - .uleb128 0x4b - .8byte .LVL957 - .4byte 0x1633b - .byte 0 - .uleb128 0x50 - .4byte 0x13abb - .8byte .LBB1654 - .8byte .LBE1654-.LBB1654 - .byte 0x1 - .2byte 0x6c7 - .4byte 0x138fa - .uleb128 0x51 - .4byte 0x13ad4 - .uleb128 0x51 - .4byte 0x13ac8 - .uleb128 0x4b - .8byte .LVL963 - .4byte 0x1633b - .byte 0 - .uleb128 0x50 - .4byte 0x13abb - .8byte .LBB1656 - .8byte .LBE1656-.LBB1656 - .byte 0x1 - .2byte 0x67f - .4byte 0x1392e - .uleb128 0x51 - .4byte 0x13ad4 - .uleb128 0x51 - .4byte 0x13ac8 - .uleb128 0x4b - .8byte .LVL970 - .4byte 0x1633b - .byte 0 - .uleb128 0x50 - .4byte 0x13abb - .8byte .LBB1658 - .8byte .LBE1658-.LBB1658 - .byte 0x1 - .2byte 0x6b2 - .4byte 0x13962 - .uleb128 0x51 - .4byte 0x13ad4 - .uleb128 0x51 - .4byte 0x13ac8 - .uleb128 0x4b - .8byte .LVL977 - .4byte 0x1633b - .byte 0 - .uleb128 0x4b - .8byte .LVL956 - .4byte 0x16192 - .uleb128 0x4b - .8byte .LVL958 - .4byte 0x16192 + .4byte 0x13cb9 .uleb128 0x4b .8byte .LVL962 - .4byte 0x16664 - .uleb128 0x4b - .8byte .LVL964 - .4byte 0x164fd - .uleb128 0x4b - .8byte .LVL968 - .4byte 0x16a0b + .4byte 0x1652c + .byte 0 + .uleb128 0x50 + .4byte 0x13cac + .8byte .LBB1716 + .8byte .LBE1716-.LBB1716 + .byte 0x1 + .2byte 0x6f0 + .4byte 0x13b53 + .uleb128 0x51 + .4byte 0x13cc5 + .uleb128 0x51 + .4byte 0x13cb9 .uleb128 0x4b .8byte .LVL969 - .4byte 0x14330 + .4byte 0x1652c + .byte 0 .uleb128 0x4b - .8byte .LVL971 - .4byte 0x16a0b + .8byte .LVL953 + .4byte 0x16383 + .uleb128 0x4b + .8byte .LVL954 + .4byte 0x16442 + .uleb128 0x4b + .8byte .LVL956 + .4byte 0x16855 + .uleb128 0x4b + .8byte .LVL957 + .4byte 0x166ee + .uleb128 0x4b + .8byte .LVL960 + .4byte 0x16bfc + .uleb128 0x4b + .8byte .LVL961 + .4byte 0x14521 + .uleb128 0x4b + .8byte .LVL963 + .4byte 0x16bfc + .uleb128 0x4b + .8byte .LVL964 + .4byte 0x161e2 + .uleb128 0x4b + .8byte .LVL967 + .4byte 0x141f6 + .uleb128 0x4b + .8byte .LVL968 + .4byte 0x1401a .uleb128 0x4b .8byte .LVL972 - .4byte 0x15ff1 + .4byte 0x1401a + .uleb128 0x4b + .8byte .LVL973 + .4byte 0x161e2 + .uleb128 0x4b + .8byte .LVL974 + .4byte 0x166ee .uleb128 0x4b .8byte .LVL975 - .4byte 0x14005 + .4byte 0x16855 .uleb128 0x4b .8byte .LVL976 - .4byte 0x13e29 + .4byte 0x16442 + .uleb128 0x4b + .8byte .LVL977 + .4byte 0x16383 + .uleb128 0x4b + .8byte .LVL978 + .4byte 0x141f6 + .uleb128 0x4b + .8byte .LVL979 + .4byte 0x16ba0 .uleb128 0x4b .8byte .LVL980 - .4byte 0x13e29 + .4byte 0x14521 .uleb128 0x4b .8byte .LVL981 - .4byte 0x15ff1 - .uleb128 0x4b - .8byte .LVL982 - .4byte 0x164fd - .uleb128 0x4b - .8byte .LVL983 - .4byte 0x16251 - .uleb128 0x4b - .8byte .LVL984 - .4byte 0x16664 - .uleb128 0x4b - .8byte .LVL987 - .4byte 0x14005 - .uleb128 0x4b - .8byte .LVL988 - .4byte 0x16251 - .uleb128 0x4b - .8byte .LVL989 - .4byte 0x169af - .uleb128 0x4b - .8byte .LVL990 - .4byte 0x14330 - .uleb128 0x4b - .8byte .LVL991 - .4byte 0x169af + .4byte 0x16ba0 .byte 0 .uleb128 0x63 .4byte .LASF3111 .byte 0x1 - .2byte 0x636 + .2byte 0x635 .byte 0x1 - .4byte 0x13aa6 + .4byte 0x13c97 .uleb128 0x61 .string "ebc" .byte 0x1 - .2byte 0x636 - .4byte 0xe4e5 + .2byte 0x635 + .4byte 0xe4d7 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x638 + .2byte 0x637 .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0x639 - .4byte 0xe82d + .2byte 0x638 + .4byte 0xe81f .uleb128 0x65 - .4byte .LASF3025 - .4byte 0x13ab6 + .4byte .LASF3024 + .4byte 0x13ca7 .4byte .LASF3111 .byte 0 .uleb128 0x5 .4byte 0x68 - .4byte 0x13ab6 + .4byte 0x13ca7 .uleb128 0x6 .4byte 0x4f .byte 0x1a .byte 0 .uleb128 0x3 - .4byte 0x13aa6 + .4byte 0x13c97 .uleb128 0x63 .4byte .LASF3112 .byte 0x1 - .2byte 0x630 + .2byte 0x62f .byte 0x1 - .4byte 0x13ae1 + .4byte 0x13cd2 .uleb128 0x62 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x630 + .2byte 0x62f .4byte 0xe0e4 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x630 - .4byte 0xe82d + .2byte 0x62f + .4byte 0xe81f .byte 0 .uleb128 0x63 .4byte .LASF3113 .byte 0x1 - .2byte 0x625 + .2byte 0x624 .byte 0x1 - .4byte 0x13b13 + .4byte 0x13d04 .uleb128 0x62 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x625 + .2byte 0x624 .4byte 0xe0e4 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x625 - .4byte 0xe82d + .2byte 0x624 + .4byte 0xe81f .uleb128 0x4f .string "buf" .byte 0x1 - .2byte 0x627 - .4byte 0x13b13 + .2byte 0x626 + .4byte 0x13d04 .byte 0 .uleb128 0x7 .byte 0x8 @@ -51839,2000 +52104,2030 @@ .uleb128 0x63 .4byte .LASF3114 .byte 0x1 - .2byte 0x5f7 + .2byte 0x5f6 .byte 0x1 - .4byte 0x13be3 + .4byte 0x13dd4 .uleb128 0x62 .4byte .LASF3115 .byte 0x1 - .2byte 0x5f7 + .2byte 0x5f6 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3116 .byte 0x1 - .2byte 0x5f7 + .2byte 0x5f6 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3117 .byte 0x1 - .2byte 0x5f7 + .2byte 0x5f6 .4byte 0xac0 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x5f7 - .4byte 0xe82d + .2byte 0x5f6 + .4byte 0xe81f .uleb128 0x62 .4byte .LASF874 .byte 0x1 - .2byte 0x5f7 + .2byte 0x5f6 .4byte 0xe1ba .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x5f9 + .2byte 0x5f8 .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF3118 .byte 0x1 - .2byte 0x5fa + .2byte 0x5f9 .4byte 0x13f .uleb128 0x43 .4byte .LASF3119 .byte 0x1 - .2byte 0x5fa + .2byte 0x5f9 .4byte 0x13f .uleb128 0x43 .4byte .LASF2870 .byte 0x1 - .2byte 0x5fb + .2byte 0x5fa .4byte 0xc6 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x5fb + .2byte 0x5fa .4byte 0xc6 .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0x5fc + .2byte 0x5fb .4byte 0xc6 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x5fc + .2byte 0x5fb .4byte 0xc6 .uleb128 0x43 .4byte .LASF3120 .byte 0x1 - .2byte 0x5fd + .2byte 0x5fc .4byte 0xc6 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x5fe + .2byte 0x5fd .4byte 0xbfee .uleb128 0x43 .4byte .LASF3121 .byte 0x1 - .2byte 0x5ff + .2byte 0x5fe .4byte 0xc6 .uleb128 0x43 .4byte .LASF3122 .byte 0x1 - .2byte 0x600 + .2byte 0x5ff .4byte 0xbfee .byte 0 .uleb128 0x63 .4byte .LASF3123 .byte 0x1 - .2byte 0x5cc + .2byte 0x5cb .byte 0x1 - .4byte 0x13cad + .4byte 0x13e9e .uleb128 0x62 .4byte .LASF3115 .byte 0x1 - .2byte 0x5cc + .2byte 0x5cb .4byte 0xbfee .uleb128 0x62 .4byte .LASF3116 .byte 0x1 - .2byte 0x5cc + .2byte 0x5cb .4byte 0xac0 .uleb128 0x62 .4byte .LASF3117 .byte 0x1 - .2byte 0x5cc + .2byte 0x5cb .4byte 0xac0 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x5cc - .4byte 0xe82d + .2byte 0x5cb + .4byte 0xe81f .uleb128 0x62 .4byte .LASF874 .byte 0x1 - .2byte 0x5cc + .2byte 0x5cb .4byte 0xe1ba .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x5ce + .2byte 0x5cd .4byte 0xe0e4 .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0x5cf + .2byte 0x5ce .4byte 0xc6 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x5cf + .2byte 0x5ce .4byte 0xc6 .uleb128 0x43 .4byte .LASF2870 .byte 0x1 - .2byte 0x5d0 + .2byte 0x5cf .4byte 0xc6 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x5d1 + .2byte 0x5d0 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3118 .byte 0x1 - .2byte 0x5d2 + .2byte 0x5d1 .4byte 0x13f .uleb128 0x43 .4byte .LASF3119 .byte 0x1 - .2byte 0x5d2 + .2byte 0x5d1 .4byte 0x13f .uleb128 0x43 .4byte .LASF3120 .byte 0x1 - .2byte 0x5d3 + .2byte 0x5d2 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x5d4 + .2byte 0x5d3 .4byte 0xbfee .uleb128 0x43 .4byte .LASF3121 .byte 0x1 - .2byte 0x5d5 + .2byte 0x5d4 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3122 .byte 0x1 - .2byte 0x5d6 + .2byte 0x5d5 .4byte 0xbfee .byte 0 .uleb128 0x63 .4byte .LASF3124 .byte 0x1 - .2byte 0x59f + .2byte 0x59e .byte 0x1 - .4byte 0x13d6b + .4byte 0x13f5c .uleb128 0x62 .4byte .LASF3115 .byte 0x1 - .2byte 0x59f + .2byte 0x59e .4byte 0xbfee .uleb128 0x62 .4byte .LASF3116 .byte 0x1 - .2byte 0x59f + .2byte 0x59e .4byte 0xac0 .uleb128 0x62 .4byte .LASF3117 .byte 0x1 - .2byte 0x59f + .2byte 0x59e .4byte 0xac0 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x59f - .4byte 0xe82d + .2byte 0x59e + .4byte 0xe81f .uleb128 0x62 .4byte .LASF874 .byte 0x1 - .2byte 0x59f + .2byte 0x59e .4byte 0xe1ba .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x5a1 + .2byte 0x5a0 .4byte 0xe0e4 .uleb128 0x43 .4byte .LASF3118 .byte 0x1 - .2byte 0x5a2 + .2byte 0x5a1 .4byte 0x13f .uleb128 0x43 .4byte .LASF3119 .byte 0x1 - .2byte 0x5a2 + .2byte 0x5a1 .4byte 0x13f .uleb128 0x43 .4byte .LASF2870 .byte 0x1 - .2byte 0x5a3 + .2byte 0x5a2 .4byte 0xc6 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x5a3 + .2byte 0x5a2 .4byte 0xc6 .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0x5a4 + .2byte 0x5a3 .4byte 0xc6 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x5a4 + .2byte 0x5a3 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3120 .byte 0x1 - .2byte 0x5a5 + .2byte 0x5a4 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x5a6 + .2byte 0x5a5 .4byte 0xbfee .uleb128 0x43 .4byte .LASF3121 .byte 0x1 - .2byte 0x5a7 + .2byte 0x5a6 .4byte 0xc6 .byte 0 .uleb128 0x63 .4byte .LASF3125 .byte 0x1 - .2byte 0x575 + .2byte 0x574 .byte 0x1 - .4byte 0x13e29 + .4byte 0x1401a .uleb128 0x62 .4byte .LASF3115 .byte 0x1 - .2byte 0x575 + .2byte 0x574 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3116 .byte 0x1 - .2byte 0x575 + .2byte 0x574 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3117 .byte 0x1 - .2byte 0x575 + .2byte 0x574 .4byte 0xac0 .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x575 - .4byte 0xe82d + .2byte 0x574 + .4byte 0xe81f .uleb128 0x62 .4byte .LASF874 .byte 0x1 - .2byte 0x575 + .2byte 0x574 .4byte 0xe1ba .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x577 + .2byte 0x576 .4byte 0xe0e4 .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0x578 + .2byte 0x577 .4byte 0xc6 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x578 + .2byte 0x577 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2870 .byte 0x1 - .2byte 0x579 + .2byte 0x578 .4byte 0xc6 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x57a + .2byte 0x579 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3118 .byte 0x1 - .2byte 0x57b + .2byte 0x57a .4byte 0x13f .uleb128 0x43 .4byte .LASF3119 .byte 0x1 - .2byte 0x57b + .2byte 0x57a .4byte 0x13f .uleb128 0x43 .4byte .LASF3120 .byte 0x1 - .2byte 0x57c + .2byte 0x57b .4byte 0xc6 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x57d + .2byte 0x57c .4byte 0xbfee .uleb128 0x43 .4byte .LASF3121 .byte 0x1 - .2byte 0x57e + .2byte 0x57d .4byte 0xc6 .byte 0 .uleb128 0x4a .4byte .LASF3126 .byte 0x1 - .2byte 0x53c + .2byte 0x53b .8byte .LFB2827 .8byte .LFE2827-.LFB2827 .uleb128 0x1 .byte 0x9c - .4byte 0x13f57 + .4byte 0x14148 .uleb128 0x55 .4byte .LASF3115 .byte 0x1 - .2byte 0x53c + .2byte 0x53b .4byte 0xbfee - .4byte .LLST233 + .4byte .LLST241 .uleb128 0x55 .4byte .LASF3116 .byte 0x1 - .2byte 0x53c + .2byte 0x53b .4byte 0xac0 - .4byte .LLST234 + .4byte .LLST242 .uleb128 0x55 .4byte .LASF3117 .byte 0x1 - .2byte 0x53c + .2byte 0x53b .4byte 0xac0 - .4byte .LLST235 + .4byte .LLST243 .uleb128 0x55 .4byte .LASF3127 .byte 0x1 - .2byte 0x53c + .2byte 0x53b .4byte 0xbfee - .4byte .LLST236 + .4byte .LLST244 .uleb128 0x55 .4byte .LASF2943 .byte 0x1 - .2byte 0x53c - .4byte 0xe82d - .4byte .LLST237 + .2byte 0x53b + .4byte 0xe81f + .4byte .LLST245 .uleb128 0x55 .4byte .LASF874 .byte 0x1 - .2byte 0x53c + .2byte 0x53b .4byte 0xe1ba - .4byte .LLST238 + .4byte .LLST246 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x53e + .2byte 0x53d .4byte 0xe0e4 .uleb128 0x57 .string "i" .byte 0x1 - .2byte 0x53f + .2byte 0x53e .4byte 0xc6 - .4byte .LLST239 + .4byte .LLST247 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x540 + .2byte 0x53f .4byte 0xc6 .uleb128 0x56 .4byte .LASF2870 .byte 0x1 - .2byte 0x541 + .2byte 0x540 .4byte 0xc6 - .4byte .LLST240 + .4byte .LLST248 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x542 + .2byte 0x541 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3118 .byte 0x1 - .2byte 0x543 + .2byte 0x542 .4byte 0x13f .uleb128 0x43 .4byte .LASF3119 .byte 0x1 - .2byte 0x543 + .2byte 0x542 .4byte 0x13f .uleb128 0x56 .4byte .LASF3122 .byte 0x1 - .2byte 0x544 + .2byte 0x543 .4byte 0xbfee - .4byte .LLST241 + .4byte .LLST249 .uleb128 0x56 - .4byte .LASF3090 + .4byte .LASF3089 .byte 0x1 - .2byte 0x545 + .2byte 0x544 .4byte 0xc6 - .4byte .LLST242 + .4byte .LLST250 .uleb128 0x56 .4byte .LASF3128 .byte 0x1 - .2byte 0x546 + .2byte 0x545 .4byte 0x45a4 - .4byte .LLST243 + .4byte .LLST251 .uleb128 0x4b - .8byte .LVL800 - .4byte 0x16a0b + .8byte .LVL797 + .4byte 0x16bfc .uleb128 0x4b - .8byte .LVL806 - .4byte 0x1611e + .8byte .LVL803 + .4byte 0x1630f .uleb128 0x4b - .8byte .LVL810 - .4byte 0x1611e + .8byte .LVL807 + .4byte 0x1630f .byte 0 .uleb128 0x60 .4byte .LASF3129 .byte 0x1 - .2byte 0x4c3 + .2byte 0x4c2 .4byte 0x13f .byte 0x1 - .4byte 0x14005 + .4byte 0x141f6 .uleb128 0x62 .4byte .LASF3116 .byte 0x1 - .2byte 0x4c3 + .2byte 0x4c2 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3117 .byte 0x1 - .2byte 0x4c3 + .2byte 0x4c2 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3127 .byte 0x1 - .2byte 0x4c3 + .2byte 0x4c2 .4byte 0xbfee .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x4c3 - .4byte 0xe82d + .2byte 0x4c2 + .4byte 0xe81f .uleb128 0x62 .4byte .LASF845 .byte 0x1 - .2byte 0x4c3 + .2byte 0x4c2 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x4c5 + .2byte 0x4c4 .4byte 0x110 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x4c6 + .2byte 0x4c5 .4byte 0x110 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x4c7 + .2byte 0x4c6 .4byte 0xbfee .uleb128 0x43 .4byte .LASF3131 .byte 0x1 - .2byte 0x4c8 + .2byte 0x4c7 .4byte 0x13f .uleb128 0x43 .4byte .LASF3132 .byte 0x1 - .2byte 0x4c8 + .2byte 0x4c7 .4byte 0x13f .uleb128 0x43 .4byte .LASF3133 .byte 0x1 - .2byte 0x4c9 + .2byte 0x4c8 .4byte 0x13f .uleb128 0x43 .4byte .LASF3119 .byte 0x1 - .2byte 0x4ca + .2byte 0x4c9 .4byte 0x13f .uleb128 0x43 .4byte .LASF3118 .byte 0x1 - .2byte 0x4cb + .2byte 0x4ca .4byte 0x13f .byte 0 .uleb128 0x4a .4byte .LASF3134 .byte 0x1 - .2byte 0x419 + .2byte 0x418 .8byte .LFB2825 .8byte .LFE2825-.LFB2825 .uleb128 0x1 .byte 0x9c - .4byte 0x14164 + .4byte 0x14355 .uleb128 0x71 .4byte .LASF3115 .byte 0x1 - .2byte 0x419 + .2byte 0x418 .4byte 0xbfee .uleb128 0x1 .byte 0x50 .uleb128 0x71 .4byte .LASF3116 .byte 0x1 - .2byte 0x419 + .2byte 0x418 .4byte 0xac0 .uleb128 0x1 .byte 0x51 .uleb128 0x71 .4byte .LASF3117 .byte 0x1 - .2byte 0x419 + .2byte 0x418 .4byte 0xac0 .uleb128 0x1 .byte 0x52 .uleb128 0x71 .4byte .LASF3127 .byte 0x1 - .2byte 0x419 + .2byte 0x418 .4byte 0xbfee .uleb128 0x1 .byte 0x53 .uleb128 0x71 .4byte .LASF2943 .byte 0x1 - .2byte 0x419 - .4byte 0xe82d + .2byte 0x418 + .4byte 0xe81f .uleb128 0x1 .byte 0x54 .uleb128 0x55 .4byte .LASF874 .byte 0x1 - .2byte 0x419 + .2byte 0x418 .4byte 0xe1ba .4byte .LLST13 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x41b + .2byte 0x41a .4byte 0xe0e4 .uleb128 0x57 .string "i" .byte 0x1 - .2byte 0x41c + .2byte 0x41b .4byte 0xc6 .4byte .LLST14 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x41d + .2byte 0x41c .4byte 0xc6 .uleb128 0x56 .4byte .LASF2870 .byte 0x1 - .2byte 0x41e + .2byte 0x41d .4byte 0xc6 .4byte .LLST15 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x41f + .2byte 0x41e .4byte 0xc6 .uleb128 0x56 .4byte .LASF3118 .byte 0x1 - .2byte 0x420 + .2byte 0x41f .4byte 0x13f .4byte .LLST16 .uleb128 0x56 .4byte .LASF3119 .byte 0x1 - .2byte 0x420 + .2byte 0x41f .4byte 0x13f .4byte .LLST17 .uleb128 0x56 .4byte .LASF3122 .byte 0x1 - .2byte 0x421 + .2byte 0x420 .4byte 0xbfee .4byte .LLST18 .uleb128 0x49 .4byte .LASF2953 .byte 0x1 - .2byte 0x422 + .2byte 0x421 .4byte 0x110 .uleb128 0x1 .byte 0x5d .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x423 + .2byte 0x422 .4byte 0x110 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x424 + .2byte 0x423 .4byte 0xbfee .uleb128 0x43 .4byte .LASF2916 .byte 0x1 - .2byte 0x425 + .2byte 0x424 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3131 .byte 0x1 - .2byte 0x426 + .2byte 0x425 .4byte 0x110 .uleb128 0x43 .4byte .LASF3132 .byte 0x1 - .2byte 0x426 + .2byte 0x425 .4byte 0x110 .uleb128 0x56 .4byte .LASF3133 .byte 0x1 - .2byte 0x427 + .2byte 0x426 .4byte 0x13f .4byte .LLST19 .uleb128 0x56 - .4byte .LASF3090 + .4byte .LASF3089 .byte 0x1 - .2byte 0x428 + .2byte 0x427 .4byte 0xc6 .4byte .LLST20 .uleb128 0x56 .4byte .LASF3128 .byte 0x1 - .2byte 0x429 + .2byte 0x428 .4byte 0x45a4 .4byte .LLST21 .byte 0 .uleb128 0x63 .4byte .LASF3135 .byte 0x1 - .2byte 0x3e5 + .2byte 0x3e4 .byte 0x1 - .4byte 0x1428e + .4byte 0x1447f .uleb128 0x62 .4byte .LASF3115 .byte 0x1 - .2byte 0x3e5 + .2byte 0x3e4 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3116 .byte 0x1 - .2byte 0x3e5 + .2byte 0x3e4 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3117 .byte 0x1 - .2byte 0x3e5 + .2byte 0x3e4 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3127 .byte 0x1 - .2byte 0x3e5 + .2byte 0x3e4 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3136 .byte 0x1 - .2byte 0x3e5 + .2byte 0x3e4 .4byte 0xbfee .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x3e5 - .4byte 0xe82d + .2byte 0x3e4 + .4byte 0xe81f .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x3e7 + .2byte 0x3e6 .4byte 0xe0e4 .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0x3e8 + .2byte 0x3e7 .4byte 0xc6 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x3e9 + .2byte 0x3e8 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2870 .byte 0x1 - .2byte 0x3ea + .2byte 0x3e9 .4byte 0xc6 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x3eb + .2byte 0x3ea .4byte 0xc6 .uleb128 0x43 .4byte .LASF3118 .byte 0x1 - .2byte 0x3ec + .2byte 0x3eb .4byte 0x13f .uleb128 0x43 .4byte .LASF3119 .byte 0x1 - .2byte 0x3ec + .2byte 0x3eb .4byte 0x13f .uleb128 0x43 .4byte .LASF3137 .byte 0x1 - .2byte 0x3ed + .2byte 0x3ec .4byte 0xac0 .uleb128 0x43 .4byte .LASF3138 .byte 0x1 - .2byte 0x3ed + .2byte 0x3ec .4byte 0xac0 .uleb128 0x43 .4byte .LASF3122 .byte 0x1 - .2byte 0x3ee + .2byte 0x3ed .4byte 0xbfee .uleb128 0x43 .4byte .LASF3139 .byte 0x1 - .2byte 0x3ef + .2byte 0x3ee .4byte 0xbfee .uleb128 0x43 .4byte .LASF3140 .byte 0x1 - .2byte 0x3f0 + .2byte 0x3ef .4byte 0xbfee .uleb128 0x43 .4byte .LASF3141 .byte 0x1 - .2byte 0x3f1 + .2byte 0x3f0 .4byte 0xbfee .uleb128 0x43 .4byte .LASF3142 .byte 0x1 - .2byte 0x3f1 + .2byte 0x3f0 .4byte 0xbfee .uleb128 0x43 .4byte .LASF2838 .byte 0x1 - .2byte 0x3f2 + .2byte 0x3f1 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2840 .byte 0x1 - .2byte 0x3f3 + .2byte 0x3f2 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2839 .byte 0x1 - .2byte 0x3f4 + .2byte 0x3f3 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2841 .byte 0x1 - .2byte 0x3f5 + .2byte 0x3f4 .4byte 0xc6 .byte 0 .uleb128 0x60 .4byte .LASF3143 .byte 0x1 - .2byte 0x388 + .2byte 0x387 .4byte 0x13f .byte 0x1 - .4byte 0x14330 + .4byte 0x14521 .uleb128 0x62 .4byte .LASF3119 .byte 0x1 - .2byte 0x388 + .2byte 0x387 .4byte 0x13f .uleb128 0x62 .4byte .LASF3118 .byte 0x1 - .2byte 0x388 + .2byte 0x387 .4byte 0x13f .uleb128 0x62 .4byte .LASF3127 .byte 0x1 - .2byte 0x388 + .2byte 0x387 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3136 .byte 0x1 - .2byte 0x388 + .2byte 0x387 .4byte 0xbfee .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x388 - .4byte 0xe82d + .2byte 0x387 + .4byte 0xe81f .uleb128 0x62 .4byte .LASF845 .byte 0x1 - .2byte 0x388 + .2byte 0x387 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x38a + .2byte 0x389 .4byte 0x110 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x38b + .2byte 0x38a .4byte 0xbfee .uleb128 0x43 .4byte .LASF3131 .byte 0x1 - .2byte 0x38c + .2byte 0x38b .4byte 0x13f .uleb128 0x43 .4byte .LASF3132 .byte 0x1 - .2byte 0x38c + .2byte 0x38b .4byte 0x13f .uleb128 0x43 .4byte .LASF3133 .byte 0x1 - .2byte 0x38d + .2byte 0x38c .4byte 0x13f .uleb128 0x43 .4byte .LASF3144 .byte 0x1 - .2byte 0x38e + .2byte 0x38d .4byte 0x110 .byte 0 .uleb128 0x4a .4byte .LASF3145 .byte 0x1 - .2byte 0x2f7 + .2byte 0x2f6 .8byte .LFB2822 .8byte .LFE2822-.LFB2822 .uleb128 0x1 .byte 0x9c - .4byte 0x1450f + .4byte 0x14700 .uleb128 0x55 .4byte .LASF3115 .byte 0x1 - .2byte 0x2f7 + .2byte 0x2f6 .4byte 0xbfee .4byte .LLST0 .uleb128 0x71 .4byte .LASF3116 .byte 0x1 - .2byte 0x2f7 + .2byte 0x2f6 .4byte 0xac0 .uleb128 0x1 .byte 0x51 .uleb128 0x71 .4byte .LASF3117 .byte 0x1 - .2byte 0x2f7 + .2byte 0x2f6 .4byte 0xac0 .uleb128 0x1 .byte 0x52 .uleb128 0x71 .4byte .LASF3127 .byte 0x1 - .2byte 0x2f7 + .2byte 0x2f6 .4byte 0xbfee .uleb128 0x1 .byte 0x53 .uleb128 0x71 .4byte .LASF3136 .byte 0x1 - .2byte 0x2f7 + .2byte 0x2f6 .4byte 0xbfee .uleb128 0x1 .byte 0x54 .uleb128 0x71 .4byte .LASF2943 .byte 0x1 - .2byte 0x2f7 - .4byte 0xe82d + .2byte 0x2f6 + .4byte 0xe81f .uleb128 0x1 .byte 0x55 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x2f9 + .2byte 0x2f8 .4byte 0xe0e4 .uleb128 0x66 .string "i" .byte 0x1 - .2byte 0x2fa + .2byte 0x2f9 .4byte 0xc6 .uleb128 0x1 .byte 0x67 .uleb128 0x66 .string "j" .byte 0x1 - .2byte 0x2fb + .2byte 0x2fa .4byte 0xc6 .uleb128 0x1 .byte 0x5a .uleb128 0x56 .4byte .LASF2870 .byte 0x1 - .2byte 0x2fc + .2byte 0x2fb .4byte 0xc6 .4byte .LLST1 .uleb128 0x56 .4byte .LASF262 .byte 0x1 - .2byte 0x2fd + .2byte 0x2fc .4byte 0xc6 .4byte .LLST2 .uleb128 0x56 .4byte .LASF3118 .byte 0x1 - .2byte 0x2fe + .2byte 0x2fd .4byte 0x13f .4byte .LLST3 .uleb128 0x56 .4byte .LASF3119 .byte 0x1 - .2byte 0x2fe + .2byte 0x2fd .4byte 0x13f .4byte .LLST4 .uleb128 0x43 .4byte .LASF3137 .byte 0x1 - .2byte 0x2ff + .2byte 0x2fe .4byte 0xac0 .uleb128 0x43 .4byte .LASF3138 .byte 0x1 - .2byte 0x2ff + .2byte 0x2fe .4byte 0xac0 .uleb128 0x56 .4byte .LASF3122 .byte 0x1 - .2byte 0x300 + .2byte 0x2ff .4byte 0xbfee .4byte .LLST5 .uleb128 0x49 .4byte .LASF3146 .byte 0x1 - .2byte 0x301 + .2byte 0x300 .4byte 0xbfee .uleb128 0x1 .byte 0x5c .uleb128 0x43 .4byte .LASF3139 .byte 0x1 - .2byte 0x302 + .2byte 0x301 .4byte 0xbfee .uleb128 0x56 .4byte .LASF3140 .byte 0x1 - .2byte 0x303 + .2byte 0x302 .4byte 0xbfee .4byte .LLST6 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x304 + .2byte 0x303 .4byte 0x110 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x305 + .2byte 0x304 .4byte 0xbfee .uleb128 0x43 .4byte .LASF3144 .byte 0x1 - .2byte 0x306 + .2byte 0x305 .4byte 0x110 .uleb128 0x43 .4byte .LASF3141 .byte 0x1 - .2byte 0x307 + .2byte 0x306 .4byte 0xbfee .uleb128 0x56 .4byte .LASF3142 .byte 0x1 - .2byte 0x307 + .2byte 0x306 .4byte 0xbfee .4byte .LLST7 .uleb128 0x43 .4byte .LASF2916 .byte 0x1 - .2byte 0x308 + .2byte 0x307 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3131 .byte 0x1 - .2byte 0x309 + .2byte 0x308 .4byte 0x110 .uleb128 0x43 .4byte .LASF3132 .byte 0x1 - .2byte 0x309 + .2byte 0x308 .4byte 0x110 .uleb128 0x56 .4byte .LASF3133 .byte 0x1 - .2byte 0x30a + .2byte 0x309 .4byte 0x13f .4byte .LLST8 .uleb128 0x56 .4byte .LASF2838 .byte 0x1 - .2byte 0x30b + .2byte 0x30a .4byte 0xc6 .4byte .LLST9 .uleb128 0x56 .4byte .LASF2840 .byte 0x1 - .2byte 0x30c + .2byte 0x30b .4byte 0xc6 .4byte .LLST10 .uleb128 0x56 .4byte .LASF2839 .byte 0x1 - .2byte 0x30d + .2byte 0x30c .4byte 0xc6 .4byte .LLST11 .uleb128 0x56 .4byte .LASF2841 .byte 0x1 - .2byte 0x30e + .2byte 0x30d .4byte 0xc6 .4byte .LLST12 .byte 0 .uleb128 0x4a .4byte .LASF3147 .byte 0x1 - .2byte 0x29a + .2byte 0x299 .8byte .LFB2821 .8byte .LFE2821-.LFB2821 .uleb128 0x1 .byte 0x9c - .4byte 0x14bc3 + .4byte 0x14db4 .uleb128 0x55 .4byte .LASF3115 .byte 0x1 - .2byte 0x29a + .2byte 0x299 .4byte 0xbfee - .4byte .LLST107 + .4byte .LLST115 .uleb128 0x55 .4byte .LASF3116 .byte 0x1 - .2byte 0x29a + .2byte 0x299 .4byte 0xac0 - .4byte .LLST108 + .4byte .LLST116 .uleb128 0x55 .4byte .LASF3117 .byte 0x1 - .2byte 0x29a + .2byte 0x299 .4byte 0xac0 - .4byte .LLST109 + .4byte .LLST117 .uleb128 0x55 .4byte .LASF3127 .byte 0x1 - .2byte 0x29a + .2byte 0x299 .4byte 0xbfee - .4byte .LLST110 + .4byte .LLST118 .uleb128 0x55 .4byte .LASF3136 .byte 0x1 - .2byte 0x29a + .2byte 0x299 .4byte 0xbfee - .4byte .LLST111 + .4byte .LLST119 .uleb128 0x55 .4byte .LASF2943 .byte 0x1 - .2byte 0x29a - .4byte 0xe82d - .4byte .LLST112 + .2byte 0x299 + .4byte 0xe81f + .4byte .LLST120 .uleb128 0x55 .4byte .LASF874 .byte 0x1 - .2byte 0x29a + .2byte 0x299 .4byte 0xe1ba - .4byte .LLST113 + .4byte .LLST121 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x29c + .2byte 0x29b .4byte 0xe0e4 .uleb128 0x57 .string "i" .byte 0x1 - .2byte 0x29d + .2byte 0x29c .4byte 0xc6 - .4byte .LLST114 + .4byte .LLST122 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x29d + .2byte 0x29c .4byte 0xc6 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x29d + .2byte 0x29c .4byte 0xc6 .uleb128 0x56 .4byte .LASF2870 .byte 0x1 + .2byte 0x29c + .4byte 0xc6 + .4byte .LLST123 + .uleb128 0x56 + .4byte .LASF3089 + .byte 0x1 .2byte 0x29d .4byte 0xc6 - .4byte .LLST115 - .uleb128 0x56 - .4byte .LASF3090 - .byte 0x1 - .2byte 0x29e - .4byte 0xc6 - .4byte .LLST116 + .4byte .LLST124 .uleb128 0x56 .4byte .LASF3128 .byte 0x1 - .2byte 0x29f + .2byte 0x29e .4byte 0x45a4 - .4byte .LLST117 + .4byte .LLST125 .uleb128 0x43 .4byte .LASF3121 .byte 0x1 - .2byte 0x2a0 + .2byte 0x29f .4byte 0xc6 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x7d0 - .4byte 0x14bb5 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x8a0 + .4byte 0x14da6 .uleb128 0x56 .4byte .LASF3122 .byte 0x1 - .2byte 0x2b7 + .2byte 0x2b6 .4byte 0xbfee - .4byte .LLST118 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x800 - .4byte 0x148ec + .4byte .LLST126 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x8d0 + .4byte 0x14add .uleb128 0x56 .4byte .LASF3119 .byte 0x1 - .2byte 0x2b9 + .2byte 0x2b8 .4byte 0x13f - .4byte .LLST119 + .4byte .LLST127 .uleb128 0x56 .4byte .LASF3118 .byte 0x1 - .2byte 0x2ba + .2byte 0x2b9 .4byte 0x13f - .4byte .LLST120 + .4byte .LLST128 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x830 + .4byte .Ldebug_ranges0+0x900 .uleb128 0x56 .4byte .LASF3148 .byte 0x1 - .2byte 0x2bd + .2byte 0x2bc .4byte 0x2b0 - .4byte .LLST121 + .4byte .LLST129 .uleb128 0x49 .4byte .LASF3132 .byte 0x1 - .2byte 0x2be + .2byte 0x2bd .4byte 0x13f .uleb128 0x1 .byte 0x55 .uleb128 0x56 .4byte .LASF3133 .byte 0x1 - .2byte 0x2bf - .4byte 0x13f - .4byte .LLST122 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x860 - .4byte 0x146cc - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x2c2 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x2c2 - .4byte 0x110 - .4byte .LLST123 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x2c2 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x2c2 - .4byte 0x13f - .4byte .LLST124 - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x2c2 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x890 - .4byte 0x1471a - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x2c3 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x2c3 - .4byte 0x110 - .4byte .LLST125 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x2c3 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x2c3 - .4byte 0x13f - .4byte .LLST126 - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x2c3 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x8c0 - .4byte 0x14768 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x2c4 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x2c4 - .4byte 0x110 - .4byte .LLST127 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x2c4 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x2c4 - .4byte 0x13f - .4byte .LLST128 - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x2c4 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x8f0 - .4byte 0x147b6 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x2c5 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x2c5 - .4byte 0x110 - .4byte .LLST129 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x2c5 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x2c5 + .2byte 0x2be .4byte 0x13f .4byte .LLST130 - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x2c5 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x920 - .4byte 0x14804 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x930 + .4byte 0x148bd .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x2c6 + .2byte 0x2c1 .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x2c6 + .2byte 0x2c1 .4byte 0x110 .4byte .LLST131 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x2c6 + .2byte 0x2c1 .4byte 0x110 .uleb128 0x56 .4byte .LASF3131 .byte 0x1 - .2byte 0x2c6 + .2byte 0x2c1 .4byte 0x13f .4byte .LLST132 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x2c6 + .2byte 0x2c1 .4byte 0xbfee .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x950 - .4byte 0x14852 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x960 + .4byte 0x1490b .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x2c7 + .2byte 0x2c2 .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x2c7 + .2byte 0x2c2 .4byte 0x110 .4byte .LLST133 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x2c7 + .2byte 0x2c2 .4byte 0x110 .uleb128 0x56 .4byte .LASF3131 .byte 0x1 - .2byte 0x2c7 + .2byte 0x2c2 .4byte 0x13f .4byte .LLST134 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x2c7 + .2byte 0x2c2 .4byte 0xbfee .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x980 - .4byte 0x148a0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x990 + .4byte 0x14959 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x2c8 + .2byte 0x2c3 .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x2c8 + .2byte 0x2c3 .4byte 0x110 .4byte .LLST135 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x2c8 + .2byte 0x2c3 .4byte 0x110 .uleb128 0x56 .4byte .LASF3131 .byte 0x1 - .2byte 0x2c8 + .2byte 0x2c3 .4byte 0x13f .4byte .LLST136 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x2c8 + .2byte 0x2c3 .4byte 0xbfee .byte 0 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x9b0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x9c0 + .4byte 0x149a7 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x2c9 + .2byte 0x2c4 .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x2c9 + .2byte 0x2c4 .4byte 0x110 .4byte .LLST137 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x2c9 + .2byte 0x2c4 .4byte 0x110 .uleb128 0x56 .4byte .LASF3131 .byte 0x1 - .2byte 0x2c9 + .2byte 0x2c4 .4byte 0x13f .4byte .LLST138 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x2c9 + .2byte 0x2c4 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x9f0 + .4byte 0x149f5 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x2c5 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x2c5 + .4byte 0x110 + .4byte .LLST139 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c5 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2c5 + .4byte 0x13f + .4byte .LLST140 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c5 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xa20 + .4byte 0x14a43 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x2c6 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x2c6 + .4byte 0x110 + .4byte .LLST141 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c6 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2c6 + .4byte 0x13f + .4byte .LLST142 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c6 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xa50 + .4byte 0x14a91 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x110 + .4byte .LLST143 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x13f + .4byte .LLST144 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c7 + .4byte 0xbfee + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xa80 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x2c8 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x2c8 + .4byte 0x110 + .4byte .LLST145 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c8 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2c8 + .4byte 0x13f + .4byte .LLST146 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c8 .4byte 0xbfee .byte 0 .byte 0 .byte 0 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x9e0 + .4byte .Ldebug_ranges0+0xab0 .uleb128 0x56 .4byte .LASF3119 .byte 0x1 - .2byte 0x2d7 + .2byte 0x2d6 .4byte 0x13f - .4byte .LLST139 + .4byte .LLST147 .uleb128 0x56 .4byte .LASF3118 .byte 0x1 - .2byte 0x2d8 + .2byte 0x2d7 .4byte 0x13f - .4byte .LLST140 + .4byte .LLST148 .uleb128 0x5b - .4byte .Ldebug_ranges0+0xa10 + .4byte .Ldebug_ranges0+0xae0 .uleb128 0x56 .4byte .LASF3148 .byte 0x1 - .2byte 0x2db + .2byte 0x2da .4byte 0x2b0 - .4byte .LLST141 + .4byte .LLST149 .uleb128 0x56 .4byte .LASF3132 .byte 0x1 - .2byte 0x2dc + .2byte 0x2db .4byte 0x13f - .4byte .LLST142 + .4byte .LLST150 .uleb128 0x56 .4byte .LASF3133 .byte 0x1 - .2byte 0x2dd - .4byte 0x13f - .4byte .LLST143 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xa40 - .4byte 0x14994 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x2e0 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x2e0 - .4byte 0x110 - .4byte .LLST144 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x2e0 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x2e0 - .4byte 0x13f - .4byte .LLST145 - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x2e0 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xa70 - .4byte 0x149e2 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x2e1 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x2e1 - .4byte 0x110 - .4byte .LLST146 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x2e1 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x2e1 - .4byte 0x13f - .4byte .LLST147 - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x2e1 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xaa0 - .4byte 0x14a30 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x2e2 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x2e2 - .4byte 0x110 - .4byte .LLST148 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x2e2 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x2e2 - .4byte 0x13f - .4byte .LLST149 - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x2e2 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xad0 - .4byte 0x14a7e - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x2e3 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x2e3 - .4byte 0x110 - .4byte .LLST150 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x2e3 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x2e3 + .2byte 0x2dc .4byte 0x13f .4byte .LLST151 - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x2e3 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xb00 - .4byte 0x14acc + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xb10 + .4byte 0x14b85 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x2e4 + .2byte 0x2df .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x2e4 + .2byte 0x2df .4byte 0x110 .4byte .LLST152 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x2e4 + .2byte 0x2df .4byte 0x110 .uleb128 0x56 .4byte .LASF3131 .byte 0x1 - .2byte 0x2e4 + .2byte 0x2df .4byte 0x13f .4byte .LLST153 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x2e4 + .2byte 0x2df .4byte 0xbfee .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xb30 - .4byte 0x14b1a + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xb40 + .4byte 0x14bd3 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x2e5 + .2byte 0x2e0 .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x2e5 + .2byte 0x2e0 .4byte 0x110 .4byte .LLST154 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x2e5 + .2byte 0x2e0 .4byte 0x110 .uleb128 0x56 .4byte .LASF3131 .byte 0x1 - .2byte 0x2e5 + .2byte 0x2e0 .4byte 0x13f .4byte .LLST155 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x2e5 + .2byte 0x2e0 .4byte 0xbfee .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xb60 - .4byte 0x14b68 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xb70 + .4byte 0x14c21 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x2e6 + .2byte 0x2e1 .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x2e6 + .2byte 0x2e1 .4byte 0x110 .4byte .LLST156 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x2e6 + .2byte 0x2e1 .4byte 0x110 .uleb128 0x56 .4byte .LASF3131 .byte 0x1 - .2byte 0x2e6 + .2byte 0x2e1 .4byte 0x13f .4byte .LLST157 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x2e6 + .2byte 0x2e1 .4byte 0xbfee .byte 0 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0xb90 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xba0 + .4byte 0x14c6f .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x2e7 + .2byte 0x2e2 .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x2e7 + .2byte 0x2e2 .4byte 0x110 .4byte .LLST158 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x2e7 + .2byte 0x2e2 .4byte 0x110 .uleb128 0x56 .4byte .LASF3131 .byte 0x1 - .2byte 0x2e7 + .2byte 0x2e2 .4byte 0x13f .4byte .LLST159 .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x2e7 + .2byte 0x2e2 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xbd0 + .4byte 0x14cbd + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x110 + .4byte .LLST160 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x13f + .4byte .LLST161 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e3 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xc00 + .4byte 0x14d0b + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x2e4 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x2e4 + .4byte 0x110 + .4byte .LLST162 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e4 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2e4 + .4byte 0x13f + .4byte .LLST163 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e4 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xc30 + .4byte 0x14d59 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x2e5 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x2e5 + .4byte 0x110 + .4byte .LLST164 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e5 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2e5 + .4byte 0x13f + .4byte .LLST165 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e5 + .4byte 0xbfee + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xc60 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x2e6 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x2e6 + .4byte 0x110 + .4byte .LLST166 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e6 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2e6 + .4byte 0x13f + .4byte .LLST167 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e6 .4byte 0xbfee .byte 0 .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL345 - .4byte 0x16a0b + .8byte .LVL342 + .4byte 0x16bfc .byte 0 .uleb128 0x4a .4byte .LASF3149 .byte 0x1 - .2byte 0x252 + .2byte 0x251 .8byte .LFB2820 .8byte .LFE2820-.LFB2820 .uleb128 0x1 .byte 0x9c - .4byte 0x14f94 + .4byte 0x15185 .uleb128 0x55 .4byte .LASF3115 .byte 0x1 - .2byte 0x252 + .2byte 0x251 .4byte 0xbfee - .4byte .LLST160 + .4byte .LLST168 .uleb128 0x55 .4byte .LASF3116 .byte 0x1 - .2byte 0x252 + .2byte 0x251 .4byte 0xac0 - .4byte .LLST161 + .4byte .LLST169 .uleb128 0x55 .4byte .LASF3117 .byte 0x1 - .2byte 0x252 + .2byte 0x251 .4byte 0xac0 - .4byte .LLST162 + .4byte .LLST170 .uleb128 0x55 .4byte .LASF3127 .byte 0x1 - .2byte 0x252 + .2byte 0x251 .4byte 0xbfee - .4byte .LLST163 + .4byte .LLST171 .uleb128 0x55 .4byte .LASF3136 .byte 0x1 - .2byte 0x252 + .2byte 0x251 .4byte 0xbfee - .4byte .LLST164 + .4byte .LLST172 .uleb128 0x55 .4byte .LASF2943 .byte 0x1 - .2byte 0x252 - .4byte 0xe82d - .4byte .LLST165 + .2byte 0x251 + .4byte 0xe81f + .4byte .LLST173 .uleb128 0x55 .4byte .LASF874 .byte 0x1 - .2byte 0x252 + .2byte 0x251 .4byte 0xe1ba - .4byte .LLST166 + .4byte .LLST174 .uleb128 0x43 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0x1 - .2byte 0x254 + .2byte 0x253 .4byte 0xe0e4 .uleb128 0x57 .string "i" .byte 0x1 - .2byte 0x255 + .2byte 0x254 .4byte 0xc6 - .4byte .LLST167 + .4byte .LLST175 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x255 + .2byte 0x254 .4byte 0xc6 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x255 + .2byte 0x254 .4byte 0xc6 .uleb128 0x56 .4byte .LASF2870 .byte 0x1 + .2byte 0x254 + .4byte 0xc6 + .4byte .LLST176 + .uleb128 0x56 + .4byte .LASF3089 + .byte 0x1 .2byte 0x255 .4byte 0xc6 - .4byte .LLST168 - .uleb128 0x56 - .4byte .LASF3090 - .byte 0x1 - .2byte 0x256 - .4byte 0xc6 - .4byte .LLST169 + .4byte .LLST177 .uleb128 0x56 .4byte .LASF3128 .byte 0x1 - .2byte 0x257 + .2byte 0x256 .4byte 0x45a4 - .4byte .LLST170 + .4byte .LLST178 .uleb128 0x56 .4byte .LASF3121 .byte 0x1 - .2byte 0x258 + .2byte 0x257 .4byte 0xc6 - .4byte .LLST171 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xbc0 - .4byte 0x14f79 + .4byte .LLST179 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xc90 + .4byte 0x1516a .uleb128 0x56 .4byte .LASF3119 .byte 0x1 - .2byte 0x277 + .2byte 0x276 .4byte 0x13f - .4byte .LLST172 + .4byte .LLST180 .uleb128 0x56 .4byte .LASF3118 .byte 0x1 - .2byte 0x278 + .2byte 0x277 .4byte 0x13f - .4byte .LLST173 + .4byte .LLST181 .uleb128 0x5b - .4byte .Ldebug_ranges0+0xbf0 + .4byte .Ldebug_ranges0+0xcc0 .uleb128 0x56 .4byte .LASF3148 .byte 0x1 - .2byte 0x27b + .2byte 0x27a .4byte 0x2b0 - .4byte .LLST174 + .4byte .LLST182 .uleb128 0x56 .4byte .LASF3122 .byte 0x1 - .2byte 0x27c + .2byte 0x27b .4byte 0xbfee - .4byte .LLST175 + .4byte .LLST183 .uleb128 0x43 .4byte .LASF3132 .byte 0x1 - .2byte 0x27d + .2byte 0x27c .4byte 0x110 .uleb128 0x56 .4byte .LASF3133 .byte 0x1 - .2byte 0x27e + .2byte 0x27d .4byte 0x13f - .4byte .LLST176 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xc20 - .4byte 0x14d75 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x281 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x281 - .4byte 0x110 - .4byte .LLST177 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x281 - .4byte 0x110 - .uleb128 0x43 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x281 - .4byte 0x13f - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x281 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xc60 - .4byte 0x14dbf - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x282 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x282 - .4byte 0x110 - .4byte .LLST178 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x282 - .4byte 0x110 - .uleb128 0x43 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x282 - .4byte 0x13f - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x282 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xc90 - .4byte 0x14e09 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x283 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x283 - .4byte 0x110 - .4byte .LLST179 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x283 - .4byte 0x110 - .uleb128 0x43 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x283 - .4byte 0x13f - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x283 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xcc0 - .4byte 0x14e53 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x284 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x284 - .4byte 0x110 - .4byte .LLST180 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x284 - .4byte 0x110 - .uleb128 0x43 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x284 - .4byte 0x13f - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x284 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c + .4byte .LLST184 + .uleb128 0x68 .4byte .Ldebug_ranges0+0xcf0 - .4byte 0x14e9d + .4byte 0x14f66 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x280 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x280 + .4byte 0x110 + .4byte .LLST185 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x280 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x280 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x280 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xd30 + .4byte 0x14fb0 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x281 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x281 + .4byte 0x110 + .4byte .LLST186 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x281 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x281 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x281 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xd60 + .4byte 0x14ffa + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x282 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x282 + .4byte 0x110 + .4byte .LLST187 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x282 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x282 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x282 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xd90 + .4byte 0x15044 + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x283 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x283 + .4byte 0x110 + .4byte .LLST188 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x283 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x283 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x283 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xdc0 + .4byte 0x1508e + .uleb128 0x43 + .4byte .LASF3130 + .byte 0x1 + .2byte 0x286 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x286 + .4byte 0x110 + .4byte .LLST189 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x286 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x286 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x286 + .4byte 0xbfee + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xdf0 + .4byte 0x150d8 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 @@ -53843,7 +54138,7 @@ .byte 0x1 .2byte 0x287 .4byte 0x110 - .4byte .LLST181 + .4byte .LLST190 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 @@ -53860,9 +54155,9 @@ .2byte 0x287 .4byte 0xbfee .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xd20 - .4byte 0x14ee7 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0xe20 + .4byte 0x15122 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 @@ -53873,7 +54168,7 @@ .byte 0x1 .2byte 0x288 .4byte 0x110 - .4byte .LLST182 + .4byte .LLST191 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 @@ -53888,540 +54183,518 @@ .4byte .LASF2826 .byte 0x1 .2byte 0x288 - .4byte 0xbfee - .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0xd50 - .4byte 0x14f31 - .uleb128 0x43 - .4byte .LASF3130 - .byte 0x1 - .2byte 0x289 - .4byte 0x110 - .uleb128 0x56 - .4byte .LASF3144 - .byte 0x1 - .2byte 0x289 - .4byte 0x110 - .4byte .LLST183 - .uleb128 0x43 - .4byte .LASF2953 - .byte 0x1 - .2byte 0x289 - .4byte 0x110 - .uleb128 0x43 - .4byte .LASF3131 - .byte 0x1 - .2byte 0x289 - .4byte 0x13f - .uleb128 0x43 - .4byte .LASF2826 - .byte 0x1 - .2byte 0x289 .4byte 0xbfee .byte 0 .uleb128 0x5b - .4byte .Ldebug_ranges0+0xd80 + .4byte .Ldebug_ranges0+0xe50 .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x28a + .2byte 0x289 .4byte 0x110 .uleb128 0x56 .4byte .LASF3144 .byte 0x1 - .2byte 0x28a + .2byte 0x289 .4byte 0x110 - .4byte .LLST184 + .4byte .LLST192 .uleb128 0x43 .4byte .LASF2953 .byte 0x1 - .2byte 0x28a + .2byte 0x289 .4byte 0x110 .uleb128 0x43 .4byte .LASF3131 .byte 0x1 - .2byte 0x28a + .2byte 0x289 .4byte 0x13f .uleb128 0x43 .4byte .LASF2826 .byte 0x1 - .2byte 0x28a + .2byte 0x289 .4byte 0xbfee .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL560 - .4byte 0x16a0b + .8byte .LVL557 + .4byte 0x16bfc .uleb128 0x4b - .8byte .LVL630 - .4byte 0x16a0b + .8byte .LVL627 + .4byte 0x16bfc .byte 0 .uleb128 0x72 .4byte .LASF3155 .byte 0x1 - .2byte 0x216 + .2byte 0x215 .8byte .LFB2819 .8byte .LFE2819-.LFB2819 .uleb128 0x1 .byte 0x9c - .4byte 0x1505b + .4byte 0x1524c .uleb128 0x71 .4byte .LASF3150 .byte 0x1 - .2byte 0x216 + .2byte 0x215 .4byte 0xac0 .uleb128 0x1 .byte 0x50 .uleb128 0x71 .4byte .LASF3151 .byte 0x1 - .2byte 0x216 + .2byte 0x215 .4byte 0xac0 .uleb128 0x1 .byte 0x51 .uleb128 0x71 .4byte .LASF3127 .byte 0x1 - .2byte 0x216 + .2byte 0x215 .4byte 0x45aa .uleb128 0x1 .byte 0x52 .uleb128 0x55 .4byte .LASF2943 .byte 0x1 - .2byte 0x216 - .4byte 0xe82d - .4byte .LLST344 + .2byte 0x215 + .4byte 0xe81f + .4byte .LLST352 .uleb128 0x49 .4byte .LASF2870 .byte 0x1 - .2byte 0x218 + .2byte 0x217 .4byte 0xc6 .uleb128 0x1 .byte 0x5f .uleb128 0x49 .4byte .LASF262 .byte 0x1 - .2byte 0x218 + .2byte 0x217 .4byte 0xc6 .uleb128 0x1 .byte 0x5a .uleb128 0x43 .4byte .LASF3152 .byte 0x1 - .2byte 0x219 + .2byte 0x218 .4byte 0x13f .uleb128 0x56 .4byte .LASF3153 .byte 0x1 - .2byte 0x219 + .2byte 0x218 .4byte 0x13f - .4byte .LLST345 + .4byte .LLST353 .uleb128 0x56 .4byte .LASF3130 .byte 0x1 - .2byte 0x21a + .2byte 0x219 .4byte 0x15a - .4byte .LLST346 + .4byte .LLST354 .uleb128 0x66 .string "i" .byte 0x1 - .2byte 0x21b + .2byte 0x21a .4byte 0xc6 .uleb128 0x1 .byte 0x5c .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x21b + .2byte 0x21a .4byte 0xc6 .uleb128 0x56 .4byte .LASF3154 .byte 0x1 - .2byte 0x21c + .2byte 0x21b .4byte 0x13f - .4byte .LLST347 + .4byte .LLST355 .byte 0 .uleb128 0x72 .4byte .LASF3156 .byte 0x1 - .2byte 0x1e5 + .2byte 0x1e4 .8byte .LFB2818 .8byte .LFE2818-.LFB2818 .uleb128 0x1 .byte 0x9c - .4byte 0x152f6 + .4byte 0x154e7 .uleb128 0x71 .4byte .LASF3150 .byte 0x1 - .2byte 0x1e5 + .2byte 0x1e4 .4byte 0xac0 .uleb128 0x1 .byte 0x50 .uleb128 0x71 .4byte .LASF3157 .byte 0x1 - .2byte 0x1e5 + .2byte 0x1e4 .4byte 0xac0 .uleb128 0x1 .byte 0x51 .uleb128 0x71 .4byte .LASF3151 .byte 0x1 - .2byte 0x1e5 + .2byte 0x1e4 .4byte 0xac0 .uleb128 0x1 .byte 0x52 .uleb128 0x71 .4byte .LASF3127 .byte 0x1 - .2byte 0x1e5 + .2byte 0x1e4 .4byte 0x45aa .uleb128 0x1 .byte 0x53 .uleb128 0x71 .4byte .LASF3136 .byte 0x1 - .2byte 0x1e5 + .2byte 0x1e4 .4byte 0x45aa .uleb128 0x1 .byte 0x54 .uleb128 0x55 .4byte .LASF2943 .byte 0x1 - .2byte 0x1e5 - .4byte 0xe82d - .4byte .LLST323 + .2byte 0x1e4 + .4byte 0xe81f + .4byte .LLST331 .uleb128 0x49 .4byte .LASF2870 .byte 0x1 - .2byte 0x1e7 + .2byte 0x1e6 .4byte 0xc6 .uleb128 0x1 .byte 0x62 .uleb128 0x56 .4byte .LASF262 .byte 0x1 - .2byte 0x1e7 + .2byte 0x1e6 .4byte 0xc6 - .4byte .LLST324 + .4byte .LLST332 .uleb128 0x43 .4byte .LASF3152 .byte 0x1 - .2byte 0x1e8 + .2byte 0x1e7 .4byte 0x13f .uleb128 0x56 .4byte .LASF3158 .byte 0x1 - .2byte 0x1e8 + .2byte 0x1e7 .4byte 0x13f - .4byte .LLST325 + .4byte .LLST333 .uleb128 0x56 .4byte .LASF3153 .byte 0x1 - .2byte 0x1e8 + .2byte 0x1e7 .4byte 0x13f - .4byte .LLST326 + .4byte .LLST334 .uleb128 0x56 .4byte .LASF3130 .byte 0x1 - .2byte 0x1e9 + .2byte 0x1e8 .4byte 0x15a - .4byte .LLST327 + .4byte .LLST335 .uleb128 0x43 .4byte .LASF3144 .byte 0x1 - .2byte 0x1ea + .2byte 0x1e9 .4byte 0x15a .uleb128 0x57 .string "i" .byte 0x1 - .2byte 0x1eb + .2byte 0x1ea .4byte 0xc6 - .4byte .LLST328 + .4byte .LLST336 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x1eb + .2byte 0x1ea .4byte 0xc6 .uleb128 0x49 .4byte .LASF3154 .byte 0x1 - .2byte 0x1ec + .2byte 0x1eb .4byte 0x13f .uleb128 0x1 .byte 0x55 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1730 - .4byte 0x15173 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x17c0 + .4byte 0x15364 .uleb128 0x49 .4byte .LASF3159 .byte 0x1 - .2byte 0x1fb + .2byte 0x1fa .4byte 0x13f .uleb128 0x1 .byte 0x55 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x17a0 - .4byte 0x1518d + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1830 + .4byte 0x1537e + .uleb128 0x56 + .4byte .LASF3159 + .byte 0x1 + .2byte 0x1fb + .4byte 0x13f + .4byte .LLST339 + .byte 0 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x18b0 + .4byte 0x15398 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x1fc .4byte 0x13f - .4byte .LLST331 + .4byte .LLST340 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1820 - .4byte 0x151a7 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1920 + .4byte 0x153b2 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x1fd .4byte 0x13f - .4byte .LLST332 + .4byte .LLST341 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1890 - .4byte 0x151c1 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1980 + .4byte 0x153cc .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x1fe .4byte 0x13f - .4byte .LLST333 + .4byte .LLST342 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x18f0 - .4byte 0x151db + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x19d0 + .4byte 0x153e6 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x1ff .4byte 0x13f - .4byte .LLST334 + .4byte .LLST343 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1940 - .4byte 0x151f5 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1720 + .4byte 0x15400 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x200 .4byte 0x13f - .4byte .LLST335 + .4byte .LLST337 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1690 - .4byte 0x1520f + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1790 + .4byte 0x1541a .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x201 .4byte 0x13f - .4byte .LLST329 + .4byte .LLST338 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1700 - .4byte 0x15229 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1a90 + .4byte 0x15434 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 - .2byte 0x202 + .2byte 0x203 .4byte 0x13f - .4byte .LLST330 + .4byte .LLST345 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1a00 - .4byte 0x15243 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1b00 + .4byte 0x1544e .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x204 .4byte 0x13f - .4byte .LLST337 + .4byte .LLST346 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1a70 - .4byte 0x1525d + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1b60 + .4byte 0x15468 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x205 .4byte 0x13f - .4byte .LLST338 + .4byte .LLST347 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1ad0 - .4byte 0x15277 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1bc0 + .4byte 0x15482 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x206 .4byte 0x13f - .4byte .LLST339 + .4byte .LLST348 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1b30 - .4byte 0x15291 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1c10 + .4byte 0x1549c .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x207 .4byte 0x13f - .4byte .LLST340 + .4byte .LLST349 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1b80 - .4byte 0x152ab + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1c70 + .4byte 0x154b6 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x208 .4byte 0x13f - .4byte .LLST341 + .4byte .LLST350 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1be0 - .4byte 0x152c5 + .uleb128 0x68 + .4byte .Ldebug_ranges0+0x1cd0 + .4byte 0x154d0 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x209 .4byte 0x13f - .4byte .LLST342 + .4byte .LLST351 .byte 0 - .uleb128 0x6c - .4byte .Ldebug_ranges0+0x1c40 - .4byte 0x152df + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1a20 .uleb128 0x56 .4byte .LASF3159 .byte 0x1 .2byte 0x20a .4byte 0x13f - .4byte .LLST343 - .byte 0 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1990 - .uleb128 0x56 - .4byte .LASF3159 - .byte 0x1 - .2byte 0x20b - .4byte 0x13f - .4byte .LLST336 + .4byte .LLST344 .byte 0 .byte 0 .uleb128 0x63 .4byte .LASF3160 .byte 0x1 - .2byte 0x1a5 + .2byte 0x1a4 .byte 0x1 - .4byte 0x1547c + .4byte 0x1566d .uleb128 0x62 .4byte .LASF3150 .byte 0x1 - .2byte 0x1a5 + .2byte 0x1a4 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3157 .byte 0x1 - .2byte 0x1a5 + .2byte 0x1a4 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3151 .byte 0x1 - .2byte 0x1a5 + .2byte 0x1a4 .4byte 0xac0 .uleb128 0x62 .4byte .LASF3127 .byte 0x1 - .2byte 0x1a5 + .2byte 0x1a4 .4byte 0x45aa .uleb128 0x62 .4byte .LASF3136 .byte 0x1 - .2byte 0x1a5 + .2byte 0x1a4 .4byte 0x45aa .uleb128 0x62 .4byte .LASF2943 .byte 0x1 - .2byte 0x1a5 - .4byte 0xe82d + .2byte 0x1a4 + .4byte 0xe81f .uleb128 0x43 .4byte .LASF2870 .byte 0x1 - .2byte 0x1a7 + .2byte 0x1a6 .4byte 0xc6 .uleb128 0x43 .4byte .LASF262 .byte 0x1 - .2byte 0x1a7 + .2byte 0x1a6 .4byte 0xc6 .uleb128 0x43 .4byte .LASF3152 .byte 0x1 - .2byte 0x1a8 + .2byte 0x1a7 .4byte 0x13f .uleb128 0x43 .4byte .LASF3158 .byte 0x1 - .2byte 0x1a8 + .2byte 0x1a7 .4byte 0x13f .uleb128 0x43 .4byte .LASF3153 .byte 0x1 - .2byte 0x1a8 + .2byte 0x1a7 .4byte 0x13f .uleb128 0x43 .4byte .LASF3130 .byte 0x1 - .2byte 0x1a9 + .2byte 0x1a8 .4byte 0x15a .uleb128 0x43 .4byte .LASF3144 .byte 0x1 - .2byte 0x1aa + .2byte 0x1a9 .4byte 0x15a .uleb128 0x43 .4byte .LASF3154 .byte 0x1 - .2byte 0x1ab + .2byte 0x1aa .4byte 0x13f .uleb128 0x4f .string "i" .byte 0x1 - .2byte 0x1ac + .2byte 0x1ab .4byte 0xc6 .uleb128 0x4f .string "j" .byte 0x1 - .2byte 0x1ad + .2byte 0x1ac .4byte 0xc6 .uleb128 0x43 .4byte .LASF2838 .byte 0x1 - .2byte 0x1ae + .2byte 0x1ad .4byte 0xc6 .uleb128 0x43 .4byte .LASF2840 .byte 0x1 - .2byte 0x1af + .2byte 0x1ae .4byte 0xc6 .uleb128 0x43 .4byte .LASF2839 .byte 0x1 - .2byte 0x1b0 + .2byte 0x1af .4byte 0xc6 .uleb128 0x43 .4byte .LASF2841 .byte 0x1 - .2byte 0x1b1 + .2byte 0x1b0 .4byte 0xc6 .uleb128 0x6f - .4byte 0x15401 + .4byte 0x155f2 + .uleb128 0x43 + .4byte .LASF3159 + .byte 0x1 + .2byte 0x1cd + .4byte 0x13f + .byte 0 + .uleb128 0x6f + .4byte 0x15604 .uleb128 0x43 .4byte .LASF3159 .byte 0x1 @@ -54429,7 +54702,7 @@ .4byte 0x13f .byte 0 .uleb128 0x6f - .4byte 0x15413 + .4byte 0x15616 .uleb128 0x43 .4byte .LASF3159 .byte 0x1 @@ -54437,7 +54710,7 @@ .4byte 0x13f .byte 0 .uleb128 0x6f - .4byte 0x15425 + .4byte 0x15628 .uleb128 0x43 .4byte .LASF3159 .byte 0x1 @@ -54445,7 +54718,7 @@ .4byte 0x13f .byte 0 .uleb128 0x6f - .4byte 0x15437 + .4byte 0x1563a .uleb128 0x43 .4byte .LASF3159 .byte 0x1 @@ -54453,7 +54726,7 @@ .4byte 0x13f .byte 0 .uleb128 0x6f - .4byte 0x15449 + .4byte 0x1564c .uleb128 0x43 .4byte .LASF3159 .byte 0x1 @@ -54461,218 +54734,210 @@ .4byte 0x13f .byte 0 .uleb128 0x6f - .4byte 0x1545b + .4byte 0x1565e .uleb128 0x43 .4byte .LASF3159 .byte 0x1 .2byte 0x1d3 .4byte 0x13f .byte 0 - .uleb128 0x6f - .4byte 0x1546d + .uleb128 0x64 .uleb128 0x43 .4byte .LASF3159 .byte 0x1 .2byte 0x1d4 .4byte 0x13f .byte 0 - .uleb128 0x64 - .uleb128 0x43 - .4byte .LASF3159 - .byte 0x1 - .2byte 0x1d5 - .4byte 0x13f - .byte 0 .byte 0 .uleb128 0x60 .4byte .LASF3161 .byte 0x1 - .2byte 0x186 + .2byte 0x185 .4byte 0xc6 .byte 0x1 - .4byte 0x154b2 + .4byte 0x156a3 .uleb128 0x61 .string "ebc" .byte 0x1 - .2byte 0x186 - .4byte 0xe4e5 + .2byte 0x185 + .4byte 0xe4d7 .uleb128 0x62 .4byte .LASF3162 .byte 0x1 - .2byte 0x186 + .2byte 0x185 .4byte 0xc6 .uleb128 0x43 .4byte .LASF2943 .byte 0x1 - .2byte 0x188 - .4byte 0xe82d + .2byte 0x187 + .4byte 0xe81f .byte 0 .uleb128 0x60 .4byte .LASF3163 .byte 0x1 - .2byte 0x168 + .2byte 0x167 .4byte 0x13f .byte 0x3 - .4byte 0x15500 + .4byte 0x156f1 .uleb128 0x62 .4byte .LASF2826 .byte 0x1 - .2byte 0x168 + .2byte 0x167 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3118 .byte 0x1 - .2byte 0x168 + .2byte 0x167 .4byte 0x13f .uleb128 0x62 .4byte .LASF3119 .byte 0x1 - .2byte 0x168 + .2byte 0x167 .4byte 0x13f .uleb128 0x43 .4byte .LASF3164 .byte 0x1 - .2byte 0x16a + .2byte 0x169 .4byte 0x13f .uleb128 0x43 .4byte .LASF3133 .byte 0x1 - .2byte 0x16b + .2byte 0x16a .4byte 0x13f .byte 0 .uleb128 0x60 .4byte .LASF3165 .byte 0x1 - .2byte 0x14a + .2byte 0x149 .4byte 0x13f .byte 0x3 - .4byte 0x1554e + .4byte 0x1573f .uleb128 0x62 .4byte .LASF2826 .byte 0x1 - .2byte 0x14a + .2byte 0x149 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3118 .byte 0x1 - .2byte 0x14a + .2byte 0x149 .4byte 0x13f .uleb128 0x62 .4byte .LASF3119 .byte 0x1 - .2byte 0x14a + .2byte 0x149 .4byte 0x13f .uleb128 0x43 .4byte .LASF3164 .byte 0x1 - .2byte 0x14c + .2byte 0x14b .4byte 0x13f .uleb128 0x43 .4byte .LASF3133 .byte 0x1 - .2byte 0x14d + .2byte 0x14c .4byte 0x13f .byte 0 .uleb128 0x60 .4byte .LASF3166 .byte 0x1 - .2byte 0x12c + .2byte 0x12b .4byte 0x11f .byte 0x3 - .4byte 0x1559c + .4byte 0x1578d .uleb128 0x62 .4byte .LASF2826 .byte 0x1 - .2byte 0x12c + .2byte 0x12b .4byte 0xbfee .uleb128 0x62 .4byte .LASF3118 .byte 0x1 - .2byte 0x12c + .2byte 0x12b .4byte 0x13f .uleb128 0x62 .4byte .LASF3119 .byte 0x1 - .2byte 0x12c + .2byte 0x12b .4byte 0x13f .uleb128 0x43 .4byte .LASF3164 .byte 0x1 - .2byte 0x12e + .2byte 0x12d .4byte 0x11f .uleb128 0x43 .4byte .LASF3133 .byte 0x1 - .2byte 0x12f + .2byte 0x12e .4byte 0x13f .byte 0 .uleb128 0x60 .4byte .LASF3167 .byte 0x1 - .2byte 0x120 + .2byte 0x11f .4byte 0x13f .byte 0x3 - .4byte 0x155d2 + .4byte 0x157c3 .uleb128 0x62 .4byte .LASF2826 .byte 0x1 - .2byte 0x120 + .2byte 0x11f .4byte 0xbfee .uleb128 0x62 .4byte .LASF3118 .byte 0x1 - .2byte 0x120 + .2byte 0x11f .4byte 0x13f .uleb128 0x62 .4byte .LASF3119 .byte 0x1 - .2byte 0x120 + .2byte 0x11f .4byte 0x13f .byte 0 .uleb128 0x60 .4byte .LASF3168 .byte 0x1 - .2byte 0x114 + .2byte 0x113 .4byte 0x13f .byte 0x3 - .4byte 0x15608 + .4byte 0x157f9 .uleb128 0x62 .4byte .LASF2826 .byte 0x1 - .2byte 0x114 + .2byte 0x113 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3118 .byte 0x1 - .2byte 0x114 + .2byte 0x113 .4byte 0x13f .uleb128 0x62 .4byte .LASF3119 .byte 0x1 - .2byte 0x114 + .2byte 0x113 .4byte 0x13f .byte 0 .uleb128 0x60 .4byte .LASF3169 .byte 0x1 - .2byte 0x108 + .2byte 0x107 .4byte 0x11f .byte 0x3 - .4byte 0x1563e + .4byte 0x1582f .uleb128 0x62 .4byte .LASF2826 .byte 0x1 - .2byte 0x108 + .2byte 0x107 .4byte 0xbfee .uleb128 0x62 .4byte .LASF3118 .byte 0x1 - .2byte 0x108 + .2byte 0x107 .4byte 0x13f .uleb128 0x62 .4byte .LASF3119 .byte 0x1 - .2byte 0x108 + .2byte 0x107 .4byte 0x13f .byte 0 .uleb128 0x73 @@ -54680,7 +54945,7 @@ .byte 0xa .byte 0x4a .byte 0x3 - .4byte 0x15661 + .4byte 0x15852 .uleb128 0x74 .4byte .LASF2906 .byte 0xa @@ -54697,7 +54962,7 @@ .byte 0xa .byte 0x3b .byte 0x3 - .4byte 0x1568f + .4byte 0x15880 .uleb128 0x74 .4byte .LASF2906 .byte 0xa @@ -54719,7 +54984,7 @@ .byte 0xa .byte 0x35 .byte 0x3 - .4byte 0x156d3 + .4byte 0x158c4 .uleb128 0x74 .4byte .LASF2906 .byte 0xa @@ -54751,7 +55016,7 @@ .byte 0xa .byte 0x30 .byte 0x3 - .4byte 0x156eb + .4byte 0x158dc .uleb128 0x74 .4byte .LASF2906 .byte 0xa @@ -54764,14 +55029,14 @@ .byte 0x2b .4byte 0xc6 .byte 0x3 - .4byte 0x15712 + .4byte 0x15903 .uleb128 0x74 .4byte .LASF2906 .byte 0xa .byte 0x2b .4byte 0xe0a4 .uleb128 0x74 - .4byte .LASF2993 + .4byte .LASF2992 .byte 0xa .byte 0x2b .4byte 0xe0e4 @@ -54781,7 +55046,7 @@ .byte 0x9 .2byte 0x1ab .byte 0x3 - .4byte 0x1575c + .4byte 0x1594d .uleb128 0x61 .string "dev" .byte 0x9 @@ -54814,7 +55079,7 @@ .2byte 0x108 .4byte 0xb6df .byte 0x3 - .4byte 0x1577a + .4byte 0x1596b .uleb128 0x61 .string "dev" .byte 0x9 @@ -54827,7 +55092,7 @@ .byte 0x1d .4byte 0xb6df .byte 0x3 - .4byte 0x15796 + .4byte 0x15987 .uleb128 0x76 .string "bus" .byte 0xc7 @@ -54840,7 +55105,7 @@ .byte 0xd1 .4byte 0xc6 .byte 0x3 - .4byte 0x157b2 + .4byte 0x159a3 .uleb128 0x74 .4byte .LASF3185 .byte 0x9 @@ -54852,7 +55117,7 @@ .byte 0xca .byte 0xa3 .byte 0x3 - .4byte 0x157eb + .4byte 0x159dc .uleb128 0x76 .string "dev" .byte 0xca @@ -54880,7 +55145,7 @@ .byte 0x35 .4byte 0xc6 .byte 0x3 - .4byte 0x15807 + .4byte 0x159f8 .uleb128 0x74 .4byte .LASF2907 .byte 0x3 @@ -54893,7 +55158,7 @@ .byte 0x30 .4byte 0xc6 .byte 0x3 - .4byte 0x1582c + .4byte 0x15a1d .uleb128 0x74 .4byte .LASF2907 .byte 0x3 @@ -54910,7 +55175,7 @@ .byte 0x3 .byte 0x2b .byte 0x3 - .4byte 0x15844 + .4byte 0x15a35 .uleb128 0x74 .4byte .LASF2907 .byte 0x3 @@ -54922,7 +55187,7 @@ .byte 0x3 .byte 0x26 .byte 0x3 - .4byte 0x1585c + .4byte 0x15a4d .uleb128 0x74 .4byte .LASF2907 .byte 0x3 @@ -54934,7 +55199,7 @@ .byte 0x3 .byte 0x21 .byte 0x3 - .4byte 0x15874 + .4byte 0x15a65 .uleb128 0x74 .4byte .LASF2907 .byte 0x3 @@ -54946,7 +55211,7 @@ .byte 0x3 .byte 0x1c .byte 0x3 - .4byte 0x1588c + .4byte 0x15a7d .uleb128 0x74 .4byte .LASF2907 .byte 0x3 @@ -54958,12 +55223,12 @@ .byte 0xb .byte 0x42 .byte 0x3 - .4byte 0x158a4 + .4byte 0x15a95 .uleb128 0x74 .4byte .LASF116 .byte 0xb .byte 0x42 - .4byte 0x158a4 + .4byte 0x15a95 .byte 0 .uleb128 0x7 .byte 0x8 @@ -54973,24 +55238,24 @@ .byte 0xb .byte 0x38 .byte 0x3 - .4byte 0x158c2 + .4byte 0x15ab3 .uleb128 0x74 .4byte .LASF116 .byte 0xb .byte 0x38 - .4byte 0x158a4 + .4byte 0x15a95 .byte 0 .uleb128 0x73 .4byte .LASF3196 .byte 0xb .byte 0x24 .byte 0x3 - .4byte 0x158fa + .4byte 0x15aeb .uleb128 0x74 .4byte .LASF116 .byte 0xb .byte 0x24 - .4byte 0x158a4 + .4byte 0x15a95 .uleb128 0x74 .4byte .LASF193 .byte 0xb @@ -55009,98 +55274,98 @@ .byte 0 .uleb128 0x75 .4byte .LASF3197 - .byte 0x7 + .byte 0x8 .byte 0x98 .4byte 0x29 .byte 0x3 - .4byte 0x15929 + .4byte 0x15b1a .uleb128 0x76 .string "to" - .byte 0x7 + .byte 0x8 .byte 0x98 .4byte 0x458 .uleb128 0x74 .4byte .LASF1973 - .byte 0x7 + .byte 0x8 .byte 0x98 .4byte 0x30b6 .uleb128 0x76 .string "n" - .byte 0x7 + .byte 0x8 .byte 0x98 .4byte 0x29 .byte 0 .uleb128 0x75 .4byte .LASF3198 - .byte 0x7 + .byte 0x8 .byte 0x90 .4byte 0x29 .byte 0x3 - .4byte 0x15958 + .4byte 0x15b49 .uleb128 0x76 .string "to" - .byte 0x7 + .byte 0x8 .byte 0x90 .4byte 0x458 .uleb128 0x74 .4byte .LASF1973 - .byte 0x7 + .byte 0x8 .byte 0x90 .4byte 0x30b6 .uleb128 0x76 .string "n" - .byte 0x7 + .byte 0x8 .byte 0x90 .4byte 0x29 .byte 0 .uleb128 0x75 .4byte .LASF3199 - .byte 0x7 + .byte 0x8 .byte 0x81 .4byte 0x29 .byte 0x3 - .4byte 0x15987 + .4byte 0x15b78 .uleb128 0x76 .string "to" - .byte 0x7 + .byte 0x8 .byte 0x81 .4byte 0x458 .uleb128 0x74 .4byte .LASF1973 - .byte 0x7 + .byte 0x8 .byte 0x81 .4byte 0x30b6 .uleb128 0x76 .string "n" - .byte 0x7 + .byte 0x8 .byte 0x81 .4byte 0x29 .byte 0 .uleb128 0x75 .4byte .LASF3200 - .byte 0x7 + .byte 0x8 .byte 0x6e .4byte 0x29 .byte 0x3 - .4byte 0x159c1 + .4byte 0x15bb2 .uleb128 0x76 .string "to" - .byte 0x7 + .byte 0x8 .byte 0x6e .4byte 0x458 .uleb128 0x74 .4byte .LASF1973 - .byte 0x7 + .byte 0x8 .byte 0x6e .4byte 0x30b6 .uleb128 0x76 .string "n" - .byte 0x7 + .byte 0x8 .byte 0x6e .4byte 0x29 .uleb128 0x77 .string "res" - .byte 0x7 + .byte 0x8 .byte 0x70 .4byte 0x29 .byte 0 @@ -55110,7 +55375,7 @@ .byte 0xf5 .4byte 0x458 .byte 0x3 - .4byte 0x159f5 + .4byte 0x15be6 .uleb128 0x76 .string "ptr" .byte 0x5 @@ -55135,7 +55400,7 @@ .byte 0x4b .4byte 0x29 .byte 0x3 - .4byte 0x15a3f + .4byte 0x15c30 .uleb128 0x74 .4byte .LASF1118 .byte 0x5 @@ -55170,7 +55435,7 @@ .2byte 0x2e5 .4byte 0x458 .byte 0x3 - .4byte 0x15a69 + .4byte 0x15c5a .uleb128 0x62 .4byte .LASF957 .byte 0x10 @@ -55188,7 +55453,7 @@ .2byte 0x216 .4byte 0x458 .byte 0x3 - .4byte 0x15aa1 + .4byte 0x15c92 .uleb128 0x62 .4byte .LASF957 .byte 0x10 @@ -55213,7 +55478,7 @@ .2byte 0x1dd .4byte 0x458 .byte 0x3 - .4byte 0x15ad7 + .4byte 0x15cc8 .uleb128 0x62 .4byte .LASF957 .byte 0x10 @@ -55236,7 +55501,7 @@ .2byte 0x159 .4byte 0x6d .byte 0x3 - .4byte 0x15af5 + .4byte 0x15ce6 .uleb128 0x62 .4byte .LASF957 .byte 0x10 @@ -55249,7 +55514,7 @@ .2byte 0x13d .4byte 0xd6c9 .byte 0x3 - .4byte 0x15b13 + .4byte 0x15d04 .uleb128 0x62 .4byte .LASF171 .byte 0x10 @@ -55259,32 +55524,32 @@ .uleb128 0x73 .4byte .LASF3212 .byte 0xbd - .byte 0xdb + .byte 0xde .byte 0x3 - .4byte 0x15b36 + .4byte 0x15d27 .uleb128 0x74 - .4byte .LASF3027 + .4byte .LASF3026 .byte 0xbd - .byte 0xdb + .byte 0xde .4byte 0xd640 .uleb128 0x74 .4byte .LASF793 .byte 0xbd - .byte 0xdc + .byte 0xdf .4byte 0x458 .byte 0 .uleb128 0x75 .4byte .LASF3213 .byte 0xbd - .byte 0xd6 + .byte 0xd9 .4byte 0x458 .byte 0x3 - .4byte 0x15b52 + .4byte 0x15d43 .uleb128 0x74 - .4byte .LASF3027 + .4byte .LASF3026 .byte 0xbd - .byte 0xd6 - .4byte 0x15b52 + .byte 0xd9 + .4byte 0x15d43 .byte 0 .uleb128 0x7 .byte 0x8 @@ -55295,12 +55560,12 @@ .2byte 0x164 .4byte 0x458 .byte 0x3 - .4byte 0x15b76 + .4byte 0x15d67 .uleb128 0x61 .string "dev" .byte 0xa1 .2byte 0x164 - .4byte 0x15b76 + .4byte 0x15d67 .byte 0 .uleb128 0x7 .byte 0x8 @@ -55311,7 +55576,7 @@ .2byte 0x498 .4byte 0xc6 .byte 0x3 - .4byte 0x15bb1 + .4byte 0x15da2 .uleb128 0x61 .string "np" .byte 0xd @@ -55334,7 +55599,7 @@ .2byte 0x1ef .4byte 0xc6 .byte 0x3 - .4byte 0x15bfd + .4byte 0x15dee .uleb128 0x61 .string "np" .byte 0xd @@ -55366,7 +55631,7 @@ .byte 0xd .byte 0x83 .byte 0x3 - .4byte 0x15c15 + .4byte 0x15e06 .uleb128 0x74 .4byte .LASF838 .byte 0xd @@ -55378,7 +55643,7 @@ .byte 0x2 .2byte 0x4a0 .byte 0x3 - .4byte 0x15c3b + .4byte 0x15e2c .uleb128 0x61 .string "dev" .byte 0x2 @@ -55396,7 +55661,7 @@ .2byte 0x49b .4byte 0x458 .byte 0x3 - .4byte 0x15c59 + .4byte 0x15e4a .uleb128 0x61 .string "dev" .byte 0x2 @@ -55409,7 +55674,7 @@ .2byte 0x2c5 .4byte 0x458 .byte 0x3 - .4byte 0x15c8f + .4byte 0x15e80 .uleb128 0x61 .string "dev" .byte 0x2 @@ -55432,7 +55697,7 @@ .byte 0xca .4byte 0x351 .byte 0x3 - .4byte 0x15cab + .4byte 0x15e9c .uleb128 0x76 .string "res" .byte 0xe @@ -55445,7 +55710,7 @@ .byte 0x22 .4byte 0x2b0 .byte 0x3 - .4byte 0x15cc7 + .4byte 0x15eb8 .uleb128 0x76 .string "ptr" .byte 0xcb @@ -55458,7 +55723,7 @@ .byte 0x1d .4byte 0xc6 .byte 0x3 - .4byte 0x15ce3 + .4byte 0x15ed4 .uleb128 0x74 .4byte .LASF957 .byte 0xcc @@ -55471,7 +55736,7 @@ .2byte 0x169 .4byte 0x29 .byte 0x3 - .4byte 0x15cff + .4byte 0x15ef0 .uleb128 0x61 .string "m" .byte 0x11 @@ -55484,7 +55749,7 @@ .2byte 0x148 .4byte 0x29 .byte 0x3 - .4byte 0x15d1b + .4byte 0x15f0c .uleb128 0x61 .string "m" .byte 0x11 @@ -55497,7 +55762,7 @@ .byte 0x97 .4byte 0x2b0 .byte 0x3 - .4byte 0x15d57 + .4byte 0x15f48 .uleb128 0x74 .4byte .LASF1118 .byte 0xc9 @@ -55524,7 +55789,7 @@ .byte 0xc9 .byte 0x91 .byte 0x3 - .4byte 0x15d87 + .4byte 0x15f78 .uleb128 0x74 .4byte .LASF957 .byte 0xc9 @@ -55548,7 +55813,7 @@ .byte 0xc9 .byte 0x80 .byte 0x3 - .4byte 0x15db3 + .4byte 0x15fa4 .uleb128 0x76 .string "ptr" .byte 0xc9 @@ -55571,12 +55836,12 @@ .byte 0x5f .4byte 0xc6 .byte 0x3 - .4byte 0x15dd9 + .4byte 0x15fca .uleb128 0x76 .string "ti" .byte 0xc9 .byte 0x5f - .4byte 0x15dd9 + .4byte 0x15fca .uleb128 0x74 .4byte .LASF3237 .byte 0xc9 @@ -55592,7 +55857,7 @@ .byte 0xf .4byte 0x2eff .byte 0x3 - .4byte 0x15dfb + .4byte 0x15fec .uleb128 0x78 .4byte .LASF3239 .byte 0x4 @@ -55610,7 +55875,7 @@ .byte 0x22 .4byte 0xc6 .byte 0x3 - .4byte 0x15e1e + .4byte 0x1600f .uleb128 0x76 .string "n" .byte 0xcd @@ -55619,24 +55884,24 @@ .byte 0 .uleb128 0x75 .4byte .LASF3241 - .byte 0x6 + .byte 0x7 .byte 0x9a .4byte 0xe2 .byte 0x3 - .4byte 0x15e50 + .4byte 0x16041 .uleb128 0x74 .4byte .LASF2424 - .byte 0x6 + .byte 0x7 .byte 0x9a .4byte 0xf4 .uleb128 0x74 .4byte .LASF850 - .byte 0x6 + .byte 0x7 .byte 0x9a .4byte 0xc6 .uleb128 0x78 .4byte .LASF261 - .byte 0x6 + .byte 0x7 .byte 0x9c .4byte 0x8b .byte 0 @@ -55646,7 +55911,7 @@ .byte 0x50 .4byte 0xd2 .byte 0x3 - .4byte 0x15e6a + .4byte 0x1605b .uleb128 0x76 .string "p" .byte 0xce @@ -55659,12 +55924,12 @@ .byte 0xb8 .4byte 0xd2 .byte 0x3 - .4byte 0x15e84 + .4byte 0x16075 .uleb128 0x76 .string "p" .byte 0xcf .byte 0xb8 - .4byte 0x15e84 + .4byte 0x16075 .byte 0 .uleb128 0x7 .byte 0x8 @@ -55675,7 +55940,7 @@ .byte 0x39 .4byte 0xd2 .byte 0x3 - .4byte 0x15ea6 + .4byte 0x16097 .uleb128 0x76 .string "val" .byte 0xcf @@ -55684,21 +55949,21 @@ .byte 0 .uleb128 0x75 .4byte .LASF3245 - .byte 0x8 + .byte 0x6 .byte 0x68 .4byte 0xc6 .byte 0x3 - .4byte 0x15ecc + .4byte 0x160bd .uleb128 0x76 .string "nr" - .byte 0x8 + .byte 0x6 .byte 0x68 .4byte 0xc6 .uleb128 0x74 .4byte .LASF1118 - .byte 0x8 + .byte 0x6 .byte 0x68 - .4byte 0x15ecc + .4byte 0x160bd .byte 0 .uleb128 0x7 .byte 0x8 @@ -55708,7 +55973,7 @@ .byte 0xf .byte 0x2f .byte 0x3 - .4byte 0x15f05 + .4byte 0x160f6 .uleb128 0x76 .string "i" .byte 0xf @@ -55718,7 +55983,7 @@ .string "v" .byte 0xf .byte 0x2f - .4byte 0x15f05 + .4byte 0x160f6 .uleb128 0x77 .string "w0" .byte 0xf @@ -55728,7 +55993,7 @@ .string "x1" .byte 0xf .byte 0x2f - .4byte 0x15f05 + .4byte 0x160f6 .byte 0 .uleb128 0x7 .byte 0x8 @@ -55739,7 +56004,7 @@ .byte 0x1b .4byte 0xc6 .byte 0x3 - .4byte 0x15f25 + .4byte 0x16116 .uleb128 0x76 .string "x" .byte 0xd0 @@ -55752,7 +56017,7 @@ .byte 0xb .4byte 0x29 .byte 0x3 - .4byte 0x15f41 + .4byte 0x16132 .uleb128 0x74 .4byte .LASF2457 .byte 0xd1 @@ -55764,12 +56029,12 @@ .byte 0xd2 .byte 0xb .byte 0x3 - .4byte 0x15f62 + .4byte 0x16153 .uleb128 0x76 .string "p" .byte 0xd2 .byte 0xb - .4byte 0x15f62 + .4byte 0x16153 .uleb128 0x74 .4byte .LASF957 .byte 0xd2 @@ -55778,21 +56043,21 @@ .byte 0 .uleb128 0x7 .byte 0x8 - .4byte 0x15f69 + .4byte 0x1615a .uleb128 0x7a .uleb128 0x3 - .4byte 0x15f68 + .4byte 0x16159 .uleb128 0x73 .4byte .LASF3250 .byte 0xd2 .byte 0x9 .byte 0x3 - .4byte 0x15f8f + .4byte 0x16180 .uleb128 0x76 .string "p" .byte 0xd2 .byte 0x9 - .4byte 0x15f62 + .4byte 0x16153 .uleb128 0x74 .4byte .LASF957 .byte 0xd2 @@ -55804,12 +56069,12 @@ .byte 0xc .2byte 0x11c .byte 0x3 - .4byte 0x15fbf + .4byte 0x161b0 .uleb128 0x61 .string "p" .byte 0xc .2byte 0x11c - .4byte 0x15fbf + .4byte 0x161b0 .uleb128 0x61 .string "res" .byte 0xc @@ -55823,879 +56088,879 @@ .byte 0 .uleb128 0x7 .byte 0x8 - .4byte 0x15f68 + .4byte 0x16159 .uleb128 0x7b - .4byte 0x1051a + .4byte 0x1050c .8byte .LFB2853 .8byte .LFE2853-.LFB2853 .uleb128 0x1 .byte 0x9c - .4byte 0x15ff1 - .uleb128 0x6a - .4byte 0x1052b + .4byte 0x161e2 + .uleb128 0x6b + .4byte 0x1051d .4byte .LLST22 .uleb128 0x7c - .4byte 0x10537 + .4byte 0x10529 .uleb128 0x1 .byte 0x51 .byte 0 .uleb128 0x7b - .4byte 0x14164 + .4byte 0x14355 .8byte .LFB2875 .8byte .LFE2875-.LFB2875 .uleb128 0x1 .byte 0x9c - .4byte 0x1611e - .uleb128 0x6a - .4byte 0x14171 - .4byte .LLST216 + .4byte 0x1630f + .uleb128 0x6b + .4byte 0x14362 + .4byte .LLST224 .uleb128 0x7c - .4byte 0x1417d + .4byte 0x1436e .uleb128 0x1 .byte 0x51 .uleb128 0x7c - .4byte 0x14189 + .4byte 0x1437a .uleb128 0x1 .byte 0x52 .uleb128 0x7c - .4byte 0x14195 + .4byte 0x14386 .uleb128 0x1 .byte 0x53 .uleb128 0x7c - .4byte 0x141ad + .4byte 0x1439e .uleb128 0x1 .byte 0x54 .uleb128 0x51 + .4byte 0x14392 + .uleb128 0x54 + .4byte 0x143aa + .uleb128 0x5e + .4byte 0x143b6 + .uleb128 0x1 + .byte 0x65 + .uleb128 0x5d + .4byte 0x143c0 + .4byte .LLST225 + .uleb128 0x5d + .4byte 0x143ca + .4byte .LLST226 + .uleb128 0x5d + .4byte 0x143d6 + .4byte .LLST227 + .uleb128 0x5d + .4byte 0x143e2 + .4byte .LLST228 + .uleb128 0x5d + .4byte 0x143ee + .4byte .LLST229 + .uleb128 0x54 + .4byte 0x143fa + .uleb128 0x54 + .4byte 0x14406 + .uleb128 0x5d + .4byte 0x14412 + .4byte .LLST230 + .uleb128 0x54 + .4byte 0x1441e + .uleb128 0x5d + .4byte 0x1442a + .4byte .LLST231 + .uleb128 0x54 + .4byte 0x14436 + .uleb128 0x54 + .4byte 0x14442 + .uleb128 0x5d + .4byte 0x1444e + .4byte .LLST232 + .uleb128 0x5d + .4byte 0x1445a + .4byte .LLST233 + .uleb128 0x5d + .4byte 0x14466 + .4byte .LLST234 + .uleb128 0x5d + .4byte 0x14472 + .4byte .LLST235 + .uleb128 0x5c + .4byte 0x1447f + .8byte .LBB1548 + .4byte .Ldebug_ranges0+0xeb0 + .byte 0x1 + .2byte 0x412 + .uleb128 0x51 + .4byte 0x144cc + .uleb128 0x51 + .4byte 0x144c0 + .uleb128 0x51 + .4byte 0x144b4 + .uleb128 0x51 + .4byte 0x144a8 + .uleb128 0x51 + .4byte 0x1449c + .uleb128 0x51 + .4byte 0x14490 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xeb0 + .uleb128 0x54 + .4byte 0x144d8 + .uleb128 0x54 + .4byte 0x144e4 + .uleb128 0x54 + .4byte 0x144f0 + .uleb128 0x5d + .4byte 0x144fc + .4byte .LLST236 + .uleb128 0x5d + .4byte 0x14508 + .4byte .LLST237 + .uleb128 0x54 + .4byte 0x14514 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x7b + .4byte 0x14148 + .8byte .LFB2876 + .8byte .LFE2876-.LFB2876 + .uleb128 0x1 + .byte 0x9c + .4byte 0x16383 + .uleb128 0x7c + .4byte 0x14165 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x7c + .4byte 0x14171 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x6b + .4byte 0x14189 + .4byte .LLST238 + .uleb128 0x51 + .4byte 0x1417d + .uleb128 0x51 + .4byte 0x1417d + .uleb128 0x51 + .4byte 0x14159 + .uleb128 0x54 + .4byte 0x14195 + .uleb128 0x54 .4byte 0x141a1 + .uleb128 0x54 + .4byte 0x141ad .uleb128 0x54 .4byte 0x141b9 .uleb128 0x5e .4byte 0x141c5 .uleb128 0x1 - .byte 0x65 - .uleb128 0x5d - .4byte 0x141cf - .4byte .LLST217 - .uleb128 0x5d - .4byte 0x141d9 - .4byte .LLST218 - .uleb128 0x5d - .4byte 0x141e5 - .4byte .LLST219 - .uleb128 0x5d - .4byte 0x141f1 - .4byte .LLST220 - .uleb128 0x5d - .4byte 0x141fd - .4byte .LLST221 - .uleb128 0x54 - .4byte 0x14209 - .uleb128 0x54 - .4byte 0x14215 - .uleb128 0x5d - .4byte 0x14221 - .4byte .LLST222 - .uleb128 0x54 - .4byte 0x1422d - .uleb128 0x5d - .4byte 0x14239 - .4byte .LLST223 - .uleb128 0x54 - .4byte 0x14245 - .uleb128 0x54 - .4byte 0x14251 - .uleb128 0x5d - .4byte 0x1425d - .4byte .LLST224 - .uleb128 0x5d - .4byte 0x14269 - .4byte .LLST225 - .uleb128 0x5d - .4byte 0x14275 - .4byte .LLST226 - .uleb128 0x5d - .4byte 0x14281 - .4byte .LLST227 - .uleb128 0x5c - .4byte 0x1428e - .8byte .LBB1486 - .4byte .Ldebug_ranges0+0xde0 - .byte 0x1 - .2byte 0x413 - .uleb128 0x51 - .4byte 0x142db - .uleb128 0x51 - .4byte 0x142cf - .uleb128 0x51 - .4byte 0x142c3 - .uleb128 0x51 - .4byte 0x142b7 - .uleb128 0x51 - .4byte 0x142ab - .uleb128 0x51 - .4byte 0x1429f - .uleb128 0x5b - .4byte .Ldebug_ranges0+0xde0 - .uleb128 0x54 - .4byte 0x142e7 - .uleb128 0x54 - .4byte 0x142f3 - .uleb128 0x54 - .4byte 0x142ff - .uleb128 0x5d - .4byte 0x1430b - .4byte .LLST228 - .uleb128 0x5d - .4byte 0x14317 - .4byte .LLST229 - .uleb128 0x54 - .4byte 0x14323 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x7b - .4byte 0x13f57 - .8byte .LFB2876 - .8byte .LFE2876-.LFB2876 - .uleb128 0x1 - .byte 0x9c - .4byte 0x16192 - .uleb128 0x7c - .4byte 0x13f74 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x7c - .4byte 0x13f80 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x6a - .4byte 0x13f98 - .4byte .LLST230 - .uleb128 0x51 - .4byte 0x13f8c - .uleb128 0x51 - .4byte 0x13f8c - .uleb128 0x51 - .4byte 0x13f68 - .uleb128 0x54 - .4byte 0x13fa4 - .uleb128 0x54 - .4byte 0x13fb0 - .uleb128 0x54 - .4byte 0x13fbc - .uleb128 0x54 - .4byte 0x13fc8 - .uleb128 0x5e - .4byte 0x13fd4 - .uleb128 0x1 .byte 0x57 .uleb128 0x5d - .4byte 0x13fe0 - .4byte .LLST231 + .4byte 0x141d1 + .4byte .LLST239 .uleb128 0x54 - .4byte 0x13fec + .4byte 0x141dd .uleb128 0x5d - .4byte 0x13ff8 - .4byte .LLST232 + .4byte 0x141e9 + .4byte .LLST240 .byte 0 .uleb128 0x7b - .4byte 0x13d6b + .4byte 0x13f5c .8byte .LFB2877 .8byte .LFE2877-.LFB2877 .uleb128 0x1 .byte 0x9c - .4byte 0x16251 - .uleb128 0x6a - .4byte 0x13d78 - .4byte .LLST244 + .4byte 0x16442 + .uleb128 0x6b + .4byte 0x13f69 + .4byte .LLST252 .uleb128 0x7c - .4byte 0x13d84 + .4byte 0x13f75 .uleb128 0x1 .byte 0x51 .uleb128 0x7c - .4byte 0x13d90 + .4byte 0x13f81 .uleb128 0x1 .byte 0x52 - .uleb128 0x6a - .4byte 0x13da8 - .4byte .LLST245 + .uleb128 0x6b + .4byte 0x13f99 + .4byte .LLST253 .uleb128 0x51 - .4byte 0x13d9c + .4byte 0x13f8d .uleb128 0x51 - .4byte 0x13d9c + .4byte 0x13f8d .uleb128 0x51 - .4byte 0x13d9c + .4byte 0x13f8d .uleb128 0x54 - .4byte 0x13db4 + .4byte 0x13fa5 .uleb128 0x5d - .4byte 0x13dc0 - .4byte .LLST246 + .4byte 0x13fb1 + .4byte .LLST254 .uleb128 0x54 - .4byte 0x13dca + .4byte 0x13fbb .uleb128 0x5d - .4byte 0x13dd4 - .4byte .LLST247 + .4byte 0x13fc5 + .4byte .LLST255 .uleb128 0x54 - .4byte 0x13de0 + .4byte 0x13fd1 .uleb128 0x5d - .4byte 0x13dec - .4byte .LLST248 + .4byte 0x13fdd + .4byte .LLST256 .uleb128 0x5d - .4byte 0x13df8 - .4byte .LLST249 + .4byte 0x13fe9 + .4byte .LLST257 .uleb128 0x5d - .4byte 0x13e04 - .4byte .LLST250 + .4byte 0x13ff5 + .4byte .LLST258 .uleb128 0x5e - .4byte 0x13e10 + .4byte 0x14001 .uleb128 0x1 .byte 0x55 .uleb128 0x5d - .4byte 0x13e1c - .4byte .LLST251 + .4byte 0x1400d + .4byte .LLST259 .uleb128 0x5a - .4byte 0x15608 - .8byte .LBB1494 - .8byte .LBE1494-.LBB1494 + .4byte 0x157f9 + .8byte .LBB1556 + .8byte .LBE1556-.LBB1556 .byte 0x1 - .2byte 0x59a + .2byte 0x599 .uleb128 0x51 - .4byte 0x15631 + .4byte 0x15822 .uleb128 0x51 - .4byte 0x15625 + .4byte 0x15816 .uleb128 0x51 - .4byte 0x15619 + .4byte 0x1580a .byte 0 .byte 0 .uleb128 0x7b - .4byte 0x13be3 + .4byte 0x13dd4 .8byte .LFB2878 .8byte .LFE2878-.LFB2878 .uleb128 0x1 .byte 0x9c - .4byte 0x1633b + .4byte 0x1652c .uleb128 0x7c - .4byte 0x13bf0 + .4byte 0x13de1 .uleb128 0x1 .byte 0x50 .uleb128 0x7c - .4byte 0x13bfc + .4byte 0x13ded .uleb128 0x1 .byte 0x51 .uleb128 0x7c - .4byte 0x13c08 + .4byte 0x13df9 .uleb128 0x1 .byte 0x52 - .uleb128 0x6a - .4byte 0x13c20 - .4byte .LLST252 + .uleb128 0x6b + .4byte 0x13e11 + .4byte .LLST260 .uleb128 0x51 - .4byte 0x13c14 + .4byte 0x13e05 .uleb128 0x51 - .4byte 0x13c14 + .4byte 0x13e05 .uleb128 0x51 - .4byte 0x13c14 + .4byte 0x13e05 .uleb128 0x54 - .4byte 0x13c2c + .4byte 0x13e1d .uleb128 0x5d - .4byte 0x13c38 - .4byte .LLST253 + .4byte 0x13e29 + .4byte .LLST261 .uleb128 0x54 - .4byte 0x13c42 + .4byte 0x13e33 .uleb128 0x5d - .4byte 0x13c4c - .4byte .LLST254 + .4byte 0x13e3d + .4byte .LLST262 .uleb128 0x54 - .4byte 0x13c58 + .4byte 0x13e49 .uleb128 0x54 - .4byte 0x13c64 + .4byte 0x13e55 .uleb128 0x54 - .4byte 0x13c70 + .4byte 0x13e61 .uleb128 0x5d - .4byte 0x13c7c - .4byte .LLST255 + .4byte 0x13e6d + .4byte .LLST263 .uleb128 0x5e - .4byte 0x13c88 + .4byte 0x13e79 .uleb128 0x1 .byte 0x55 .uleb128 0x5d - .4byte 0x13c94 - .4byte .LLST256 + .4byte 0x13e85 + .4byte .LLST264 .uleb128 0x5d - .4byte 0x13ca0 - .4byte .LLST257 + .4byte 0x13e91 + .4byte .LLST265 .uleb128 0x50 - .4byte 0x155d2 - .8byte .LBB1496 - .8byte .LBE1496-.LBB1496 + .4byte 0x157c3 + .8byte .LBB1558 + .8byte .LBE1558-.LBB1558 .byte 0x1 - .2byte 0x5ec - .4byte 0x16312 + .2byte 0x5eb + .4byte 0x16503 .uleb128 0x51 - .4byte 0x155fb + .4byte 0x157ec .uleb128 0x51 - .4byte 0x155ef + .4byte 0x157e0 .uleb128 0x51 - .4byte 0x155e3 + .4byte 0x157d4 .byte 0 .uleb128 0x5a - .4byte 0x1559c - .8byte .LBB1498 - .8byte .LBE1498-.LBB1498 + .4byte 0x1578d + .8byte .LBB1560 + .8byte .LBE1560-.LBB1560 .byte 0x1 - .2byte 0x5f1 + .2byte 0x5f0 .uleb128 0x51 - .4byte 0x155c5 + .4byte 0x157b6 .uleb128 0x51 - .4byte 0x155b9 + .4byte 0x157aa .uleb128 0x51 - .4byte 0x155ad + .4byte 0x1579e .byte 0 .byte 0 .uleb128 0x7d - .4byte 0x13ae1 + .4byte 0x13cd2 .8byte .LFB2879 .8byte .LFE2879-.LFB2879 .uleb128 0x1 .byte 0x9c - .4byte 0x1643d - .uleb128 0x6a - .4byte 0x13aee - .4byte .LLST258 + .4byte 0x1662e + .uleb128 0x6b + .4byte 0x13cdf + .4byte .LLST266 .uleb128 0x51 - .4byte 0x13afa + .4byte 0x13ceb .uleb128 0x54 - .4byte 0x13b06 + .4byte 0x13cf7 .uleb128 0x58 - .4byte 0x15712 - .8byte .LBB1500 - .4byte .Ldebug_ranges0+0xe30 + .4byte 0x15903 + .8byte .LBB1562 + .4byte .Ldebug_ranges0+0xf00 .byte 0x1 - .2byte 0x629 - .4byte 0x163bb + .2byte 0x628 + .4byte 0x165ac .uleb128 0x51 - .4byte 0x15743 + .4byte 0x15934 .uleb128 0x51 - .4byte 0x15737 + .4byte 0x15928 .uleb128 0x51 - .4byte 0x1572b + .4byte 0x1591c .uleb128 0x51 - .4byte 0x1571f + .4byte 0x15910 .uleb128 0x5b - .4byte .Ldebug_ranges0+0xe30 + .4byte .Ldebug_ranges0+0xf00 .uleb128 0x54 - .4byte 0x1574f + .4byte 0x15940 .uleb128 0x5c - .4byte 0x1575c - .8byte .LBB1502 - .4byte .Ldebug_ranges0+0xe80 + .4byte 0x1594d + .8byte .LBB1564 + .4byte .Ldebug_ranges0+0xf50 .byte 0x9 .2byte 0x1af .uleb128 0x51 - .4byte 0x1576d + .4byte 0x1595e .byte 0 .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x1568f - .8byte .LBB1511 - .4byte .Ldebug_ranges0+0xeb0 + .4byte 0x15880 + .8byte .LBB1573 + .4byte .Ldebug_ranges0+0xf80 .byte 0x1 - .2byte 0x62a - .4byte 0x163ed + .2byte 0x629 + .4byte 0x165de .uleb128 0x51 - .4byte 0x156c7 + .4byte 0x158b8 .uleb128 0x51 - .4byte 0x156bc + .4byte 0x158ad .uleb128 0x51 - .4byte 0x156b1 + .4byte 0x158a2 .uleb128 0x51 - .4byte 0x156a6 + .4byte 0x15897 .uleb128 0x51 - .4byte 0x1569b + .4byte 0x1588c .byte 0 .uleb128 0x50 - .4byte 0x15661 - .8byte .LBB1517 - .8byte .LBE1517-.LBB1517 + .4byte 0x15852 + .8byte .LBB1579 + .8byte .LBE1579-.LBB1579 .byte 0x1 - .2byte 0x62b - .4byte 0x16419 + .2byte 0x62a + .4byte 0x1660a .uleb128 0x51 - .4byte 0x15683 + .4byte 0x15874 .uleb128 0x51 - .4byte 0x15678 + .4byte 0x15869 .uleb128 0x51 - .4byte 0x1566d + .4byte 0x1585e .byte 0 .uleb128 0x5a - .4byte 0x1563e - .8byte .LBB1519 - .8byte .LBE1519-.LBB1519 + .4byte 0x1582f + .8byte .LBB1581 + .8byte .LBE1581-.LBB1581 .byte 0x1 - .2byte 0x62c + .2byte 0x62b .uleb128 0x51 - .4byte 0x15655 + .4byte 0x15846 .uleb128 0x51 - .4byte 0x1564a + .4byte 0x1583b .byte 0 .byte 0 .uleb128 0x7d - .4byte 0x1547c + .4byte 0x1566d .8byte .LFB2882 .8byte .LFE2882-.LFB2882 .uleb128 0x1 .byte 0x9c - .4byte 0x164fd - .uleb128 0x6a - .4byte 0x1548d - .4byte .LLST259 - .uleb128 0x6a - .4byte 0x15499 - .4byte .LLST260 + .4byte 0x166ee + .uleb128 0x6b + .4byte 0x1567e + .4byte .LLST267 + .uleb128 0x6b + .4byte 0x1568a + .4byte .LLST268 .uleb128 0x54 - .4byte 0x154a5 + .4byte 0x15696 .uleb128 0x50 - .4byte 0x156d3 - .8byte .LBB1522 - .8byte .LBE1522-.LBB1522 + .4byte 0x158c4 + .8byte .LBB1584 + .8byte .LBE1584-.LBB1584 + .byte 0x1 + .2byte 0x197 + .4byte 0x16682 + .uleb128 0x51 + .4byte 0x158d0 + .byte 0 + .uleb128 0x50 + .4byte 0x15a4d + .8byte .LBB1586 + .8byte .LBE1586-.LBB1586 .byte 0x1 .2byte 0x198 - .4byte 0x16491 + .4byte 0x166a4 .uleb128 0x51 - .4byte 0x156df + .4byte 0x15a59 .byte 0 .uleb128 0x50 - .4byte 0x1585c - .8byte .LBB1524 - .8byte .LBE1524-.LBB1524 + .4byte 0x15a7d + .8byte .LBB1588 + .8byte .LBE1588-.LBB1588 .byte 0x1 - .2byte 0x199 - .4byte 0x164b3 + .2byte 0x19b + .4byte 0x166d3 .uleb128 0x51 - .4byte 0x15868 - .byte 0 - .uleb128 0x50 - .4byte 0x1588c - .8byte .LBB1526 - .8byte .LBE1526-.LBB1526 - .byte 0x1 - .2byte 0x19c - .4byte 0x164e2 - .uleb128 0x51 - .4byte 0x15898 - .uleb128 0x4b - .8byte .LVL890 - .4byte 0x16c76 - .byte 0 + .4byte 0x15a89 .uleb128 0x4b .8byte .LVL887 - .4byte 0x169af + .4byte 0x16e67 + .byte 0 .uleb128 0x4b - .8byte .LVL891 - .4byte 0x169af + .8byte .LVL884 + .4byte 0x16ba0 + .uleb128 0x4b + .8byte .LVL888 + .4byte 0x16ba0 .byte 0 .uleb128 0x7b - .4byte 0x13b19 + .4byte 0x13d0a .8byte .LFB2883 .8byte .LFE2883-.LFB2883 .uleb128 0x1 .byte 0x9c - .4byte 0x16664 - .uleb128 0x6a - .4byte 0x13b26 - .4byte .LLST262 - .uleb128 0x6a - .4byte 0x13b32 - .4byte .LLST263 - .uleb128 0x6a - .4byte 0x13b3e - .4byte .LLST264 - .uleb128 0x6a - .4byte 0x13b56 - .4byte .LLST265 - .uleb128 0x51 - .4byte 0x13b4a - .uleb128 0x51 - .4byte 0x13b4a - .uleb128 0x51 - .4byte 0x13b4a - .uleb128 0x54 - .4byte 0x13b62 - .uleb128 0x54 - .4byte 0x13b6e - .uleb128 0x54 - .4byte 0x13b7a - .uleb128 0x5d - .4byte 0x13b86 - .4byte .LLST266 - .uleb128 0x54 - .4byte 0x13b92 - .uleb128 0x5d - .4byte 0x13b9e - .4byte .LLST267 - .uleb128 0x54 - .4byte 0x13ba8 - .uleb128 0x5d - .4byte 0x13bb2 - .4byte .LLST268 - .uleb128 0x5d - .4byte 0x13bbe - .4byte .LLST269 - .uleb128 0x54 - .4byte 0x13bca - .uleb128 0x5d - .4byte 0x13bd6 + .4byte 0x16855 + .uleb128 0x6b + .4byte 0x13d17 .4byte .LLST270 - .uleb128 0x58 - .4byte 0x15500 - .8byte .LBB1534 - .4byte .Ldebug_ranges0+0xef0 - .byte 0x1 - .2byte 0x618 - .4byte 0x165f6 - .uleb128 0x51 - .4byte 0x15529 - .uleb128 0x51 - .4byte 0x1551d - .uleb128 0x51 - .4byte 0x15511 - .uleb128 0x5b - .4byte .Ldebug_ranges0+0xef0 - .uleb128 0x54 - .4byte 0x15535 - .uleb128 0x5d - .4byte 0x15541 + .uleb128 0x6b + .4byte 0x13d23 .4byte .LLST271 - .uleb128 0x5c - .4byte 0x155d2 - .8byte .LBB1536 - .4byte .Ldebug_ranges0+0xf30 + .uleb128 0x6b + .4byte 0x13d2f + .4byte .LLST272 + .uleb128 0x6b + .4byte 0x13d47 + .4byte .LLST273 + .uleb128 0x51 + .4byte 0x13d3b + .uleb128 0x51 + .4byte 0x13d3b + .uleb128 0x51 + .4byte 0x13d3b + .uleb128 0x54 + .4byte 0x13d53 + .uleb128 0x54 + .4byte 0x13d5f + .uleb128 0x54 + .4byte 0x13d6b + .uleb128 0x5d + .4byte 0x13d77 + .4byte .LLST274 + .uleb128 0x54 + .4byte 0x13d83 + .uleb128 0x5d + .4byte 0x13d8f + .4byte .LLST275 + .uleb128 0x54 + .4byte 0x13d99 + .uleb128 0x5d + .4byte 0x13da3 + .4byte .LLST276 + .uleb128 0x5d + .4byte 0x13daf + .4byte .LLST277 + .uleb128 0x54 + .4byte 0x13dbb + .uleb128 0x5d + .4byte 0x13dc7 + .4byte .LLST278 + .uleb128 0x58 + .4byte 0x156f1 + .8byte .LBB1596 + .4byte .Ldebug_ranges0+0xfc0 .byte 0x1 - .2byte 0x163 + .2byte 0x617 + .4byte 0x167e7 .uleb128 0x51 - .4byte 0x155fb + .4byte 0x1571a .uleb128 0x51 - .4byte 0x155ef + .4byte 0x1570e .uleb128 0x51 - .4byte 0x155e3 + .4byte 0x15702 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xfc0 + .uleb128 0x54 + .4byte 0x15726 + .uleb128 0x5d + .4byte 0x15732 + .4byte .LLST279 + .uleb128 0x5c + .4byte 0x157c3 + .8byte .LBB1598 + .4byte .Ldebug_ranges0+0x1000 + .byte 0x1 + .2byte 0x162 + .uleb128 0x51 + .4byte 0x157ec + .uleb128 0x51 + .4byte 0x157e0 + .uleb128 0x51 + .4byte 0x157d4 .byte 0 .byte 0 .byte 0 .uleb128 0x58 - .4byte 0x154b2 - .8byte .LBB1568 - .4byte .Ldebug_ranges0+0x1030 + .4byte 0x156a3 + .8byte .LBB1630 + .4byte .Ldebug_ranges0+0x1100 .byte 0x1 - .2byte 0x61f - .4byte 0x16656 + .2byte 0x61e + .4byte 0x16847 .uleb128 0x51 - .4byte 0x154db + .4byte 0x156cc .uleb128 0x51 - .4byte 0x154cf + .4byte 0x156c0 .uleb128 0x51 - .4byte 0x154c3 + .4byte 0x156b4 .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1030 + .4byte .Ldebug_ranges0+0x1100 .uleb128 0x54 - .4byte 0x154e7 + .4byte 0x156d8 .uleb128 0x5d - .4byte 0x154f3 - .4byte .LLST272 + .4byte 0x156e4 + .4byte .LLST280 .uleb128 0x5c - .4byte 0x1559c - .8byte .LBB1570 - .4byte .Ldebug_ranges0+0x1080 + .4byte 0x1578d + .8byte .LBB1632 + .4byte .Ldebug_ranges0+0x1150 .byte 0x1 - .2byte 0x181 + .2byte 0x180 .uleb128 0x51 - .4byte 0x155c5 + .4byte 0x157b6 .uleb128 0x51 - .4byte 0x155b9 + .4byte 0x157aa .uleb128 0x51 - .4byte 0x155ad + .4byte 0x1579e .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL904 - .4byte 0x16a0b + .8byte .LVL901 + .4byte 0x16bfc .byte 0 .uleb128 0x7b - .4byte 0x13cad + .4byte 0x13e9e .8byte .LFB2884 .8byte .LFE2884-.LFB2884 .uleb128 0x1 .byte 0x9c - .4byte 0x1677b - .uleb128 0x6a - .4byte 0x13cba - .4byte .LLST273 - .uleb128 0x6a - .4byte 0x13cc6 - .4byte .LLST274 - .uleb128 0x6a - .4byte 0x13cd2 - .4byte .LLST275 - .uleb128 0x6a - .4byte 0x13cea - .4byte .LLST276 - .uleb128 0x51 - .4byte 0x13cde - .uleb128 0x51 - .4byte 0x13cde - .uleb128 0x51 - .4byte 0x13cde - .uleb128 0x54 - .4byte 0x13cf6 - .uleb128 0x5d - .4byte 0x13d02 - .4byte .LLST277 - .uleb128 0x5d - .4byte 0x13d0e - .4byte .LLST278 - .uleb128 0x5d - .4byte 0x13d1a - .4byte .LLST279 - .uleb128 0x54 - .4byte 0x13d26 - .uleb128 0x5d - .4byte 0x13d32 - .4byte .LLST280 - .uleb128 0x54 - .4byte 0x13d3c - .uleb128 0x5d - .4byte 0x13d46 + .4byte 0x1696c + .uleb128 0x6b + .4byte 0x13eab .4byte .LLST281 - .uleb128 0x5d - .4byte 0x13d52 + .uleb128 0x6b + .4byte 0x13eb7 .4byte .LLST282 - .uleb128 0x5d - .4byte 0x13d5e + .uleb128 0x6b + .4byte 0x13ec3 .4byte .LLST283 - .uleb128 0x58 - .4byte 0x1554e - .8byte .LBB1610 - .4byte .Ldebug_ranges0+0x1190 - .byte 0x1 - .2byte 0x5c6 - .4byte 0x16760 - .uleb128 0x51 - .4byte 0x15577 - .uleb128 0x51 - .4byte 0x1556b - .uleb128 0x51 - .4byte 0x1555f - .uleb128 0x5b - .4byte .Ldebug_ranges0+0x1190 - .uleb128 0x54 - .4byte 0x15583 - .uleb128 0x5d - .4byte 0x1558f + .uleb128 0x6b + .4byte 0x13edb .4byte .LLST284 - .uleb128 0x5c - .4byte 0x15608 - .8byte .LBB1612 - .4byte .Ldebug_ranges0+0x11d0 + .uleb128 0x51 + .4byte 0x13ecf + .uleb128 0x51 + .4byte 0x13ecf + .uleb128 0x51 + .4byte 0x13ecf + .uleb128 0x54 + .4byte 0x13ee7 + .uleb128 0x5d + .4byte 0x13ef3 + .4byte .LLST285 + .uleb128 0x5d + .4byte 0x13eff + .4byte .LLST286 + .uleb128 0x5d + .4byte 0x13f0b + .4byte .LLST287 + .uleb128 0x54 + .4byte 0x13f17 + .uleb128 0x5d + .4byte 0x13f23 + .4byte .LLST288 + .uleb128 0x54 + .4byte 0x13f2d + .uleb128 0x5d + .4byte 0x13f37 + .4byte .LLST289 + .uleb128 0x5d + .4byte 0x13f43 + .4byte .LLST290 + .uleb128 0x5d + .4byte 0x13f4f + .4byte .LLST291 + .uleb128 0x58 + .4byte 0x1573f + .8byte .LBB1672 + .4byte .Ldebug_ranges0+0x1260 .byte 0x1 - .2byte 0x145 + .2byte 0x5c5 + .4byte 0x16951 .uleb128 0x51 - .4byte 0x15631 + .4byte 0x15768 .uleb128 0x51 - .4byte 0x15625 + .4byte 0x1575c .uleb128 0x51 - .4byte 0x15619 + .4byte 0x15750 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1260 + .uleb128 0x54 + .4byte 0x15774 + .uleb128 0x5d + .4byte 0x15780 + .4byte .LLST292 + .uleb128 0x5c + .4byte 0x157f9 + .8byte .LBB1674 + .4byte .Ldebug_ranges0+0x12a0 + .byte 0x1 + .2byte 0x144 + .uleb128 0x51 + .4byte 0x15822 + .uleb128 0x51 + .4byte 0x15816 + .uleb128 0x51 + .4byte 0x1580a .byte 0 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL934 - .4byte 0x16a0b + .8byte .LVL931 + .4byte 0x16bfc .uleb128 0x4b - .8byte .LVL949 - .4byte 0x16a0b + .8byte .LVL946 + .4byte 0x16bfc .byte 0 .uleb128 0x7b - .4byte 0x131bc + .4byte 0x13415 .8byte .LFB2886 .8byte .LFE2886-.LFB2886 .uleb128 0x1 .byte 0x9c - .4byte 0x167d4 + .4byte 0x169c5 .uleb128 0x51 - .4byte 0x131d9 + .4byte 0x13432 .uleb128 0x51 - .4byte 0x131cd + .4byte 0x13426 .uleb128 0x54 - .4byte 0x131e5 + .4byte 0x1343e .uleb128 0x54 - .4byte 0x131ef + .4byte 0x13448 .uleb128 0x54 - .4byte 0x131fb + .4byte 0x13454 .uleb128 0x5d - .4byte 0x13207 - .4byte .LLST287 + .4byte 0x13460 + .4byte .LLST295 .uleb128 0x54 - .4byte 0x13213 + .4byte 0x1346c .uleb128 0x5d - .4byte 0x1321f - .4byte .LLST288 + .4byte 0x13478 + .4byte .LLST296 .uleb128 0x4b - .8byte .LVL1010 - .4byte 0x16c81 + .8byte .LVL1000 + .4byte 0x16e72 .byte 0 .uleb128 0x7b - .4byte 0x1308c + .4byte 0x132e5 .8byte .LFB2887 .8byte .LFE2887-.LFB2887 .uleb128 0x1 .byte 0x9c - .4byte 0x16848 + .4byte 0x16a39 .uleb128 0x51 - .4byte 0x130b5 + .4byte 0x1330e .uleb128 0x51 - .4byte 0x130b5 + .4byte 0x1330e .uleb128 0x51 - .4byte 0x130a9 + .4byte 0x13302 .uleb128 0x51 - .4byte 0x1309d + .4byte 0x132f6 .uleb128 0x54 - .4byte 0x130c1 + .4byte 0x1331a .uleb128 0x54 - .4byte 0x130cb + .4byte 0x13324 .uleb128 0x54 - .4byte 0x130d7 + .4byte 0x13330 .uleb128 0x5e - .4byte 0x130e3 + .4byte 0x1333c .uleb128 0x1 .byte 0x59 .uleb128 0x54 - .4byte 0x130ef + .4byte 0x13348 .uleb128 0x54 - .4byte 0x130fb + .4byte 0x13354 .uleb128 0x54 - .4byte 0x13107 + .4byte 0x13360 .uleb128 0x5d - .4byte 0x13113 - .4byte .LLST289 + .4byte 0x1336c + .4byte .LLST297 .uleb128 0x5d - .4byte 0x1311f - .4byte .LLST290 + .4byte 0x13378 + .4byte .LLST298 .uleb128 0x4b - .8byte .LVL1015 - .4byte 0x16c81 + .8byte .LVL1005 + .4byte 0x16e72 .byte 0 .uleb128 0x7b - .4byte 0x100aa + .4byte 0x1009c .8byte .LFB2862 .8byte .LFE2862-.LFB2862 .uleb128 0x1 .byte 0x9c - .4byte 0x168e5 - .uleb128 0x6a - .4byte 0x100bb - .4byte .LLST318 - .uleb128 0x6a - .4byte 0x100c7 - .4byte .LLST319 - .uleb128 0x6a - .4byte 0x100d3 - .4byte .LLST320 + .4byte 0x16ad6 + .uleb128 0x6b + .4byte 0x100ad + .4byte .LLST326 + .uleb128 0x6b + .4byte 0x100b9 + .4byte .LLST327 + .uleb128 0x6b + .4byte 0x100c5 + .4byte .LLST328 .uleb128 0x54 - .4byte 0x100df + .4byte 0x100d1 .uleb128 0x54 - .4byte 0x100eb + .4byte 0x100dd .uleb128 0x5d - .4byte 0x100f7 - .4byte .LLST321 + .4byte 0x100e9 + .4byte .LLST329 .uleb128 0x5f - .8byte .LBB1993 - .8byte .LBE1993-.LBB1993 - .4byte 0x168d7 + .8byte .LBB2043 + .8byte .LBE2043-.LBB2043 + .4byte 0x16ac8 .uleb128 0x51 - .4byte 0x100bb + .4byte 0x100ad .uleb128 0x51 - .4byte 0x100c7 + .4byte 0x100b9 .uleb128 0x51 - .4byte 0x100d3 + .4byte 0x100c5 .uleb128 0x53 - .8byte .LBB1994 - .8byte .LBE1994-.LBB1994 + .8byte .LBB2044 + .8byte .LBE2044-.LBB2044 .uleb128 0x54 - .4byte 0x1687e + .4byte 0x16a6f .uleb128 0x54 - .4byte 0x16883 + .4byte 0x16a74 .uleb128 0x54 - .4byte 0x16888 + .4byte 0x16a79 .byte 0 .byte 0 .uleb128 0x4b - .8byte .LVL1218 - .4byte 0x16b45 + .8byte .LVL1210 + .4byte 0x16d36 .byte 0 .uleb128 0x7d - .4byte 0x1547c + .4byte 0x1566d .8byte .LFB2892 .8byte .LFE2892-.LFB2892 .uleb128 0x1 .byte 0x9c - .4byte 0x16999 - .uleb128 0x6a - .4byte 0x1548d - .4byte .LLST322 + .4byte 0x16b8a + .uleb128 0x6b + .4byte 0x1567e + .4byte .LLST330 .uleb128 0x54 - .4byte 0x154a5 + .4byte 0x15696 .uleb128 0x51 - .4byte 0x15499 + .4byte 0x1568a .uleb128 0x50 - .4byte 0x15874 - .8byte .LBB1995 - .8byte .LBE1995-.LBB1995 + .4byte 0x15a65 + .8byte .LBB2045 + .8byte .LBE2045-.LBB2045 + .byte 0x1 + .2byte 0x190 + .4byte 0x16b26 + .uleb128 0x51 + .4byte 0x15a71 + .byte 0 + .uleb128 0x50 + .4byte 0x158dc + .8byte .LBB2047 + .8byte .LBE2047-.LBB2047 .byte 0x1 .2byte 0x191 - .4byte 0x16935 + .4byte 0x16b4d .uleb128 0x51 - .4byte 0x15880 + .4byte 0x158f7 + .uleb128 0x51 + .4byte 0x158ec .byte 0 .uleb128 0x50 - .4byte 0x156eb - .8byte .LBB1997 - .8byte .LBE1997-.LBB1997 + .4byte 0x15a9b + .8byte .LBB2049 + .8byte .LBE2049-.LBB2049 .byte 0x1 - .2byte 0x192 - .4byte 0x1695c + .2byte 0x18d + .4byte 0x16b7c .uleb128 0x51 - .4byte 0x15706 - .uleb128 0x51 - .4byte 0x156fb - .byte 0 - .uleb128 0x50 - .4byte 0x158aa - .8byte .LBB1999 - .8byte .LBE1999-.LBB1999 - .byte 0x1 - .2byte 0x18e - .4byte 0x1698b - .uleb128 0x51 - .4byte 0x158b6 + .4byte 0x15aa7 .uleb128 0x4b - .8byte .LVL1226 - .4byte 0x16c8c + .8byte .LVL1218 + .4byte 0x16e7d .byte 0 .uleb128 0x4b - .8byte .LVL1223 - .4byte 0x169af + .8byte .LVL1215 + .4byte 0x16ba0 .byte 0 .uleb128 0x7e .4byte .LASF3252 .4byte .LASF3252 .byte 0xbd - .byte 0xcc + .byte 0xcf .uleb128 0x7e .4byte .LASF3253 .4byte .LASF3253 .byte 0xbd - .byte 0xca + .byte 0xcd .uleb128 0x7f .4byte .LASF3254 .4byte .LASF3254 @@ -56735,70 +57000,70 @@ .4byte .LASF3261 .4byte .LASF3261 .byte 0xc2 - .byte 0x33 + .byte 0x34 .uleb128 0x80 - .4byte .LASF3262 - .4byte .LASF3262 - .uleb128 0x7e - .4byte .LASF3262 - .4byte .LASF3262 - .byte 0xd4 - .byte 0x36 + .4byte .LASF3272 + .4byte .LASF3272 .uleb128 0x7f - .4byte .LASF3263 - .4byte .LASF3263 + .4byte .LASF3262 + .4byte .LASF3262 .byte 0x2 .2byte 0x5cb .uleb128 0x7e + .4byte .LASF3263 + .4byte .LASF3263 + .byte 0xc1 + .byte 0x29 + .uleb128 0x7e .4byte .LASF3264 .4byte .LASF3264 .byte 0xc1 - .byte 0x26 + .byte 0x2a .uleb128 0x7e .4byte .LASF3265 .4byte .LASF3265 - .byte 0xc1 - .byte 0x27 - .uleb128 0x7e - .4byte .LASF3266 - .4byte .LASF3266 .byte 0xaa .byte 0x9 .uleb128 0x7f - .4byte .LASF3267 - .4byte .LASF3267 + .4byte .LASF3266 + .4byte .LASF3266 .byte 0x47 .2byte 0x6b7 .uleb128 0x7f - .4byte .LASF3268 - .4byte .LASF3268 + .4byte .LASF3267 + .4byte .LASF3267 .byte 0x47 .2byte 0x675 .uleb128 0x7e - .4byte .LASF3269 - .4byte .LASF3269 + .4byte .LASF3268 + .4byte .LASF3268 .byte 0x9a .byte 0x67 .uleb128 0x7e - .4byte .LASF3270 - .4byte .LASF3270 + .4byte .LASF3269 + .4byte .LASF3269 .byte 0x52 .byte 0x53 .uleb128 0x7e - .4byte .LASF3271 - .4byte .LASF3271 + .4byte .LASF3270 + .4byte .LASF3270 .byte 0x52 .byte 0xa5 .uleb128 0x7e - .4byte .LASF3272 - .4byte .LASF3272 + .4byte .LASF3271 + .4byte .LASF3271 .byte 0xc2 - .byte 0x2e + .byte 0x2f + .uleb128 0x7e + .4byte .LASF3272 + .4byte .LASF3272 + .byte 0xd4 + .byte 0x36 .uleb128 0x7e .4byte .LASF3273 .4byte .LASF3273 .byte 0xc2 - .byte 0x27 + .byte 0x28 .uleb128 0x7f .4byte .LASF3274 .4byte .LASF3274 @@ -56869,7 +57134,7 @@ .4byte .LASF3288 .4byte .LASF3288 .byte 0xc2 - .byte 0x31 + .byte 0x32 .uleb128 0x7f .4byte .LASF3289 .4byte .LASF3289 @@ -56889,7 +57154,7 @@ .4byte .LASF3292 .4byte .LASF3292 .byte 0xc1 - .byte 0x28 + .byte 0x2b .uleb128 0x7f .4byte .LASF3293 .4byte .LASF3293 @@ -56899,17 +57164,17 @@ .4byte .LASF3294 .4byte .LASF3294 .byte 0xc2 - .byte 0x2f + .byte 0x30 .uleb128 0x7f .4byte .LASF3295 .4byte .LASF3295 - .byte 0x5 - .2byte 0x199 - .uleb128 0x7f - .4byte .LASF3296 - .4byte .LASF3296 .byte 0x5 .2byte 0x19f + .uleb128 0x7f + .4byte .LASF3296 + .4byte .LASF3296 + .byte 0x5 + .2byte 0x199 .uleb128 0x7e .4byte .LASF3297 .4byte .LASF3297 @@ -56919,22 +57184,22 @@ .4byte .LASF3298 .4byte .LASF3298 .byte 0xc2 + .byte 0x29 + .uleb128 0x7e + .4byte .LASF3299 + .4byte .LASF3299 + .byte 0xc2 .byte 0x25 .uleb128 0x7e - .4byte .LASF3299 - .4byte .LASF3299 - .byte 0xc2 - .byte 0x28 - .uleb128 0x7e .4byte .LASF3300 .4byte .LASF3300 .byte 0xc2 - .byte 0x24 + .byte 0x2e .uleb128 0x7e .4byte .LASF3301 .4byte .LASF3301 .byte 0xc2 - .byte 0x2d + .byte 0x27 .uleb128 0x7e .4byte .LASF3302 .4byte .LASF3302 @@ -56959,7 +57224,7 @@ .4byte .LASF3306 .4byte .LASF3306 .byte 0xc2 - .byte 0x29 + .byte 0x2a .uleb128 0x7e .4byte .LASF3307 .4byte .LASF3307 @@ -56974,27 +57239,27 @@ .4byte .LASF3309 .4byte .LASF3309 .byte 0xc2 - .byte 0x2c + .byte 0x2d .uleb128 0x7e .4byte .LASF3310 .4byte .LASF3310 .byte 0xc2 - .byte 0x2b + .byte 0x2c .uleb128 0x7e .4byte .LASF3311 .4byte .LASF3311 .byte 0xc3 - .byte 0x73 + .byte 0x7b .uleb128 0x7e .4byte .LASF3312 .4byte .LASF3312 .byte 0xc2 - .byte 0x2a + .byte 0x2b .uleb128 0x7e .4byte .LASF3313 .4byte .LASF3313 .byte 0xc1 - .byte 0x29 + .byte 0x2c .uleb128 0x81 .string "up" .string "up" @@ -58377,18 +58642,12 @@ .byte 0 .byte 0 .uleb128 0x68 - .uleb128 0x1d + .uleb128 0xb .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 0x69 @@ -58404,11 +58663,26 @@ .uleb128 0xb .uleb128 0x59 .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x6a + .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 0x6a + .uleb128 0x6b .uleb128 0x5 .byte 0 .uleb128 0x31 @@ -58417,7 +58691,7 @@ .uleb128 0x17 .byte 0 .byte 0 - .uleb128 0x6b + .uleb128 0x6c .uleb128 0x1d .byte 0x1 .uleb128 0x31 @@ -58430,15 +58704,6 @@ .uleb128 0xb .uleb128 0x59 .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x6c - .uleb128 0xb - .byte 0x1 - .uleb128 0x55 - .uleb128 0x17 .uleb128 0x1 .uleb128 0x13 .byte 0 @@ -58746,9 +59011,9 @@ .byte 0x50 .8byte 0 .8byte 0 -.LLST261: - .8byte .LVL893 - .8byte .LVL894 +.LLST269: + .8byte .LVL890 + .8byte .LVL891 .2byte 0x1 .byte 0x50 .8byte 0 @@ -58760,677 +59025,671 @@ .byte 0x50 .8byte 0 .8byte 0 -.LLST291: - .8byte .LVL1016 - .8byte .LVL1017 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST292: - .8byte .LVL1020 - .8byte .LVL1021 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1032 - .8byte .LVL1033 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1170 - .8byte .LVL1171 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST293: - .8byte .LVL1028 - .8byte .LVL1029 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1079 - .8byte .LVL1080 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST294: - .8byte .LVL1032 - .8byte .LVL1034 - .2byte 0x1 - .byte 0x63 - .8byte .LVL1041 - .8byte .LVL1079 - .2byte 0x1 - .byte 0x63 - .8byte .LVL1084 - .8byte .LVL1170 - .2byte 0x1 - .byte 0x63 - .8byte .LVL1171 - .8byte .LVL1176 - .2byte 0x1 - .byte 0x63 - .8byte .LVL1179 - .8byte .LVL1193 - .2byte 0x1 - .byte 0x63 - .8byte .LVL1195 - .8byte .LFE2869 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST295: - .8byte .LVL1023 - .8byte .LVL1035 - .2byte 0x1 - .byte 0x65 - .8byte .LVL1039 - .8byte .LVL1042 - .2byte 0x1 - .byte 0x65 - .8byte .LVL1079 - .8byte .LVL1084 - .2byte 0x1 - .byte 0x65 - .8byte .LVL1177 - .8byte .LVL1179 - .2byte 0x1 - .byte 0x65 - .8byte .LVL1202 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x65 - .8byte 0 - .8byte 0 -.LLST296: - .8byte .LVL1023 - .8byte .LVL1024 - .2byte 0x2 - .byte 0x91 - .sleb128 -32 - .8byte .LVL1024 - .8byte .LVL1025 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1026 - .8byte .LVL1030 - .2byte 0x2 - .byte 0x91 - .sleb128 -32 - .8byte .LVL1030 - .8byte .LVL1082 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1082 - .8byte .LVL1170 - .2byte 0x2 - .byte 0x91 - .sleb128 -32 - .8byte .LVL1171 - .8byte .LVL1176 - .2byte 0x2 - .byte 0x91 - .sleb128 -32 - .8byte .LVL1177 - .8byte .LVL1193 - .2byte 0x2 - .byte 0x91 - .sleb128 -32 - .8byte .LVL1195 - .8byte .LFE2869 - .2byte 0x2 - .byte 0x91 - .sleb128 -32 - .8byte 0 - .8byte 0 -.LLST297: - .8byte .LVL1027 - .8byte .LVL1034 - .2byte 0x1 - .byte 0x63 - .8byte .LVL1039 - .8byte .LVL1041 - .2byte 0x1 - .byte 0x63 - .8byte .LVL1079 - .8byte .LVL1084 - .2byte 0x1 - .byte 0x63 - .8byte .LVL1202 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST298: - .8byte .LVL1032 - .8byte .LVL1037 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1065 - .8byte .LVL1073 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1146 - .8byte .LVL1149 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1187 - .8byte .LVL1189 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1192 - .8byte .LVL1193 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1195 - .8byte .LVL1196 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1197 - .8byte .LVL1199 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1202 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x6a - .8byte 0 - .8byte 0 .LLST299: - .8byte .LVL1032 - .8byte .LVL1037 + .8byte .LVL1006 + .8byte .LVL1007 .2byte 0x1 - .byte 0x6a - .8byte .LVL1073 - .8byte .LVL1077 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1084 - .8byte .LVL1085 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1196 - .8byte .LVL1197 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1202 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x6a + .byte 0x50 .8byte 0 .8byte 0 .LLST300: - .8byte .LVL1085 - .8byte .LVL1086-1 + .8byte .LVL1010 + .8byte .LVL1011 .2byte 0x1 - .byte 0x51 + .byte 0x50 + .8byte .LVL1022 + .8byte .LVL1023 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1159 + .8byte .LVL1160 + .2byte 0x1 + .byte 0x50 .8byte 0 .8byte 0 .LLST301: - .8byte .LVL1090 - .8byte .LVL1093 + .8byte .LVL1018 + .8byte .LVL1019 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1068 + .8byte .LVL1069 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 .LLST302: - .8byte .LVL1091 - .8byte .LVL1092 + .8byte .LVL1022 + .8byte .LVL1024 .2byte 0x1 - .byte 0x51 + .byte 0x63 + .8byte .LVL1031 + .8byte .LVL1068 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1073 + .8byte .LVL1159 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1160 + .8byte .LVL1165 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1168 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1187 + .8byte .LFE2869 + .2byte 0x1 + .byte 0x63 .8byte 0 .8byte 0 .LLST303: - .8byte .LVL1096 - .8byte .LVL1099 + .8byte .LVL1013 + .8byte .LVL1025 .2byte 0x1 - .byte 0x50 + .byte 0x65 + .8byte .LVL1029 + .8byte .LVL1032 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1068 + .8byte .LVL1073 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1166 + .8byte .LVL1168 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1191 + .8byte .LVL1192 + .2byte 0x1 + .byte 0x65 .8byte 0 .8byte 0 .LLST304: - .8byte .LVL1097 - .8byte .LVL1098 + .8byte .LVL1013 + .8byte .LVL1014 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1014 + .8byte .LVL1015 .2byte 0x1 - .byte 0x51 + .byte 0x50 + .8byte .LVL1016 + .8byte .LVL1020 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1020 + .8byte .LVL1071 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1071 + .8byte .LVL1159 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1160 + .8byte .LVL1165 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1166 + .8byte .LVL1185 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1187 + .8byte .LFE2869 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 .8byte 0 .8byte 0 .LLST305: - .8byte .LVL1032 - .8byte .LVL1037 + .8byte .LVL1017 + .8byte .LVL1024 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1029 + .8byte .LVL1031 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1068 + .8byte .LVL1073 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1191 + .8byte .LVL1192 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST306: + .8byte .LVL1022 + .8byte .LVL1027 .2byte 0x1 .byte 0x6a - .8byte .LVL1102 - .8byte .LVL1109 + .8byte .LVL1055 + .8byte .LVL1062 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1135 + .8byte .LVL1138 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1172 + .8byte .LVL1174 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1179 + .8byte .LVL1180 .2byte 0x1 .byte 0x6a .8byte .LVL1183 .8byte .LVL1185 .2byte 0x1 .byte 0x6a - .8byte .LVL1189 - .8byte .LVL1190 + .8byte .LVL1187 + .8byte .LVL1188 .2byte 0x1 - .byte 0x50 - .8byte .LVL1190 + .byte 0x6a + .8byte .LVL1189 .8byte .LVL1192 .2byte 0x1 .byte 0x6a - .8byte .LVL1202 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x6a - .8byte 0 - .8byte 0 -.LLST306: - .8byte .LVL1105 - .8byte .LVL1108 - .2byte 0x1 - .byte 0x50 .8byte 0 .8byte 0 .LLST307: - .8byte .LVL1106 - .8byte .LVL1107 + .8byte .LVL1022 + .8byte .LVL1027 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1062 + .8byte .LVL1066 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1073 + .8byte .LVL1074 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1188 + .8byte .LVL1189 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1191 + .8byte .LVL1192 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST308: + .8byte .LVL1074 + .8byte .LVL1075-1 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST308: - .8byte .LVL1108 - .8byte .LVL1110-1 +.LLST309: + .8byte .LVL1079 + .8byte .LVL1082 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST309: - .8byte .LVL1032 - .8byte .LVL1039 - .2byte 0x2 - .byte 0x91 - .sleb128 -28 - .8byte .LVL1115 - .8byte .LVL1146 - .2byte 0x2 - .byte 0x91 - .sleb128 -28 - .8byte .LVL1149 - .8byte .LVL1161 - .2byte 0x2 - .byte 0x91 - .sleb128 -28 - .8byte .LVL1161 - .8byte .LVL1162 - .2byte 0x1 - .byte 0x51 - .8byte .LVL1165 - .8byte .LVL1170 - .2byte 0x2 - .byte 0x91 - .sleb128 -28 - .8byte .LVL1171 - .8byte .LVL1176 - .2byte 0x2 - .byte 0x91 - .sleb128 -28 - .8byte .LVL1199 - .8byte .LVL1203 - .2byte 0x2 - .byte 0x91 - .sleb128 -28 - .8byte .LVL1207 - .8byte .LFE2869 - .2byte 0x2 - .byte 0x91 - .sleb128 -28 - .8byte 0 - .8byte 0 .LLST310: - .8byte .LVL1032 - .8byte .LVL1039 - .2byte 0x2 - .byte 0x91 - .sleb128 -24 - .8byte .LVL1115 - .8byte .LVL1146 - .2byte 0x2 - .byte 0x91 - .sleb128 -24 - .8byte .LVL1149 - .8byte .LVL1154 - .2byte 0x2 - .byte 0x91 - .sleb128 -24 - .8byte .LVL1154 - .8byte .LVL1155 + .8byte .LVL1080 + .8byte .LVL1081 .2byte 0x1 .byte 0x51 - .8byte .LVL1157 - .8byte .LVL1170 - .2byte 0x2 - .byte 0x91 - .sleb128 -24 - .8byte .LVL1171 - .8byte .LVL1176 - .2byte 0x2 - .byte 0x91 - .sleb128 -24 - .8byte .LVL1199 - .8byte .LVL1203 - .2byte 0x2 - .byte 0x91 - .sleb128 -24 - .8byte .LVL1205 - .8byte .LFE2869 - .2byte 0x2 - .byte 0x91 - .sleb128 -24 .8byte 0 .8byte 0 .LLST311: - .8byte .LVL1032 - .8byte .LVL1036 + .8byte .LVL1085 + .8byte .LVL1088 .2byte 0x1 - .byte 0x68 - .8byte .LVL1121 - .8byte .LVL1130 - .2byte 0x1 - .byte 0x68 - .8byte .LVL1134 - .8byte .LVL1146 - .2byte 0x1 - .byte 0x68 - .8byte .LVL1151 - .8byte .LVL1157 - .2byte 0x1 - .byte 0x68 - .8byte .LVL1165 - .8byte .LVL1167 - .2byte 0x1 - .byte 0x68 - .8byte .LVL1199 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x68 - .8byte .LVL1206 - .8byte .LVL1207 - .2byte 0x1 - .byte 0x68 + .byte 0x50 .8byte 0 .8byte 0 .LLST312: - .8byte .LVL1032 - .8byte .LVL1038 + .8byte .LVL1086 + .8byte .LVL1087 .2byte 0x1 - .byte 0x6c - .8byte .LVL1125 - .8byte .LVL1146 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1149 - .8byte .LVL1157 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1164 - .8byte .LVL1170 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1171 - .8byte .LVL1176 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1199 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x6c + .byte 0x51 .8byte 0 .8byte 0 .LLST313: - .8byte .LVL1117 - .8byte .LVL1122 + .8byte .LVL1022 + .8byte .LVL1027 .2byte 0x1 .byte 0x6a - .8byte .LVL1157 - .8byte .LVL1160 + .8byte .LVL1091 + .8byte .LVL1098 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1175 + .8byte .LVL1177 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1180 + .8byte .LVL1181 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1181 + .8byte .LVL1183 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1191 + .8byte .LVL1192 .2byte 0x1 .byte 0x6a .8byte 0 .8byte 0 .LLST314: - .8byte .LVL1032 - .8byte .LVL1038 + .8byte .LVL1094 + .8byte .LVL1097 .2byte 0x1 - .byte 0x6c - .8byte .LVL1119 - .8byte .LVL1125 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1126 - .8byte .LVL1146 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1149 - .8byte .LVL1151 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1157 - .8byte .LVL1164 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1171 - .8byte .LVL1176 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1202 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x6c - .8byte .LVL1205 - .8byte .LFE2869 - .2byte 0x1 - .byte 0x6c + .byte 0x50 .8byte 0 .8byte 0 .LLST315: - .8byte .LVL1032 - .8byte .LVL1037 + .8byte .LVL1095 + .8byte .LVL1096 .2byte 0x1 - .byte 0x6a - .8byte .LVL1122 - .8byte .LVL1146 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1149 - .8byte .LVL1157 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1160 - .8byte .LVL1170 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1171 - .8byte .LVL1176 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1199 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1205 - .8byte .LVL1207 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1207 - .8byte .LVL1208 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1208 - .8byte .LFE2869 - .2byte 0x1 - .byte 0x6a + .byte 0x51 .8byte 0 .8byte 0 .LLST316: - .8byte .LVL1032 - .8byte .LVL1038 - .2byte 0x1 - .byte 0x6b - .8byte .LVL1123 - .8byte .LVL1146 - .2byte 0x1 - .byte 0x6b - .8byte .LVL1149 - .8byte .LVL1157 - .2byte 0x1 - .byte 0x6b - .8byte .LVL1165 - .8byte .LVL1170 - .2byte 0x1 - .byte 0x6b - .8byte .LVL1171 - .8byte .LVL1176 - .2byte 0x1 - .byte 0x6b - .8byte .LVL1199 - .8byte .LVL1200 + .8byte .LVL1097 + .8byte .LVL1099-1 .2byte 0x1 .byte 0x50 - .8byte .LVL1200 - .8byte .LVL1203 - .2byte 0x1 - .byte 0x6b .8byte 0 .8byte 0 .LLST317: - .8byte .LVL1032 - .8byte .LVL1036 + .8byte .LVL1022 + .8byte .LVL1029 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1104 + .8byte .LVL1135 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1138 + .8byte .LVL1144 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1144 + .8byte .LVL1145 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1148 + .8byte .LVL1159 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1160 + .8byte .LVL1165 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1191 + .8byte .LVL1192 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1194 + .8byte .LVL1200 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte 0 + .8byte 0 +.LLST318: + .8byte .LVL1022 + .8byte .LVL1029 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte .LVL1104 + .8byte .LVL1135 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte .LVL1138 + .8byte .LVL1156 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte .LVL1156 + .8byte .LVL1157 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1160 + .8byte .LVL1165 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte .LVL1191 + .8byte .LVL1200 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte 0 + .8byte 0 +.LLST319: + .8byte .LVL1022 + .8byte .LVL1026 .2byte 0x1 .byte 0x68 - .8byte .LVL1130 - .8byte .LVL1146 + .8byte .LVL1110 + .8byte .LVL1119 .2byte 0x1 .byte 0x68 - .8byte .LVL1149 - .8byte .LVL1151 + .8byte .LVL1123 + .8byte .LVL1135 .2byte 0x1 .byte 0x68 - .8byte .LVL1171 - .8byte .LVL1173 + .8byte .LVL1148 + .8byte .LVL1150 .2byte 0x1 .byte 0x68 - .8byte .LVL1202 - .8byte .LVL1203 + .8byte .LVL1153 + .8byte .LVL1159 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1191 + .8byte .LVL1192 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1193 + .8byte .LVL1194 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1197 + .8byte .LVL1200 .2byte 0x1 .byte 0x68 .8byte 0 .8byte 0 -.LLST204: +.LLST320: + .8byte .LVL1022 + .8byte .LVL1028 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1114 + .8byte .LVL1135 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1138 + .8byte .LVL1140 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1147 + .8byte .LVL1159 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1160 + .8byte .LVL1165 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1191 + .8byte .LVL1192 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1197 + .8byte .LVL1200 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST321: + .8byte .LVL1106 + .8byte .LVL1111 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1140 + .8byte .LVL1143 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST322: + .8byte .LVL1022 + .8byte .LVL1028 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1108 + .8byte .LVL1114 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1115 + .8byte .LVL1135 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1138 + .8byte .LVL1147 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1160 + .8byte .LVL1165 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1191 + .8byte .LVL1197 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST323: + .8byte .LVL1022 + .8byte .LVL1027 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1111 + .8byte .LVL1135 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1138 + .8byte .LVL1140 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1143 + .8byte .LVL1159 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1160 + .8byte .LVL1165 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1191 + .8byte .LVL1194 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1194 + .8byte .LVL1195 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1195 + .8byte .LVL1200 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST324: + .8byte .LVL1022 + .8byte .LVL1028 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1112 + .8byte .LVL1135 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1138 + .8byte .LVL1140 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1148 + .8byte .LVL1159 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1160 + .8byte .LVL1165 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1191 + .8byte .LVL1192 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1197 + .8byte .LVL1198 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1198 + .8byte .LVL1200 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST325: + .8byte .LVL1022 + .8byte .LVL1026 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1119 + .8byte .LVL1135 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1138 + .8byte .LVL1140 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1160 + .8byte .LVL1162 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1191 + .8byte .LVL1192 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST212: + .8byte .LVL702 + .8byte .LVL703 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST213: + .8byte .LVL702 + .8byte .LVL704-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST214: + .8byte .LVL702 + .8byte .LVL704-1 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST197: + .8byte .LVL672 + .8byte .LVL673 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST198: + .8byte .LVL672 + .8byte .LVL674 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST199: + .8byte .LVL672 + .8byte .LVL675 + .2byte 0x1 + .byte 0x52 + .8byte .LVL675 + .8byte .LVL676-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST200: + .8byte .LVL677 + .8byte .LVL678 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST201: + .8byte .LVL677 + .8byte .LVL679 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST202: + .8byte .LVL677 + .8byte .LVL680 + .2byte 0x1 + .byte 0x52 + .8byte .LVL680 + .8byte .LVL681-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST215: .8byte .LVL705 .8byte .LVL706 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST205: +.LLST216: .8byte .LVL705 - .8byte .LVL707-1 + .8byte .LVL707 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST206: +.LLST217: .8byte .LVL705 - .8byte .LVL707-1 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST189: - .8byte .LVL675 - .8byte .LVL676 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST190: - .8byte .LVL675 - .8byte .LVL677 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST191: - .8byte .LVL675 - .8byte .LVL678 - .2byte 0x1 - .byte 0x52 - .8byte .LVL678 - .8byte .LVL679-1 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST192: - .8byte .LVL680 - .8byte .LVL681 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST193: - .8byte .LVL680 - .8byte .LVL682 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST194: - .8byte .LVL680 - .8byte .LVL683 - .2byte 0x1 - .byte 0x52 - .8byte .LVL683 - .8byte .LVL684-1 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST207: - .8byte .LVL708 .8byte .LVL709 .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST208: - .8byte .LVL708 - .8byte .LVL710 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST209: - .8byte .LVL708 - .8byte .LVL712 - .2byte 0x1 .byte 0x52 - .8byte .LVL712 - .8byte .LVL717 + .8byte .LVL709 + .8byte .LVL714 .2byte 0x1 .byte 0x65 - .8byte .LVL718 + .8byte .LVL715 .8byte .LFE2858 .2byte 0x1 .byte 0x65 .8byte 0 .8byte 0 -.LLST210: - .8byte .LVL708 - .8byte .LVL713-1 +.LLST218: + .8byte .LVL705 + .8byte .LVL710-1 .2byte 0x1 .byte 0x53 - .8byte .LVL713-1 + .8byte .LVL710-1 + .8byte .LVL713 + .2byte 0x1 + .byte 0x64 + .8byte .LVL715 .8byte .LVL716 .2byte 0x1 .byte 0x64 @@ -59438,136 +59697,132 @@ .8byte .LVL719 .2byte 0x1 .byte 0x64 - .8byte .LVL721 - .8byte .LVL722 - .2byte 0x1 - .byte 0x64 .8byte 0 .8byte 0 -.LLST211: - .8byte .LVL711 - .8byte .LVL717 - .2byte 0x1 - .byte 0x66 - .8byte .LVL718 - .8byte .LFE2858 - .2byte 0x1 - .byte 0x66 - .8byte 0 - .8byte 0 -.LLST212: +.LLST219: + .8byte .LVL708 .8byte .LVL714 - .8byte .LVL718 + .2byte 0x1 + .byte 0x66 + .8byte .LVL715 + .8byte .LFE2858 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST220: + .8byte .LVL711 + .8byte .LVL715 .2byte 0x2 .byte 0x91 .sleb128 20 - .8byte .LVL721 + .8byte .LVL718 .8byte .LFE2858 .2byte 0x2 .byte 0x91 .sleb128 20 .8byte 0 .8byte 0 -.LLST195: - .8byte .LVL685 - .8byte .LVL686 +.LLST203: + .8byte .LVL682 + .8byte .LVL683 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST196: - .8byte .LVL685 - .8byte .LVL687 +.LLST204: + .8byte .LVL682 + .8byte .LVL684 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST197: - .8byte .LVL685 - .8byte .LVL688-1 +.LLST205: + .8byte .LVL682 + .8byte .LVL685-1 .2byte 0x1 .byte 0x52 - .8byte .LVL688-1 - .8byte .LVL690 + .8byte .LVL685-1 + .8byte .LVL687 .2byte 0x1 .byte 0x63 .8byte 0 .8byte 0 -.LLST198: - .8byte .LVL691 - .8byte .LVL692 +.LLST206: + .8byte .LVL688 + .8byte .LVL689 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST199: - .8byte .LVL691 - .8byte .LVL693 +.LLST207: + .8byte .LVL688 + .8byte .LVL690 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST200: +.LLST208: + .8byte .LVL688 + .8byte .LVL691 + .2byte 0x1 + .byte 0x52 .8byte .LVL691 .8byte .LVL694 .2byte 0x1 - .byte 0x52 - .8byte .LVL694 - .8byte .LVL697 - .2byte 0x1 .byte 0x64 - .8byte .LVL698 + .8byte .LVL695 .8byte .LFE2856 .2byte 0x1 .byte 0x64 .8byte 0 .8byte 0 -.LLST201: - .8byte .LVL700 - .8byte .LVL701 +.LLST209: + .8byte .LVL697 + .8byte .LVL698 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST202: - .8byte .LVL700 - .8byte .LVL702 +.LLST210: + .8byte .LVL697 + .8byte .LVL699 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST203: +.LLST211: + .8byte .LVL697 .8byte .LVL700 - .8byte .LVL703 .2byte 0x1 .byte 0x52 - .8byte .LVL703 - .8byte .LVL704-1 + .8byte .LVL700 + .8byte .LVL701-1 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST213: - .8byte .LVL725 - .8byte .LVL726-1 +.LLST221: + .8byte .LVL722 + .8byte .LVL723-1 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST214: - .8byte .LVL725 - .8byte .LVL726-1 +.LLST222: + .8byte .LVL722 + .8byte .LVL723-1 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST215: - .8byte .LVL725 - .8byte .LVL726-1 +.LLST223: + .8byte .LVL722 + .8byte .LVL723-1 .2byte 0x1 .byte 0x52 - .8byte .LVL726-1 - .8byte .LVL728 + .8byte .LVL723-1 + .8byte .LVL725 .2byte 0x1 .byte 0x63 .8byte 0 @@ -59620,68 +59875,8 @@ .8byte .LVL103 .2byte 0x1 .byte 0x51 - .8byte .LVL105 - .8byte .LVL106 - .2byte 0x1 - .byte 0x51 - .8byte .LVL112 - .8byte .LVL114 - .2byte 0x1 - .byte 0x51 - .8byte .LVL138 - .8byte .LVL139 - .2byte 0x1 - .byte 0x51 - .8byte .LVL141 - .8byte .LVL143 - .2byte 0x1 - .byte 0x51 - .8byte .LVL146 - .8byte .LVL148 - .2byte 0x1 - .byte 0x51 - .8byte .LVL161 - .8byte .LVL162 - .2byte 0x1 - .byte 0x51 - .8byte .LVL176 - .8byte .LVL178 - .2byte 0x1 - .byte 0x51 - .8byte .LVL190 - .8byte .LVL192 - .2byte 0x1 - .byte 0x51 - .8byte .LVL204 - .8byte .LVL205 - .2byte 0x1 - .byte 0x51 - .8byte .LVL207 - .8byte .LVL208 - .2byte 0x1 - .byte 0x51 - .8byte .LVL210 - .8byte .LVL211-1 - .2byte 0x1 - .byte 0x51 - .8byte .LVL227 - .8byte .LVL228 - .2byte 0x1 - .byte 0x51 - .8byte .LVL230 - .8byte .LVL232 - .2byte 0x1 - .byte 0x51 - .8byte .LVL244 - .8byte .LVL245 - .2byte 0x1 - .byte 0x51 - .8byte .LVL247 - .8byte .LVL249 - .2byte 0x1 - .byte 0x51 - .8byte .LVL258 - .8byte .LVL260 + .8byte .LVL287 + .8byte .LVL288 .2byte 0x1 .byte 0x51 .8byte 0 @@ -59692,495 +59887,147 @@ .2byte 0x1 .byte 0x52 .8byte .LVL102 - .8byte .LVL110 + .8byte .LVL120 .2byte 0x1 .byte 0x65 - .8byte .LVL112 - .8byte .LVL142 + .8byte .LVL122 + .8byte .LVL223 .2byte 0x1 .byte 0x65 - .8byte .LVL142 - .8byte .LVL144-1 + .8byte .LVL225 + .8byte .LVL312 .2byte 0x1 - .byte 0x52 - .8byte .LVL146 + .byte 0x65 + .8byte .LVL314 .8byte .LFE2849 .2byte 0x1 .byte 0x65 .8byte 0 .8byte 0 -.LLST33: - .8byte .LVL108 - .8byte .LVL110 +.LLST107: + .8byte .LVL118 + .8byte .LVL122 + .2byte 0x2 + .byte 0x91 + .sleb128 -12 + .8byte .LVL253 + .8byte .LVL269 + .2byte 0x2 + .byte 0x91 + .sleb128 -12 + .8byte .LVL327 + .8byte .LVL328 + .2byte 0x2 + .byte 0x91 + .sleb128 -12 + .8byte 0 + .8byte 0 +.LLST108: + .8byte .LVL255 + .8byte .LVL256 .2byte 0x1 - .byte 0x66 - .8byte .LVL125 - .8byte .LVL127 + .byte 0x51 + .8byte .LVL257 + .8byte .LVL258 .2byte 0x1 - .byte 0x66 - .8byte .LVL329 - .8byte .LVL331 + .byte 0x51 + .8byte .LVL268 + .8byte .LVL269 .2byte 0x1 - .byte 0x66 - .8byte .LVL335 - .8byte .LVL336 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST109: + .8byte .LVL118 + .8byte .LVL119 + .2byte 0x1 + .byte 0x51 + .8byte .LVL257 + .8byte .LVL260 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST110: + .8byte .LVL254 + .8byte .LVL259 .2byte 0x1 .byte 0x50 - .8byte .LVL336 - .8byte .LVL338 + .8byte .LVL267 + .8byte .LVL269 .2byte 0x1 - .byte 0x66 + .byte 0x50 .8byte 0 .8byte 0 -.LLST34: +.LLST111: + .8byte .LVL252 + .8byte .LVL256 + .2byte 0x1 + .byte 0x51 + .8byte .LVL267 + .8byte .LVL268 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST112: + .8byte .LVL264 + .8byte .LVL266-1 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST113: + .8byte .LVL262 + .8byte .LVL265 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST114: + .8byte .LVL261 + .8byte .LVL263 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST33: .8byte .LVL115 .8byte .LVL116 .2byte 0x1 .byte 0x50 - .8byte .LVL117 - .8byte .LVL118 + .8byte .LVL321 + .8byte .LVL323 .2byte 0x1 .byte 0x50 - .8byte .LVL279 - .8byte .LVL280 + .8byte .LVL333 + .8byte .LVL335 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST34: + .8byte .LVL106 + .8byte .LVL108 + .2byte 0x1 + .byte 0x50 + .8byte .LVL109 + .8byte .LVL110 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 .LLST35: - .8byte .LVL117 - .8byte .LVL119 - .2byte 0x1 - .byte 0x50 - .8byte .LVL300 - .8byte .LVL301 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST36: - .8byte .LVL108 .8byte .LVL109 - .2byte 0x1 - .byte 0x51 - .8byte .LVL114 - .8byte .LVL122 - .2byte 0x1 - .byte 0x51 - .8byte .LVL278 - .8byte .LVL280 - .2byte 0x1 - .byte 0x51 - .8byte .LVL300 - .8byte .LVL302 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST37: - .8byte .LVL113 - .8byte .LVL116 + .8byte .LVL115-1 .2byte 0x1 .byte 0x50 - .8byte .LVL278 - .8byte .LVL279 + .8byte .LVL320 + .8byte .LVL321 .2byte 0x1 .byte 0x50 - .8byte 0 - .8byte 0 -.LLST38: - .8byte .LVL122 - .8byte .LVL124-1 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST39: - .8byte .LVL120 - .8byte .LVL123 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST40: - .8byte .LVL119 - .8byte .LVL121 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST41: - .8byte .LVL132 - .8byte .LVL134 - .2byte 0x1 - .byte 0x50 - .8byte .LVL294 - .8byte .LVL295 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST42: - .8byte .LVL133 - .8byte .LVL136 - .2byte 0x1 - .byte 0x50 - .8byte .LVL310 - .8byte .LVL311 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST43: - .8byte .LVL130 - .8byte .LVL137-1 - .2byte 0x1 - .byte 0x51 - .8byte .LVL294 - .8byte .LVL295 - .2byte 0x1 - .byte 0x51 - .8byte .LVL310 - .8byte .LVL313 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST44: - .8byte .LVL129 - .8byte .LVL131 - .2byte 0x1 - .byte 0x52 - .8byte .LVL133 - .8byte .LVL137-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL294 - .8byte .LVL295 - .2byte 0x1 - .byte 0x52 - .8byte .LVL310 - .8byte .LVL315 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST45: - .8byte .LVL314 - .8byte .LVL316-1 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST46: - .8byte .LVL311 - .8byte .LVL314 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST47: - .8byte .LVL108 - .8byte .LVL111 - .2byte 0x1 - .byte 0x67 - .8byte .LVL135 - .8byte .LVL138 - .2byte 0x1 - .byte 0x67 - .8byte .LVL312 - .8byte .LVL317 - .2byte 0x1 - .byte 0x67 - .8byte .LVL330 - .8byte .LVL331 - .2byte 0x1 - .byte 0x67 - .8byte 0 - .8byte 0 -.LLST48: - .8byte .LVL149 - .8byte .LVL150 - .2byte 0x1 - .byte 0x50 - .8byte .LVL151 - .8byte .LVL152 - .2byte 0x1 - .byte 0x50 - .8byte .LVL283 - .8byte .LVL284 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST49: - .8byte .LVL151 - .8byte .LVL153 - .2byte 0x1 - .byte 0x50 - .8byte .LVL300 - .8byte .LVL301 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST50: - .8byte .LVL108 - .8byte .LVL109 - .2byte 0x1 - .byte 0x51 - .8byte .LVL148 - .8byte .LVL154 - .2byte 0x1 - .byte 0x51 - .8byte .LVL282 - .8byte .LVL284 - .2byte 0x1 - .byte 0x51 - .8byte .LVL300 - .8byte .LVL302 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST51: - .8byte .LVL147 - .8byte .LVL150 - .2byte 0x1 - .byte 0x50 - .8byte .LVL282 - .8byte .LVL283 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST52: - .8byte .LVL156 - .8byte .LVL158-1 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST53: - .8byte .LVL155 - .8byte .LVL157 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST54: - .8byte .LVL154 - .8byte .LVL156 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST55: - .8byte .LVL164 - .8byte .LVL165 - .2byte 0x1 - .byte 0x51 - .8byte .LVL166 - .8byte .LVL167 - .2byte 0x1 - .byte 0x51 - .8byte .LVL285 - .8byte .LVL286 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST56: - .8byte .LVL108 - .8byte .LVL109 - .2byte 0x1 - .byte 0x51 - .8byte .LVL166 - .8byte .LVL169 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST57: - .8byte .LVL163 - .8byte .LVL168 - .2byte 0x1 - .byte 0x50 - .8byte .LVL284 - .8byte .LVL286 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST58: - .8byte .LVL162 - .8byte .LVL165 - .2byte 0x1 - .byte 0x51 - .8byte .LVL284 - .8byte .LVL285 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST59: - .8byte .LVL173 - .8byte .LVL175-1 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST60: - .8byte .LVL171 - .8byte .LVL174 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST61: - .8byte .LVL170 - .8byte .LVL172 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST62: - .8byte .LVL187 - .8byte .LVL188 - .2byte 0x1 - .byte 0x50 - .8byte .LVL296 - .8byte .LVL298 - .2byte 0x1 - .byte 0x50 - .8byte .LVL331 - .8byte .LVL333 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST63: - .8byte .LVL179 - .8byte .LVL180 - .2byte 0x1 - .byte 0x50 - .8byte .LVL181 - .8byte .LVL182 - .2byte 0x1 - .byte 0x50 - .8byte .LVL287 - .8byte .LVL288 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST64: - .8byte .LVL181 - .8byte .LVL187-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL295 - .8byte .LVL296 - .2byte 0x1 - .byte 0x50 - .8byte .LVL296 - .8byte .LVL299-1 - .2byte 0x1 - .byte 0x53 - .8byte .LVL332 - .8byte .LVL333 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST65: - .8byte .LVL178 - .8byte .LVL183 - .2byte 0x1 - .byte 0x51 - .8byte .LVL286 - .8byte .LVL288 - .2byte 0x1 - .byte 0x51 - .8byte .LVL295 - .8byte .LVL297 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST66: - .8byte .LVL177 - .8byte .LVL180 - .2byte 0x1 - .byte 0x50 - .8byte .LVL286 - .8byte .LVL287 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST67: - .8byte .LVL185 - .8byte .LVL187-1 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST68: - .8byte .LVL184 - .8byte .LVL186 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST69: - .8byte .LVL183 - .8byte .LVL185 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST70: - .8byte .LVL201 - .8byte .LVL202 - .2byte 0x1 - .byte 0x50 - .8byte .LVL324 - .8byte .LVL326 - .2byte 0x1 - .byte 0x50 - .8byte .LVL333 - .8byte .LVL335 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST71: - .8byte .LVL193 - .8byte .LVL194 - .2byte 0x1 - .byte 0x50 - .8byte .LVL195 - .8byte .LVL196 - .2byte 0x1 - .byte 0x50 - .8byte .LVL289 - .8byte .LVL290 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST72: - .8byte .LVL195 - .8byte .LVL201-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL323 - .8byte .LVL324 - .2byte 0x1 - .byte 0x50 - .8byte .LVL324 - .8byte .LVL327-1 + .8byte .LVL321 + .8byte .LVL324-1 .2byte 0x1 .byte 0x53 .8byte .LVL334 @@ -60189,225 +60036,463 @@ .byte 0x53 .8byte 0 .8byte 0 -.LLST73: - .8byte .LVL192 +.LLST36: + .8byte .LVL105 + .8byte .LVL111 + .2byte 0x1 + .byte 0x51 + .8byte .LVL320 + .8byte .LVL322 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST37: + .8byte .LVL104 + .8byte .LVL106 + .2byte 0x1 + .byte 0x50 + .8byte .LVL107 + .8byte .LVL108 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST38: + .8byte .LVL113 + .8byte .LVL115-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST39: + .8byte .LVL112 + .8byte .LVL114 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST40: + .8byte .LVL111 + .8byte .LVL113 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST41: + .8byte .LVL129 + .8byte .LVL130 + .2byte 0x1 + .byte 0x51 + .8byte .LVL131 + .8byte .LVL132 + .2byte 0x1 + .byte 0x51 + .8byte .LVL279 + .8byte .LVL280 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST42: + .8byte .LVL118 + .8byte .LVL119 + .2byte 0x1 + .byte 0x51 + .8byte .LVL131 + .8byte .LVL134 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST43: + .8byte .LVL128 + .8byte .LVL133 + .2byte 0x1 + .byte 0x50 + .8byte .LVL278 + .8byte .LVL280 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST44: + .8byte .LVL127 + .8byte .LVL130 + .2byte 0x1 + .byte 0x51 + .8byte .LVL278 + .8byte .LVL279 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST45: + .8byte .LVL138 + .8byte .LVL140-1 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST46: + .8byte .LVL136 + .8byte .LVL139 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST47: + .8byte .LVL135 + .8byte .LVL137 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST48: + .8byte .LVL151 + .8byte .LVL152 + .2byte 0x1 + .byte 0x50 + .8byte .LVL315 + .8byte .LVL317 + .2byte 0x1 + .byte 0x50 + .8byte .LVL331 + .8byte .LVL333 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST49: + .8byte .LVL143 + .8byte .LVL144 + .2byte 0x1 + .byte 0x50 + .8byte .LVL145 + .8byte .LVL146 + .2byte 0x1 + .byte 0x50 + .8byte .LVL281 + .8byte .LVL282 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST50: + .8byte .LVL145 + .8byte .LVL151-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL314 + .8byte .LVL315 + .2byte 0x1 + .byte 0x50 + .8byte .LVL315 + .8byte .LVL318-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL332 + .8byte .LVL333 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST51: + .8byte .LVL142 + .8byte .LVL147 + .2byte 0x1 + .byte 0x51 + .8byte .LVL280 + .8byte .LVL282 + .2byte 0x1 + .byte 0x51 + .8byte .LVL314 + .8byte .LVL316 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST52: + .8byte .LVL141 + .8byte .LVL144 + .2byte 0x1 + .byte 0x50 + .8byte .LVL280 + .8byte .LVL281 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST53: + .8byte .LVL149 + .8byte .LVL151-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST54: + .8byte .LVL148 + .8byte .LVL150 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST55: + .8byte .LVL147 + .8byte .LVL149 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST56: + .8byte .LVL156 + .8byte .LVL157 + .2byte 0x1 + .byte 0x50 + .8byte .LVL158 + .8byte .LVL159 + .2byte 0x1 + .byte 0x50 + .8byte .LVL270 + .8byte .LVL271 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST57: + .8byte .LVL158 + .8byte .LVL160 + .2byte 0x1 + .byte 0x50 + .8byte .LVL295 + .8byte .LVL296 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST58: + .8byte .LVL118 + .8byte .LVL119 + .2byte 0x1 + .byte 0x51 + .8byte .LVL155 + .8byte .LVL161 + .2byte 0x1 + .byte 0x51 + .8byte .LVL269 + .8byte .LVL271 + .2byte 0x1 + .byte 0x51 + .8byte .LVL295 + .8byte .LVL297 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST59: + .8byte .LVL154 + .8byte .LVL157 + .2byte 0x1 + .byte 0x50 + .8byte .LVL269 + .8byte .LVL270 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST60: + .8byte .LVL163 + .8byte .LVL165-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST61: + .8byte .LVL162 + .8byte .LVL164 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST62: + .8byte .LVL161 + .8byte .LVL163 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST63: + .8byte .LVL173 + .8byte .LVL174 + .2byte 0x1 + .byte 0x51 + .8byte .LVL175 + .8byte .LVL176 + .2byte 0x1 + .byte 0x51 + .8byte .LVL285 + .8byte .LVL286 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST64: + .8byte .LVL118 + .8byte .LVL119 + .2byte 0x1 + .byte 0x51 + .8byte .LVL175 + .8byte .LVL178 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST65: + .8byte .LVL172 + .8byte .LVL177 + .2byte 0x1 + .byte 0x50 + .8byte .LVL284 + .8byte .LVL286 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST66: + .8byte .LVL171 + .8byte .LVL174 + .2byte 0x1 + .byte 0x51 + .8byte .LVL284 + .8byte .LVL285 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST67: + .8byte .LVL182 + .8byte .LVL184-1 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST68: + .8byte .LVL180 + .8byte .LVL183 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST69: + .8byte .LVL179 + .8byte .LVL181 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST70: .8byte .LVL197 + .8byte .LVL198 .2byte 0x1 - .byte 0x51 - .8byte .LVL288 + .byte 0x50 + .8byte .LVL291 + .8byte .LVL293 + .2byte 0x1 + .byte 0x50 + .8byte .LVL335 + .8byte .LFE2849 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST71: + .8byte .LVL189 + .8byte .LVL190 + .2byte 0x1 + .byte 0x50 + .8byte .LVL191 + .8byte .LVL192 + .2byte 0x1 + .byte 0x50 + .8byte .LVL283 + .8byte .LVL284 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST72: + .8byte .LVL191 + .8byte .LVL197-1 + .2byte 0x1 + .byte 0x50 .8byte .LVL290 + .8byte .LVL291 + .2byte 0x1 + .byte 0x50 + .8byte .LVL291 + .8byte .LVL294-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL336 + .8byte .LFE2849 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST73: + .8byte .LVL188 + .8byte .LVL193 .2byte 0x1 .byte 0x51 - .8byte .LVL323 - .8byte .LVL325 + .8byte .LVL282 + .8byte .LVL284 + .2byte 0x1 + .byte 0x51 + .8byte .LVL290 + .8byte .LVL292 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 .LLST74: - .8byte .LVL191 - .8byte .LVL194 + .8byte .LVL187 + .8byte .LVL190 .2byte 0x1 .byte 0x50 - .8byte .LVL288 - .8byte .LVL289 + .8byte .LVL282 + .8byte .LVL283 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 .LLST75: - .8byte .LVL199 - .8byte .LVL201-1 + .8byte .LVL195 + .8byte .LVL197-1 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 .LLST76: - .8byte .LVL198 - .8byte .LVL200 + .8byte .LVL194 + .8byte .LVL196 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 .LLST77: - .8byte .LVL197 - .8byte .LVL199 + .8byte .LVL193 + .8byte .LVL195 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 .LLST78: - .8byte .LVL215 - .8byte .LVL216 - .2byte 0x1 - .byte 0x51 - .8byte .LVL217 - .8byte .LVL218 - .2byte 0x1 - .byte 0x51 - .8byte .LVL293 - .8byte .LVL294 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST79: - .8byte .LVL108 - .8byte .LVL109 - .2byte 0x1 - .byte 0x51 - .8byte .LVL217 - .8byte .LVL220 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST80: - .8byte .LVL214 - .8byte .LVL219 + .8byte .LVL202 + .8byte .LVL203 .2byte 0x1 .byte 0x50 - .8byte .LVL292 - .8byte .LVL294 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST81: - .8byte .LVL213 - .8byte .LVL216 - .2byte 0x1 - .byte 0x51 - .8byte .LVL292 - .8byte .LVL293 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST82: - .8byte .LVL224 - .8byte .LVL226-1 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST83: - .8byte .LVL222 - .8byte .LVL225 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST84: - .8byte .LVL221 - .8byte .LVL223 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST85: - .8byte .LVL241 - .8byte .LVL242 - .2byte 0x1 - .byte 0x50 - .8byte .LVL318 - .8byte .LVL320 - .2byte 0x1 - .byte 0x50 - .8byte .LVL338 - .8byte .LFE2849 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST86: - .8byte .LVL233 - .8byte .LVL234 - .2byte 0x1 - .byte 0x50 - .8byte .LVL235 - .8byte .LVL236 - .2byte 0x1 - .byte 0x50 - .8byte .LVL291 - .8byte .LVL292 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST87: - .8byte .LVL235 - .8byte .LVL241-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL317 - .8byte .LVL318 - .2byte 0x1 - .byte 0x50 - .8byte .LVL318 - .8byte .LVL321-1 - .2byte 0x1 - .byte 0x53 - .8byte .LVL339 - .8byte .LFE2849 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST88: - .8byte .LVL232 - .8byte .LVL237 - .2byte 0x1 - .byte 0x51 - .8byte .LVL290 - .8byte .LVL292 - .2byte 0x1 - .byte 0x51 - .8byte .LVL317 - .8byte .LVL319 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST89: - .8byte .LVL231 - .8byte .LVL234 - .2byte 0x1 - .byte 0x50 - .8byte .LVL290 - .8byte .LVL291 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST90: - .8byte .LVL239 - .8byte .LVL241-1 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST91: - .8byte .LVL238 - .8byte .LVL240 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST92: - .8byte .LVL237 - .8byte .LVL239 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST93: - .8byte .LVL251 - .8byte .LVL252 - .2byte 0x1 - .byte 0x50 - .8byte .LVL253 - .8byte .LVL254 + .8byte .LVL204 + .8byte .LVL205 .2byte 0x1 .byte 0x50 .8byte .LVL277 @@ -60416,148 +60501,337 @@ .byte 0x50 .8byte 0 .8byte 0 -.LLST94: - .8byte .LVL253 - .8byte .LVL255 +.LLST79: + .8byte .LVL204 + .8byte .LVL206 .2byte 0x1 .byte 0x50 - .8byte .LVL302 - .8byte .LVL304 + .8byte .LVL297 + .8byte .LVL299 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST95: - .8byte .LVL250 - .8byte .LVL256 +.LLST80: + .8byte .LVL201 + .8byte .LVL207 .2byte 0x1 .byte 0x51 .8byte .LVL275 .8byte .LVL278 .2byte 0x1 .byte 0x51 - .8byte .LVL302 - .8byte .LVL303 + .8byte .LVL297 + .8byte .LVL298 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST96: - .8byte .LVL248 - .8byte .LVL257-1 +.LLST81: + .8byte .LVL200 + .8byte .LVL208-1 .2byte 0x1 .byte 0x52 .8byte .LVL275 .8byte .LVL276 .2byte 0x1 .byte 0x52 - .8byte .LVL302 - .8byte .LVL306 + .8byte .LVL297 + .8byte .LVL301 .2byte 0x1 .byte 0x52 .8byte 0 .8byte 0 -.LLST97: - .8byte .LVL307 - .8byte .LVL309-1 +.LLST82: + .8byte .LVL302 + .8byte .LVL304-1 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 +.LLST83: + .8byte .LVL300 + .8byte .LVL303 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST84: + .8byte .LVL299 + .8byte .LVL302 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST85: + .8byte .LVL211 + .8byte .LVL212 + .2byte 0x1 + .byte 0x50 + .8byte .LVL213 + .8byte .LVL214 + .2byte 0x1 + .byte 0x50 + .8byte .LVL274 + .8byte .LVL275 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST86: + .8byte .LVL213 + .8byte .LVL215 + .2byte 0x1 + .byte 0x50 + .8byte .LVL295 + .8byte .LVL296 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST87: + .8byte .LVL118 + .8byte .LVL119 + .2byte 0x1 + .byte 0x51 + .8byte .LVL210 + .8byte .LVL216 + .2byte 0x1 + .byte 0x51 + .8byte .LVL273 + .8byte .LVL275 + .2byte 0x1 + .byte 0x51 + .8byte .LVL295 + .8byte .LVL297 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST88: + .8byte .LVL209 + .8byte .LVL212 + .2byte 0x1 + .byte 0x50 + .8byte .LVL273 + .8byte .LVL274 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST89: + .8byte .LVL218 + .8byte .LVL220-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST90: + .8byte .LVL217 + .8byte .LVL219 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST91: + .8byte .LVL216 + .8byte .LVL218 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST92: + .8byte .LVL118 + .8byte .LVL120 + .2byte 0x1 + .byte 0x66 + .8byte .LVL238 + .8byte .LVL240 + .2byte 0x1 + .byte 0x66 + .8byte .LVL326 + .8byte .LVL328 + .2byte 0x1 + .byte 0x66 + .8byte .LVL328 + .8byte .LVL329 + .2byte 0x1 + .byte 0x50 + .8byte .LVL329 + .8byte .LVL331 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST93: + .8byte .LVL228 + .8byte .LVL229 + .2byte 0x1 + .byte 0x50 + .8byte .LVL230 + .8byte .LVL231 + .2byte 0x1 + .byte 0x50 + .8byte .LVL272 + .8byte .LVL273 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST94: + .8byte .LVL230 + .8byte .LVL232 + .2byte 0x1 + .byte 0x50 + .8byte .LVL295 + .8byte .LVL296 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST95: + .8byte .LVL118 + .8byte .LVL119 + .2byte 0x1 + .byte 0x51 + .8byte .LVL227 + .8byte .LVL235 + .2byte 0x1 + .byte 0x51 + .8byte .LVL271 + .8byte .LVL273 + .2byte 0x1 + .byte 0x51 + .8byte .LVL295 + .8byte .LVL297 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST96: + .8byte .LVL226 + .8byte .LVL229 + .2byte 0x1 + .byte 0x50 + .8byte .LVL271 + .8byte .LVL272 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST97: + .8byte .LVL235 + .8byte .LVL237-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 .LLST98: + .8byte .LVL233 + .8byte .LVL236 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST99: + .8byte .LVL232 + .8byte .LVL234 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST100: + .8byte .LVL245 + .8byte .LVL247 + .2byte 0x1 + .byte 0x50 + .8byte .LVL286 + .8byte .LVL287 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST101: + .8byte .LVL246 + .8byte .LVL249 + .2byte 0x1 + .byte 0x50 + .8byte .LVL305 + .8byte .LVL306 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST102: + .8byte .LVL243 + .8byte .LVL250-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL286 + .8byte .LVL287 + .2byte 0x1 + .byte 0x51 .8byte .LVL305 .8byte .LVL308 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST99: - .8byte .LVL304 - .8byte .LVL307 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST100: - .8byte .LVL261 - .8byte .LVL262 - .2byte 0x1 - .byte 0x50 - .8byte .LVL263 - .8byte .LVL264 - .2byte 0x1 - .byte 0x50 - .8byte .LVL281 - .8byte .LVL282 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST101: - .8byte .LVL263 - .8byte .LVL265 - .2byte 0x1 - .byte 0x50 - .8byte .LVL300 - .8byte .LVL301 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST102: - .8byte .LVL108 - .8byte .LVL109 - .2byte 0x1 - .byte 0x51 - .8byte .LVL260 - .8byte .LVL266 - .2byte 0x1 - .byte 0x51 - .8byte .LVL280 - .8byte .LVL282 - .2byte 0x1 - .byte 0x51 - .8byte .LVL300 - .8byte .LVL302 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 .LLST103: - .8byte .LVL259 - .8byte .LVL262 + .8byte .LVL242 + .8byte .LVL244 .2byte 0x1 - .byte 0x50 - .8byte .LVL280 - .8byte .LVL281 + .byte 0x52 + .8byte .LVL246 + .8byte .LVL250-1 .2byte 0x1 - .byte 0x50 + .byte 0x52 + .8byte .LVL286 + .8byte .LVL287 + .2byte 0x1 + .byte 0x52 + .8byte .LVL305 + .8byte .LVL310 + .2byte 0x1 + .byte 0x52 .8byte 0 .8byte 0 .LLST104: - .8byte .LVL268 - .8byte .LVL270-1 + .8byte .LVL309 + .8byte .LVL311-1 .2byte 0x1 - .byte 0x51 + .byte 0x50 .8byte 0 .8byte 0 .LLST105: - .8byte .LVL267 - .8byte .LVL269 + .8byte .LVL306 + .8byte .LVL309 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 .LLST106: - .8byte .LVL266 - .8byte .LVL268 + .8byte .LVL117 + .8byte .LVL121 .2byte 0x1 - .byte 0x51 + .byte 0x67 + .8byte .LVL248 + .8byte .LVL251 + .2byte 0x1 + .byte 0x67 + .8byte .LVL307 + .8byte .LVL312 + .2byte 0x1 + .byte 0x67 + .8byte .LVL327 + .8byte .LVL328 + .2byte 0x1 + .byte 0x67 .8byte 0 .8byte 0 -.LLST185: - .8byte .LVL654 - .8byte .LVL655-1 +.LLST193: + .8byte .LVL651 + .8byte .LVL652-1 .2byte 0x1 .byte 0x50 .8byte 0 @@ -60569,267 +60843,181 @@ .byte 0x50 .8byte 0 .8byte 0 -.LLST348: - .8byte .LVL1323 - .8byte .LVL1324 +.LLST356: + .8byte .LVL1315 + .8byte .LVL1316 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST349: - .8byte .LVL1325 - .8byte .LVL1421 +.LLST357: + .8byte .LVL1318 + .8byte .LVL1323 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1327 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST358: + .8byte .LVL1403 + .8byte .LVL1408 .2byte 0x1 .byte 0x63 - .8byte .LVL1425 + .8byte .LVL1443 + .8byte .LVL1450 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1483 + .8byte .LVL1496 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1497 + .8byte .LVL1498 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1505 + .8byte .LVL1508 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1514 + .8byte .LVL1518 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1522 + .8byte .LVL1525 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1531 + .8byte .LVL1533 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1567 + .8byte .LVL1569 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1578 + .8byte .LVL1580 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1582 + .8byte .LVL1584 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1593 + .8byte .LVL1596 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST359: + .8byte .LVL1485 + .8byte .LVL1488 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1516 + .8byte .LVL1517-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST360: + .8byte .LVL1317 + .8byte .LVL1323 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1327 + .8byte .LVL1403 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1407 + .8byte .LVL1443 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1450 + .8byte .LVL1483 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1496 + .8byte .LVL1498 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1505 + .8byte .LVL1514 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1518 + .8byte .LVL1522 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1525 + .8byte .LVL1557 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1557 + .8byte .LVL1558 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1558 + .8byte .LVL1561 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1567 + .8byte .LVL1578 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1580 + .8byte .LVL1593 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1607 .8byte .LFE2844 .2byte 0x1 .byte 0x63 .8byte 0 .8byte 0 -.LLST350: - .8byte .LVL1326 - .8byte .LVL1340 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1366 - .8byte .LVL1373 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1389 - .8byte .LVL1392 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1400 - .8byte .LVL1423 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1425 - .8byte .LVL1437 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1441 - .8byte .LVL1460 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1462 - .8byte .LVL1473 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1480 - .8byte .LVL1481 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1485 - .8byte .LVL1564 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1570 - .8byte .LVL1620 - .2byte 0x1 - .byte 0x69 - .8byte 0 - .8byte 0 -.LLST351: - .8byte .LVL1464 - .8byte .LVL1468 - .2byte 0x1 - .byte 0x51 - .8byte .LVL1493 - .8byte .LVL1494-1 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST352: - .8byte .LVL1326 - .8byte .LVL1327 +.LLST387: + .8byte .LVL1414 + .8byte .LVL1415 .2byte 0x1 .byte 0x50 - .8byte .LVL1404 - .8byte .LVL1405 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1430 - .8byte .LVL1432 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1448 - .8byte .LVL1449 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1457 - .8byte .LVL1458 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1471 - .8byte .LVL1472 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1526 .8byte .LVL1527 + .8byte .LVL1528-1 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST379: - .8byte .LVL1416 - .8byte .LVL1417 +.LLST402: + .8byte .LVL1553 + .8byte .LVL1554 .2byte 0x1 .byte 0x50 - .8byte .LVL1539 - .8byte .LVL1540-1 + .8byte .LVL1618 + .8byte .LVL1619-1 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 .LLST388: - .8byte .LVL1535 - .8byte .LVL1536 + .8byte .LVL1427 + .8byte .LVL1429-1 .2byte 0x1 - .byte 0x50 - .8byte .LVL1614 - .8byte .LVL1615-1 + .byte 0x51 + .8byte .LVL1533 + .8byte .LVL1534 .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST380: - .8byte .LVL1326 - .8byte .LVL1340 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1366 - .8byte .LVL1373 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1389 - .8byte .LVL1392 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1400 - .8byte .LVL1406 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1410 - .8byte .LVL1423 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1425 - .8byte .LVL1460 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1480 - .8byte .LVL1481 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1485 - .8byte .LVL1486 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1501 - .8byte .LVL1562 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1570 - .8byte .LVL1618 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1627 - .8byte .LFE2844 - .2byte 0x1 - .byte 0x69 - .8byte 0 - .8byte 0 -.LLST381: - .8byte .LVL1441 - .8byte .LVL1442-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1628 - .8byte .LVL1629 - .2byte 0x1 - .byte 0x50 + .byte 0x51 .8byte 0 .8byte 0 .LLST389: - .8byte .LVL1560 - .8byte .LVL1561-1 + .8byte .LVL1319 + .8byte .LVL1325 .2byte 0x1 - .byte 0x50 - .8byte .LVL1593 - .8byte .LVL1594-1 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST387: - .8byte .LVL1518 - .8byte .LVL1519-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1550 - .8byte .LVL1551 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST390: - .8byte .LVL1550 - .8byte .LVL1551 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1597 - .8byte .LVL1598-1 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST384: - .8byte .LVL1407 - .8byte .LVL1408 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1489 - .8byte .LVL1490-1 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST382: - .8byte .LVL1326 - .8byte .LVL1343 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1365 - .8byte .LVL1373 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1389 - .8byte .LVL1392 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1400 - .8byte .LVL1423 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1425 - .8byte .LVL1465 - .2byte 0x1 - .byte 0x6a - .8byte .LVL1466 - .8byte .LVL1467 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1467 - .8byte .LFE2844 - .2byte 0x1 - .byte 0x6a - .8byte 0 - .8byte 0 -.LLST385: - .8byte .LVL1326 - .8byte .LVL1340 + .byte 0x69 + .8byte .LVL1327 + .8byte .LVL1341 .2byte 0x1 .byte 0x69 .8byte .LVL1366 @@ -60841,281 +61029,403 @@ .2byte 0x1 .byte 0x69 .8byte .LVL1400 - .8byte .LVL1406 + .8byte .LVL1436 .2byte 0x1 .byte 0x69 - .8byte .LVL1410 - .8byte .LVL1423 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1425 .8byte .LVL1437 + .8byte .LVL1438 .2byte 0x1 .byte 0x69 - .8byte .LVL1441 - .8byte .LVL1460 + .8byte .LVL1442 + .8byte .LVL1484 .2byte 0x1 .byte 0x69 - .8byte .LVL1470 - .8byte .LVL1473 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1480 - .8byte .LVL1481 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1485 - .8byte .LVL1486 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1499 - .8byte .LVL1562 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1570 - .8byte .LVL1618 - .2byte 0x1 - .byte 0x69 - .8byte .LVL1620 - .8byte .LVL1627 - .2byte 0x1 - .byte 0x69 - .8byte 0 - .8byte 0 -.LLST386: - .8byte .LVL1499 - .8byte .LVL1500-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1624 - .8byte .LVL1625 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST383: - .8byte .LVL1477 - .8byte .LVL1478 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1566 - .8byte .LVL1567-1 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST353: - .8byte .LVL1326 - .8byte .LVL1329 - .2byte 0x1 - .byte 0x68 - .8byte .LVL1401 - .8byte .LVL1402 - .2byte 0x1 - .byte 0x68 - .8byte .LVL1419 - .8byte .LVL1422 - .2byte 0x1 - .byte 0x68 - .8byte .LVL1503 + .8byte .LVL1505 .8byte .LVL1515 .2byte 0x1 - .byte 0x68 - .8byte .LVL1527 - .8byte .LVL1529 + .byte 0x69 + .8byte .LVL1518 + .8byte .LVL1524 .2byte 0x1 - .byte 0x68 - .8byte .LVL1572 - .8byte .LVL1588 + .byte 0x69 + .8byte .LVL1525 + .8byte .LVL1561 .2byte 0x1 - .byte 0x68 + .byte 0x69 + .8byte .LVL1567 + .8byte .LVL1593 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1607 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x69 .8byte 0 .8byte 0 -.LLST354: - .8byte .LVL1506 - .8byte .LVL1507 +.LLST390: + .8byte .LVL1428 + .8byte .LVL1429-1 .2byte 0x1 .byte 0x50 - .8byte .LVL1511 - .8byte .LVL1512 + .8byte .LVL1544 + .8byte .LVL1545 .2byte 0x1 .byte 0x50 - .8byte 0 - .8byte 0 -.LLST355: - .8byte .LVL1326 - .8byte .LVL1328-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL1419 - .8byte .LVL1420 - .2byte 0x1 - .byte 0x52 - .8byte .LVL1505 - .8byte .LVL1508-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL1510 - .8byte .LVL1511-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL1511 - .8byte .LVL1513-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL1527 - .8byte .LVL1528-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL1572 - .8byte .LVL1573-1 - .2byte 0x1 - .byte 0x52 .8byte 0 .8byte 0 .LLST391: - .8byte .LVL1575 - .8byte .LVL1576-1 + .8byte .LVL1539 + .8byte .LVL1540 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1542 + .8byte .LVL1543 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST395: + .8byte .LVL1480 + .8byte .LVL1481-1 .2byte 0x1 .byte 0x50 - .8byte .LVL1578 - .8byte .LVL1579-1 + .8byte .LVL1628 + .8byte .LVL1629-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST404: + .8byte .LVL1574 + .8byte .LVL1575 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1589 + .8byte .LVL1590-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST403: + .8byte .LVL1574 + .8byte .LVL1575 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1633 + .8byte .LVL1634-1 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 .LLST392: - .8byte .LVL1326 + .8byte .LVL1404 + .8byte .LVL1405 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1446 + .8byte .LVL1447-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST401: + .8byte .LVL1319 + .8byte .LVL1325 + .2byte 0x1 + .byte 0x69 .8byte .LVL1327 + .8byte .LVL1341 .2byte 0x1 - .byte 0x50 - .8byte .LVL1401 - .8byte .LVL1402 + .byte 0x69 + .8byte .LVL1366 + .8byte .LVL1373 .2byte 0x1 - .byte 0x50 + .byte 0x69 + .8byte .LVL1389 + .8byte .LVL1392 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1400 + .8byte .LVL1436 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1437 + .8byte .LVL1438 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1442 + .8byte .LVL1486 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1487 + .8byte .LVL1536 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1547 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST396: + .8byte .LVL1493 + .8byte .LVL1495-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1593 + .8byte .LVL1594 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST397: + .8byte .LVL1494 + .8byte .LVL1496 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1497 + .8byte .LVL1498 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1582 .8byte .LVL1584 - .8byte .LVL1585-1 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1596 + .8byte .LVL1607 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST398: + .8byte .LVL1494 + .8byte .LVL1495-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1604 + .8byte .LVL1605 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST356: - .8byte .LVL1337 - .8byte .LVL1369-1 +.LLST399: + .8byte .LVL1599 + .8byte .LVL1600 .2byte 0x1 - .byte 0x56 - .8byte .LVL1373 - .8byte .LVL1389 + .byte 0x51 + .8byte .LVL1602 + .8byte .LVL1603 .2byte 0x1 - .byte 0x56 - .8byte .LVL1392 - .8byte .LVL1400 - .2byte 0x1 - .byte 0x56 - .8byte .LVL1413 - .8byte .LVL1414-1 - .2byte 0x1 - .byte 0x56 - .8byte .LVL1428 - .8byte .LVL1429-1 - .2byte 0x1 - .byte 0x56 + .byte 0x51 .8byte 0 .8byte 0 -.LLST357: - .8byte .LVL1336 - .8byte .LVL1369-1 +.LLST400: + .8byte .LVL1502 + .8byte .LVL1503 .2byte 0x1 - .byte 0x5a - .8byte .LVL1373 - .8byte .LVL1389 + .byte 0x50 + .8byte .LVL1563 + .8byte .LVL1564-1 .2byte 0x1 - .byte 0x5a - .8byte .LVL1392 - .8byte .LVL1400 - .2byte 0x1 - .byte 0x5a - .8byte .LVL1413 - .8byte .LVL1414-1 - .2byte 0x1 - .byte 0x5a - .8byte .LVL1428 - .8byte .LVL1429-1 - .2byte 0x1 - .byte 0x5a - .8byte 0 - .8byte 0 -.LLST358: - .8byte .LVL1338 - .8byte .LVL1369-1 - .2byte 0x1 - .byte 0x59 - .8byte .LVL1373 - .8byte .LVL1389 - .2byte 0x1 - .byte 0x59 - .8byte .LVL1392 - .8byte .LVL1400 - .2byte 0x1 - .byte 0x59 - .8byte .LVL1413 - .8byte .LVL1414-1 - .2byte 0x1 - .byte 0x59 - .8byte .LVL1428 - .8byte .LVL1429-1 - .2byte 0x1 - .byte 0x59 - .8byte 0 - .8byte 0 -.LLST359: - .8byte .LVL1339 - .8byte .LVL1369-1 - .2byte 0x1 - .byte 0x58 - .8byte .LVL1373 - .8byte .LVL1389 - .2byte 0x1 - .byte 0x58 - .8byte .LVL1392 - .8byte .LVL1400 - .2byte 0x1 - .byte 0x58 - .8byte .LVL1413 - .8byte .LVL1414-1 - .2byte 0x1 - .byte 0x58 - .8byte .LVL1428 - .8byte .LVL1429-1 - .2byte 0x1 - .byte 0x58 - .8byte 0 - .8byte 0 -.LLST360: - .8byte .LVL1335 - .8byte .LVL1369-1 - .2byte 0x1 - .byte 0x55 - .8byte .LVL1373 - .8byte .LVL1389 - .2byte 0x1 - .byte 0x55 - .8byte .LVL1392 - .8byte .LVL1400 - .2byte 0x1 - .byte 0x55 - .8byte .LVL1413 - .8byte .LVL1414-1 - .2byte 0x1 - .byte 0x55 - .8byte .LVL1428 - .8byte .LVL1429-1 - .2byte 0x1 - .byte 0x55 + .byte 0x50 .8byte 0 .8byte 0 .LLST361: - .8byte .LVL1330 + .8byte .LVL1319 + .8byte .LVL1324 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1327 + .8byte .LVL1329 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1400 + .8byte .LVL1402 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1450 + .8byte .LVL1476 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1547 + .8byte .LVL1549 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1623 + .8byte .LVL1626 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1636 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST362: + .8byte .LVL1455 + .8byte .LVL1456 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1461 + .8byte .LVL1462 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST363: + .8byte .LVL1453 + .8byte .LVL1454 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1459 + .8byte .LVL1460 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST393: + .8byte .LVL1465 + .8byte .LVL1466-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1468 + .8byte .LVL1469-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST394: + .8byte .LVL1319 + .8byte .LVL1320 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1321 + .8byte .LVL1322 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1474 + .8byte .LVL1475-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST364: + .8byte .LVL1338 + .8byte .LVL1369-1 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1373 + .8byte .LVL1389 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1392 + .8byte .LVL1400 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1411 + .8byte .LVL1412-1 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1419 + .8byte .LVL1420-1 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST365: + .8byte .LVL1337 + .8byte .LVL1369-1 + .2byte 0x1 + .byte 0x58 + .8byte .LVL1373 + .8byte .LVL1389 + .2byte 0x1 + .byte 0x58 + .8byte .LVL1392 + .8byte .LVL1400 + .2byte 0x1 + .byte 0x58 + .8byte .LVL1411 + .8byte .LVL1412-1 + .2byte 0x1 + .byte 0x58 + .8byte .LVL1419 + .8byte .LVL1420-1 + .2byte 0x1 + .byte 0x58 + .8byte 0 + .8byte 0 +.LLST366: + .8byte .LVL1339 + .8byte .LVL1369-1 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1373 + .8byte .LVL1389 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1392 + .8byte .LVL1400 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1411 + .8byte .LVL1412-1 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1419 + .8byte .LVL1420-1 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST367: + .8byte .LVL1340 + .8byte .LVL1369-1 + .2byte 0x1 + .byte 0x5a + .8byte .LVL1373 + .8byte .LVL1389 + .2byte 0x1 + .byte 0x5a + .8byte .LVL1392 + .8byte .LVL1400 + .2byte 0x1 + .byte 0x5a + .8byte .LVL1411 + .8byte .LVL1412-1 + .2byte 0x1 + .byte 0x5a + .8byte .LVL1419 + .8byte .LVL1420-1 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST368: + .8byte .LVL1336 + .8byte .LVL1369-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1373 + .8byte .LVL1389 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1392 + .8byte .LVL1400 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1411 + .8byte .LVL1412-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1419 + .8byte .LVL1420-1 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST369: + .8byte .LVL1331 .8byte .LVL1345 .2byte 0x1 .byte 0x50 @@ -61125,7 +61435,7 @@ .byte 0x50 .8byte 0 .8byte 0 -.LLST362: +.LLST370: .8byte .LVL1349 .8byte .LVL1363 .2byte 0x1 @@ -61140,8 +61450,12 @@ .byte 0x50 .8byte 0 .8byte 0 -.LLST363: +.LLST371: + .8byte .LVL1319 .8byte .LVL1326 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1327 .8byte .LVL1347 .2byte 0x1 .byte 0x6b @@ -61154,17 +61468,13 @@ .2byte 0x1 .byte 0x6b .8byte .LVL1400 - .8byte .LVL1424 - .2byte 0x1 - .byte 0x6b - .8byte .LVL1425 .8byte .LFE2844 .2byte 0x1 .byte 0x6b .8byte 0 .8byte 0 -.LLST364: - .8byte .LVL1341 +.LLST372: + .8byte .LVL1342 .8byte .LVL1361 .2byte 0x1 .byte 0x53 @@ -61192,19 +61502,19 @@ .8byte .LVL1400 .2byte 0x1 .byte 0x53 - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x53 - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 -.LLST365: - .8byte .LVL1341 +.LLST373: .8byte .LVL1342 + .8byte .LVL1343 .2byte 0x1 .byte 0x51 .8byte .LVL1348 @@ -61219,22 +61529,18 @@ .8byte .LVL1400 .2byte 0x1 .byte 0x51 - .8byte .LVL1413 - .8byte .LVL1414-1 - .2byte 0x1 - .byte 0x51 - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST366: - .8byte .LVL1341 +.LLST374: .8byte .LVL1342 + .8byte .LVL1343 .2byte 0x1 .byte 0x54 - .8byte .LVL1342 + .8byte .LVL1343 .8byte .LVL1348 .2byte 0x1 .byte 0x51 @@ -61242,18 +61548,18 @@ .8byte .LVL1369-1 .2byte 0x1 .byte 0x54 - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x54 - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x54 .8byte 0 .8byte 0 -.LLST367: - .8byte .LVL1334 +.LLST375: + .8byte .LVL1335 .8byte .LVL1369-1 .2byte 0x1 .byte 0x61 @@ -61265,43 +61571,43 @@ .8byte .LVL1400 .2byte 0x1 .byte 0x61 - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x61 - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x61 .8byte 0 .8byte 0 -.LLST368: - .8byte .LVL1331 - .8byte .LVL1369-1 - .2byte 0x1 - .byte 0x5b - .8byte .LVL1373 - .8byte .LVL1389 - .2byte 0x1 - .byte 0x5b - .8byte .LVL1392 - .8byte .LVL1400 - .2byte 0x1 - .byte 0x5b - .8byte .LVL1413 - .8byte .LVL1414-1 - .2byte 0x1 - .byte 0x5b - .8byte .LVL1428 - .8byte .LVL1429-1 - .2byte 0x1 - .byte 0x5b - .8byte 0 - .8byte 0 -.LLST369: +.LLST376: .8byte .LVL1332 .8byte .LVL1369-1 .2byte 0x1 + .byte 0x5b + .8byte .LVL1373 + .8byte .LVL1389 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1392 + .8byte .LVL1400 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1411 + .8byte .LVL1412-1 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1419 + .8byte .LVL1420-1 + .2byte 0x1 + .byte 0x5b + .8byte 0 + .8byte 0 +.LLST377: + .8byte .LVL1333 + .8byte .LVL1369-1 + .2byte 0x1 .byte 0x5e .8byte .LVL1373 .8byte .LVL1389 @@ -61311,18 +61617,18 @@ .8byte .LVL1400 .2byte 0x1 .byte 0x5e - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x5e - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x5e .8byte 0 .8byte 0 -.LLST370: - .8byte .LVL1333 +.LLST378: + .8byte .LVL1334 .8byte .LVL1369-1 .2byte 0x1 .byte 0x62 @@ -61334,18 +61640,18 @@ .8byte .LVL1400 .2byte 0x1 .byte 0x62 - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x62 - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x62 .8byte 0 .8byte 0 -.LLST371: - .8byte .LVL1341 +.LLST379: + .8byte .LVL1342 .8byte .LVL1346 .2byte 0x1 .byte 0x6e @@ -61373,18 +61679,18 @@ .8byte .LVL1397 .2byte 0x1 .byte 0x6e - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x6e - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x6e .8byte 0 .8byte 0 -.LLST372: - .8byte .LVL1341 +.LLST380: + .8byte .LVL1342 .8byte .LVL1344 .2byte 0x1 .byte 0x53 @@ -61404,18 +61710,18 @@ .8byte .LVL1397 .2byte 0x1 .byte 0x53 - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x53 - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 -.LLST373: - .8byte .LVL1341 +.LLST381: + .8byte .LVL1342 .8byte .LVL1369-1 .2byte 0x1 .byte 0x52 @@ -61427,18 +61733,18 @@ .8byte .LVL1400 .2byte 0x1 .byte 0x52 - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x52 - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x52 .8byte 0 .8byte 0 -.LLST374: - .8byte .LVL1341 +.LLST382: + .8byte .LVL1342 .8byte .LVL1346 .2byte 0x1 .byte 0x6e @@ -61447,6 +61753,65 @@ .2byte 0x1 .byte 0x6e .8byte .LVL1352 + .8byte .LVL1353 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1354 + .8byte .LVL1355 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1356 + .8byte .LVL1357 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1358 + .8byte .LVL1359 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1360 + .8byte .LVL1369-1 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1373 + .8byte .LVL1374 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1375 + .8byte .LVL1376 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1381 + .8byte .LVL1382 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1385 + .8byte .LVL1386 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1392 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1396 + .8byte .LVL1397 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1411 + .8byte .LVL1412-1 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1419 + .8byte .LVL1420-1 + .2byte 0x1 + .byte 0x6e + .8byte 0 + .8byte 0 +.LLST383: + .8byte .LVL1342 + .8byte .LVL1346 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1351 .8byte .LVL1353 .2byte 0x1 .byte 0x6e @@ -61482,26 +61847,22 @@ .8byte .LVL1397 .2byte 0x1 .byte 0x6e - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x6e - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x6e .8byte 0 .8byte 0 -.LLST375: - .8byte .LVL1341 +.LLST384: + .8byte .LVL1342 .8byte .LVL1346 .2byte 0x1 .byte 0x6e - .8byte .LVL1351 .8byte .LVL1353 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1354 .8byte .LVL1355 .2byte 0x1 .byte 0x6e @@ -61541,26 +61902,22 @@ .8byte .LVL1400 .2byte 0x1 .byte 0x6e - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x6e - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x6e .8byte 0 .8byte 0 -.LLST376: - .8byte .LVL1341 +.LLST385: + .8byte .LVL1342 .8byte .LVL1346 .2byte 0x1 .byte 0x6e - .8byte .LVL1353 .8byte .LVL1355 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1356 .8byte .LVL1357 .2byte 0x1 .byte 0x6e @@ -61592,26 +61949,22 @@ .8byte .LVL1398 .2byte 0x1 .byte 0x6e - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x6e - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x6e .8byte 0 .8byte 0 -.LLST377: - .8byte .LVL1341 +.LLST386: + .8byte .LVL1342 .8byte .LVL1346 .2byte 0x1 .byte 0x6e - .8byte .LVL1355 .8byte .LVL1357 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1358 .8byte .LVL1359 .2byte 0x1 .byte 0x6e @@ -61643,334 +61996,279 @@ .8byte .LVL1399 .2byte 0x1 .byte 0x6e - .8byte .LVL1413 - .8byte .LVL1414-1 + .8byte .LVL1411 + .8byte .LVL1412-1 .2byte 0x1 .byte 0x6e - .8byte .LVL1428 - .8byte .LVL1429-1 + .8byte .LVL1419 + .8byte .LVL1420-1 .2byte 0x1 .byte 0x6e .8byte 0 .8byte 0 -.LLST378: - .8byte .LVL1341 - .8byte .LVL1346 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1357 - .8byte .LVL1359 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1360 - .8byte .LVL1369-1 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1373 - .8byte .LVL1374 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1375 - .8byte .LVL1376 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1381 - .8byte .LVL1382 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1385 - .8byte .LVL1386 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1392 - .8byte .LVL1393 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1396 - .8byte .LVL1397 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1413 - .8byte .LVL1414-1 - .2byte 0x1 - .byte 0x6e - .8byte .LVL1428 - .8byte .LVL1429-1 - .2byte 0x1 - .byte 0x6e - .8byte 0 - .8byte 0 -.LLST186: - .8byte .LVL656 - .8byte .LVL657 +.LLST194: + .8byte .LVL653 + .8byte .LVL654 .2byte 0x1 .byte 0x50 - .8byte .LVL657 + .8byte .LVL654 + .8byte .LVL661 + .2byte 0x1 + .byte 0x64 .8byte .LVL664 - .2byte 0x1 - .byte 0x64 - .8byte .LVL667 - .8byte .LVL673 + .8byte .LVL670 .2byte 0x1 .byte 0x64 .8byte 0 .8byte 0 -.LLST187: +.LLST195: + .8byte .LVL653 .8byte .LVL656 - .8byte .LVL659 .2byte 0x1 .byte 0x51 - .8byte .LVL659 - .8byte .LVL666 + .8byte .LVL656 + .8byte .LVL663 .2byte 0x1 .byte 0x66 - .8byte .LVL667 + .8byte .LVL664 .8byte .LFE2840 .2byte 0x1 .byte 0x66 .8byte 0 .8byte 0 -.LLST188: +.LLST196: + .8byte .LVL655 .8byte .LVL658 - .8byte .LVL661 .2byte 0x2 .byte 0x70 .sleb128 -12 - .8byte .LVL661 - .8byte .LVL668 + .8byte .LVL658 + .8byte .LVL665 .2byte 0x2 .byte 0x91 .sleb128 20 + .8byte .LVL665 .8byte .LVL668 - .8byte .LVL671 .2byte 0x2 .byte 0x70 .sleb128 -12 - .8byte .LVL671 + .8byte .LVL668 .8byte .LFE2840 .2byte 0x2 .byte 0x91 .sleb128 20 .8byte 0 .8byte 0 -.LLST393: - .8byte .LVL1631 - .8byte .LVL1632 +.LLST405: + .8byte .LVL1639 + .8byte .LVL1640 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST286: - .8byte .LVL992 - .8byte .LVL993 +.LLST294: + .8byte .LVL982 + .8byte .LVL983 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST285: +.LLST293: + .8byte .LVL952 .8byte .LVL955 + .2byte 0x1 + .byte 0x50 + .8byte .LVL955 + .8byte .LVL958 + .2byte 0x1 + .byte 0x64 + .8byte .LVL958 .8byte .LVL959 .2byte 0x1 .byte 0x50 - .8byte .LVL960 - .8byte .LVL961 - .2byte 0x1 - .byte 0x50 - .8byte .LVL961 + .8byte .LVL959 .8byte .LVL965 .2byte 0x1 .byte 0x64 + .8byte .LVL965 .8byte .LVL966 - .8byte .LVL967 .2byte 0x1 .byte 0x50 - .8byte .LVL967 - .8byte .LVL973 + .8byte .LVL966 + .8byte .LVL970 .2byte 0x1 .byte 0x64 - .8byte .LVL973 - .8byte .LVL974 - .2byte 0x1 - .byte 0x50 - .8byte .LVL974 - .8byte .LVL978 - .2byte 0x1 - .byte 0x64 - .8byte .LVL979 - .8byte .LVL985 - .2byte 0x1 - .byte 0x64 - .8byte .LVL986 + .8byte .LVL971 .8byte .LFE2835 .2byte 0x1 .byte 0x64 .8byte 0 .8byte 0 -.LLST233: - .8byte .LVL792 - .8byte .LVL793 +.LLST241: + .8byte .LVL789 + .8byte .LVL790 .2byte 0x1 .byte 0x50 - .8byte .LVL798 - .8byte .LVL799 + .8byte .LVL795 + .8byte .LVL796 .2byte 0x1 .byte 0x52 + .8byte .LVL799 .8byte .LVL802 - .8byte .LVL805 .2byte 0x1 .byte 0x50 - .8byte .LVL812 - .8byte .LVL813 + .8byte .LVL809 + .8byte .LVL810 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST234: - .8byte .LVL792 - .8byte .LVL794 +.LLST242: + .8byte .LVL789 + .8byte .LVL791 .2byte 0x1 .byte 0x51 - .8byte .LVL794 - .8byte .LVL817 - .2byte 0x1 - .byte 0x69 - .8byte .LVL819 - .8byte .LFE2827 - .2byte 0x1 - .byte 0x69 - .8byte 0 - .8byte 0 -.LLST235: - .8byte .LVL792 - .8byte .LVL804 - .2byte 0x1 - .byte 0x52 - .8byte .LVL804 - .8byte .LVL808 - .2byte 0x1 - .byte 0x5d - .8byte .LVL808 - .8byte .LVL817 - .2byte 0x1 - .byte 0x6a - .8byte .LVL819 - .8byte .LFE2827 - .2byte 0x1 - .byte 0x6a - .8byte 0 - .8byte 0 -.LLST236: - .8byte .LVL792 - .8byte .LVL803 - .2byte 0x1 - .byte 0x53 - .8byte .LVL803 - .8byte .LVL809 - .2byte 0x1 - .byte 0x62 - .8byte .LVL809 - .8byte .LVL818 - .2byte 0x1 - .byte 0x6b - .8byte .LVL819 - .8byte .LFE2827 - .2byte 0x1 - .byte 0x6b - .8byte 0 - .8byte 0 -.LLST237: - .8byte .LVL792 + .8byte .LVL791 .8byte .LVL814 .2byte 0x1 - .byte 0x54 - .8byte .LVL819 - .8byte .LVL829 + .byte 0x69 + .8byte .LVL816 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST243: + .8byte .LVL789 + .8byte .LVL801 + .2byte 0x1 + .byte 0x52 + .8byte .LVL801 + .8byte .LVL805 + .2byte 0x1 + .byte 0x5d + .8byte .LVL805 + .8byte .LVL814 + .2byte 0x1 + .byte 0x6a + .8byte .LVL816 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST244: + .8byte .LVL789 + .8byte .LVL800 + .2byte 0x1 + .byte 0x53 + .8byte .LVL800 + .8byte .LVL806 + .2byte 0x1 + .byte 0x62 + .8byte .LVL806 + .8byte .LVL815 + .2byte 0x1 + .byte 0x6b + .8byte .LVL816 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST245: + .8byte .LVL789 + .8byte .LVL811 .2byte 0x1 .byte 0x54 - .8byte .LVL829 + .8byte .LVL816 + .8byte .LVL826 + .2byte 0x1 + .byte 0x54 + .8byte .LVL826 .8byte .LFE2827 .2byte 0x1 .byte 0x63 .8byte 0 .8byte 0 -.LLST238: - .8byte .LVL792 - .8byte .LVL800-1 +.LLST246: + .8byte .LVL789 + .8byte .LVL797-1 .2byte 0x1 .byte 0x55 - .8byte .LVL819 - .8byte .LVL829 - .2byte 0x1 - .byte 0x55 - .8byte 0 - .8byte 0 -.LLST239: - .8byte .LVL796 - .8byte .LVL814 - .2byte 0x1 - .byte 0x64 - .8byte .LVL823 - .8byte .LVL825 - .2byte 0x1 - .byte 0x64 - .8byte .LVL827 - .8byte .LFE2827 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST240: - .8byte .LVL797 - .8byte .LVL815 - .2byte 0x1 - .byte 0x66 - .8byte .LVL819 - .8byte .LVL820 - .2byte 0x1 - .byte 0x66 - .8byte .LVL822 - .8byte .LFE2827 - .2byte 0x1 - .byte 0x66 - .8byte 0 - .8byte 0 -.LLST241: - .8byte .LVL802 .8byte .LVL816 + .8byte .LVL826 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST247: + .8byte .LVL793 + .8byte .LVL811 + .2byte 0x1 + .byte 0x64 + .8byte .LVL820 + .8byte .LVL822 + .2byte 0x1 + .byte 0x64 + .8byte .LVL824 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST248: + .8byte .LVL794 + .8byte .LVL812 + .2byte 0x1 + .byte 0x66 + .8byte .LVL816 + .8byte .LVL817 + .2byte 0x1 + .byte 0x66 + .8byte .LVL819 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST249: + .8byte .LVL799 + .8byte .LVL813 .2byte 0x1 .byte 0x68 .8byte 0 .8byte 0 -.LLST242: - .8byte .LVL801 - .8byte .LVL806-1 +.LLST250: + .8byte .LVL798 + .8byte .LVL803-1 .2byte 0x1 .byte 0x58 - .8byte .LVL807 - .8byte .LVL810-1 + .8byte .LVL804 + .8byte .LVL807-1 .2byte 0x1 .byte 0x58 - .8byte .LVL811 - .8byte .LVL819 + .8byte .LVL808 + .8byte .LVL816 .2byte 0x1 .byte 0x58 - .8byte .LVL830 + .8byte .LVL827 .8byte .LFE2827 .2byte 0x1 .byte 0x58 .8byte 0 .8byte 0 -.LLST243: - .8byte .LVL793 - .8byte .LVL795 +.LLST251: + .8byte .LVL790 + .8byte .LVL792 .2byte 0x1 .byte 0x50 - .8byte .LVL813 - .8byte .LVL821 + .8byte .LVL810 + .8byte .LVL818 .2byte 0x1 .byte 0x50 - .8byte .LVL826 - .8byte .LVL828 + .8byte .LVL823 + .8byte .LVL825 .2byte 0x1 .byte 0x50 .8byte 0 @@ -62261,1043 +62559,1047 @@ .byte 0x6c .8byte 0 .8byte 0 -.LLST107: - .8byte .LVL340 - .8byte .LVL341 +.LLST115: + .8byte .LVL337 + .8byte .LVL338 .2byte 0x1 .byte 0x50 - .8byte .LVL341 - .8byte .LVL478 + .8byte .LVL338 + .8byte .LVL475 .2byte 0x1 .byte 0x66 - .8byte .LVL483 - .8byte .LVL549 + .8byte .LVL480 + .8byte .LVL546 .2byte 0x1 .byte 0x66 - .8byte 0 - .8byte 0 -.LLST108: - .8byte .LVL340 - .8byte .LVL343 - .2byte 0x1 - .byte 0x51 - .8byte .LVL343 - .8byte .LVL480 - .2byte 0x1 - .byte 0x6a - .8byte .LVL483 - .8byte .LVL551 - .2byte 0x1 - .byte 0x6a - .8byte 0 - .8byte 0 -.LLST109: - .8byte .LVL340 - .8byte .LVL411 - .2byte 0x1 - .byte 0x52 - .8byte .LVL411 - .8byte .LVL480 - .2byte 0x1 - .byte 0x69 - .8byte .LVL483 - .8byte .LVL551 - .2byte 0x1 - .byte 0x69 - .8byte 0 - .8byte 0 -.LLST110: - .8byte .LVL340 - .8byte .LVL409 - .2byte 0x1 - .byte 0x53 - .8byte .LVL409 - .8byte .LVL481 - .2byte 0x1 - .byte 0x6b - .8byte .LVL483 - .8byte .LVL552 - .2byte 0x1 - .byte 0x6b - .8byte 0 - .8byte 0 -.LLST111: - .8byte .LVL340 - .8byte .LVL410 - .2byte 0x1 - .byte 0x54 - .8byte .LVL410 - .8byte .LVL481 - .2byte 0x1 - .byte 0x6c - .8byte .LVL483 - .8byte .LVL552 - .2byte 0x1 - .byte 0x6c - .8byte 0 - .8byte 0 -.LLST112: - .8byte .LVL340 - .8byte .LVL477 - .2byte 0x1 - .byte 0x55 - .8byte .LVL483 - .8byte .LVL540 - .2byte 0x1 - .byte 0x63 - .8byte .LVL540 - .8byte .LVL546 - .2byte 0x1 - .byte 0x55 - .8byte .LVL546 - .8byte .LVL548 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST113: - .8byte .LVL340 - .8byte .LVL345-1 - .2byte 0x1 - .byte 0x56 - .8byte .LVL540 - .8byte .LVL546 - .2byte 0x1 - .byte 0x56 - .8byte 0 - .8byte 0 -.LLST114: - .8byte .LVL344 - .8byte .LVL478 - .2byte 0x1 - .byte 0x65 - .8byte .LVL483 - .8byte .LVL540 - .2byte 0x1 - .byte 0x65 - .8byte .LVL543 - .8byte .LVL544 - .2byte 0x1 - .byte 0x65 - .8byte .LVL545 - .8byte .LVL549 - .2byte 0x1 - .byte 0x65 - .8byte 0 - .8byte 0 -.LLST115: - .8byte .LVL344 - .8byte .LVL479 - .2byte 0x1 - .byte 0x67 - .8byte .LVL483 - .8byte .LVL541 - .2byte 0x1 - .byte 0x67 - .8byte .LVL542 - .8byte .LVL550 - .2byte 0x1 - .byte 0x67 .8byte 0 .8byte 0 .LLST116: - .8byte .LVL346 - .8byte .LVL352 + .8byte .LVL337 + .8byte .LVL340 .2byte 0x1 - .byte 0x55 + .byte 0x51 + .8byte .LVL340 + .8byte .LVL477 + .2byte 0x1 + .byte 0x6a + .8byte .LVL480 + .8byte .LVL548 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST117: + .8byte .LVL337 .8byte .LVL408 - .8byte .LVL415 .2byte 0x1 - .byte 0x55 + .byte 0x52 + .8byte .LVL408 + .8byte .LVL477 + .2byte 0x1 + .byte 0x69 + .8byte .LVL480 + .8byte .LVL548 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST118: + .8byte .LVL337 + .8byte .LVL406 + .2byte 0x1 + .byte 0x53 + .8byte .LVL406 + .8byte .LVL478 + .2byte 0x1 + .byte 0x6b + .8byte .LVL480 + .8byte .LVL549 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST119: + .8byte .LVL337 + .8byte .LVL407 + .2byte 0x1 + .byte 0x54 + .8byte .LVL407 + .8byte .LVL478 + .2byte 0x1 + .byte 0x6c + .8byte .LVL480 + .8byte .LVL549 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST120: + .8byte .LVL337 .8byte .LVL474 - .8byte .LVL483 .2byte 0x1 .byte 0x55 + .8byte .LVL480 + .8byte .LVL537 + .2byte 0x1 + .byte 0x63 + .8byte .LVL537 + .8byte .LVL543 + .2byte 0x1 + .byte 0x55 + .8byte .LVL543 + .8byte .LVL545 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST121: + .8byte .LVL337 + .8byte .LVL342-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL537 + .8byte .LVL543 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST122: + .8byte .LVL341 + .8byte .LVL475 + .2byte 0x1 + .byte 0x65 + .8byte .LVL480 + .8byte .LVL537 + .2byte 0x1 + .byte 0x65 + .8byte .LVL540 + .8byte .LVL541 + .2byte 0x1 + .byte 0x65 + .8byte .LVL542 + .8byte .LVL546 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST123: + .8byte .LVL341 + .8byte .LVL476 + .2byte 0x1 + .byte 0x67 + .8byte .LVL480 + .8byte .LVL538 + .2byte 0x1 + .byte 0x67 + .8byte .LVL539 .8byte .LVL547 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST124: + .8byte .LVL343 + .8byte .LVL349 + .2byte 0x1 + .byte 0x55 + .8byte .LVL405 + .8byte .LVL412 + .2byte 0x1 + .byte 0x55 + .8byte .LVL471 + .8byte .LVL480 + .2byte 0x1 + .byte 0x55 + .8byte .LVL544 .8byte .LFE2821 .2byte 0x1 .byte 0x55 .8byte 0 .8byte 0 -.LLST117: - .8byte .LVL342 - .8byte .LVL479 +.LLST125: + .8byte .LVL339 + .8byte .LVL476 .2byte 0x1 .byte 0x68 - .8byte .LVL483 - .8byte .LVL550 + .8byte .LVL480 + .8byte .LVL547 .2byte 0x1 .byte 0x68 .8byte 0 .8byte 0 -.LLST118: - .8byte .LVL347 - .8byte .LVL540 +.LLST126: + .8byte .LVL344 + .8byte .LVL537 .2byte 0x1 .byte 0x5a .8byte 0 .8byte 0 -.LLST119: - .8byte .LVL348 - .8byte .LVL349 +.LLST127: + .8byte .LVL345 + .8byte .LVL346 .2byte 0x1 .byte 0x56 - .8byte .LVL350 - .8byte .LVL412 - .2byte 0x1 - .byte 0x56 - .8byte .LVL483 - .8byte .LVL485 - .2byte 0x1 - .byte 0x56 - .8byte .LVL487 - .8byte .LVL513 - .2byte 0x1 - .byte 0x56 - .8byte 0 - .8byte 0 -.LLST120: - .8byte .LVL348 - .8byte .LVL414 - .2byte 0x1 - .byte 0x50 - .8byte .LVL483 - .8byte .LVL484 - .2byte 0x1 - .byte 0x50 - .8byte .LVL486 - .8byte .LVL489 - .2byte 0x1 - .byte 0x50 - .8byte .LVL491 - .8byte .LVL493 - .2byte 0x1 - .byte 0x50 - .8byte .LVL495 - .8byte .LVL497 - .2byte 0x1 - .byte 0x50 - .8byte .LVL499 - .8byte .LVL501 - .2byte 0x1 - .byte 0x50 - .8byte .LVL503 - .8byte .LVL505 - .2byte 0x1 - .byte 0x50 - .8byte .LVL507 - .8byte .LVL509 - .2byte 0x1 - .byte 0x50 - .8byte .LVL511 - .8byte .LVL513 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST121: .8byte .LVL347 - .8byte .LVL420 + .8byte .LVL409 .2byte 0x1 - .byte 0x59 - .8byte .LVL423 - .8byte .LVL426 - .2byte 0x1 - .byte 0x59 - .8byte .LVL430 - .8byte .LVL433 - .2byte 0x1 - .byte 0x59 - .8byte .LVL437 - .8byte .LVL440 - .2byte 0x1 - .byte 0x59 - .8byte .LVL444 - .8byte .LVL446 - .2byte 0x1 - .byte 0x59 - .8byte .LVL451 - .8byte .LVL453 - .2byte 0x1 - .byte 0x59 - .8byte .LVL458 - .8byte .LVL460 - .2byte 0x1 - .byte 0x59 - .8byte .LVL465 - .8byte .LVL467 - .2byte 0x1 - .byte 0x59 - .8byte .LVL472 - .8byte .LVL513 - .2byte 0x1 - .byte 0x59 - .8byte .LVL517 - .8byte .LVL518 - .2byte 0x1 - .byte 0x59 - .8byte 0 - .8byte 0 -.LLST122: - .8byte .LVL347 - .8byte .LVL403 - .2byte 0x1 - .byte 0x52 - .8byte .LVL407 - .8byte .LVL416 - .2byte 0x1 - .byte 0x52 - .8byte .LVL476 - .8byte .LVL483 - .2byte 0x1 - .byte 0x52 - .8byte .LVL487 - .8byte .LVL513 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST123: - .8byte .LVL347 - .8byte .LVL362 - .2byte 0x1 - .byte 0x6e - .8byte .LVL365 - .8byte .LVL369 - .2byte 0x1 - .byte 0x6e - .8byte .LVL372 - .8byte .LVL376 - .2byte 0x1 - .byte 0x6e - .8byte .LVL379 - .8byte .LVL383 - .2byte 0x1 - .byte 0x6e - .8byte .LVL386 - .8byte .LVL390 - .2byte 0x1 - .byte 0x6e - .8byte .LVL393 - .8byte .LVL397 - .2byte 0x1 - .byte 0x6e - .8byte .LVL400 - .8byte .LVL417 - .2byte 0x1 - .byte 0x6e - .8byte .LVL423 - .8byte .LVL427 - .2byte 0x1 - .byte 0x6e - .8byte .LVL430 - .8byte .LVL434 - .2byte 0x1 - .byte 0x6e - .8byte .LVL437 - .8byte .LVL441 - .2byte 0x1 - .byte 0x6e - .8byte .LVL444 - .8byte .LVL448 - .2byte 0x1 - .byte 0x6e - .8byte .LVL451 - .8byte .LVL455 - .2byte 0x1 - .byte 0x6e - .8byte .LVL458 - .8byte .LVL462 - .2byte 0x1 - .byte 0x6e - .8byte .LVL465 + .byte 0x56 + .8byte .LVL480 .8byte .LVL482 .2byte 0x1 - .byte 0x6e - .8byte .LVL483 - .8byte .LVL488 - .2byte 0x1 - .byte 0x6e - .8byte .LVL512 - .8byte .LVL518 - .2byte 0x1 - .byte 0x6e - .8byte 0 - .8byte 0 -.LLST124: - .8byte .LVL352 - .8byte .LVL356 - .2byte 0x1 - .byte 0x55 - .8byte .LVL357 - .8byte .LVL408 - .2byte 0x1 - .byte 0x55 - .8byte .LVL483 - .8byte .LVL513 - .2byte 0x1 - .byte 0x55 - .8byte 0 - .8byte 0 -.LLST125: - .8byte .LVL359 - .8byte .LVL363 - .2byte 0x1 - .byte 0x60 - .8byte 0 - .8byte 0 -.LLST126: - .8byte .LVL347 - .8byte .LVL354 - .2byte 0x1 - .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 - .2byte 0x1 - .byte 0x53 - .8byte .LVL364 - .8byte .LVL367 - .2byte 0x1 - .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 - .2byte 0x1 - .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 - .2byte 0x1 - .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 - .2byte 0x1 - .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 - .2byte 0x1 - .byte 0x53 - .8byte .LVL400 - .8byte .LVL404 - .2byte 0x1 - .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 - .2byte 0x1 - .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 - .2byte 0x1 - .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 - .2byte 0x1 - .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 - .8byte .LVL444 - .8byte .LVL447 - .2byte 0x1 - .byte 0x53 - .8byte .LVL451 - .8byte .LVL454 - .2byte 0x1 - .byte 0x53 - .8byte .LVL458 - .8byte .LVL461 - .2byte 0x1 - .byte 0x53 - .8byte .LVL465 - .8byte .LVL468 - .2byte 0x1 - .byte 0x53 - .8byte .LVL472 - .8byte .LVL483 - .2byte 0x1 - .byte 0x53 - .8byte .LVL487 - .8byte .LVL488 - .2byte 0x1 - .byte 0x53 - .8byte .LVL508 + .byte 0x56 + .8byte .LVL484 .8byte .LVL510 .2byte 0x1 - .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST127: - .8byte .LVL366 - .8byte .LVL370 - .2byte 0x1 - .byte 0x60 + .byte 0x56 .8byte 0 .8byte 0 .LLST128: - .8byte .LVL347 - .8byte .LVL354 + .8byte .LVL345 + .8byte .LVL411 .2byte 0x1 - .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 + .byte 0x50 + .8byte .LVL480 + .8byte .LVL481 .2byte 0x1 - .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 - .2byte 0x1 - .byte 0x53 - .8byte .LVL371 - .8byte .LVL374 - .2byte 0x1 - .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 - .2byte 0x1 - .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 - .2byte 0x1 - .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 - .2byte 0x1 - .byte 0x53 - .8byte .LVL400 - .8byte .LVL404 - .2byte 0x1 - .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 - .2byte 0x1 - .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 - .2byte 0x1 - .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 - .2byte 0x1 - .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 - .8byte .LVL444 - .8byte .LVL447 - .2byte 0x1 - .byte 0x53 - .8byte .LVL451 - .8byte .LVL454 - .2byte 0x1 - .byte 0x53 - .8byte .LVL458 - .8byte .LVL461 - .2byte 0x1 - .byte 0x53 - .8byte .LVL465 - .8byte .LVL468 - .2byte 0x1 - .byte 0x53 - .8byte .LVL472 + .byte 0x50 .8byte .LVL483 + .8byte .LVL486 .2byte 0x1 - .byte 0x53 - .8byte .LVL487 + .byte 0x50 .8byte .LVL488 + .8byte .LVL490 .2byte 0x1 - .byte 0x53 - .8byte .LVL504 - .8byte .LVL506 + .byte 0x50 + .8byte .LVL492 + .8byte .LVL494 .2byte 0x1 - .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST129: - .8byte .LVL373 - .8byte .LVL377 - .2byte 0x1 - .byte 0x60 - .8byte 0 - .8byte 0 -.LLST130: - .8byte .LVL347 - .8byte .LVL354 - .2byte 0x1 - .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 - .2byte 0x1 - .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 - .2byte 0x1 - .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 - .2byte 0x1 - .byte 0x53 - .8byte .LVL378 - .8byte .LVL381 - .2byte 0x1 - .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 - .2byte 0x1 - .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 - .2byte 0x1 - .byte 0x53 - .8byte .LVL400 - .8byte .LVL404 - .2byte 0x1 - .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 - .2byte 0x1 - .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 - .2byte 0x1 - .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 - .2byte 0x1 - .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 - .8byte .LVL444 - .8byte .LVL447 - .2byte 0x1 - .byte 0x53 - .8byte .LVL451 - .8byte .LVL454 - .2byte 0x1 - .byte 0x53 - .8byte .LVL458 - .8byte .LVL461 - .2byte 0x1 - .byte 0x53 - .8byte .LVL465 - .8byte .LVL468 - .2byte 0x1 - .byte 0x53 - .8byte .LVL472 - .8byte .LVL483 - .2byte 0x1 - .byte 0x53 - .8byte .LVL487 - .8byte .LVL488 - .2byte 0x1 - .byte 0x53 - .8byte .LVL500 - .8byte .LVL502 - .2byte 0x1 - .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST131: - .8byte .LVL380 - .8byte .LVL384 - .2byte 0x1 - .byte 0x60 - .8byte 0 - .8byte 0 -.LLST132: - .8byte .LVL347 - .8byte .LVL354 - .2byte 0x1 - .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 - .2byte 0x1 - .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 - .2byte 0x1 - .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 - .2byte 0x1 - .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 - .2byte 0x1 - .byte 0x53 - .8byte .LVL385 - .8byte .LVL388 - .2byte 0x1 - .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 - .2byte 0x1 - .byte 0x53 - .8byte .LVL400 - .8byte .LVL404 - .2byte 0x1 - .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 - .2byte 0x1 - .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 - .2byte 0x1 - .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 - .2byte 0x1 - .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 - .8byte .LVL444 - .8byte .LVL447 - .2byte 0x1 - .byte 0x53 - .8byte .LVL451 - .8byte .LVL454 - .2byte 0x1 - .byte 0x53 - .8byte .LVL458 - .8byte .LVL461 - .2byte 0x1 - .byte 0x53 - .8byte .LVL465 - .8byte .LVL468 - .2byte 0x1 - .byte 0x53 - .8byte .LVL472 - .8byte .LVL483 - .2byte 0x1 - .byte 0x53 - .8byte .LVL487 - .8byte .LVL488 - .2byte 0x1 - .byte 0x53 + .byte 0x50 .8byte .LVL496 .8byte .LVL498 .2byte 0x1 - .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 + .byte 0x50 + .8byte .LVL500 + .8byte .LVL502 .2byte 0x1 - .byte 0x53 + .byte 0x50 + .8byte .LVL504 + .8byte .LVL506 + .2byte 0x1 + .byte 0x50 + .8byte .LVL508 + .8byte .LVL510 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST129: + .8byte .LVL344 + .8byte .LVL417 + .2byte 0x1 + .byte 0x59 + .8byte .LVL420 + .8byte .LVL423 + .2byte 0x1 + .byte 0x59 + .8byte .LVL427 + .8byte .LVL430 + .2byte 0x1 + .byte 0x59 + .8byte .LVL434 + .8byte .LVL437 + .2byte 0x1 + .byte 0x59 + .8byte .LVL441 + .8byte .LVL443 + .2byte 0x1 + .byte 0x59 + .8byte .LVL448 + .8byte .LVL450 + .2byte 0x1 + .byte 0x59 + .8byte .LVL455 + .8byte .LVL457 + .2byte 0x1 + .byte 0x59 + .8byte .LVL462 + .8byte .LVL464 + .2byte 0x1 + .byte 0x59 + .8byte .LVL469 + .8byte .LVL510 + .2byte 0x1 + .byte 0x59 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST130: + .8byte .LVL344 + .8byte .LVL400 + .2byte 0x1 + .byte 0x52 + .8byte .LVL404 + .8byte .LVL413 + .2byte 0x1 + .byte 0x52 + .8byte .LVL473 + .8byte .LVL480 + .2byte 0x1 + .byte 0x52 + .8byte .LVL484 + .8byte .LVL510 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST131: + .8byte .LVL344 + .8byte .LVL359 + .2byte 0x1 + .byte 0x6e + .8byte .LVL362 + .8byte .LVL366 + .2byte 0x1 + .byte 0x6e + .8byte .LVL369 + .8byte .LVL373 + .2byte 0x1 + .byte 0x6e + .8byte .LVL376 + .8byte .LVL380 + .2byte 0x1 + .byte 0x6e + .8byte .LVL383 + .8byte .LVL387 + .2byte 0x1 + .byte 0x6e + .8byte .LVL390 + .8byte .LVL394 + .2byte 0x1 + .byte 0x6e + .8byte .LVL397 + .8byte .LVL414 + .2byte 0x1 + .byte 0x6e + .8byte .LVL420 + .8byte .LVL424 + .2byte 0x1 + .byte 0x6e + .8byte .LVL427 + .8byte .LVL431 + .2byte 0x1 + .byte 0x6e + .8byte .LVL434 + .8byte .LVL438 + .2byte 0x1 + .byte 0x6e + .8byte .LVL441 + .8byte .LVL445 + .2byte 0x1 + .byte 0x6e + .8byte .LVL448 + .8byte .LVL452 + .2byte 0x1 + .byte 0x6e + .8byte .LVL455 + .8byte .LVL459 + .2byte 0x1 + .byte 0x6e + .8byte .LVL462 + .8byte .LVL479 + .2byte 0x1 + .byte 0x6e + .8byte .LVL480 + .8byte .LVL485 + .2byte 0x1 + .byte 0x6e + .8byte .LVL509 + .8byte .LVL515 + .2byte 0x1 + .byte 0x6e + .8byte 0 + .8byte 0 +.LLST132: + .8byte .LVL349 + .8byte .LVL353 + .2byte 0x1 + .byte 0x55 + .8byte .LVL354 + .8byte .LVL405 + .2byte 0x1 + .byte 0x55 + .8byte .LVL480 + .8byte .LVL510 + .2byte 0x1 + .byte 0x55 .8byte 0 .8byte 0 .LLST133: - .8byte .LVL387 - .8byte .LVL391 + .8byte .LVL356 + .8byte .LVL360 .2byte 0x1 .byte 0x60 .8byte 0 .8byte 0 .LLST134: - .8byte .LVL347 - .8byte .LVL354 + .8byte .LVL344 + .8byte .LVL351 .2byte 0x1 .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 + .8byte .LVL355 + .8byte .LVL357 .2byte 0x1 .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 + .8byte .LVL361 + .8byte .LVL364 .2byte 0x1 .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 + .8byte .LVL369 + .8byte .LVL371 .2byte 0x1 .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 + .8byte .LVL376 + .8byte .LVL378 .2byte 0x1 .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 + .8byte .LVL383 + .8byte .LVL385 .2byte 0x1 .byte 0x53 + .8byte .LVL390 .8byte .LVL392 - .8byte .LVL395 .2byte 0x1 .byte 0x53 - .8byte .LVL400 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 .8byte .LVL404 + .8byte .LVL415 .2byte 0x1 .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 + .8byte .LVL420 + .8byte .LVL422 .2byte 0x1 .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 + .8byte .LVL427 + .8byte .LVL429 .2byte 0x1 .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 + .8byte .LVL434 + .8byte .LVL436 .2byte 0x1 .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 + .8byte .LVL441 .8byte .LVL444 - .8byte .LVL447 .2byte 0x1 .byte 0x53 + .8byte .LVL448 .8byte .LVL451 - .8byte .LVL454 .2byte 0x1 .byte 0x53 + .8byte .LVL455 .8byte .LVL458 - .8byte .LVL461 .2byte 0x1 .byte 0x53 + .8byte .LVL462 .8byte .LVL465 - .8byte .LVL468 .2byte 0x1 .byte 0x53 - .8byte .LVL472 - .8byte .LVL483 + .8byte .LVL469 + .8byte .LVL480 .2byte 0x1 .byte 0x53 - .8byte .LVL487 - .8byte .LVL488 + .8byte .LVL484 + .8byte .LVL485 .2byte 0x1 .byte 0x53 - .8byte .LVL492 - .8byte .LVL494 + .8byte .LVL505 + .8byte .LVL507 .2byte 0x1 .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 + .8byte .LVL514 + .8byte .LVL515 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 .LLST135: - .8byte .LVL394 - .8byte .LVL398 + .8byte .LVL363 + .8byte .LVL367 .2byte 0x1 .byte 0x60 .8byte 0 .8byte 0 .LLST136: - .8byte .LVL347 - .8byte .LVL354 + .8byte .LVL344 + .8byte .LVL351 .2byte 0x1 .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 + .8byte .LVL355 + .8byte .LVL357 .2byte 0x1 .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 + .8byte .LVL362 + .8byte .LVL364 .2byte 0x1 .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 + .8byte .LVL368 + .8byte .LVL371 .2byte 0x1 .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 + .8byte .LVL376 + .8byte .LVL378 .2byte 0x1 .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 + .8byte .LVL383 + .8byte .LVL385 .2byte 0x1 .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 + .8byte .LVL390 + .8byte .LVL392 .2byte 0x1 .byte 0x53 - .8byte .LVL399 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 .8byte .LVL404 + .8byte .LVL415 .2byte 0x1 .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 + .8byte .LVL420 + .8byte .LVL422 .2byte 0x1 .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 + .8byte .LVL427 + .8byte .LVL429 .2byte 0x1 .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 + .8byte .LVL434 + .8byte .LVL436 .2byte 0x1 .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 + .8byte .LVL441 .8byte .LVL444 - .8byte .LVL447 .2byte 0x1 .byte 0x53 + .8byte .LVL448 .8byte .LVL451 - .8byte .LVL454 .2byte 0x1 .byte 0x53 + .8byte .LVL455 .8byte .LVL458 - .8byte .LVL461 .2byte 0x1 .byte 0x53 + .8byte .LVL462 .8byte .LVL465 - .8byte .LVL468 .2byte 0x1 .byte 0x53 - .8byte .LVL472 - .8byte .LVL483 + .8byte .LVL469 + .8byte .LVL480 .2byte 0x1 .byte 0x53 - .8byte .LVL487 - .8byte .LVL490 + .8byte .LVL484 + .8byte .LVL485 .2byte 0x1 .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 + .8byte .LVL501 + .8byte .LVL503 + .2byte 0x1 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 .LLST137: - .8byte .LVL401 - .8byte .LVL405 + .8byte .LVL370 + .8byte .LVL374 .2byte 0x1 - .byte 0x5f + .byte 0x60 .8byte 0 .8byte 0 .LLST138: - .8byte .LVL347 - .8byte .LVL354 + .8byte .LVL344 + .8byte .LVL351 .2byte 0x1 .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 + .8byte .LVL355 + .8byte .LVL357 .2byte 0x1 .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 + .8byte .LVL362 + .8byte .LVL364 .2byte 0x1 .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 + .8byte .LVL369 + .8byte .LVL371 .2byte 0x1 .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 + .8byte .LVL375 + .8byte .LVL378 .2byte 0x1 .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 + .8byte .LVL383 + .8byte .LVL385 .2byte 0x1 .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 + .8byte .LVL390 + .8byte .LVL392 .2byte 0x1 .byte 0x53 - .8byte .LVL400 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 .8byte .LVL404 + .8byte .LVL415 .2byte 0x1 .byte 0x53 - .8byte .LVL406 - .8byte .LVL418 + .8byte .LVL420 + .8byte .LVL422 .2byte 0x1 .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 + .8byte .LVL427 + .8byte .LVL429 .2byte 0x1 .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 + .8byte .LVL434 + .8byte .LVL436 .2byte 0x1 .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 + .8byte .LVL441 .8byte .LVL444 - .8byte .LVL447 .2byte 0x1 .byte 0x53 + .8byte .LVL448 .8byte .LVL451 - .8byte .LVL454 .2byte 0x1 .byte 0x53 + .8byte .LVL455 .8byte .LVL458 - .8byte .LVL461 .2byte 0x1 .byte 0x53 + .8byte .LVL462 .8byte .LVL465 - .8byte .LVL468 .2byte 0x1 .byte 0x53 - .8byte .LVL472 - .8byte .LVL488 + .8byte .LVL469 + .8byte .LVL480 .2byte 0x1 .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 + .8byte .LVL484 + .8byte .LVL485 + .2byte 0x1 + .byte 0x53 + .8byte .LVL497 + .8byte .LVL499 + .2byte 0x1 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 .LLST139: - .8byte .LVL347 - .8byte .LVL348 + .8byte .LVL377 + .8byte .LVL381 .2byte 0x1 - .byte 0x57 - .8byte .LVL412 - .8byte .LVL413 - .2byte 0x1 - .byte 0x57 - .8byte .LVL414 - .8byte .LVL483 - .2byte 0x1 - .byte 0x57 - .8byte .LVL513 - .8byte .LVL515 - .2byte 0x1 - .byte 0x57 - .8byte .LVL517 - .8byte .LVL540 - .2byte 0x1 - .byte 0x57 + .byte 0x60 .8byte 0 .8byte 0 .LLST140: + .8byte .LVL344 + .8byte .LVL351 + .2byte 0x1 + .byte 0x53 + .8byte .LVL355 + .8byte .LVL357 + .2byte 0x1 + .byte 0x53 + .8byte .LVL362 + .8byte .LVL364 + .2byte 0x1 + .byte 0x53 + .8byte .LVL369 + .8byte .LVL371 + .2byte 0x1 + .byte 0x53 + .8byte .LVL376 + .8byte .LVL378 + .2byte 0x1 + .byte 0x53 + .8byte .LVL382 + .8byte .LVL385 + .2byte 0x1 + .byte 0x53 + .8byte .LVL390 + .8byte .LVL392 + .2byte 0x1 + .byte 0x53 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 + .8byte .LVL404 + .8byte .LVL415 + .2byte 0x1 + .byte 0x53 + .8byte .LVL420 + .8byte .LVL422 + .2byte 0x1 + .byte 0x53 + .8byte .LVL427 + .8byte .LVL429 + .2byte 0x1 + .byte 0x53 + .8byte .LVL434 + .8byte .LVL436 + .2byte 0x1 + .byte 0x53 + .8byte .LVL441 + .8byte .LVL444 + .2byte 0x1 + .byte 0x53 + .8byte .LVL448 + .8byte .LVL451 + .2byte 0x1 + .byte 0x53 + .8byte .LVL455 + .8byte .LVL458 + .2byte 0x1 + .byte 0x53 + .8byte .LVL462 + .8byte .LVL465 + .2byte 0x1 + .byte 0x53 + .8byte .LVL469 + .8byte .LVL480 + .2byte 0x1 + .byte 0x53 + .8byte .LVL484 + .8byte .LVL485 + .2byte 0x1 + .byte 0x53 + .8byte .LVL493 + .8byte .LVL495 + .2byte 0x1 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST141: + .8byte .LVL384 + .8byte .LVL388 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST142: + .8byte .LVL344 + .8byte .LVL351 + .2byte 0x1 + .byte 0x53 + .8byte .LVL355 + .8byte .LVL357 + .2byte 0x1 + .byte 0x53 + .8byte .LVL362 + .8byte .LVL364 + .2byte 0x1 + .byte 0x53 + .8byte .LVL369 + .8byte .LVL371 + .2byte 0x1 + .byte 0x53 + .8byte .LVL376 + .8byte .LVL378 + .2byte 0x1 + .byte 0x53 + .8byte .LVL383 + .8byte .LVL385 + .2byte 0x1 + .byte 0x53 + .8byte .LVL389 + .8byte .LVL392 + .2byte 0x1 + .byte 0x53 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 + .8byte .LVL404 + .8byte .LVL415 + .2byte 0x1 + .byte 0x53 + .8byte .LVL420 + .8byte .LVL422 + .2byte 0x1 + .byte 0x53 + .8byte .LVL427 + .8byte .LVL429 + .2byte 0x1 + .byte 0x53 + .8byte .LVL434 + .8byte .LVL436 + .2byte 0x1 + .byte 0x53 + .8byte .LVL441 + .8byte .LVL444 + .2byte 0x1 + .byte 0x53 + .8byte .LVL448 + .8byte .LVL451 + .2byte 0x1 + .byte 0x53 + .8byte .LVL455 + .8byte .LVL458 + .2byte 0x1 + .byte 0x53 + .8byte .LVL462 + .8byte .LVL465 + .2byte 0x1 + .byte 0x53 + .8byte .LVL469 + .8byte .LVL480 + .2byte 0x1 + .byte 0x53 + .8byte .LVL484 + .8byte .LVL485 + .2byte 0x1 + .byte 0x53 + .8byte .LVL489 + .8byte .LVL491 + .2byte 0x1 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST143: + .8byte .LVL391 + .8byte .LVL395 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST144: + .8byte .LVL344 + .8byte .LVL351 + .2byte 0x1 + .byte 0x53 + .8byte .LVL355 + .8byte .LVL357 + .2byte 0x1 + .byte 0x53 + .8byte .LVL362 + .8byte .LVL364 + .2byte 0x1 + .byte 0x53 + .8byte .LVL369 + .8byte .LVL371 + .2byte 0x1 + .byte 0x53 + .8byte .LVL376 + .8byte .LVL378 + .2byte 0x1 + .byte 0x53 + .8byte .LVL383 + .8byte .LVL385 + .2byte 0x1 + .byte 0x53 + .8byte .LVL390 + .8byte .LVL392 + .2byte 0x1 + .byte 0x53 + .8byte .LVL396 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 + .8byte .LVL404 + .8byte .LVL415 + .2byte 0x1 + .byte 0x53 + .8byte .LVL420 + .8byte .LVL422 + .2byte 0x1 + .byte 0x53 + .8byte .LVL427 + .8byte .LVL429 + .2byte 0x1 + .byte 0x53 + .8byte .LVL434 + .8byte .LVL436 + .2byte 0x1 + .byte 0x53 + .8byte .LVL441 + .8byte .LVL444 + .2byte 0x1 + .byte 0x53 + .8byte .LVL448 + .8byte .LVL451 + .2byte 0x1 + .byte 0x53 + .8byte .LVL455 + .8byte .LVL458 + .2byte 0x1 + .byte 0x53 + .8byte .LVL462 + .8byte .LVL465 + .2byte 0x1 + .byte 0x53 + .8byte .LVL469 + .8byte .LVL480 + .2byte 0x1 + .byte 0x53 + .8byte .LVL484 + .8byte .LVL487 + .2byte 0x1 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST145: + .8byte .LVL398 + .8byte .LVL402 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST146: + .8byte .LVL344 + .8byte .LVL351 + .2byte 0x1 + .byte 0x53 + .8byte .LVL355 + .8byte .LVL357 + .2byte 0x1 + .byte 0x53 + .8byte .LVL362 + .8byte .LVL364 + .2byte 0x1 + .byte 0x53 + .8byte .LVL369 + .8byte .LVL371 + .2byte 0x1 + .byte 0x53 + .8byte .LVL376 + .8byte .LVL378 + .2byte 0x1 + .byte 0x53 + .8byte .LVL383 + .8byte .LVL385 + .2byte 0x1 + .byte 0x53 + .8byte .LVL390 + .8byte .LVL392 + .2byte 0x1 + .byte 0x53 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 + .8byte .LVL403 + .8byte .LVL415 + .2byte 0x1 + .byte 0x53 + .8byte .LVL420 + .8byte .LVL422 + .2byte 0x1 + .byte 0x53 + .8byte .LVL427 + .8byte .LVL429 + .2byte 0x1 + .byte 0x53 + .8byte .LVL434 + .8byte .LVL436 + .2byte 0x1 + .byte 0x53 + .8byte .LVL441 + .8byte .LVL444 + .2byte 0x1 + .byte 0x53 + .8byte .LVL448 + .8byte .LVL451 + .2byte 0x1 + .byte 0x53 + .8byte .LVL455 + .8byte .LVL458 + .2byte 0x1 + .byte 0x53 + .8byte .LVL462 + .8byte .LVL465 + .2byte 0x1 + .byte 0x53 + .8byte .LVL469 + .8byte .LVL485 + .2byte 0x1 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST147: + .8byte .LVL344 + .8byte .LVL345 + .2byte 0x1 + .byte 0x57 + .8byte .LVL409 + .8byte .LVL410 + .2byte 0x1 + .byte 0x57 + .8byte .LVL411 + .8byte .LVL480 + .2byte 0x1 + .byte 0x57 + .8byte .LVL510 + .8byte .LVL512 + .2byte 0x1 + .byte 0x57 + .8byte .LVL514 + .8byte .LVL537 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST148: + .8byte .LVL344 .8byte .LVL347 - .8byte .LVL350 .2byte 0x1 .byte 0x50 - .8byte .LVL412 + .8byte .LVL409 + .8byte .LVL470 + .2byte 0x1 + .byte 0x50 .8byte .LVL473 + .8byte .LVL480 .2byte 0x1 .byte 0x50 - .8byte .LVL476 - .8byte .LVL483 + .8byte .LVL510 + .8byte .LVL511 .2byte 0x1 .byte 0x50 .8byte .LVL513 - .8byte .LVL514 + .8byte .LVL516 .2byte 0x1 .byte 0x50 - .8byte .LVL516 + .8byte .LVL517 .8byte .LVL519 .2byte 0x1 .byte 0x50 @@ -63309,611 +63611,495 @@ .8byte .LVL525 .2byte 0x1 .byte 0x50 - .8byte .LVL526 - .8byte .LVL528 - .2byte 0x1 - .byte 0x50 - .8byte .LVL530 - .8byte .LVL532 - .2byte 0x1 - .byte 0x50 - .8byte .LVL534 - .8byte .LVL536 - .2byte 0x1 - .byte 0x50 - .8byte .LVL538 - .8byte .LVL540 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST141: - .8byte .LVL347 - .8byte .LVL355 - .2byte 0x1 - .byte 0x54 - .8byte .LVL358 - .8byte .LVL361 - .2byte 0x1 - .byte 0x54 - .8byte .LVL365 - .8byte .LVL368 - .2byte 0x1 - .byte 0x54 - .8byte .LVL372 - .8byte .LVL375 - .2byte 0x1 - .byte 0x54 - .8byte .LVL379 - .8byte .LVL382 - .2byte 0x1 - .byte 0x54 - .8byte .LVL386 - .8byte .LVL389 - .2byte 0x1 - .byte 0x54 - .8byte .LVL393 - .8byte .LVL396 - .2byte 0x1 - .byte 0x54 - .8byte .LVL400 - .8byte .LVL402 - .2byte 0x1 - .byte 0x54 - .8byte .LVL407 - .8byte .LVL483 - .2byte 0x1 - .byte 0x54 - .8byte .LVL487 - .8byte .LVL488 - .2byte 0x1 - .byte 0x54 - .8byte .LVL513 - .8byte .LVL540 - .2byte 0x1 - .byte 0x54 - .8byte 0 - .8byte 0 -.LLST142: - .8byte .LVL416 - .8byte .LVL419 - .2byte 0x1 - .byte 0x52 - .8byte .LVL422 - .8byte .LVL475 - .2byte 0x1 - .byte 0x52 - .8byte .LVL513 - .8byte .LVL540 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST143: - .8byte .LVL415 - .8byte .LVL469 - .2byte 0x1 - .byte 0x55 - .8byte .LVL472 - .8byte .LVL474 - .2byte 0x1 - .byte 0x55 - .8byte .LVL517 - .8byte .LVL540 - .2byte 0x1 - .byte 0x55 - .8byte 0 - .8byte 0 -.LLST144: - .8byte .LVL347 - .8byte .LVL353 - .2byte 0x1 - .byte 0x6e - .8byte .LVL358 - .8byte .LVL362 - .2byte 0x1 - .byte 0x6e - .8byte .LVL365 - .8byte .LVL369 - .2byte 0x1 - .byte 0x6e - .8byte .LVL372 - .8byte .LVL376 - .2byte 0x1 - .byte 0x6e - .8byte .LVL379 - .8byte .LVL383 - .2byte 0x1 - .byte 0x6e - .8byte .LVL386 - .8byte .LVL390 - .2byte 0x1 - .byte 0x6e - .8byte .LVL393 - .8byte .LVL397 - .2byte 0x1 - .byte 0x6e - .8byte .LVL400 - .8byte .LVL427 - .2byte 0x1 - .byte 0x6e - .8byte .LVL430 - .8byte .LVL434 - .2byte 0x1 - .byte 0x6e - .8byte .LVL437 - .8byte .LVL441 - .2byte 0x1 - .byte 0x6e - .8byte .LVL444 - .8byte .LVL448 - .2byte 0x1 - .byte 0x6e - .8byte .LVL451 - .8byte .LVL455 - .2byte 0x1 - .byte 0x6e - .8byte .LVL458 - .8byte .LVL462 - .2byte 0x1 - .byte 0x6e - .8byte .LVL465 - .8byte .LVL482 - .2byte 0x1 - .byte 0x6e - .8byte .LVL483 - .8byte .LVL488 - .2byte 0x1 - .byte 0x6e - .8byte .LVL513 - .8byte .LVL518 - .2byte 0x1 - .byte 0x6e - .8byte .LVL539 - .8byte .LVL540 - .2byte 0x1 - .byte 0x6e - .8byte 0 - .8byte 0 -.LLST145: - .8byte .LVL421 - .8byte .LVL422 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST146: - .8byte .LVL424 - .8byte .LVL428 - .2byte 0x1 - .byte 0x60 - .8byte 0 - .8byte 0 -.LLST147: - .8byte .LVL347 - .8byte .LVL354 - .2byte 0x1 - .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 - .2byte 0x1 - .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 - .2byte 0x1 - .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 - .2byte 0x1 - .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 - .2byte 0x1 - .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 - .2byte 0x1 - .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 - .2byte 0x1 - .byte 0x53 - .8byte .LVL400 - .8byte .LVL404 - .2byte 0x1 - .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 - .2byte 0x1 - .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 - .2byte 0x1 - .byte 0x53 - .8byte .LVL429 - .8byte .LVL432 - .2byte 0x1 - .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 - .8byte .LVL444 - .8byte .LVL447 - .2byte 0x1 - .byte 0x53 - .8byte .LVL451 - .8byte .LVL454 - .2byte 0x1 - .byte 0x53 - .8byte .LVL458 - .8byte .LVL461 - .2byte 0x1 - .byte 0x53 - .8byte .LVL465 - .8byte .LVL468 - .2byte 0x1 - .byte 0x53 - .8byte .LVL472 - .8byte .LVL483 - .2byte 0x1 - .byte 0x53 - .8byte .LVL487 - .8byte .LVL488 - .2byte 0x1 - .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 - .2byte 0x1 - .byte 0x53 - .8byte .LVL535 - .8byte .LVL537 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST148: - .8byte .LVL431 - .8byte .LVL435 - .2byte 0x1 - .byte 0x60 - .8byte 0 - .8byte 0 -.LLST149: - .8byte .LVL347 - .8byte .LVL354 - .2byte 0x1 - .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 - .2byte 0x1 - .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 - .2byte 0x1 - .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 - .2byte 0x1 - .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 - .2byte 0x1 - .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 - .2byte 0x1 - .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 - .2byte 0x1 - .byte 0x53 - .8byte .LVL400 - .8byte .LVL404 - .2byte 0x1 - .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 - .2byte 0x1 - .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 - .2byte 0x1 - .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 - .2byte 0x1 - .byte 0x53 - .8byte .LVL436 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 - .8byte .LVL444 - .8byte .LVL447 - .2byte 0x1 - .byte 0x53 - .8byte .LVL451 - .8byte .LVL454 - .2byte 0x1 - .byte 0x53 - .8byte .LVL458 - .8byte .LVL461 - .2byte 0x1 - .byte 0x53 - .8byte .LVL465 - .8byte .LVL468 - .2byte 0x1 - .byte 0x53 - .8byte .LVL472 - .8byte .LVL483 - .2byte 0x1 - .byte 0x53 - .8byte .LVL487 - .8byte .LVL488 - .2byte 0x1 - .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 - .2byte 0x1 - .byte 0x53 - .8byte .LVL531 - .8byte .LVL533 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST150: - .8byte .LVL438 - .8byte .LVL442 - .2byte 0x1 - .byte 0x60 - .8byte 0 - .8byte 0 -.LLST151: - .8byte .LVL347 - .8byte .LVL354 - .2byte 0x1 - .byte 0x53 - .8byte .LVL358 - .8byte .LVL360 - .2byte 0x1 - .byte 0x53 - .8byte .LVL365 - .8byte .LVL367 - .2byte 0x1 - .byte 0x53 - .8byte .LVL372 - .8byte .LVL374 - .2byte 0x1 - .byte 0x53 - .8byte .LVL379 - .8byte .LVL381 - .2byte 0x1 - .byte 0x53 - .8byte .LVL386 - .8byte .LVL388 - .2byte 0x1 - .byte 0x53 - .8byte .LVL393 - .8byte .LVL395 - .2byte 0x1 - .byte 0x53 - .8byte .LVL400 - .8byte .LVL404 - .2byte 0x1 - .byte 0x53 - .8byte .LVL407 - .8byte .LVL418 - .2byte 0x1 - .byte 0x53 - .8byte .LVL423 - .8byte .LVL425 - .2byte 0x1 - .byte 0x53 - .8byte .LVL430 - .8byte .LVL432 - .2byte 0x1 - .byte 0x53 - .8byte .LVL437 - .8byte .LVL439 - .2byte 0x1 - .byte 0x53 - .8byte .LVL443 - .8byte .LVL447 - .2byte 0x1 - .byte 0x53 - .8byte .LVL451 - .8byte .LVL454 - .2byte 0x1 - .byte 0x53 - .8byte .LVL458 - .8byte .LVL461 - .2byte 0x1 - .byte 0x53 - .8byte .LVL465 - .8byte .LVL468 - .2byte 0x1 - .byte 0x53 - .8byte .LVL472 - .8byte .LVL483 - .2byte 0x1 - .byte 0x53 - .8byte .LVL487 - .8byte .LVL488 - .2byte 0x1 - .byte 0x53 - .8byte .LVL517 - .8byte .LVL518 - .2byte 0x1 - .byte 0x53 .8byte .LVL527 .8byte .LVL529 .2byte 0x1 - .byte 0x53 + .byte 0x50 + .8byte .LVL531 + .8byte .LVL533 + .2byte 0x1 + .byte 0x50 + .8byte .LVL535 + .8byte .LVL537 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST149: + .8byte .LVL344 + .8byte .LVL352 + .2byte 0x1 + .byte 0x54 + .8byte .LVL355 + .8byte .LVL358 + .2byte 0x1 + .byte 0x54 + .8byte .LVL362 + .8byte .LVL365 + .2byte 0x1 + .byte 0x54 + .8byte .LVL369 + .8byte .LVL372 + .2byte 0x1 + .byte 0x54 + .8byte .LVL376 + .8byte .LVL379 + .2byte 0x1 + .byte 0x54 + .8byte .LVL383 + .8byte .LVL386 + .2byte 0x1 + .byte 0x54 + .8byte .LVL390 + .8byte .LVL393 + .2byte 0x1 + .byte 0x54 + .8byte .LVL397 + .8byte .LVL399 + .2byte 0x1 + .byte 0x54 + .8byte .LVL404 + .8byte .LVL480 + .2byte 0x1 + .byte 0x54 + .8byte .LVL484 + .8byte .LVL485 + .2byte 0x1 + .byte 0x54 + .8byte .LVL510 + .8byte .LVL537 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST150: + .8byte .LVL413 + .8byte .LVL416 + .2byte 0x1 + .byte 0x52 + .8byte .LVL419 + .8byte .LVL472 + .2byte 0x1 + .byte 0x52 + .8byte .LVL510 + .8byte .LVL537 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST151: + .8byte .LVL412 + .8byte .LVL466 + .2byte 0x1 + .byte 0x55 + .8byte .LVL469 + .8byte .LVL471 + .2byte 0x1 + .byte 0x55 + .8byte .LVL514 + .8byte .LVL537 + .2byte 0x1 + .byte 0x55 .8byte 0 .8byte 0 .LLST152: - .8byte .LVL445 - .8byte .LVL449 + .8byte .LVL344 + .8byte .LVL350 .2byte 0x1 - .byte 0x60 + .byte 0x6e + .8byte .LVL355 + .8byte .LVL359 + .2byte 0x1 + .byte 0x6e + .8byte .LVL362 + .8byte .LVL366 + .2byte 0x1 + .byte 0x6e + .8byte .LVL369 + .8byte .LVL373 + .2byte 0x1 + .byte 0x6e + .8byte .LVL376 + .8byte .LVL380 + .2byte 0x1 + .byte 0x6e + .8byte .LVL383 + .8byte .LVL387 + .2byte 0x1 + .byte 0x6e + .8byte .LVL390 + .8byte .LVL394 + .2byte 0x1 + .byte 0x6e + .8byte .LVL397 + .8byte .LVL424 + .2byte 0x1 + .byte 0x6e + .8byte .LVL427 + .8byte .LVL431 + .2byte 0x1 + .byte 0x6e + .8byte .LVL434 + .8byte .LVL438 + .2byte 0x1 + .byte 0x6e + .8byte .LVL441 + .8byte .LVL445 + .2byte 0x1 + .byte 0x6e + .8byte .LVL448 + .8byte .LVL452 + .2byte 0x1 + .byte 0x6e + .8byte .LVL455 + .8byte .LVL459 + .2byte 0x1 + .byte 0x6e + .8byte .LVL462 + .8byte .LVL479 + .2byte 0x1 + .byte 0x6e + .8byte .LVL480 + .8byte .LVL485 + .2byte 0x1 + .byte 0x6e + .8byte .LVL510 + .8byte .LVL515 + .2byte 0x1 + .byte 0x6e + .8byte .LVL536 + .8byte .LVL537 + .2byte 0x1 + .byte 0x6e .8byte 0 .8byte 0 .LLST153: - .8byte .LVL347 - .8byte .LVL351 + .8byte .LVL418 + .8byte .LVL419 .2byte 0x1 - .byte 0x59 - .8byte .LVL408 - .8byte .LVL420 - .2byte 0x1 - .byte 0x59 - .8byte .LVL423 - .8byte .LVL426 - .2byte 0x1 - .byte 0x59 - .8byte .LVL430 - .8byte .LVL433 - .2byte 0x1 - .byte 0x59 - .8byte .LVL437 - .8byte .LVL440 - .2byte 0x1 - .byte 0x59 - .8byte .LVL444 - .8byte .LVL446 - .2byte 0x1 - .byte 0x59 - .8byte .LVL450 - .8byte .LVL453 - .2byte 0x1 - .byte 0x59 - .8byte .LVL458 - .8byte .LVL460 - .2byte 0x1 - .byte 0x59 - .8byte .LVL465 - .8byte .LVL467 - .2byte 0x1 - .byte 0x59 - .8byte .LVL472 - .8byte .LVL483 - .2byte 0x1 - .byte 0x59 - .8byte .LVL517 - .8byte .LVL518 - .2byte 0x1 - .byte 0x59 - .8byte .LVL524 - .8byte .LVL527 - .2byte 0x1 - .byte 0x59 + .byte 0x52 .8byte 0 .8byte 0 .LLST154: - .8byte .LVL452 - .8byte .LVL456 + .8byte .LVL421 + .8byte .LVL425 .2byte 0x1 .byte 0x60 .8byte 0 .8byte 0 .LLST155: - .8byte .LVL347 + .8byte .LVL344 .8byte .LVL351 .2byte 0x1 - .byte 0x59 - .8byte .LVL408 + .byte 0x53 + .8byte .LVL355 + .8byte .LVL357 + .2byte 0x1 + .byte 0x53 + .8byte .LVL362 + .8byte .LVL364 + .2byte 0x1 + .byte 0x53 + .8byte .LVL369 + .8byte .LVL371 + .2byte 0x1 + .byte 0x53 + .8byte .LVL376 + .8byte .LVL378 + .2byte 0x1 + .byte 0x53 + .8byte .LVL383 + .8byte .LVL385 + .2byte 0x1 + .byte 0x53 + .8byte .LVL390 + .8byte .LVL392 + .2byte 0x1 + .byte 0x53 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 + .8byte .LVL404 + .8byte .LVL415 + .2byte 0x1 + .byte 0x53 .8byte .LVL420 + .8byte .LVL422 .2byte 0x1 - .byte 0x59 - .8byte .LVL423 + .byte 0x53 .8byte .LVL426 + .8byte .LVL429 .2byte 0x1 - .byte 0x59 - .8byte .LVL430 - .8byte .LVL433 + .byte 0x53 + .8byte .LVL434 + .8byte .LVL436 .2byte 0x1 - .byte 0x59 - .8byte .LVL437 - .8byte .LVL440 - .2byte 0x1 - .byte 0x59 + .byte 0x53 + .8byte .LVL441 .8byte .LVL444 - .8byte .LVL446 .2byte 0x1 - .byte 0x59 + .byte 0x53 + .8byte .LVL448 .8byte .LVL451 - .8byte .LVL453 .2byte 0x1 - .byte 0x59 - .8byte .LVL457 - .8byte .LVL460 + .byte 0x53 + .8byte .LVL455 + .8byte .LVL458 .2byte 0x1 - .byte 0x59 + .byte 0x53 + .8byte .LVL462 .8byte .LVL465 - .8byte .LVL467 .2byte 0x1 - .byte 0x59 - .8byte .LVL472 - .8byte .LVL483 + .byte 0x53 + .8byte .LVL469 + .8byte .LVL480 .2byte 0x1 - .byte 0x59 - .8byte .LVL517 - .8byte .LVL521 + .byte 0x53 + .8byte .LVL484 + .8byte .LVL485 .2byte 0x1 - .byte 0x59 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x53 + .8byte .LVL532 + .8byte .LVL534 + .2byte 0x1 + .byte 0x53 .8byte 0 .8byte 0 .LLST156: - .8byte .LVL459 - .8byte .LVL463 + .8byte .LVL428 + .8byte .LVL432 .2byte 0x1 .byte 0x60 .8byte 0 .8byte 0 .LLST157: - .8byte .LVL347 + .8byte .LVL344 .8byte .LVL351 .2byte 0x1 - .byte 0x59 - .8byte .LVL408 + .byte 0x53 + .8byte .LVL355 + .8byte .LVL357 + .2byte 0x1 + .byte 0x53 + .8byte .LVL362 + .8byte .LVL364 + .2byte 0x1 + .byte 0x53 + .8byte .LVL369 + .8byte .LVL371 + .2byte 0x1 + .byte 0x53 + .8byte .LVL376 + .8byte .LVL378 + .2byte 0x1 + .byte 0x53 + .8byte .LVL383 + .8byte .LVL385 + .2byte 0x1 + .byte 0x53 + .8byte .LVL390 + .8byte .LVL392 + .2byte 0x1 + .byte 0x53 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 + .8byte .LVL404 + .8byte .LVL415 + .2byte 0x1 + .byte 0x53 .8byte .LVL420 + .8byte .LVL422 .2byte 0x1 - .byte 0x59 - .8byte .LVL423 - .8byte .LVL426 + .byte 0x53 + .8byte .LVL427 + .8byte .LVL429 .2byte 0x1 - .byte 0x59 - .8byte .LVL430 + .byte 0x53 .8byte .LVL433 + .8byte .LVL436 .2byte 0x1 - .byte 0x59 - .8byte .LVL437 - .8byte .LVL440 - .2byte 0x1 - .byte 0x59 + .byte 0x53 + .8byte .LVL441 .8byte .LVL444 + .2byte 0x1 + .byte 0x53 + .8byte .LVL448 + .8byte .LVL451 + .2byte 0x1 + .byte 0x53 + .8byte .LVL455 + .8byte .LVL458 + .2byte 0x1 + .byte 0x53 + .8byte .LVL462 + .8byte .LVL465 + .2byte 0x1 + .byte 0x53 + .8byte .LVL469 + .8byte .LVL480 + .2byte 0x1 + .byte 0x53 + .8byte .LVL484 + .8byte .LVL485 + .2byte 0x1 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x53 + .8byte .LVL528 + .8byte .LVL530 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST158: + .8byte .LVL435 + .8byte .LVL439 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST159: + .8byte .LVL344 + .8byte .LVL351 + .2byte 0x1 + .byte 0x53 + .8byte .LVL355 + .8byte .LVL357 + .2byte 0x1 + .byte 0x53 + .8byte .LVL362 + .8byte .LVL364 + .2byte 0x1 + .byte 0x53 + .8byte .LVL369 + .8byte .LVL371 + .2byte 0x1 + .byte 0x53 + .8byte .LVL376 + .8byte .LVL378 + .2byte 0x1 + .byte 0x53 + .8byte .LVL383 + .8byte .LVL385 + .2byte 0x1 + .byte 0x53 + .8byte .LVL390 + .8byte .LVL392 + .2byte 0x1 + .byte 0x53 + .8byte .LVL397 + .8byte .LVL401 + .2byte 0x1 + .byte 0x53 + .8byte .LVL404 + .8byte .LVL415 + .2byte 0x1 + .byte 0x53 + .8byte .LVL420 + .8byte .LVL422 + .2byte 0x1 + .byte 0x53 + .8byte .LVL427 + .8byte .LVL429 + .2byte 0x1 + .byte 0x53 + .8byte .LVL434 + .8byte .LVL436 + .2byte 0x1 + .byte 0x53 + .8byte .LVL440 + .8byte .LVL444 + .2byte 0x1 + .byte 0x53 + .8byte .LVL448 + .8byte .LVL451 + .2byte 0x1 + .byte 0x53 + .8byte .LVL455 + .8byte .LVL458 + .2byte 0x1 + .byte 0x53 + .8byte .LVL462 + .8byte .LVL465 + .2byte 0x1 + .byte 0x53 + .8byte .LVL469 + .8byte .LVL480 + .2byte 0x1 + .byte 0x53 + .8byte .LVL484 + .8byte .LVL485 + .2byte 0x1 + .byte 0x53 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x53 + .8byte .LVL524 + .8byte .LVL526 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST160: + .8byte .LVL442 .8byte .LVL446 .2byte 0x1 - .byte 0x59 - .8byte .LVL451 - .8byte .LVL453 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST161: + .8byte .LVL344 + .8byte .LVL348 .2byte 0x1 .byte 0x59 - .8byte .LVL458 - .8byte .LVL460 + .8byte .LVL405 + .8byte .LVL417 .2byte 0x1 .byte 0x59 + .8byte .LVL420 + .8byte .LVL423 + .2byte 0x1 + .byte 0x59 + .8byte .LVL427 + .8byte .LVL430 + .2byte 0x1 + .byte 0x59 + .8byte .LVL434 + .8byte .LVL437 + .2byte 0x1 + .byte 0x59 + .8byte .LVL441 + .8byte .LVL443 + .2byte 0x1 + .byte 0x59 + .8byte .LVL447 + .8byte .LVL450 + .2byte 0x1 + .byte 0x59 + .8byte .LVL455 + .8byte .LVL457 + .2byte 0x1 + .byte 0x59 + .8byte .LVL462 .8byte .LVL464 - .8byte .LVL467 .2byte 0x1 .byte 0x59 - .8byte .LVL472 - .8byte .LVL483 + .8byte .LVL469 + .8byte .LVL480 .2byte 0x1 .byte 0x59 - .8byte .LVL517 - .8byte .LVL518 + .8byte .LVL514 + .8byte .LVL515 .2byte 0x1 .byte 0x59 .8byte .LVL521 @@ -63922,570 +64108,686 @@ .byte 0x59 .8byte 0 .8byte 0 -.LLST158: - .8byte .LVL466 - .8byte .LVL470 - .2byte 0x1 - .byte 0x5f - .8byte 0 - .8byte 0 -.LLST159: - .8byte .LVL471 - .8byte .LVL474 - .2byte 0x1 - .byte 0x55 - .8byte .LVL513 - .8byte .LVL518 - .2byte 0x1 - .byte 0x55 - .8byte 0 - .8byte 0 -.LLST160: - .8byte .LVL553 - .8byte .LVL555 - .2byte 0x1 - .byte 0x50 - .8byte .LVL555 - .8byte .LVL560-1 - .2byte 0x1 - .byte 0x55 - .8byte .LVL561 - .8byte .LVL563 - .2byte 0x1 - .byte 0x55 - .8byte .LVL563 - .8byte .LVL606 - .2byte 0x1 - .byte 0x67 - .8byte .LVL609 - .8byte .LVL628 - .2byte 0x1 - .byte 0x67 - .8byte .LVL628 - .8byte .LVL629 - .2byte 0x1 - .byte 0x55 - .8byte .LVL629 - .8byte .LVL635 - .2byte 0x1 - .byte 0x67 - .8byte .LVL638 - .8byte .LFE2820 - .2byte 0x1 - .byte 0x55 - .8byte 0 - .8byte 0 -.LLST161: - .8byte .LVL553 - .8byte .LVL605 - .2byte 0x1 - .byte 0x51 - .8byte .LVL609 - .8byte .LVL634 - .2byte 0x1 - .byte 0x65 - .8byte .LVL638 - .8byte .LFE2820 - .2byte 0x1 - .byte 0x65 - .8byte 0 - .8byte 0 .LLST162: - .8byte .LVL553 - .8byte .LVL604 + .8byte .LVL449 + .8byte .LVL453 .2byte 0x1 - .byte 0x52 - .8byte .LVL609 - .8byte .LVL633 - .2byte 0x1 - .byte 0x64 - .8byte .LVL638 - .8byte .LFE2820 - .2byte 0x1 - .byte 0x64 + .byte 0x60 .8byte 0 .8byte 0 .LLST163: - .8byte .LVL553 - .8byte .LVL607 + .8byte .LVL344 + .8byte .LVL348 .2byte 0x1 - .byte 0x53 - .8byte .LVL609 - .8byte .LVL636 + .byte 0x59 + .8byte .LVL405 + .8byte .LVL417 .2byte 0x1 - .byte 0x69 - .8byte .LVL638 - .8byte .LFE2820 + .byte 0x59 + .8byte .LVL420 + .8byte .LVL423 .2byte 0x1 - .byte 0x69 + .byte 0x59 + .8byte .LVL427 + .8byte .LVL430 + .2byte 0x1 + .byte 0x59 + .8byte .LVL434 + .8byte .LVL437 + .2byte 0x1 + .byte 0x59 + .8byte .LVL441 + .8byte .LVL443 + .2byte 0x1 + .byte 0x59 + .8byte .LVL448 + .8byte .LVL450 + .2byte 0x1 + .byte 0x59 + .8byte .LVL454 + .8byte .LVL457 + .2byte 0x1 + .byte 0x59 + .8byte .LVL462 + .8byte .LVL464 + .2byte 0x1 + .byte 0x59 + .8byte .LVL469 + .8byte .LVL480 + .2byte 0x1 + .byte 0x59 + .8byte .LVL514 + .8byte .LVL518 + .2byte 0x1 + .byte 0x59 .8byte 0 .8byte 0 .LLST164: - .8byte .LVL553 - .8byte .LVL607 + .8byte .LVL456 + .8byte .LVL460 .2byte 0x1 - .byte 0x54 - .8byte .LVL609 - .8byte .LVL636 - .2byte 0x1 - .byte 0x6a - .8byte .LVL638 - .8byte .LFE2820 - .2byte 0x1 - .byte 0x6a + .byte 0x60 .8byte 0 .8byte 0 .LLST165: - .8byte .LVL553 - .8byte .LVL554 + .8byte .LVL344 + .8byte .LVL348 .2byte 0x1 - .byte 0x55 - .8byte .LVL554 - .8byte .LVL604 + .byte 0x59 + .8byte .LVL405 + .8byte .LVL417 .2byte 0x1 - .byte 0x63 - .8byte .LVL609 - .8byte .LVL633 + .byte 0x59 + .8byte .LVL420 + .8byte .LVL423 .2byte 0x1 - .byte 0x63 - .8byte .LVL638 - .8byte .LFE2820 + .byte 0x59 + .8byte .LVL427 + .8byte .LVL430 .2byte 0x1 - .byte 0x63 + .byte 0x59 + .8byte .LVL434 + .8byte .LVL437 + .2byte 0x1 + .byte 0x59 + .8byte .LVL441 + .8byte .LVL443 + .2byte 0x1 + .byte 0x59 + .8byte .LVL448 + .8byte .LVL450 + .2byte 0x1 + .byte 0x59 + .8byte .LVL455 + .8byte .LVL457 + .2byte 0x1 + .byte 0x59 + .8byte .LVL461 + .8byte .LVL464 + .2byte 0x1 + .byte 0x59 + .8byte .LVL469 + .8byte .LVL480 + .2byte 0x1 + .byte 0x59 + .8byte .LVL514 + .8byte .LVL515 + .2byte 0x1 + .byte 0x59 + .8byte .LVL518 + .8byte .LVL521 + .2byte 0x1 + .byte 0x59 .8byte 0 .8byte 0 .LLST166: - .8byte .LVL553 - .8byte .LVL560-1 + .8byte .LVL463 + .8byte .LVL467 .2byte 0x1 - .byte 0x56 - .8byte .LVL628 - .8byte .LVL630-1 - .2byte 0x1 - .byte 0x56 - .8byte .LVL638 - .8byte .LFE2820 - .2byte 0x1 - .byte 0x56 + .byte 0x5f .8byte 0 .8byte 0 .LLST167: - .8byte .LVL558 - .8byte .LVL606 + .8byte .LVL468 + .8byte .LVL471 .2byte 0x1 - .byte 0x68 - .8byte .LVL609 - .8byte .LVL635 + .byte 0x55 + .8byte .LVL510 + .8byte .LVL515 .2byte 0x1 - .byte 0x68 - .8byte .LVL639 - .8byte .LVL641 - .2byte 0x1 - .byte 0x68 - .8byte .LVL642 - .8byte .LFE2820 - .2byte 0x1 - .byte 0x68 + .byte 0x55 .8byte 0 .8byte 0 .LLST168: - .8byte .LVL557 - .8byte .LVL608 + .8byte .LVL550 + .8byte .LVL552 .2byte 0x1 - .byte 0x6b - .8byte .LVL609 - .8byte .LVL637 + .byte 0x50 + .8byte .LVL552 + .8byte .LVL557-1 .2byte 0x1 - .byte 0x6b - .8byte .LVL640 + .byte 0x55 + .8byte .LVL558 + .8byte .LVL560 + .2byte 0x1 + .byte 0x55 + .8byte .LVL560 + .8byte .LVL603 + .2byte 0x1 + .byte 0x67 + .8byte .LVL606 + .8byte .LVL625 + .2byte 0x1 + .byte 0x67 + .8byte .LVL625 + .8byte .LVL626 + .2byte 0x1 + .byte 0x55 + .8byte .LVL626 + .8byte .LVL632 + .2byte 0x1 + .byte 0x67 + .8byte .LVL635 .8byte .LFE2820 .2byte 0x1 - .byte 0x6b + .byte 0x55 .8byte 0 .8byte 0 .LLST169: - .8byte .LVL565 - .8byte .LVL572 + .8byte .LVL550 + .8byte .LVL602 .2byte 0x1 - .byte 0x53 - .8byte .LVL574 - .8byte .LVL576 + .byte 0x51 + .8byte .LVL606 + .8byte .LVL631 .2byte 0x1 - .byte 0x53 - .8byte .LVL578 - .8byte .LVL580 + .byte 0x65 + .8byte .LVL635 + .8byte .LFE2820 .2byte 0x1 - .byte 0x53 - .8byte .LVL582 - .8byte .LVL584 - .2byte 0x1 - .byte 0x53 - .8byte .LVL586 - .8byte .LVL588 - .2byte 0x1 - .byte 0x53 - .8byte .LVL590 - .8byte .LVL592 - .2byte 0x1 - .byte 0x53 - .8byte .LVL594 - .8byte .LVL596 - .2byte 0x1 - .byte 0x53 - .8byte .LVL598 - .8byte .LVL600 - .2byte 0x1 - .byte 0x53 - .8byte .LVL603 - .8byte .LVL609 - .2byte 0x1 - .byte 0x53 - .8byte .LVL613 - .8byte .LVL614 - .2byte 0x1 - .byte 0x53 - .8byte .LVL627 - .8byte .LVL628 - .2byte 0x1 - .byte 0x53 - .8byte .LVL632 - .8byte .LVL638 - .2byte 0x1 - .byte 0x53 + .byte 0x65 .8byte 0 .8byte 0 .LLST170: - .8byte .LVL556 - .8byte .LVL608 + .8byte .LVL550 + .8byte .LVL601 .2byte 0x1 - .byte 0x6c - .8byte .LVL609 - .8byte .LVL637 + .byte 0x52 + .8byte .LVL606 + .8byte .LVL630 .2byte 0x1 - .byte 0x6c + .byte 0x64 + .8byte .LVL635 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST171: + .8byte .LVL550 + .8byte .LVL604 + .2byte 0x1 + .byte 0x53 + .8byte .LVL606 + .8byte .LVL633 + .2byte 0x1 + .byte 0x69 + .8byte .LVL635 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST172: + .8byte .LVL550 + .8byte .LVL604 + .2byte 0x1 + .byte 0x54 + .8byte .LVL606 + .8byte .LVL633 + .2byte 0x1 + .byte 0x6a + .8byte .LVL635 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST173: + .8byte .LVL550 + .8byte .LVL551 + .2byte 0x1 + .byte 0x55 + .8byte .LVL551 + .8byte .LVL601 + .2byte 0x1 + .byte 0x63 + .8byte .LVL606 + .8byte .LVL630 + .2byte 0x1 + .byte 0x63 + .8byte .LVL635 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST174: + .8byte .LVL550 + .8byte .LVL557-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL625 + .8byte .LVL627-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL635 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST175: + .8byte .LVL555 + .8byte .LVL603 + .2byte 0x1 + .byte 0x68 + .8byte .LVL606 + .8byte .LVL632 + .2byte 0x1 + .byte 0x68 + .8byte .LVL636 .8byte .LVL638 + .2byte 0x1 + .byte 0x68 + .8byte .LVL639 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST176: + .8byte .LVL554 + .8byte .LVL605 + .2byte 0x1 + .byte 0x6b + .8byte .LVL606 + .8byte .LVL634 + .2byte 0x1 + .byte 0x6b + .8byte .LVL637 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST177: + .8byte .LVL562 + .8byte .LVL569 + .2byte 0x1 + .byte 0x53 + .8byte .LVL571 + .8byte .LVL573 + .2byte 0x1 + .byte 0x53 + .8byte .LVL575 + .8byte .LVL577 + .2byte 0x1 + .byte 0x53 + .8byte .LVL579 + .8byte .LVL581 + .2byte 0x1 + .byte 0x53 + .8byte .LVL583 + .8byte .LVL585 + .2byte 0x1 + .byte 0x53 + .8byte .LVL587 + .8byte .LVL589 + .2byte 0x1 + .byte 0x53 + .8byte .LVL591 + .8byte .LVL593 + .2byte 0x1 + .byte 0x53 + .8byte .LVL595 + .8byte .LVL597 + .2byte 0x1 + .byte 0x53 + .8byte .LVL600 + .8byte .LVL606 + .2byte 0x1 + .byte 0x53 + .8byte .LVL610 + .8byte .LVL611 + .2byte 0x1 + .byte 0x53 + .8byte .LVL624 + .8byte .LVL625 + .2byte 0x1 + .byte 0x53 + .8byte .LVL629 + .8byte .LVL635 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST178: + .8byte .LVL553 + .8byte .LVL605 + .2byte 0x1 + .byte 0x6c + .8byte .LVL606 + .8byte .LVL634 + .2byte 0x1 + .byte 0x6c + .8byte .LVL635 .8byte .LFE2820 .2byte 0x1 .byte 0x6c .8byte 0 .8byte 0 -.LLST171: - .8byte .LVL559 - .8byte .LVL560-1 - .2byte 0x1 - .byte 0x5c - .8byte .LVL562 - .8byte .LVL564 - .2byte 0x1 - .byte 0x5c - .8byte .LVL628 - .8byte .LVL630-1 - .2byte 0x1 - .byte 0x5c - .8byte .LVL631 - .8byte .LVL638 - .2byte 0x1 - .byte 0x5c - .8byte 0 - .8byte 0 -.LLST172: - .8byte .LVL566 - .8byte .LVL567 - .2byte 0x1 - .byte 0x52 - .8byte .LVL568 - .8byte .LVL611 - .2byte 0x1 - .byte 0x52 - .8byte .LVL613 - .8byte .LVL628 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST173: - .8byte .LVL566 - .8byte .LVL610 - .2byte 0x1 - .byte 0x50 - .8byte .LVL612 - .8byte .LVL615 - .2byte 0x1 - .byte 0x50 - .8byte .LVL616 - .8byte .LVL617 - .2byte 0x1 - .byte 0x50 - .8byte .LVL618 - .8byte .LVL619 - .2byte 0x1 - .byte 0x50 - .8byte .LVL620 - .8byte .LVL621 - .2byte 0x1 - .byte 0x50 - .8byte .LVL622 - .8byte .LVL623 - .2byte 0x1 - .byte 0x50 - .8byte .LVL624 - .8byte .LVL625 - .2byte 0x1 - .byte 0x50 - .8byte .LVL626 - .8byte .LVL628 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST174: - .8byte .LVL566 - .8byte .LVL571 - .2byte 0x1 - .byte 0x5d - .8byte .LVL573 - .8byte .LVL628 - .2byte 0x1 - .byte 0x5d - .8byte 0 - .8byte 0 -.LLST175: - .8byte .LVL566 - .8byte .LVL569 - .2byte 0x1 - .byte 0x59 - .8byte .LVL570 - .8byte .LVL628 - .2byte 0x1 - .byte 0x59 - .8byte 0 - .8byte 0 -.LLST176: - .8byte .LVL566 - .8byte .LVL601 - .2byte 0x1 - .byte 0x55 - .8byte .LVL603 - .8byte .LVL609 - .2byte 0x1 - .byte 0x55 - .8byte .LVL613 - .8byte .LVL628 - .2byte 0x1 - .byte 0x55 - .8byte 0 - .8byte 0 -.LLST177: - .8byte .LVL571 - .8byte .LVL573 - .2byte 0x1 - .byte 0x5d - .8byte 0 - .8byte 0 -.LLST178: - .8byte .LVL575 - .8byte .LVL577 - .2byte 0x1 - .byte 0x5f - .8byte 0 - .8byte 0 .LLST179: - .8byte .LVL579 - .8byte .LVL581 + .8byte .LVL556 + .8byte .LVL557-1 .2byte 0x1 - .byte 0x5f + .byte 0x5c + .8byte .LVL559 + .8byte .LVL561 + .2byte 0x1 + .byte 0x5c + .8byte .LVL625 + .8byte .LVL627-1 + .2byte 0x1 + .byte 0x5c + .8byte .LVL628 + .8byte .LVL635 + .2byte 0x1 + .byte 0x5c .8byte 0 .8byte 0 .LLST180: - .8byte .LVL583 - .8byte .LVL585 + .8byte .LVL563 + .8byte .LVL564 .2byte 0x1 - .byte 0x5f + .byte 0x52 + .8byte .LVL565 + .8byte .LVL608 + .2byte 0x1 + .byte 0x52 + .8byte .LVL610 + .8byte .LVL625 + .2byte 0x1 + .byte 0x52 .8byte 0 .8byte 0 .LLST181: - .8byte .LVL587 - .8byte .LVL589 + .8byte .LVL563 + .8byte .LVL607 .2byte 0x1 - .byte 0x5e + .byte 0x50 + .8byte .LVL609 + .8byte .LVL612 + .2byte 0x1 + .byte 0x50 + .8byte .LVL613 + .8byte .LVL614 + .2byte 0x1 + .byte 0x50 + .8byte .LVL615 + .8byte .LVL616 + .2byte 0x1 + .byte 0x50 + .8byte .LVL617 + .8byte .LVL618 + .2byte 0x1 + .byte 0x50 + .8byte .LVL619 + .8byte .LVL620 + .2byte 0x1 + .byte 0x50 + .8byte .LVL621 + .8byte .LVL622 + .2byte 0x1 + .byte 0x50 + .8byte .LVL623 + .8byte .LVL625 + .2byte 0x1 + .byte 0x50 .8byte 0 .8byte 0 .LLST182: - .8byte .LVL591 - .8byte .LVL593 + .8byte .LVL563 + .8byte .LVL568 .2byte 0x1 - .byte 0x5f + .byte 0x5d + .8byte .LVL570 + .8byte .LVL625 + .2byte 0x1 + .byte 0x5d .8byte 0 .8byte 0 .LLST183: - .8byte .LVL595 - .8byte .LVL597 + .8byte .LVL563 + .8byte .LVL566 + .2byte 0x1 + .byte 0x59 + .8byte .LVL567 + .8byte .LVL625 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST184: + .8byte .LVL563 + .8byte .LVL598 + .2byte 0x1 + .byte 0x55 + .8byte .LVL600 + .8byte .LVL606 + .2byte 0x1 + .byte 0x55 + .8byte .LVL610 + .8byte .LVL625 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST185: + .8byte .LVL568 + .8byte .LVL570 + .2byte 0x1 + .byte 0x5d + .8byte 0 + .8byte 0 +.LLST186: + .8byte .LVL572 + .8byte .LVL574 .2byte 0x1 .byte 0x5f .8byte 0 .8byte 0 -.LLST184: - .8byte .LVL599 - .8byte .LVL602 +.LLST187: + .8byte .LVL576 + .8byte .LVL578 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST188: + .8byte .LVL580 + .8byte .LVL582 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST189: + .8byte .LVL584 + .8byte .LVL586 .2byte 0x1 .byte 0x5e .8byte 0 .8byte 0 -.LLST344: +.LLST190: + .8byte .LVL588 + .8byte .LVL590 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST191: + .8byte .LVL592 + .8byte .LVL594 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST192: + .8byte .LVL596 + .8byte .LVL599 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST352: + .8byte .LVL1301 + .8byte .LVL1306 + .2byte 0x1 + .byte 0x53 + .8byte .LVL1314 + .8byte .LFE2819 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST353: + .8byte .LVL1305 + .8byte .LVL1306 + .2byte 0x1 + .byte 0x53 + .8byte .LVL1307 .8byte .LVL1309 - .8byte .LVL1314 .2byte 0x1 .byte 0x53 - .8byte .LVL1322 - .8byte .LFE2819 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST345: .8byte .LVL1313 - .8byte .LVL1314 - .2byte 0x1 - .byte 0x53 - .8byte .LVL1315 - .8byte .LVL1317 - .2byte 0x1 - .byte 0x53 - .8byte .LVL1321 .8byte .LFE2819 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 -.LLST346: - .8byte .LVL1316 - .8byte .LVL1319 +.LLST354: + .8byte .LVL1308 + .8byte .LVL1311 .2byte 0x1 .byte 0x54 .8byte 0 .8byte 0 -.LLST347: - .8byte .LVL1318 - .8byte .LVL1320 +.LLST355: + .8byte .LVL1310 + .8byte .LVL1312 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 -.LLST323: - .8byte .LVL1227 - .8byte .LVL1235 - .2byte 0x1 - .byte 0x55 - .8byte .LVL1247 - .8byte .LVL1249 - .2byte 0x1 - .byte 0x55 - .8byte .LVL1301 - .8byte .LVL1302 - .2byte 0x1 - .byte 0x55 - .8byte 0 - .8byte 0 -.LLST324: - .8byte .LVL1229 - .8byte .LVL1301 - .2byte 0x1 - .byte 0x5c - .8byte .LVL1302 - .8byte .LFE2818 - .2byte 0x1 - .byte 0x5c - .8byte 0 - .8byte 0 -.LLST325: - .8byte .LVL1234 - .8byte .LVL1245 - .2byte 0x1 - .byte 0x56 - .8byte .LVL1250 - .8byte .LVL1301 - .2byte 0x1 - .byte 0x56 - .8byte .LVL1302 - .8byte .LFE2818 - .2byte 0x1 - .byte 0x56 - .8byte 0 - .8byte 0 -.LLST326: - .8byte .LVL1231 - .8byte .LVL1233 - .2byte 0x1 - .byte 0x5a - .8byte .LVL1244 - .8byte .LVL1248 - .2byte 0x1 - .byte 0x5a - .8byte 0 - .8byte 0 -.LLST327: - .8byte .LVL1231 - .8byte .LVL1301 - .2byte 0x1 - .byte 0x59 - .8byte .LVL1302 - .8byte .LFE2818 - .2byte 0x1 - .byte 0x59 - .8byte 0 - .8byte 0 -.LLST328: - .8byte .LVL1230 - .8byte .LVL1301 - .2byte 0x1 - .byte 0x60 - .8byte .LVL1302 - .8byte .LFE2818 - .2byte 0x1 - .byte 0x60 - .8byte 0 - .8byte 0 .LLST331: - .8byte .LVL1236 - .8byte .LVL1237 + .8byte .LVL1219 + .8byte .LVL1227 .2byte 0x1 - .byte 0x5b - .8byte .LVL1269 - .8byte .LVL1270 + .byte 0x55 + .8byte .LVL1239 + .8byte .LVL1241 .2byte 0x1 - .byte 0x5b - .8byte .LVL1278 - .8byte .LVL1279 + .byte 0x55 + .8byte .LVL1293 + .8byte .LVL1294 .2byte 0x1 - .byte 0x5b - .8byte .LVL1283 - .8byte .LVL1284 - .2byte 0x1 - .byte 0x5b + .byte 0x55 .8byte 0 .8byte 0 .LLST332: + .8byte .LVL1221 + .8byte .LVL1293 + .2byte 0x1 + .byte 0x5c + .8byte .LVL1294 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x5c + .8byte 0 + .8byte 0 +.LLST333: + .8byte .LVL1226 .8byte .LVL1237 - .8byte .LVL1238 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1242 + .8byte .LVL1293 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1294 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST334: + .8byte .LVL1223 + .8byte .LVL1225 + .2byte 0x1 + .byte 0x5a + .8byte .LVL1236 + .8byte .LVL1240 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST335: + .8byte .LVL1223 + .8byte .LVL1293 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1294 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST336: + .8byte .LVL1222 + .8byte .LVL1293 + .2byte 0x1 + .byte 0x60 + .8byte .LVL1294 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST339: + .8byte .LVL1228 + .8byte .LVL1229 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1261 + .8byte .LVL1262 .2byte 0x1 .byte 0x5b .8byte .LVL1270 .8byte .LVL1271 .2byte 0x1 .byte 0x5b - .8byte .LVL1274 .8byte .LVL1275 - .2byte 0x1 - .byte 0x5b - .8byte .LVL1281 - .8byte .LVL1282 + .8byte .LVL1276 .2byte 0x1 .byte 0x5b .8byte 0 .8byte 0 -.LLST333: - .8byte .LVL1238 - .8byte .LVL1239 +.LLST340: + .8byte .LVL1229 + .8byte .LVL1230 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1262 + .8byte .LVL1263 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1266 + .8byte .LVL1267 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1273 + .8byte .LVL1274 + .2byte 0x1 + .byte 0x5b + .8byte 0 + .8byte 0 +.LLST341: + .8byte .LVL1230 + .8byte .LVL1231 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1263 + .8byte .LVL1264 .2byte 0x1 .byte 0x5b .8byte .LVL1271 @@ -64496,76 +64798,76 @@ .8byte .LVL1280 .2byte 0x1 .byte 0x5b - .8byte .LVL1287 - .8byte .LVL1288 - .2byte 0x1 - .byte 0x5b .8byte 0 .8byte 0 -.LLST334: - .8byte .LVL1239 - .8byte .LVL1240 +.LLST342: + .8byte .LVL1231 + .8byte .LVL1232 .2byte 0x1 .byte 0x5b - .8byte .LVL1267 - .8byte .LVL1268 + .8byte .LVL1259 + .8byte .LVL1260 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1269 + .8byte .LVL1270 .2byte 0x1 .byte 0x5b .8byte .LVL1277 .8byte .LVL1278 .2byte 0x1 .byte 0x5b - .8byte .LVL1285 - .8byte .LVL1286 + .8byte 0 + .8byte 0 +.LLST343: + .8byte .LVL1232 + .8byte .LVL1233 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1258 + .8byte .LVL1259 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1268 + .8byte .LVL1269 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1274 + .8byte .LVL1275 .2byte 0x1 .byte 0x5b .8byte 0 .8byte 0 -.LLST335: - .8byte .LVL1240 - .8byte .LVL1241 +.LLST337: + .8byte .LVL1233 + .8byte .LVL1234 .2byte 0x1 .byte 0x5b - .8byte .LVL1266 + .8byte .LVL1257 + .8byte .LVL1258 + .2byte 0x1 + .byte 0x5b .8byte .LVL1267 + .8byte .LVL1268 .2byte 0x1 .byte 0x5b .8byte .LVL1276 .8byte .LVL1277 .2byte 0x1 .byte 0x5b - .8byte .LVL1282 - .8byte .LVL1283 - .2byte 0x1 - .byte 0x5b .8byte 0 .8byte 0 -.LLST329: - .8byte .LVL1241 - .8byte .LVL1242 +.LLST338: + .8byte .LVL1223 + .8byte .LVL1224 .2byte 0x1 .byte 0x5b - .8byte .LVL1265 - .8byte .LVL1266 + .8byte .LVL1234 + .8byte .LVL1240 .2byte 0x1 .byte 0x5b - .8byte .LVL1275 - .8byte .LVL1276 - .2byte 0x1 - .byte 0x5b - .8byte .LVL1284 - .8byte .LVL1285 - .2byte 0x1 - .byte 0x5b - .8byte 0 - .8byte 0 -.LLST330: - .8byte .LVL1231 - .8byte .LVL1232 - .2byte 0x1 - .byte 0x5b - .8byte .LVL1242 - .8byte .LVL1248 + .8byte .LVL1256 + .8byte .LVL1257 .2byte 0x1 .byte 0x5b .8byte .LVL1264 @@ -64576,28 +64878,40 @@ .8byte .LVL1273 .2byte 0x1 .byte 0x5b - .8byte .LVL1280 - .8byte .LVL1281 - .2byte 0x1 - .byte 0x5b .8byte 0 .8byte 0 -.LLST337: - .8byte .LVL1235 - .8byte .LVL1246 +.LLST345: + .8byte .LVL1227 + .8byte .LVL1238 .2byte 0x1 .byte 0x55 - .8byte .LVL1249 - .8byte .LVL1301 + .8byte .LVL1241 + .8byte .LVL1293 .2byte 0x1 .byte 0x55 - .8byte .LVL1302 + .8byte .LVL1294 .8byte .LFE2818 .2byte 0x1 .byte 0x55 .8byte 0 .8byte 0 -.LLST338: +.LLST346: + .8byte .LVL1243 + .8byte .LVL1244 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1245 + .8byte .LVL1246 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1247 + .8byte .LVL1248 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1249 + .8byte .LVL1250 + .2byte 0x1 + .byte 0x64 .8byte .LVL1251 .8byte .LVL1252 .2byte 0x1 @@ -64606,186 +64920,170 @@ .8byte .LVL1254 .2byte 0x1 .byte 0x64 - .8byte .LVL1255 - .8byte .LVL1256 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1257 - .8byte .LVL1258 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1259 - .8byte .LVL1260 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1261 - .8byte .LVL1262 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1292 - .8byte .LVL1293 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1296 - .8byte .LVL1297 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1306 - .8byte .LVL1307 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST339: - .8byte .LVL1252 - .8byte .LVL1254 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1255 - .8byte .LVL1256 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1257 - .8byte .LVL1258 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1259 - .8byte .LVL1260 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1261 - .8byte .LVL1262 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1293 - .8byte .LVL1294 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1295 - .8byte .LVL1296 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1307 - .8byte .LVL1308 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST340: - .8byte .LVL1254 - .8byte .LVL1256 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1257 - .8byte .LVL1258 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1259 - .8byte .LVL1260 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1261 - .8byte .LVL1262 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1294 - .8byte .LVL1295 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1308 - .8byte .LFE2818 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST341: - .8byte .LVL1256 - .8byte .LVL1258 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1259 - .8byte .LVL1260 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1261 - .8byte .LVL1262 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1289 - .8byte .LVL1290 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1299 - .8byte .LVL1300 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1303 - .8byte .LVL1304 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST342: - .8byte .LVL1258 - .8byte .LVL1260 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1261 - .8byte .LVL1262 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1290 - .8byte .LVL1291 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1298 - .8byte .LVL1299 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1304 - .8byte .LVL1305 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST343: - .8byte .LVL1260 - .8byte .LVL1262 + .8byte .LVL1284 + .8byte .LVL1285 .2byte 0x1 .byte 0x64 .8byte .LVL1288 .8byte .LVL1289 .2byte 0x1 .byte 0x64 - .8byte .LVL1300 - .8byte .LVL1301 - .2byte 0x1 - .byte 0x64 - .8byte .LVL1302 - .8byte .LVL1303 + .8byte .LVL1298 + .8byte .LVL1299 .2byte 0x1 .byte 0x64 .8byte 0 .8byte 0 -.LLST336: - .8byte .LVL1231 - .8byte .LVL1232 +.LLST347: + .8byte .LVL1244 + .8byte .LVL1246 .2byte 0x1 - .byte 0x5b - .8byte .LVL1243 + .byte 0x64 + .8byte .LVL1247 .8byte .LVL1248 .2byte 0x1 + .byte 0x64 + .8byte .LVL1249 + .8byte .LVL1250 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1251 + .8byte .LVL1252 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1253 + .8byte .LVL1254 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1285 + .8byte .LVL1286 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1287 + .8byte .LVL1288 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1299 + .8byte .LVL1300 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST348: + .8byte .LVL1246 + .8byte .LVL1248 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1249 + .8byte .LVL1250 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1251 + .8byte .LVL1252 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1253 + .8byte .LVL1254 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1286 + .8byte .LVL1287 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1300 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST349: + .8byte .LVL1248 + .8byte .LVL1250 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1251 + .8byte .LVL1252 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1253 + .8byte .LVL1254 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1281 + .8byte .LVL1282 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1291 + .8byte .LVL1292 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1295 + .8byte .LVL1296 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST350: + .8byte .LVL1250 + .8byte .LVL1252 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1253 + .8byte .LVL1254 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1282 + .8byte .LVL1283 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1290 + .8byte .LVL1291 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1296 + .8byte .LVL1297 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST351: + .8byte .LVL1252 + .8byte .LVL1254 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1280 + .8byte .LVL1281 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1292 + .8byte .LVL1293 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1294 + .8byte .LVL1295 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST344: + .8byte .LVL1223 + .8byte .LVL1224 + .2byte 0x1 .byte 0x5b - .8byte .LVL1263 + .8byte .LVL1235 + .8byte .LVL1240 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1255 + .8byte .LVL1257 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1264 .8byte .LVL1265 .2byte 0x1 .byte 0x5b .8byte .LVL1272 .8byte .LVL1273 - .2byte 0x1 - .byte 0x5b - .8byte .LVL1280 - .8byte .LVL1281 .2byte 0x1 .byte 0x5b .8byte 0 @@ -64797,677 +65095,681 @@ .byte 0x50 .8byte 0 .8byte 0 -.LLST216: - .8byte .LVL730 - .8byte .LVL731 - .2byte 0x1 - .byte 0x50 - .8byte .LVL731 - .8byte .LVL746 - .2byte 0x1 - .byte 0x5a - .8byte .LVL746 - .8byte .LVL747 - .2byte 0x1 - .byte 0x55 - .8byte .LVL747 - .8byte .LVL755 - .2byte 0x1 - .byte 0x5a - .8byte .LVL765 - .8byte .LFE2875 - .2byte 0x1 - .byte 0x5a - .8byte 0 - .8byte 0 -.LLST217: - .8byte .LVL743 - .8byte .LVL748 - .2byte 0x1 - .byte 0x59 - .8byte .LVL749 - .8byte .LVL750 - .2byte 0x1 - .byte 0x59 - .8byte .LVL750 - .8byte .LVL765 - .2byte 0x1 - .byte 0x58 - .8byte .LVL765 - .8byte .LFE2875 - .2byte 0x1 - .byte 0x59 - .8byte 0 - .8byte 0 -.LLST218: - .8byte .LVL738 - .8byte .LVL739 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST219: - .8byte .LVL735 - .8byte .LVL737 - .2byte 0x1 - .byte 0x55 - .8byte .LVL737 - .8byte .LVL752 - .2byte 0x1 - .byte 0x56 - .8byte .LVL766 - .8byte .LFE2875 - .2byte 0x1 - .byte 0x56 - .8byte 0 - .8byte 0 -.LLST220: - .8byte .LVL743 - .8byte .LVL759 - .2byte 0x1 - .byte 0x56 - .8byte .LVL762 - .8byte .LFE2875 - .2byte 0x1 - .byte 0x56 - .8byte 0 - .8byte 0 -.LLST221: - .8byte .LVL743 - .8byte .LVL751 - .2byte 0x1 - .byte 0x57 - .8byte .LVL752 - .8byte .LVL760 - .2byte 0x1 - .byte 0x57 - .8byte .LVL762 - .8byte .LFE2875 - .2byte 0x1 - .byte 0x57 - .8byte 0 - .8byte 0 -.LLST222: - .8byte .LVL741 - .8byte .LVL745 - .2byte 0x1 - .byte 0x5d - .8byte .LVL747 - .8byte .LFE2875 - .2byte 0x1 - .byte 0x5d - .8byte 0 - .8byte 0 -.LLST223: - .8byte .LVL754 - .8byte .LVL761 - .2byte 0x1 - .byte 0x50 - .8byte .LVL762 - .8byte .LVL763 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 .LLST224: - .8byte .LVL732 - .8byte .LVL753 + .8byte .LVL727 + .8byte .LVL728 .2byte 0x1 - .byte 0x57 - .8byte .LVL765 - .8byte .LFE2875 + .byte 0x50 + .8byte .LVL728 + .8byte .LVL743 + .2byte 0x1 + .byte 0x5a + .8byte .LVL743 + .8byte .LVL744 .2byte 0x1 .byte 0x55 + .8byte .LVL744 + .8byte .LVL752 + .2byte 0x1 + .byte 0x5a + .8byte .LVL762 + .8byte .LFE2875 + .2byte 0x1 + .byte 0x5a .8byte 0 .8byte 0 .LLST225: + .8byte .LVL740 + .8byte .LVL745 + .2byte 0x1 + .byte 0x59 + .8byte .LVL746 + .8byte .LVL747 + .2byte 0x1 + .byte 0x59 + .8byte .LVL747 + .8byte .LVL762 + .2byte 0x1 + .byte 0x58 + .8byte .LVL762 + .8byte .LFE2875 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST226: + .8byte .LVL735 + .8byte .LVL736 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST227: + .8byte .LVL732 .8byte .LVL734 - .8byte .LVL769 + .2byte 0x1 + .byte 0x55 + .8byte .LVL734 + .8byte .LVL749 + .2byte 0x1 + .byte 0x56 + .8byte .LVL763 + .8byte .LFE2875 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST228: + .8byte .LVL740 + .8byte .LVL756 + .2byte 0x1 + .byte 0x56 + .8byte .LVL759 + .8byte .LFE2875 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST229: + .8byte .LVL740 + .8byte .LVL748 + .2byte 0x1 + .byte 0x57 + .8byte .LVL749 + .8byte .LVL757 + .2byte 0x1 + .byte 0x57 + .8byte .LVL759 + .8byte .LFE2875 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST230: + .8byte .LVL738 + .8byte .LVL742 + .2byte 0x1 + .byte 0x5d + .8byte .LVL744 + .8byte .LFE2875 + .2byte 0x1 + .byte 0x5d + .8byte 0 + .8byte 0 +.LLST231: + .8byte .LVL751 + .8byte .LVL758 + .2byte 0x1 + .byte 0x50 + .8byte .LVL759 + .8byte .LVL760 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST232: + .8byte .LVL729 + .8byte .LVL750 + .2byte 0x1 + .byte 0x57 + .8byte .LVL762 + .8byte .LFE2875 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST233: + .8byte .LVL731 + .8byte .LVL766 .2byte 0x1 .byte 0x6e .8byte 0 .8byte 0 -.LLST226: - .8byte .LVL736 - .8byte .LVL768 +.LLST234: + .8byte .LVL733 + .8byte .LVL765 .2byte 0x1 .byte 0x65 .8byte 0 .8byte 0 -.LLST227: - .8byte .LVL733 - .8byte .LVL735 +.LLST235: + .8byte .LVL730 + .8byte .LVL732 .2byte 0x1 .byte 0x55 - .8byte .LVL735 - .8byte .LVL740 + .8byte .LVL732 + .8byte .LVL737 .2byte 0x1 .byte 0x59 + .8byte .LVL737 + .8byte .LVL739 + .2byte 0x1 + .byte 0x50 .8byte .LVL740 - .8byte .LVL742 + .8byte .LVL741 .2byte 0x1 .byte 0x50 - .8byte .LVL743 - .8byte .LVL744 - .2byte 0x1 - .byte 0x50 - .8byte .LVL767 + .8byte .LVL764 .8byte .LFE2875 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST228: - .8byte .LVL755 - .8byte .LVL756 - .2byte 0x1 - .byte 0x5a - .8byte .LVL757 - .8byte .LVL764 - .2byte 0x1 - .byte 0x5a - .8byte 0 - .8byte 0 -.LLST229: +.LLST236: + .8byte .LVL752 .8byte .LVL753 - .8byte .LVL758 + .2byte 0x1 + .byte 0x5a + .8byte .LVL754 + .8byte .LVL761 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST237: + .8byte .LVL750 + .8byte .LVL755 .2byte 0x1 .byte 0x55 .8byte 0 .8byte 0 -.LLST230: - .8byte .LVL770 - .8byte .LVL774 +.LLST238: + .8byte .LVL767 + .8byte .LVL771 .2byte 0x1 .byte 0x55 - .8byte .LVL775 + .8byte .LVL772 + .8byte .LVL773 + .2byte 0x1 + .byte 0x55 .8byte .LVL776 - .2byte 0x1 - .byte 0x55 - .8byte .LVL779 .8byte .LFE2876 .2byte 0x1 .byte 0x55 .8byte 0 .8byte 0 -.LLST231: +.LLST239: + .8byte .LVL769 + .8byte .LVL770 + .2byte 0x1 + .byte 0x58 .8byte .LVL772 .8byte .LVL773 .2byte 0x1 .byte 0x58 - .8byte .LVL775 .8byte .LVL776 - .2byte 0x1 - .byte 0x58 - .8byte .LVL779 .8byte .LFE2876 .2byte 0x1 .byte 0x58 .8byte 0 .8byte 0 -.LLST232: - .8byte .LVL771 +.LLST240: + .8byte .LVL768 + .8byte .LVL774 + .2byte 0x1 + .byte 0x56 + .8byte .LVL775 .8byte .LVL777 .2byte 0x1 .byte 0x56 .8byte .LVL778 + .8byte .LVL779 + .2byte 0x1 + .byte 0x56 .8byte .LVL780 - .2byte 0x1 - .byte 0x56 .8byte .LVL781 + .2byte 0x1 + .byte 0x56 .8byte .LVL782 - .2byte 0x1 - .byte 0x56 .8byte .LVL783 + .2byte 0x1 + .byte 0x56 .8byte .LVL784 - .2byte 0x1 - .byte 0x56 .8byte .LVL785 + .2byte 0x1 + .byte 0x56 .8byte .LVL786 - .2byte 0x1 - .byte 0x56 .8byte .LVL787 + .2byte 0x1 + .byte 0x56 .8byte .LVL788 - .2byte 0x1 - .byte 0x56 - .8byte .LVL789 - .8byte .LVL790 - .2byte 0x1 - .byte 0x56 - .8byte .LVL791 .8byte .LFE2876 .2byte 0x1 .byte 0x56 .8byte 0 .8byte 0 -.LLST244: - .8byte .LVL831 - .8byte .LVL839 +.LLST252: + .8byte .LVL828 + .8byte .LVL836 .2byte 0x1 .byte 0x50 - .8byte .LVL839 + .8byte .LVL836 + .8byte .LVL843 + .2byte 0x1 + .byte 0x5a + .8byte .LVL843 + .8byte .LVL845 + .2byte 0x1 + .byte 0x50 + .8byte .LVL845 .8byte .LVL846 .2byte 0x1 .byte 0x5a .8byte .LVL846 - .8byte .LVL848 - .2byte 0x1 - .byte 0x50 - .8byte .LVL848 - .8byte .LVL849 - .2byte 0x1 - .byte 0x5a - .8byte .LVL849 .8byte .LFE2877 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST245: - .8byte .LVL831 - .8byte .LVL836 +.LLST253: + .8byte .LVL828 + .8byte .LVL833 .2byte 0x1 .byte 0x56 + .8byte .LVL846 + .8byte .LVL847 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST254: + .8byte .LVL834 + .8byte .LVL846 + .2byte 0x1 + .byte 0x5c .8byte .LVL849 .8byte .LVL850 .2byte 0x1 - .byte 0x56 - .8byte 0 - .8byte 0 -.LLST246: - .8byte .LVL837 - .8byte .LVL849 - .2byte 0x1 .byte 0x5c - .8byte .LVL852 - .8byte .LVL853 - .2byte 0x1 - .byte 0x5c - .8byte .LVL854 - .8byte .LFE2877 - .2byte 0x1 - .byte 0x5c - .8byte 0 - .8byte 0 -.LLST247: - .8byte .LVL835 - .8byte .LVL849 - .2byte 0x1 - .byte 0x5e .8byte .LVL851 .8byte .LFE2877 .2byte 0x1 + .byte 0x5c + .8byte 0 + .8byte 0 +.LLST255: + .8byte .LVL832 + .8byte .LVL846 + .2byte 0x1 + .byte 0x5e + .8byte .LVL848 + .8byte .LFE2877 + .2byte 0x1 .byte 0x5e .8byte 0 .8byte 0 -.LLST248: - .8byte .LVL841 - .8byte .LVL843 +.LLST256: + .8byte .LVL838 + .8byte .LVL840 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST249: - .8byte .LVL842 - .8byte .LVL844 +.LLST257: + .8byte .LVL839 + .8byte .LVL841 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 -.LLST250: - .8byte .LVL832 - .8byte .LVL834 +.LLST258: + .8byte .LVL829 + .8byte .LVL831 .2byte 0x1 .byte 0x54 .8byte 0 .8byte 0 -.LLST251: - .8byte .LVL838 - .8byte .LVL840 +.LLST259: + .8byte .LVL835 + .8byte .LVL837 .2byte 0x1 .byte 0x5f - .8byte .LVL845 + .8byte .LVL842 + .8byte .LVL843 + .2byte 0x1 + .byte 0x5f + .8byte .LVL844 .8byte .LVL846 .2byte 0x1 .byte 0x5f - .8byte .LVL847 - .8byte .LVL849 + .8byte 0 + .8byte 0 +.LLST260: + .8byte .LVL852 + .8byte .LVL861 .2byte 0x1 - .byte 0x5f + .byte 0x56 + .8byte .LVL862 + .8byte .LFE2878 + .2byte 0x1 + .byte 0x56 .8byte 0 .8byte 0 -.LLST252: - .8byte .LVL855 +.LLST261: + .8byte .LVL856 + .8byte .LVL863 + .2byte 0x1 + .byte 0x5a + .8byte .LVL865 + .8byte .LVL869 + .2byte 0x1 + .byte 0x5a + .8byte .LVL870 + .8byte .LFE2878 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST262: + .8byte .LVL857 .8byte .LVL864 .2byte 0x1 - .byte 0x56 - .8byte .LVL865 - .8byte .LFE2878 - .2byte 0x1 - .byte 0x56 - .8byte 0 - .8byte 0 -.LLST253: - .8byte .LVL859 + .byte 0x5d .8byte .LVL866 - .2byte 0x1 - .byte 0x5a - .8byte .LVL868 - .8byte .LVL872 - .2byte 0x1 - .byte 0x5a - .8byte .LVL873 - .8byte .LFE2878 - .2byte 0x1 - .byte 0x5a - .8byte 0 - .8byte 0 -.LLST254: - .8byte .LVL860 - .8byte .LVL867 - .2byte 0x1 - .byte 0x5d - .8byte .LVL869 .8byte .LFE2878 .2byte 0x1 .byte 0x5d .8byte 0 .8byte 0 -.LLST255: - .8byte .LVL856 - .8byte .LVL857 +.LLST263: + .8byte .LVL853 + .8byte .LVL854 .2byte 0x1 .byte 0x53 .8byte 0 .8byte 0 -.LLST256: - .8byte .LVL861 - .8byte .LVL862 +.LLST264: + .8byte .LVL858 + .8byte .LVL859 .2byte 0x1 .byte 0x5c - .8byte .LVL870 - .8byte .LVL871 + .8byte .LVL867 + .8byte .LVL868 .2byte 0x1 .byte 0x5c .8byte 0 .8byte 0 -.LLST257: +.LLST265: + .8byte .LVL860 .8byte .LVL863 - .8byte .LVL866 .2byte 0x1 .byte 0x57 .8byte 0 .8byte 0 -.LLST258: - .8byte .LVL874 - .8byte .LVL875 +.LLST266: + .8byte .LVL871 + .8byte .LVL872 .2byte 0x1 .byte 0x50 - .8byte .LVL875 - .8byte .LVL880 + .8byte .LVL872 + .8byte .LVL877 .2byte 0x1 .byte 0x64 - .8byte .LVL881 + .8byte .LVL878 .8byte .LFE2879 .2byte 0x1 .byte 0x64 .8byte 0 .8byte 0 -.LLST259: - .8byte .LVL882 - .8byte .LVL884 +.LLST267: + .8byte .LVL879 + .8byte .LVL881 .2byte 0x1 .byte 0x50 - .8byte .LVL884 - .8byte .LVL888 + .8byte .LVL881 + .8byte .LVL885 .2byte 0x1 .byte 0x63 + .8byte .LVL886 .8byte .LVL889 - .8byte .LVL892 .2byte 0x1 .byte 0x63 .8byte 0 .8byte 0 -.LLST260: - .8byte .LVL882 - .8byte .LVL883 +.LLST268: + .8byte .LVL879 + .8byte .LVL880 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST262: - .8byte .LVL899 - .8byte .LVL917 +.LLST270: + .8byte .LVL896 + .8byte .LVL914 .2byte 0x1 .byte 0x50 - .8byte .LVL920 + .8byte .LVL917 .8byte .LFE2883 .2byte 0x1 .byte 0x66 .8byte 0 .8byte 0 -.LLST263: - .8byte .LVL899 - .8byte .LVL910 +.LLST271: + .8byte .LVL896 + .8byte .LVL907 .2byte 0x1 .byte 0x51 - .8byte .LVL910 - .8byte .LVL918 + .8byte .LVL907 + .8byte .LVL915 .2byte 0x1 .byte 0x68 - .8byte .LVL920 - .8byte .LFE2883 - .2byte 0x1 - .byte 0x68 - .8byte 0 - .8byte 0 -.LLST264: - .8byte .LVL899 - .8byte .LVL911 - .2byte 0x1 - .byte 0x52 - .8byte .LVL911 - .8byte .LVL919 - .2byte 0x1 - .byte 0x69 - .8byte .LVL920 - .8byte .LFE2883 - .2byte 0x1 - .byte 0x69 - .8byte 0 - .8byte 0 -.LLST265: - .8byte .LVL899 - .8byte .LVL904-1 - .2byte 0x1 - .byte 0x56 - .8byte .LVL920 - .8byte .LFE2883 - .2byte 0x1 - .byte 0x56 - .8byte 0 - .8byte 0 -.LLST266: - .8byte .LVL903 - .8byte .LVL918 - .2byte 0x1 - .byte 0x67 - .8byte .LVL920 - .8byte .LVL921 - .2byte 0x1 - .byte 0x67 - .8byte .LVL922 - .8byte .LFE2883 - .2byte 0x1 - .byte 0x67 - .8byte 0 - .8byte 0 -.LLST267: - .8byte .LVL903 .8byte .LVL917 - .2byte 0x1 - .byte 0x65 - .8byte .LVL923 - .8byte .LVL924 - .2byte 0x1 - .byte 0x65 - .8byte .LVL925 .8byte .LFE2883 .2byte 0x1 - .byte 0x65 - .8byte 0 - .8byte 0 -.LLST268: - .8byte .LVL900 - .8byte .LVL901 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST269: - .8byte .LVL902 - .8byte .LVL916 - .2byte 0x1 - .byte 0x63 - .8byte .LVL920 - .8byte .LFE2883 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST270: - .8byte .LVL905 - .8byte .LVL920 - .2byte 0x1 - .byte 0x54 - .8byte 0 - .8byte 0 -.LLST271: - .8byte .LVL906 - .8byte .LVL908 - .2byte 0x1 - .byte 0x53 - .8byte .LVL909 - .8byte .LVL913 - .2byte 0x1 - .byte 0x53 + .byte 0x68 .8byte 0 .8byte 0 .LLST272: - .8byte .LVL905 - .8byte .LVL907 + .8byte .LVL896 + .8byte .LVL908 .2byte 0x1 - .byte 0x53 - .8byte .LVL912 - .8byte .LVL914 + .byte 0x52 + .8byte .LVL908 + .8byte .LVL916 .2byte 0x1 - .byte 0x53 - .8byte .LVL915 - .8byte .LVL920 + .byte 0x69 + .8byte .LVL917 + .8byte .LFE2883 .2byte 0x1 - .byte 0x53 + .byte 0x69 .8byte 0 .8byte 0 .LLST273: - .8byte .LVL926 - .8byte .LVL930 + .8byte .LVL896 + .8byte .LVL901-1 .2byte 0x1 - .byte 0x50 - .8byte .LVL930 - .8byte .LVL947 + .byte 0x56 + .8byte .LVL917 + .8byte .LFE2883 .2byte 0x1 - .byte 0x6b - .8byte .LVL948 - .8byte .LFE2884 - .2byte 0x1 - .byte 0x6b + .byte 0x56 .8byte 0 .8byte 0 .LLST274: - .8byte .LVL926 - .8byte .LVL943 + .8byte .LVL900 + .8byte .LVL915 .2byte 0x1 - .byte 0x51 - .8byte .LVL948 - .8byte .LFE2884 + .byte 0x67 + .8byte .LVL917 + .8byte .LVL918 .2byte 0x1 - .byte 0x64 + .byte 0x67 + .8byte .LVL919 + .8byte .LFE2883 + .2byte 0x1 + .byte 0x67 .8byte 0 .8byte 0 .LLST275: - .8byte .LVL926 - .8byte .LVL944 + .8byte .LVL900 + .8byte .LVL914 .2byte 0x1 - .byte 0x52 - .8byte .LVL948 - .8byte .LFE2884 + .byte 0x65 + .8byte .LVL920 + .8byte .LVL921 + .2byte 0x1 + .byte 0x65 + .8byte .LVL922 + .8byte .LFE2883 .2byte 0x1 .byte 0x65 .8byte 0 .8byte 0 .LLST276: - .8byte .LVL926 - .8byte .LVL934-1 + .8byte .LVL897 + .8byte .LVL898 .2byte 0x1 - .byte 0x56 - .8byte .LVL948 - .8byte .LVL949-1 - .2byte 0x1 - .byte 0x56 - .8byte .LVL950 - .8byte .LFE2884 - .2byte 0x1 - .byte 0x56 + .byte 0x53 .8byte 0 .8byte 0 .LLST277: - .8byte .LVL935 - .8byte .LVL936 + .8byte .LVL899 + .8byte .LVL913 .2byte 0x1 - .byte 0x50 - .8byte .LVL937 - .8byte .LVL940 + .byte 0x63 + .8byte .LVL917 + .8byte .LFE2883 .2byte 0x1 - .byte 0x50 - .8byte .LVL942 - .8byte .LVL948 - .2byte 0x1 - .byte 0x50 + .byte 0x63 .8byte 0 .8byte 0 .LLST278: - .8byte .LVL935 - .8byte .LVL937 + .8byte .LVL902 + .8byte .LVL917 .2byte 0x1 - .byte 0x51 - .8byte .LVL938 - .8byte .LVL939 - .2byte 0x1 - .byte 0x51 - .8byte .LVL942 - .8byte .LVL948 - .2byte 0x1 - .byte 0x51 + .byte 0x54 .8byte 0 .8byte 0 .LLST279: - .8byte .LVL931 - .8byte .LVL946 + .8byte .LVL903 + .8byte .LVL905 + .2byte 0x1 + .byte 0x53 + .8byte .LVL906 + .8byte .LVL910 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST280: + .8byte .LVL902 + .8byte .LVL904 + .2byte 0x1 + .byte 0x53 + .8byte .LVL909 + .8byte .LVL911 + .2byte 0x1 + .byte 0x53 + .8byte .LVL912 + .8byte .LVL917 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST281: + .8byte .LVL923 + .8byte .LVL927 + .2byte 0x1 + .byte 0x50 + .8byte .LVL927 + .8byte .LVL944 + .2byte 0x1 + .byte 0x6b + .8byte .LVL945 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST282: + .8byte .LVL923 + .8byte .LVL940 + .2byte 0x1 + .byte 0x51 + .8byte .LVL945 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST283: + .8byte .LVL923 + .8byte .LVL941 + .2byte 0x1 + .byte 0x52 + .8byte .LVL945 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST284: + .8byte .LVL923 + .8byte .LVL931-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL945 + .8byte .LVL946-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL947 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST285: + .8byte .LVL932 + .8byte .LVL933 + .2byte 0x1 + .byte 0x50 + .8byte .LVL934 + .8byte .LVL937 + .2byte 0x1 + .byte 0x50 + .8byte .LVL939 + .8byte .LVL945 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST286: + .8byte .LVL932 + .8byte .LVL934 + .2byte 0x1 + .byte 0x51 + .8byte .LVL935 + .8byte .LVL936 + .2byte 0x1 + .byte 0x51 + .8byte .LVL939 + .8byte .LVL945 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST287: + .8byte .LVL928 + .8byte .LVL943 .2byte 0x1 .byte 0x69 - .8byte .LVL948 - .8byte .LVL950 + .8byte .LVL945 + .8byte .LVL947 .2byte 0x1 .byte 0x69 - .8byte .LVL952 + .8byte .LVL949 .8byte .LFE2884 .2byte 0x1 .byte 0x69 .8byte 0 .8byte 0 -.LLST280: - .8byte .LVL932 +.LLST288: + .8byte .LVL929 + .8byte .LVL942 + .2byte 0x1 + .byte 0x68 .8byte .LVL945 + .8byte .LVL947 .2byte 0x1 .byte 0x68 .8byte .LVL948 @@ -65475,133 +65777,129 @@ .2byte 0x1 .byte 0x68 .8byte .LVL951 - .8byte .LVL953 - .2byte 0x1 - .byte 0x68 - .8byte .LVL954 .8byte .LFE2884 .2byte 0x1 .byte 0x68 - .8byte 0 - .8byte 0 -.LLST281: - .8byte .LVL927 - .8byte .LVL928 - .2byte 0x1 - .byte 0x54 - .8byte 0 - .8byte 0 -.LLST282: - .8byte .LVL929 - .8byte .LVL943 - .2byte 0x1 - .byte 0x63 - .8byte .LVL948 - .8byte .LFE2884 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST283: - .8byte .LVL933 - .8byte .LVL946 - .2byte 0x1 - .byte 0x6a - .8byte .LVL948 - .8byte .LVL950 - .2byte 0x1 - .byte 0x6a - .8byte 0 - .8byte 0 -.LLST284: - .8byte .LVL935 - .8byte .LVL941 - .2byte 0x1 - .byte 0x53 - .8byte .LVL942 - .8byte .LVL948 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 -.LLST287: - .8byte .LVL1009 - .8byte .LVL1010-1 - .2byte 0x1 - .byte 0x52 - .8byte 0 - .8byte 0 -.LLST288: - .8byte .LVL1008 - .8byte .LVL1010-1 - .2byte 0x1 - .byte 0x54 .8byte 0 .8byte 0 .LLST289: - .8byte .LVL1012 - .8byte .LVL1013 - .2byte 0x1 - .byte 0x54 - .8byte .LVL1014 - .8byte .LVL1015-1 + .8byte .LVL924 + .8byte .LVL925 .2byte 0x1 .byte 0x54 .8byte 0 .8byte 0 .LLST290: - .8byte .LVL1011 - .8byte .LVL1015-1 + .8byte .LVL926 + .8byte .LVL940 + .2byte 0x1 + .byte 0x63 + .8byte .LVL945 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST291: + .8byte .LVL930 + .8byte .LVL943 + .2byte 0x1 + .byte 0x6a + .8byte .LVL945 + .8byte .LVL947 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST292: + .8byte .LVL932 + .8byte .LVL938 + .2byte 0x1 + .byte 0x53 + .8byte .LVL939 + .8byte .LVL945 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST295: + .8byte .LVL999 + .8byte .LVL1000-1 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST296: + .8byte .LVL998 + .8byte .LVL1000-1 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST297: + .8byte .LVL1002 + .8byte .LVL1003 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1004 + .8byte .LVL1005-1 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST298: + .8byte .LVL1001 + .8byte .LVL1005-1 .2byte 0x1 .byte 0x58 .8byte 0 .8byte 0 -.LLST318: - .8byte .LVL1210 - .8byte .LVL1211 +.LLST326: + .8byte .LVL1202 + .8byte .LVL1203 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST319: - .8byte .LVL1210 - .8byte .LVL1212 +.LLST327: + .8byte .LVL1202 + .8byte .LVL1204 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST320: - .8byte .LVL1210 - .8byte .LVL1217 +.LLST328: + .8byte .LVL1202 + .8byte .LVL1209 .2byte 0x1 .byte 0x52 - .8byte .LVL1217 - .8byte .LVL1218-1 + .8byte .LVL1209 + .8byte .LVL1210-1 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 -.LLST321: - .8byte .LVL1213 - .8byte .LVL1214 +.LLST329: + .8byte .LVL1205 + .8byte .LVL1206 .2byte 0x1 .byte 0x51 - .8byte .LVL1215 + .8byte .LVL1207 + .8byte .LVL1208 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST330: + .8byte .LVL1211 + .8byte .LVL1212 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1212 .8byte .LVL1216 .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST322: - .8byte .LVL1219 - .8byte .LVL1220 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1220 - .8byte .LVL1224 - .2byte 0x1 .byte 0x63 - .8byte .LVL1225 + .8byte .LVL1217 .8byte .LFE2892 .2byte 0x1 .byte 0x63 @@ -65625,160 +65923,138 @@ .8byte 0 .section .debug_ranges,"",@progbits .Ldebug_ranges0: - .8byte .LBB1060 - .8byte .LBE1060 - .8byte .LBB1390 - .8byte .LBE1390 - .8byte .LBB1391 - .8byte .LBE1391 - .8byte .LBB1412 - .8byte .LBE1412 - .8byte 0 - .8byte 0 - .8byte .LBB1063 - .8byte .LBE1063 - .8byte .LBB1083 - .8byte .LBE1083 - .8byte .LBB1084 - .8byte .LBE1084 - .8byte 0 - .8byte 0 - .8byte .LBB1077 - .8byte .LBE1077 - .8byte .LBB1082 - .8byte .LBE1082 - .8byte 0 - .8byte 0 - .8byte .LBB1091 - .8byte .LBE1091 - .8byte .LBB1121 - .8byte .LBE1121 - .8byte .LBB1122 - .8byte .LBE1122 - .8byte .LBB1406 - .8byte .LBE1406 - .8byte .LBB1409 - .8byte .LBE1409 - .8byte 0 - .8byte 0 - .8byte .LBB1094 - .8byte .LBE1094 - .8byte .LBB1105 - .8byte .LBE1105 - .8byte .LBB1106 - .8byte .LBE1106 - .8byte .LBB1107 - .8byte .LBE1107 - .8byte 0 - .8byte 0 + .8byte .LBB1092 + .8byte .LBE1092 .8byte .LBB1123 .8byte .LBE1123 - .8byte .LBB1394 - .8byte .LBE1394 - .8byte .LBB1395 - .8byte .LBE1395 + .8byte .LBB1124 + .8byte .LBE1124 + .8byte .LBB1473 + .8byte .LBE1473 .8byte 0 .8byte 0 - .8byte .LBB1126 - .8byte .LBE1126 - .8byte .LBB1146 - .8byte .LBE1146 + .8byte .LBB1095 + .8byte .LBE1095 + .8byte .LBB1107 + .8byte .LBE1107 + .8byte .LBB1108 + .8byte .LBE1108 + .8byte 0 + .8byte 0 + .8byte .LBB1111 + .8byte .LBE1111 + .8byte .LBB1116 + .8byte .LBE1116 + .8byte 0 + .8byte 0 + .8byte .LBB1125 + .8byte .LBE1125 + .8byte .LBB1460 + .8byte .LBE1460 + .8byte .LBB1461 + .8byte .LBE1461 + .8byte 0 + .8byte 0 + .8byte .LBB1128 + .8byte .LBE1128 + .8byte .LBB1148 + .8byte .LBE1148 + .8byte .LBB1149 + .8byte .LBE1149 + .8byte 0 + .8byte 0 + .8byte .LBB1142 + .8byte .LBE1142 .8byte .LBB1147 .8byte .LBE1147 .8byte 0 .8byte 0 - .8byte .LBB1140 - .8byte .LBE1140 - .8byte .LBB1145 - .8byte .LBE1145 + .8byte .LBB1154 + .8byte .LBE1154 + .8byte .LBB1189 + .8byte .LBE1189 + .8byte .LBB1462 + .8byte .LBE1462 + .8byte .LBB1463 + .8byte .LBE1463 + .8byte .LBB1472 + .8byte .LBE1472 .8byte 0 .8byte 0 - .8byte .LBB1152 - .8byte .LBE1152 - .8byte .LBB1396 - .8byte .LBE1396 - .8byte .LBB1397 - .8byte .LBE1397 + .8byte .LBB1157 + .8byte .LBE1157 + .8byte .LBB1170 + .8byte .LBE1170 + .8byte .LBB1179 + .8byte .LBE1179 + .8byte .LBB1180 + .8byte .LBE1180 .8byte 0 .8byte 0 - .8byte .LBB1155 - .8byte .LBE1155 - .8byte .LBB1175 - .8byte .LBE1175 - .8byte .LBB1176 - .8byte .LBE1176 + .8byte .LBB1173 + .8byte .LBE1173 + .8byte .LBB1178 + .8byte .LBE1178 .8byte 0 .8byte 0 - .8byte .LBB1169 - .8byte .LBE1169 - .8byte .LBB1174 - .8byte .LBE1174 + .8byte .LBB1190 + .8byte .LBE1190 + .8byte .LBB1452 + .8byte .LBE1452 + .8byte .LBB1453 + .8byte .LBE1453 .8byte 0 .8byte 0 - .8byte .LBB1181 - .8byte .LBE1181 - .8byte .LBB1216 - .8byte .LBE1216 - .8byte .LBB1398 - .8byte .LBE1398 - .8byte .LBB1399 - .8byte .LBE1399 - .8byte .LBB1407 - .8byte .LBE1407 + .8byte .LBB1193 + .8byte .LBE1193 + .8byte .LBB1213 + .8byte .LBE1213 + .8byte .LBB1214 + .8byte .LBE1214 .8byte 0 .8byte 0 - .8byte .LBB1184 - .8byte .LBE1184 - .8byte .LBB1197 - .8byte .LBE1197 - .8byte .LBB1206 - .8byte .LBE1206 .8byte .LBB1207 .8byte .LBE1207 + .8byte .LBB1212 + .8byte .LBE1212 .8byte 0 .8byte 0 - .8byte .LBB1200 - .8byte .LBE1200 - .8byte .LBB1205 - .8byte .LBE1205 - .8byte 0 - .8byte 0 - .8byte .LBB1217 - .8byte .LBE1217 + .8byte .LBB1219 + .8byte .LBE1219 .8byte .LBB1252 .8byte .LBE1252 - .8byte .LBB1400 - .8byte .LBE1400 - .8byte .LBB1401 - .8byte .LBE1401 - .8byte .LBB1411 - .8byte .LBE1411 + .8byte .LBB1466 + .8byte .LBE1466 + .8byte .LBB1467 + .8byte .LBE1467 .8byte 0 .8byte 0 - .8byte .LBB1220 - .8byte .LBE1220 - .8byte .LBB1233 - .8byte .LBE1233 - .8byte .LBB1242 - .8byte .LBE1242 + .8byte .LBB1222 + .8byte .LBE1222 + .8byte .LBB1235 + .8byte .LBE1235 + .8byte .LBB1244 + .8byte .LBE1244 + .8byte .LBB1245 + .8byte .LBE1245 + .8byte 0 + .8byte 0 + .8byte .LBB1238 + .8byte .LBE1238 .8byte .LBB1243 .8byte .LBE1243 .8byte 0 .8byte 0 - .8byte .LBB1236 - .8byte .LBE1236 - .8byte .LBB1241 - .8byte .LBE1241 - .8byte 0 - .8byte 0 .8byte .LBB1253 .8byte .LBE1253 - .8byte .LBB1286 - .8byte .LBE1286 - .8byte .LBB1404 - .8byte .LBE1404 - .8byte .LBB1405 - .8byte .LBE1405 + .8byte .LBB1288 + .8byte .LBE1288 + .8byte .LBB1464 + .8byte .LBE1464 + .8byte .LBB1465 + .8byte .LBE1465 + .8byte .LBB1469 + .8byte .LBE1469 .8byte 0 .8byte 0 .8byte .LBB1256 @@ -65797,1004 +66073,1014 @@ .8byte .LBE1277 .8byte 0 .8byte 0 - .8byte .LBB1287 - .8byte .LBE1287 - .8byte .LBB1322 - .8byte .LBE1322 - .8byte .LBB1402 - .8byte .LBE1402 - .8byte .LBB1403 - .8byte .LBE1403 - .8byte .LBB1410 - .8byte .LBE1410 - .8byte 0 - .8byte 0 - .8byte .LBB1290 - .8byte .LBE1290 - .8byte .LBB1303 - .8byte .LBE1303 - .8byte .LBB1312 - .8byte .LBE1312 - .8byte .LBB1313 - .8byte .LBE1313 - .8byte 0 - .8byte 0 - .8byte .LBB1306 - .8byte .LBE1306 - .8byte .LBB1311 - .8byte .LBE1311 - .8byte 0 - .8byte 0 - .8byte .LBB1323 - .8byte .LBE1323 - .8byte .LBB1358 - .8byte .LBE1358 - .8byte .LBB1388 - .8byte .LBE1388 - .8byte .LBB1389 - .8byte .LBE1389 - .8byte .LBB1408 - .8byte .LBE1408 - .8byte 0 - .8byte 0 - .8byte .LBB1326 - .8byte .LBE1326 - .8byte .LBB1339 - .8byte .LBE1339 - .8byte .LBB1340 - .8byte .LBE1340 - .8byte .LBB1341 - .8byte .LBE1341 - .8byte 0 - .8byte 0 - .8byte .LBB1344 - .8byte .LBE1344 - .8byte .LBB1349 - .8byte .LBE1349 - .8byte 0 - .8byte 0 - .8byte .LBB1359 - .8byte .LBE1359 - .8byte .LBB1392 - .8byte .LBE1392 - .8byte .LBB1393 - .8byte .LBE1393 - .8byte 0 - .8byte 0 - .8byte .LBB1362 - .8byte .LBE1362 - .8byte .LBB1382 - .8byte .LBE1382 - .8byte .LBB1383 - .8byte .LBE1383 - .8byte 0 - .8byte 0 - .8byte .LBB1376 - .8byte .LBE1376 - .8byte .LBB1381 - .8byte .LBE1381 - .8byte 0 - .8byte 0 - .8byte .LBB1413 - .8byte .LBE1413 - .8byte .LBB1454 - .8byte .LBE1454 - .8byte 0 - .8byte 0 - .8byte .LBB1414 - .8byte .LBE1414 - .8byte .LBB1452 - .8byte .LBE1452 - .8byte 0 - .8byte 0 - .8byte .LBB1415 - .8byte .LBE1415 - .8byte .LBB1432 - .8byte .LBE1432 - .8byte 0 - .8byte 0 - .8byte .LBB1416 - .8byte .LBE1416 - .8byte .LBB1431 - .8byte .LBE1431 - .8byte 0 - .8byte 0 - .8byte .LBB1417 - .8byte .LBE1417 - .8byte .LBB1430 - .8byte .LBE1430 - .8byte 0 - .8byte 0 - .8byte .LBB1418 - .8byte .LBE1418 - .8byte .LBB1429 - .8byte .LBE1429 - .8byte 0 - .8byte 0 - .8byte .LBB1419 - .8byte .LBE1419 - .8byte .LBB1428 - .8byte .LBE1428 - .8byte 0 - .8byte 0 - .8byte .LBB1420 - .8byte .LBE1420 - .8byte .LBB1427 - .8byte .LBE1427 - .8byte 0 - .8byte 0 - .8byte .LBB1421 - .8byte .LBE1421 - .8byte .LBB1426 - .8byte .LBE1426 - .8byte 0 - .8byte 0 - .8byte .LBB1422 - .8byte .LBE1422 - .8byte .LBB1425 - .8byte .LBE1425 - .8byte 0 - .8byte 0 - .8byte .LBB1423 - .8byte .LBE1423 - .8byte .LBB1424 - .8byte .LBE1424 - .8byte 0 - .8byte 0 - .8byte .LBB1433 - .8byte .LBE1433 - .8byte .LBB1453 - .8byte .LBE1453 - .8byte 0 - .8byte 0 - .8byte .LBB1434 - .8byte .LBE1434 - .8byte .LBB1451 - .8byte .LBE1451 - .8byte 0 - .8byte 0 - .8byte .LBB1435 - .8byte .LBE1435 - .8byte .LBB1450 - .8byte .LBE1450 - .8byte 0 - .8byte 0 - .8byte .LBB1436 - .8byte .LBE1436 - .8byte .LBB1449 - .8byte .LBE1449 - .8byte 0 - .8byte 0 - .8byte .LBB1437 - .8byte .LBE1437 - .8byte .LBB1448 - .8byte .LBE1448 - .8byte 0 - .8byte 0 - .8byte .LBB1438 - .8byte .LBE1438 - .8byte .LBB1447 - .8byte .LBE1447 - .8byte 0 - .8byte 0 - .8byte .LBB1439 - .8byte .LBE1439 - .8byte .LBB1446 - .8byte .LBE1446 - .8byte 0 - .8byte 0 - .8byte .LBB1440 - .8byte .LBE1440 - .8byte .LBB1444 - .8byte .LBE1444 - .8byte 0 - .8byte 0 - .8byte .LBB1441 - .8byte .LBE1441 - .8byte .LBB1445 - .8byte .LBE1445 - .8byte 0 - .8byte 0 - .8byte .LBB1442 - .8byte .LBE1442 - .8byte .LBB1443 - .8byte .LBE1443 - .8byte 0 - .8byte 0 - .8byte .LBB1455 - .8byte .LBE1455 - .8byte .LBB1475 - .8byte .LBE1475 - .8byte 0 - .8byte 0 - .8byte .LBB1456 - .8byte .LBE1456 - .8byte .LBB1474 - .8byte .LBE1474 - .8byte 0 - .8byte 0 - .8byte .LBB1457 - .8byte .LBE1457 + .8byte .LBB1289 + .8byte .LBE1289 + .8byte .LBB1324 + .8byte .LBE1324 .8byte .LBB1458 .8byte .LBE1458 - .8byte .LBB1472 - .8byte .LBE1472 - .8byte 0 - .8byte 0 .8byte .LBB1459 .8byte .LBE1459 - .8byte .LBB1473 - .8byte .LBE1473 - .8byte 0 - .8byte 0 - .8byte .LBB1460 - .8byte .LBE1460 - .8byte .LBB1471 - .8byte .LBE1471 - .8byte 0 - .8byte 0 - .8byte .LBB1461 - .8byte .LBE1461 - .8byte .LBB1469 - .8byte .LBE1469 - .8byte 0 - .8byte 0 - .8byte .LBB1462 - .8byte .LBE1462 .8byte .LBB1470 .8byte .LBE1470 .8byte 0 .8byte 0 - .8byte .LBB1463 - .8byte .LBE1463 + .8byte .LBB1292 + .8byte .LBE1292 + .8byte .LBB1305 + .8byte .LBE1305 + .8byte .LBB1306 + .8byte .LBE1306 + .8byte .LBB1307 + .8byte .LBE1307 + .8byte 0 + .8byte 0 + .8byte .LBB1310 + .8byte .LBE1310 + .8byte .LBB1315 + .8byte .LBE1315 + .8byte 0 + .8byte 0 + .8byte .LBB1325 + .8byte .LBE1325 + .8byte .LBB1456 + .8byte .LBE1456 + .8byte .LBB1457 + .8byte .LBE1457 + .8byte 0 + .8byte 0 + .8byte .LBB1328 + .8byte .LBE1328 + .8byte .LBB1348 + .8byte .LBE1348 + .8byte .LBB1349 + .8byte .LBE1349 + .8byte 0 + .8byte 0 + .8byte .LBB1342 + .8byte .LBE1342 + .8byte .LBB1347 + .8byte .LBE1347 + .8byte 0 + .8byte 0 + .8byte .LBB1354 + .8byte .LBE1354 + .8byte .LBB1454 + .8byte .LBE1454 + .8byte .LBB1455 + .8byte .LBE1455 + .8byte .LBB1474 + .8byte .LBE1474 + .8byte 0 + .8byte 0 + .8byte .LBB1357 + .8byte .LBE1357 + .8byte .LBB1377 + .8byte .LBE1377 + .8byte .LBB1378 + .8byte .LBE1378 + .8byte 0 + .8byte 0 + .8byte .LBB1371 + .8byte .LBE1371 + .8byte .LBB1376 + .8byte .LBE1376 + .8byte 0 + .8byte 0 + .8byte .LBB1385 + .8byte .LBE1385 + .8byte .LBB1415 + .8byte .LBE1415 + .8byte .LBB1416 + .8byte .LBE1416 .8byte .LBB1468 .8byte .LBE1468 + .8byte .LBB1471 + .8byte .LBE1471 .8byte 0 .8byte 0 - .8byte .LBB1464 - .8byte .LBE1464 - .8byte .LBB1467 - .8byte .LBE1467 + .8byte .LBB1388 + .8byte .LBE1388 + .8byte .LBB1399 + .8byte .LBE1399 + .8byte .LBB1400 + .8byte .LBE1400 + .8byte .LBB1401 + .8byte .LBE1401 .8byte 0 .8byte 0 - .8byte .LBB1465 - .8byte .LBE1465 - .8byte .LBB1466 - .8byte .LBE1466 + .8byte .LBB1417 + .8byte .LBE1417 + .8byte .LBB1451 + .8byte .LBE1451 + .8byte 0 + .8byte 0 + .8byte .LBB1418 + .8byte .LBE1418 + .8byte .LBB1449 + .8byte .LBE1449 + .8byte .LBB1450 + .8byte .LBE1450 + .8byte 0 + .8byte 0 + .8byte .LBB1421 + .8byte .LBE1421 + .8byte .LBB1434 + .8byte .LBE1434 + .8byte .LBB1443 + .8byte .LBE1443 + .8byte .LBB1444 + .8byte .LBE1444 + .8byte 0 + .8byte 0 + .8byte .LBB1437 + .8byte .LBE1437 + .8byte .LBB1442 + .8byte .LBE1442 + .8byte 0 + .8byte 0 + .8byte .LBB1475 + .8byte .LBE1475 + .8byte .LBB1516 + .8byte .LBE1516 + .8byte 0 + .8byte 0 + .8byte .LBB1476 + .8byte .LBE1476 + .8byte .LBB1514 + .8byte .LBE1514 + .8byte 0 + .8byte 0 + .8byte .LBB1477 + .8byte .LBE1477 + .8byte .LBB1494 + .8byte .LBE1494 + .8byte 0 + .8byte 0 + .8byte .LBB1478 + .8byte .LBE1478 + .8byte .LBB1493 + .8byte .LBE1493 + .8byte 0 + .8byte 0 + .8byte .LBB1479 + .8byte .LBE1479 + .8byte .LBB1492 + .8byte .LBE1492 .8byte 0 .8byte 0 .8byte .LBB1480 .8byte .LBE1480 - .8byte .LBB1483 - .8byte .LBE1483 - .8byte 0 - .8byte 0 - .8byte .LBB1486 - .8byte .LBE1486 .8byte .LBB1491 .8byte .LBE1491 - .8byte .LBB1492 - .8byte .LBE1492 - .8byte .LBB1493 - .8byte .LBE1493 + .8byte 0 + .8byte 0 + .8byte .LBB1481 + .8byte .LBE1481 + .8byte .LBB1490 + .8byte .LBE1490 + .8byte 0 + .8byte 0 + .8byte .LBB1482 + .8byte .LBE1482 + .8byte .LBB1489 + .8byte .LBE1489 + .8byte 0 + .8byte 0 + .8byte .LBB1483 + .8byte .LBE1483 + .8byte .LBB1488 + .8byte .LBE1488 + .8byte 0 + .8byte 0 + .8byte .LBB1484 + .8byte .LBE1484 + .8byte .LBB1487 + .8byte .LBE1487 + .8byte 0 + .8byte 0 + .8byte .LBB1485 + .8byte .LBE1485 + .8byte .LBB1486 + .8byte .LBE1486 + .8byte 0 + .8byte 0 + .8byte .LBB1495 + .8byte .LBE1495 + .8byte .LBB1515 + .8byte .LBE1515 + .8byte 0 + .8byte 0 + .8byte .LBB1496 + .8byte .LBE1496 + .8byte .LBB1513 + .8byte .LBE1513 + .8byte 0 + .8byte 0 + .8byte .LBB1497 + .8byte .LBE1497 + .8byte .LBB1512 + .8byte .LBE1512 + .8byte 0 + .8byte 0 + .8byte .LBB1498 + .8byte .LBE1498 + .8byte .LBB1511 + .8byte .LBE1511 + .8byte 0 + .8byte 0 + .8byte .LBB1499 + .8byte .LBE1499 + .8byte .LBB1510 + .8byte .LBE1510 .8byte 0 .8byte 0 .8byte .LBB1500 .8byte .LBE1500 .8byte .LBB1509 .8byte .LBE1509 - .8byte .LBB1510 - .8byte .LBE1510 - .8byte .LBB1521 - .8byte .LBE1521 + .8byte 0 + .8byte 0 + .8byte .LBB1501 + .8byte .LBE1501 + .8byte .LBB1508 + .8byte .LBE1508 .8byte 0 .8byte 0 .8byte .LBB1502 .8byte .LBE1502 + .8byte .LBB1506 + .8byte .LBE1506 + .8byte 0 + .8byte 0 + .8byte .LBB1503 + .8byte .LBE1503 + .8byte .LBB1507 + .8byte .LBE1507 + .8byte 0 + .8byte 0 + .8byte .LBB1504 + .8byte .LBE1504 .8byte .LBB1505 .8byte .LBE1505 .8byte 0 .8byte 0 - .8byte .LBB1511 - .8byte .LBE1511 - .8byte .LBB1515 - .8byte .LBE1515 - .8byte .LBB1516 - .8byte .LBE1516 + .8byte .LBB1517 + .8byte .LBE1517 + .8byte .LBB1537 + .8byte .LBE1537 .8byte 0 .8byte 0 - .8byte .LBB1534 - .8byte .LBE1534 - .8byte .LBB1605 - .8byte .LBE1605 - .8byte .LBB1606 - .8byte .LBE1606 - .8byte 0 - .8byte 0 + .8byte .LBB1518 + .8byte .LBE1518 .8byte .LBB1536 .8byte .LBE1536 - .8byte .LBB1552 - .8byte .LBE1552 + .8byte 0 + .8byte 0 + .8byte .LBB1519 + .8byte .LBE1519 + .8byte .LBB1520 + .8byte .LBE1520 + .8byte .LBB1534 + .8byte .LBE1534 + .8byte 0 + .8byte 0 + .8byte .LBB1521 + .8byte .LBE1521 + .8byte .LBB1535 + .8byte .LBE1535 + .8byte 0 + .8byte 0 + .8byte .LBB1522 + .8byte .LBE1522 + .8byte .LBB1533 + .8byte .LBE1533 + .8byte 0 + .8byte 0 + .8byte .LBB1523 + .8byte .LBE1523 + .8byte .LBB1531 + .8byte .LBE1531 + .8byte 0 + .8byte 0 + .8byte .LBB1524 + .8byte .LBE1524 + .8byte .LBB1532 + .8byte .LBE1532 + .8byte 0 + .8byte 0 + .8byte .LBB1525 + .8byte .LBE1525 + .8byte .LBB1530 + .8byte .LBE1530 + .8byte 0 + .8byte 0 + .8byte .LBB1526 + .8byte .LBE1526 + .8byte .LBB1529 + .8byte .LBE1529 + .8byte 0 + .8byte 0 + .8byte .LBB1527 + .8byte .LBE1527 + .8byte .LBB1528 + .8byte .LBE1528 + .8byte 0 + .8byte 0 + .8byte .LBB1542 + .8byte .LBE1542 + .8byte .LBB1545 + .8byte .LBE1545 + .8byte 0 + .8byte 0 + .8byte .LBB1548 + .8byte .LBE1548 .8byte .LBB1553 .8byte .LBE1553 .8byte .LBB1554 .8byte .LBE1554 .8byte .LBB1555 .8byte .LBE1555 - .8byte .LBB1556 - .8byte .LBE1556 - .8byte .LBB1557 - .8byte .LBE1557 - .8byte .LBB1558 - .8byte .LBE1558 - .8byte .LBB1559 - .8byte .LBE1559 - .8byte .LBB1560 - .8byte .LBE1560 - .8byte .LBB1561 - .8byte .LBE1561 + .8byte 0 + .8byte 0 .8byte .LBB1562 .8byte .LBE1562 - .8byte .LBB1563 - .8byte .LBE1563 + .8byte .LBB1571 + .8byte .LBE1571 + .8byte .LBB1572 + .8byte .LBE1572 + .8byte .LBB1583 + .8byte .LBE1583 + .8byte 0 + .8byte 0 .8byte .LBB1564 .8byte .LBE1564 - .8byte .LBB1565 - .8byte .LBE1565 + .8byte .LBB1567 + .8byte .LBE1567 .8byte 0 .8byte 0 - .8byte .LBB1568 - .8byte .LBE1568 - .8byte .LBB1607 - .8byte .LBE1607 - .8byte .LBB1608 - .8byte .LBE1608 - .8byte .LBB1609 - .8byte .LBE1609 + .8byte .LBB1573 + .8byte .LBE1573 + .8byte .LBB1577 + .8byte .LBE1577 + .8byte .LBB1578 + .8byte .LBE1578 .8byte 0 .8byte 0 - .8byte .LBB1570 - .8byte .LBE1570 - .8byte .LBB1587 - .8byte .LBE1587 - .8byte .LBB1588 - .8byte .LBE1588 - .8byte .LBB1589 - .8byte .LBE1589 - .8byte .LBB1590 - .8byte .LBE1590 - .8byte .LBB1591 - .8byte .LBE1591 - .8byte .LBB1592 - .8byte .LBE1592 - .8byte .LBB1593 - .8byte .LBE1593 - .8byte .LBB1594 - .8byte .LBE1594 - .8byte .LBB1595 - .8byte .LBE1595 .8byte .LBB1596 .8byte .LBE1596 - .8byte .LBB1597 - .8byte .LBE1597 - .8byte .LBB1598 - .8byte .LBE1598 - .8byte .LBB1599 - .8byte .LBE1599 - .8byte .LBB1600 - .8byte .LBE1600 - .8byte .LBB1601 - .8byte .LBE1601 - .8byte 0 - .8byte 0 - .8byte .LBB1610 - .8byte .LBE1610 - .8byte .LBB1650 - .8byte .LBE1650 - .8byte .LBB1651 - .8byte .LBE1651 - .8byte 0 - .8byte 0 - .8byte .LBB1612 - .8byte .LBE1612 - .8byte .LBB1631 - .8byte .LBE1631 - .8byte .LBB1632 - .8byte .LBE1632 - .8byte .LBB1633 - .8byte .LBE1633 - .8byte .LBB1634 - .8byte .LBE1634 - .8byte .LBB1635 - .8byte .LBE1635 - .8byte .LBB1636 - .8byte .LBE1636 - .8byte .LBB1637 - .8byte .LBE1637 - .8byte .LBB1638 - .8byte .LBE1638 - .8byte .LBB1639 - .8byte .LBE1639 - .8byte .LBB1640 - .8byte .LBE1640 - .8byte .LBB1641 - .8byte .LBE1641 - .8byte .LBB1642 - .8byte .LBE1642 - .8byte .LBB1643 - .8byte .LBE1643 - .8byte .LBB1644 - .8byte .LBE1644 - .8byte .LBB1645 - .8byte .LBE1645 - .8byte .LBB1646 - .8byte .LBE1646 - .8byte .LBB1647 - .8byte .LBE1647 - .8byte 0 - .8byte 0 - .8byte .LBB1660 - .8byte .LBE1660 .8byte .LBB1667 .8byte .LBE1667 .8byte .LBB1668 .8byte .LBE1668 .8byte 0 .8byte 0 + .8byte .LBB1598 + .8byte .LBE1598 + .8byte .LBB1614 + .8byte .LBE1614 + .8byte .LBB1615 + .8byte .LBE1615 + .8byte .LBB1616 + .8byte .LBE1616 + .8byte .LBB1617 + .8byte .LBE1617 + .8byte .LBB1618 + .8byte .LBE1618 + .8byte .LBB1619 + .8byte .LBE1619 + .8byte .LBB1620 + .8byte .LBE1620 + .8byte .LBB1621 + .8byte .LBE1621 + .8byte .LBB1622 + .8byte .LBE1622 + .8byte .LBB1623 + .8byte .LBE1623 + .8byte .LBB1624 + .8byte .LBE1624 + .8byte .LBB1625 + .8byte .LBE1625 + .8byte .LBB1626 + .8byte .LBE1626 + .8byte .LBB1627 + .8byte .LBE1627 + .8byte 0 + .8byte 0 + .8byte .LBB1630 + .8byte .LBE1630 + .8byte .LBB1669 + .8byte .LBE1669 + .8byte .LBB1670 + .8byte .LBE1670 + .8byte .LBB1671 + .8byte .LBE1671 + .8byte 0 + .8byte 0 + .8byte .LBB1632 + .8byte .LBE1632 + .8byte .LBB1649 + .8byte .LBE1649 + .8byte .LBB1650 + .8byte .LBE1650 + .8byte .LBB1651 + .8byte .LBE1651 + .8byte .LBB1652 + .8byte .LBE1652 + .8byte .LBB1653 + .8byte .LBE1653 + .8byte .LBB1654 + .8byte .LBE1654 + .8byte .LBB1655 + .8byte .LBE1655 + .8byte .LBB1656 + .8byte .LBE1656 + .8byte .LBB1657 + .8byte .LBE1657 + .8byte .LBB1658 + .8byte .LBE1658 + .8byte .LBB1659 + .8byte .LBE1659 + .8byte .LBB1660 + .8byte .LBE1660 .8byte .LBB1661 .8byte .LBE1661 - .8byte .LBB1666 - .8byte .LBE1666 + .8byte .LBB1662 + .8byte .LBE1662 + .8byte .LBB1663 + .8byte .LBE1663 .8byte 0 .8byte 0 - .8byte .LBB1816 - .8byte .LBE1816 - .8byte .LBB1819 - .8byte .LBE1819 + .8byte .LBB1672 + .8byte .LBE1672 + .8byte .LBB1712 + .8byte .LBE1712 + .8byte .LBB1713 + .8byte .LBE1713 .8byte 0 .8byte 0 - .8byte .LBB1826 - .8byte .LBE1826 - .8byte .LBB1906 - .8byte .LBE1906 - .8byte .LBB1907 - .8byte .LBE1907 - .8byte .LBB1908 - .8byte .LBE1908 + .8byte .LBB1674 + .8byte .LBE1674 + .8byte .LBB1693 + .8byte .LBE1693 + .8byte .LBB1694 + .8byte .LBE1694 + .8byte .LBB1695 + .8byte .LBE1695 + .8byte .LBB1696 + .8byte .LBE1696 + .8byte .LBB1697 + .8byte .LBE1697 + .8byte .LBB1698 + .8byte .LBE1698 + .8byte .LBB1699 + .8byte .LBE1699 + .8byte .LBB1700 + .8byte .LBE1700 + .8byte .LBB1701 + .8byte .LBE1701 + .8byte .LBB1702 + .8byte .LBE1702 + .8byte .LBB1703 + .8byte .LBE1703 + .8byte .LBB1704 + .8byte .LBE1704 + .8byte .LBB1705 + .8byte .LBE1705 + .8byte .LBB1706 + .8byte .LBE1706 + .8byte .LBB1707 + .8byte .LBE1707 + .8byte .LBB1708 + .8byte .LBE1708 + .8byte .LBB1709 + .8byte .LBE1709 .8byte 0 .8byte 0 - .8byte .LBB1828 - .8byte .LBE1828 - .8byte .LBB1837 - .8byte .LBE1837 - .8byte .LBB1838 - .8byte .LBE1838 - .8byte .LBB1839 - .8byte .LBE1839 + .8byte .LBB1718 + .8byte .LBE1718 + .8byte .LBB1725 + .8byte .LBE1725 + .8byte .LBB1726 + .8byte .LBE1726 .8byte 0 .8byte 0 - .8byte .LBB1909 - .8byte .LBE1909 - .8byte .LBB1922 - .8byte .LBE1922 - .8byte .LBB1923 - .8byte .LBE1923 - .8byte .LBB1976 - .8byte .LBE1976 - .8byte .LBB1982 - .8byte .LBE1982 - .8byte .LBB1984 - .8byte .LBE1984 - .8byte .LBB1985 - .8byte .LBE1985 - .8byte .LBB1987 - .8byte .LBE1987 + .8byte .LBB1719 + .8byte .LBE1719 + .8byte .LBB1724 + .8byte .LBE1724 .8byte 0 .8byte 0 - .8byte .LBB1911 - .8byte .LBE1911 - .8byte .LBB1914 - .8byte .LBE1914 + .8byte .LBB1874 + .8byte .LBE1874 + .8byte .LBB1877 + .8byte .LBE1877 .8byte 0 .8byte 0 - .8byte .LBB1924 - .8byte .LBE1924 - .8byte .LBB1934 - .8byte .LBE1934 - .8byte .LBB1979 - .8byte .LBE1979 - .8byte .LBB1986 - .8byte .LBE1986 - .8byte .LBB1989 - .8byte .LBE1989 + .8byte .LBB1884 + .8byte .LBE1884 + .8byte .LBB1964 + .8byte .LBE1964 + .8byte .LBB1965 + .8byte .LBE1965 + .8byte .LBB1966 + .8byte .LBE1966 .8byte 0 .8byte 0 - .8byte .LBB1926 - .8byte .LBE1926 - .8byte .LBB1929 - .8byte .LBE1929 + .8byte .LBB1886 + .8byte .LBE1886 + .8byte .LBB1895 + .8byte .LBE1895 + .8byte .LBB1896 + .8byte .LBE1896 + .8byte .LBB1897 + .8byte .LBE1897 .8byte 0 .8byte 0 - .8byte .LBB1935 - .8byte .LBE1935 - .8byte .LBB1980 - .8byte .LBE1980 - .8byte .LBB1981 - .8byte .LBE1981 - .8byte .LBB1983 - .8byte .LBE1983 - .8byte 0 - .8byte 0 - .8byte .LBB1949 - .8byte .LBE1949 - .8byte .LBB1954 - .8byte .LBE1954 - .8byte .LBB1955 - .8byte .LBE1955 - .8byte .LBB1956 - .8byte .LBE1956 - .8byte 0 - .8byte 0 - .8byte .LBB1957 - .8byte .LBE1957 - .8byte .LBB1977 - .8byte .LBE1977 - .8byte .LBB1978 - .8byte .LBE1978 - .8byte .LBB1988 - .8byte .LBE1988 - .8byte .LBB1990 - .8byte .LBE1990 - .8byte 0 - .8byte 0 - .8byte .LBB2001 - .8byte .LBE2001 - .8byte .LBB2003 - .8byte .LBE2003 - .8byte .LBB2010 - .8byte .LBE2010 + .8byte .LBB1967 + .8byte .LBE1967 + .8byte .LBB2026 + .8byte .LBE2026 .8byte .LBB2030 .8byte .LBE2030 - .8byte .LBB2047 - .8byte .LBE2047 - .8byte .LBB2056 - .8byte .LBE2056 - .8byte 0 - .8byte 0 - .8byte .LBB2002 - .8byte .LBE2002 - .8byte .LBB2011 - .8byte .LBE2011 - .8byte 0 - .8byte 0 - .8byte .LBB2004 - .8byte .LBE2004 .8byte .LBB2033 .8byte .LBE2033 .8byte .LBB2035 .8byte .LBE2035 - .8byte .LBB2045 - .8byte .LBE2045 - .8byte .LBB2058 - .8byte .LBE2058 - .8byte .LBB2059 - .8byte .LBE2059 - .8byte 0 - .8byte 0 - .8byte .LBB2005 - .8byte .LBE2005 - .8byte .LBB2034 - .8byte .LBE2034 .8byte .LBB2036 .8byte .LBE2036 - .8byte .LBB2037 - .8byte .LBE2037 - .8byte .LBB2039 - .8byte .LBE2039 - .8byte .LBB2050 - .8byte .LBE2050 - .8byte .LBB2055 - .8byte .LBE2055 - .8byte 0 - .8byte 0 - .8byte .LBB2006 - .8byte .LBE2006 .8byte .LBB2038 .8byte .LBE2038 + .8byte 0 + .8byte 0 + .8byte .LBB1969 + .8byte .LBE1969 + .8byte .LBB1972 + .8byte .LBE1972 + .8byte 0 + .8byte 0 + .8byte .LBB1979 + .8byte .LBE1979 + .8byte .LBB1989 + .8byte .LBE1989 + .8byte .LBB2029 + .8byte .LBE2029 + .8byte .LBB2037 + .8byte .LBE2037 .8byte .LBB2040 .8byte .LBE2040 - .8byte .LBB2042 - .8byte .LBE2042 - .8byte .LBB2046 - .8byte .LBE2046 - .8byte .LBB2053 - .8byte .LBE2053 .8byte 0 .8byte 0 + .8byte .LBB1981 + .8byte .LBE1981 + .8byte .LBB1984 + .8byte .LBE1984 + .8byte 0 + .8byte 0 + .8byte .LBB1990 + .8byte .LBE1990 + .8byte .LBB2031 + .8byte .LBE2031 + .8byte .LBB2032 + .8byte .LBE2032 + .8byte .LBB2034 + .8byte .LBE2034 + .8byte 0 + .8byte 0 + .8byte .LBB2004 + .8byte .LBE2004 .8byte .LBB2007 .8byte .LBE2007 - .8byte .LBB2041 - .8byte .LBE2041 - .8byte .LBB2043 - .8byte .LBE2043 - .8byte .LBB2051 - .8byte .LBE2051 - .8byte .LBB2060 - .8byte .LBE2060 .8byte 0 .8byte 0 .8byte .LBB2008 .8byte .LBE2008 - .8byte .LBB2032 - .8byte .LBE2032 - .8byte .LBB2049 - .8byte .LBE2049 - .8byte .LBB2057 - .8byte .LBE2057 - .8byte 0 - .8byte 0 - .8byte .LBB2009 - .8byte .LBE2009 - .8byte .LBB2031 - .8byte .LBE2031 - .8byte .LBB2048 - .8byte .LBE2048 - .8byte .LBB2054 - .8byte .LBE2054 - .8byte 0 - .8byte 0 - .8byte .LBB2012 - .8byte .LBE2012 .8byte .LBB2027 .8byte .LBE2027 .8byte .LBB2028 .8byte .LBE2028 - .8byte .LBB2029 - .8byte .LBE2029 - .8byte .LBB2044 - .8byte .LBE2044 - .8byte .LBB2052 - .8byte .LBE2052 + .8byte .LBB2039 + .8byte .LBE2039 .8byte 0 .8byte 0 - .8byte .LBB2013 - .8byte .LBE2013 - .8byte .LBB2014 - .8byte .LBE2014 - .8byte .LBB2064 - .8byte .LBE2064 - .8byte .LBB2070 - .8byte .LBE2070 - .8byte .LBB2076 - .8byte .LBE2076 - .8byte .LBB2077 - .8byte .LBE2077 - .8byte 0 - .8byte 0 - .8byte .LBB2015 - .8byte .LBE2015 - .8byte .LBB2016 - .8byte .LBE2016 - .8byte .LBB2065 - .8byte .LBE2065 - .8byte .LBB2069 - .8byte .LBE2069 - .8byte .LBB2078 - .8byte .LBE2078 - .8byte 0 - .8byte 0 - .8byte .LBB2017 - .8byte .LBE2017 - .8byte .LBB2018 - .8byte .LBE2018 - .8byte .LBB2066 - .8byte .LBE2066 - .8byte .LBB2068 - .8byte .LBE2068 - .8byte .LBB2079 - .8byte .LBE2079 - .8byte 0 - .8byte 0 - .8byte .LBB2019 - .8byte .LBE2019 - .8byte .LBB2020 - .8byte .LBE2020 - .8byte .LBB2067 - .8byte .LBE2067 + .8byte .LBB2051 + .8byte .LBE2051 + .8byte .LBB2053 + .8byte .LBE2053 + .8byte .LBB2060 + .8byte .LBE2060 .8byte .LBB2080 .8byte .LBE2080 + .8byte .LBB2097 + .8byte .LBE2097 + .8byte .LBB2106 + .8byte .LBE2106 .8byte 0 .8byte 0 - .8byte .LBB2021 - .8byte .LBE2021 - .8byte .LBB2022 - .8byte .LBE2022 - .8byte .LBB2062 - .8byte .LBE2062 - .8byte .LBB2072 - .8byte .LBE2072 - .8byte .LBB2074 - .8byte .LBE2074 - .8byte 0 - .8byte 0 - .8byte .LBB2023 - .8byte .LBE2023 - .8byte .LBB2024 - .8byte .LBE2024 - .8byte .LBB2063 - .8byte .LBE2063 - .8byte .LBB2071 - .8byte .LBE2071 - .8byte .LBB2075 - .8byte .LBE2075 - .8byte 0 - .8byte 0 - .8byte .LBB2025 - .8byte .LBE2025 - .8byte .LBB2026 - .8byte .LBE2026 + .8byte .LBB2052 + .8byte .LBE2052 .8byte .LBB2061 .8byte .LBE2061 + .8byte 0 + .8byte 0 + .8byte .LBB2054 + .8byte .LBE2054 + .8byte .LBB2083 + .8byte .LBE2083 + .8byte .LBB2085 + .8byte .LBE2085 + .8byte .LBB2095 + .8byte .LBE2095 + .8byte .LBB2108 + .8byte .LBE2108 + .8byte .LBB2109 + .8byte .LBE2109 + .8byte 0 + .8byte 0 + .8byte .LBB2055 + .8byte .LBE2055 + .8byte .LBB2084 + .8byte .LBE2084 + .8byte .LBB2086 + .8byte .LBE2086 + .8byte .LBB2087 + .8byte .LBE2087 + .8byte .LBB2089 + .8byte .LBE2089 + .8byte .LBB2100 + .8byte .LBE2100 + .8byte .LBB2105 + .8byte .LBE2105 + .8byte 0 + .8byte 0 + .8byte .LBB2056 + .8byte .LBE2056 + .8byte .LBB2088 + .8byte .LBE2088 + .8byte .LBB2090 + .8byte .LBE2090 + .8byte .LBB2092 + .8byte .LBE2092 + .8byte .LBB2096 + .8byte .LBE2096 + .8byte .LBB2103 + .8byte .LBE2103 + .8byte 0 + .8byte 0 + .8byte .LBB2057 + .8byte .LBE2057 + .8byte .LBB2091 + .8byte .LBE2091 + .8byte .LBB2093 + .8byte .LBE2093 + .8byte .LBB2101 + .8byte .LBE2101 + .8byte .LBB2110 + .8byte .LBE2110 + .8byte 0 + .8byte 0 + .8byte .LBB2058 + .8byte .LBE2058 + .8byte .LBB2082 + .8byte .LBE2082 + .8byte .LBB2099 + .8byte .LBE2099 + .8byte .LBB2107 + .8byte .LBE2107 + .8byte 0 + .8byte 0 + .8byte .LBB2059 + .8byte .LBE2059 + .8byte .LBB2081 + .8byte .LBE2081 + .8byte .LBB2098 + .8byte .LBE2098 + .8byte .LBB2104 + .8byte .LBE2104 + .8byte 0 + .8byte 0 + .8byte .LBB2062 + .8byte .LBE2062 + .8byte .LBB2077 + .8byte .LBE2077 + .8byte .LBB2078 + .8byte .LBE2078 + .8byte .LBB2079 + .8byte .LBE2079 + .8byte .LBB2094 + .8byte .LBE2094 + .8byte .LBB2102 + .8byte .LBE2102 + .8byte 0 + .8byte 0 + .8byte .LBB2063 + .8byte .LBE2063 + .8byte .LBB2064 + .8byte .LBE2064 + .8byte .LBB2114 + .8byte .LBE2114 + .8byte .LBB2120 + .8byte .LBE2120 + .8byte .LBB2126 + .8byte .LBE2126 + .8byte .LBB2127 + .8byte .LBE2127 + .8byte 0 + .8byte 0 + .8byte .LBB2065 + .8byte .LBE2065 + .8byte .LBB2066 + .8byte .LBE2066 + .8byte .LBB2115 + .8byte .LBE2115 + .8byte .LBB2119 + .8byte .LBE2119 + .8byte .LBB2128 + .8byte .LBE2128 + .8byte 0 + .8byte 0 + .8byte .LBB2067 + .8byte .LBE2067 + .8byte .LBB2068 + .8byte .LBE2068 + .8byte .LBB2116 + .8byte .LBE2116 + .8byte .LBB2118 + .8byte .LBE2118 + .8byte .LBB2129 + .8byte .LBE2129 + .8byte 0 + .8byte 0 + .8byte .LBB2069 + .8byte .LBE2069 + .8byte .LBB2070 + .8byte .LBE2070 + .8byte .LBB2117 + .8byte .LBE2117 + .8byte .LBB2130 + .8byte .LBE2130 + .8byte 0 + .8byte 0 + .8byte .LBB2071 + .8byte .LBE2071 + .8byte .LBB2072 + .8byte .LBE2072 + .8byte .LBB2112 + .8byte .LBE2112 + .8byte .LBB2122 + .8byte .LBE2122 + .8byte .LBB2124 + .8byte .LBE2124 + .8byte 0 + .8byte 0 .8byte .LBB2073 .8byte .LBE2073 + .8byte .LBB2074 + .8byte .LBE2074 + .8byte .LBB2113 + .8byte .LBE2113 + .8byte .LBB2121 + .8byte .LBE2121 + .8byte .LBB2125 + .8byte .LBE2125 .8byte 0 .8byte 0 - .8byte .LBB2168 - .8byte .LBE2168 - .8byte .LBB2181 - .8byte .LBE2181 - .8byte .LBB2182 - .8byte .LBE2182 - .8byte .LBB2183 - .8byte .LBE2183 - .8byte .LBB2276 - .8byte .LBE2276 + .8byte .LBB2075 + .8byte .LBE2075 + .8byte .LBB2076 + .8byte .LBE2076 + .8byte .LBB2111 + .8byte .LBE2111 + .8byte .LBB2123 + .8byte .LBE2123 .8byte 0 .8byte 0 - .8byte .LBB2170 - .8byte .LBE2170 - .8byte .LBB2173 - .8byte .LBE2173 - .8byte .LBB2174 - .8byte .LBE2174 - .8byte .LBB2175 - .8byte .LBE2175 - .8byte .LBB2176 - .8byte .LBE2176 - .8byte 0 - .8byte 0 - .8byte .LBB2171 - .8byte .LBE2171 - .8byte .LBB2172 - .8byte .LBE2172 - .8byte 0 - .8byte 0 - .8byte .LBB2184 - .8byte .LBE2184 - .8byte .LBB2234 - .8byte .LBE2234 - .8byte .LBB2235 - .8byte .LBE2235 - .8byte .LBB2236 - .8byte .LBE2236 - .8byte .LBB2237 - .8byte .LBE2237 - .8byte .LBB2238 - .8byte .LBE2238 - .8byte .LBB2239 - .8byte .LBE2239 - .8byte 0 - .8byte 0 - .8byte .LBB2186 - .8byte .LBE2186 - .8byte .LBB2200 - .8byte .LBE2200 - .8byte .LBB2201 - .8byte .LBE2201 - .8byte .LBB2205 - .8byte .LBE2205 - .8byte .LBB2213 - .8byte .LBE2213 - .8byte .LBB2221 - .8byte .LBE2221 - .8byte 0 - .8byte 0 - .8byte .LBB2187 - .8byte .LBE2187 - .8byte .LBB2202 - .8byte .LBE2202 - .8byte .LBB2203 - .8byte .LBE2203 - .8byte .LBB2206 - .8byte .LBE2206 - .8byte .LBB2216 - .8byte .LBE2216 - .8byte .LBB2224 - .8byte .LBE2224 - .8byte 0 - .8byte 0 - .8byte .LBB2188 - .8byte .LBE2188 - .8byte .LBB2189 - .8byte .LBE2189 - .8byte .LBB2208 - .8byte .LBE2208 - .8byte .LBB2217 - .8byte .LBE2217 - .8byte .LBB2223 - .8byte .LBE2223 - .8byte 0 - .8byte 0 - .8byte .LBB2190 - .8byte .LBE2190 - .8byte .LBB2191 - .8byte .LBE2191 - .8byte .LBB2207 - .8byte .LBE2207 - .8byte .LBB2215 - .8byte .LBE2215 - .8byte .LBB2222 - .8byte .LBE2222 - .8byte 0 - .8byte 0 - .8byte .LBB2192 - .8byte .LBE2192 - .8byte .LBB2193 - .8byte .LBE2193 - .8byte .LBB2210 - .8byte .LBE2210 - .8byte .LBB2219 - .8byte .LBE2219 - .8byte .LBB2227 - .8byte .LBE2227 - .8byte 0 - .8byte 0 - .8byte .LBB2194 - .8byte .LBE2194 - .8byte .LBB2195 - .8byte .LBE2195 - .8byte .LBB2209 - .8byte .LBE2209 .8byte .LBB2218 .8byte .LBE2218 + .8byte .LBB2229 + .8byte .LBE2229 + .8byte .LBB2230 + .8byte .LBE2230 + .8byte .LBB2308 + .8byte .LBE2308 + .8byte 0 + .8byte 0 + .8byte .LBB2220 + .8byte .LBE2220 + .8byte .LBB2223 + .8byte .LBE2223 + .8byte .LBB2224 + .8byte .LBE2224 .8byte .LBB2225 .8byte .LBE2225 .8byte 0 .8byte 0 - .8byte .LBB2196 - .8byte .LBE2196 - .8byte .LBB2197 - .8byte .LBE2197 - .8byte .LBB2211 - .8byte .LBE2211 - .8byte .LBB2214 - .8byte .LBE2214 - .8byte .LBB2226 - .8byte .LBE2226 + .8byte .LBB2221 + .8byte .LBE2221 + .8byte .LBB2222 + .8byte .LBE2222 .8byte 0 .8byte 0 - .8byte .LBB2198 - .8byte .LBE2198 - .8byte .LBB2199 - .8byte .LBE2199 - .8byte .LBB2204 - .8byte .LBE2204 - .8byte .LBB2212 - .8byte .LBE2212 - .8byte .LBB2220 - .8byte .LBE2220 - .8byte 0 - .8byte 0 - .8byte .LBB2242 - .8byte .LBE2242 + .8byte .LBB2231 + .8byte .LBE2231 + .8byte .LBB2281 + .8byte .LBE2281 + .8byte .LBB2282 + .8byte .LBE2282 + .8byte .LBB2283 + .8byte .LBE2283 + .8byte .LBB2284 + .8byte .LBE2284 + .8byte .LBB2285 + .8byte .LBE2285 .8byte .LBB2286 .8byte .LBE2286 .8byte 0 .8byte 0 - .8byte .LBB2245 - .8byte .LBE2245 - .8byte .LBB2318 - .8byte .LBE2318 - .8byte 0 - .8byte 0 - .8byte .LBB2249 - .8byte .LBE2249 - .8byte .LBB2256 - .8byte .LBE2256 - .8byte 0 - .8byte 0 + .8byte .LBB2233 + .8byte .LBE2233 + .8byte .LBB2247 + .8byte .LBE2247 + .8byte .LBB2248 + .8byte .LBE2248 .8byte .LBB2252 .8byte .LBE2252 - .8byte .LBB2255 - .8byte .LBE2255 - .8byte 0 - .8byte 0 - .8byte .LBB2253 - .8byte .LBE2253 - .8byte .LBB2254 - .8byte .LBE2254 - .8byte 0 - .8byte 0 - .8byte .LBB2258 - .8byte .LBE2258 - .8byte .LBB2295 - .8byte .LBE2295 - .8byte 0 - .8byte 0 - .8byte .LBB2264 - .8byte .LBE2264 - .8byte .LBB2316 - .8byte .LBE2316 - .8byte .LBB2317 - .8byte .LBE2317 - .8byte 0 - .8byte 0 + .8byte .LBB2260 + .8byte .LBE2260 .8byte .LBB2268 .8byte .LBE2268 - .8byte .LBB2275 - .8byte .LBE2275 .8byte 0 .8byte 0 + .8byte .LBB2234 + .8byte .LBE2234 + .8byte .LBB2249 + .8byte .LBE2249 + .8byte .LBB2250 + .8byte .LBE2250 + .8byte .LBB2253 + .8byte .LBE2253 + .8byte .LBB2263 + .8byte .LBE2263 .8byte .LBB2271 .8byte .LBE2271 + .8byte 0 + .8byte 0 + .8byte .LBB2235 + .8byte .LBE2235 + .8byte .LBB2236 + .8byte .LBE2236 + .8byte .LBB2255 + .8byte .LBE2255 + .8byte .LBB2264 + .8byte .LBE2264 + .8byte .LBB2270 + .8byte .LBE2270 + .8byte 0 + .8byte 0 + .8byte .LBB2237 + .8byte .LBE2237 + .8byte .LBB2238 + .8byte .LBE2238 + .8byte .LBB2251 + .8byte .LBE2251 + .8byte .LBB2259 + .8byte .LBE2259 + .8byte .LBB2267 + .8byte .LBE2267 + .8byte 0 + .8byte 0 + .8byte .LBB2239 + .8byte .LBE2239 + .8byte .LBB2240 + .8byte .LBE2240 + .8byte .LBB2254 + .8byte .LBE2254 + .8byte .LBB2262 + .8byte .LBE2262 + .8byte .LBB2269 + .8byte .LBE2269 + .8byte 0 + .8byte 0 + .8byte .LBB2241 + .8byte .LBE2241 + .8byte .LBB2242 + .8byte .LBE2242 + .8byte .LBB2257 + .8byte .LBE2257 + .8byte .LBB2266 + .8byte .LBE2266 .8byte .LBB2274 .8byte .LBE2274 .8byte 0 .8byte 0 + .8byte .LBB2243 + .8byte .LBE2243 + .8byte .LBB2244 + .8byte .LBE2244 + .8byte .LBB2256 + .8byte .LBE2256 + .8byte .LBB2265 + .8byte .LBE2265 .8byte .LBB2272 .8byte .LBE2272 + .8byte 0 + .8byte 0 + .8byte .LBB2245 + .8byte .LBE2245 + .8byte .LBB2246 + .8byte .LBE2246 + .8byte .LBB2258 + .8byte .LBE2258 + .8byte .LBB2261 + .8byte .LBE2261 .8byte .LBB2273 .8byte .LBE2273 .8byte 0 .8byte 0 - .8byte .LBB2283 - .8byte .LBE2283 - .8byte .LBB2315 - .8byte .LBE2315 + .8byte .LBB2289 + .8byte .LBE2289 + .8byte .LBB2335 + .8byte .LBE2335 .8byte 0 .8byte 0 - .8byte .LBB2287 - .8byte .LBE2287 - .8byte .LBB2294 - .8byte .LBE2294 + .8byte .LBB2292 + .8byte .LBE2292 + .8byte .LBB2346 + .8byte .LBE2346 .8byte 0 .8byte 0 - .8byte .LBB2288 - .8byte .LBE2288 - .8byte .LBB2290 - .8byte .LBE2290 + .8byte .LBB2293 + .8byte .LBE2293 + .8byte .LBB2336 + .8byte .LBE2336 .8byte 0 .8byte 0 - .8byte .LBB2291 - .8byte .LBE2291 - .8byte .LBB2306 - .8byte .LBE2306 + .8byte .LBB2300 + .8byte .LBE2300 + .8byte .LBB2302 + .8byte .LBE2302 .8byte 0 .8byte 0 - .8byte .LBB2301 - .8byte .LBE2301 - .8byte .LBB2305 - .8byte .LBE2305 - .8byte 0 - .8byte 0 - .8byte .LBB2307 - .8byte .LBE2307 .8byte .LBB2314 .8byte .LBE2314 + .8byte .LBB2358 + .8byte .LBE2358 .8byte 0 .8byte 0 - .8byte .LBB2319 - .8byte .LBE2319 - .8byte .LBB2326 - .8byte .LBE2326 - .8byte .LBB2327 - .8byte .LBE2327 + .8byte .LBB2318 + .8byte .LBE2318 + .8byte .LBB2359 + .8byte .LBE2359 .8byte 0 .8byte 0 - .8byte .LBB2320 - .8byte .LBE2320 - .8byte .LBB2325 - .8byte .LBE2325 + .8byte .LBB2321 + .8byte .LBE2321 + .8byte .LBB2350 + .8byte .LBE2350 + .8byte 0 + .8byte 0 + .8byte .LBB2328 + .8byte .LBE2328 + .8byte .LBB2330 + .8byte .LBE2330 + .8byte 0 + .8byte 0 + .8byte .LBB2331 + .8byte .LBE2331 + .8byte .LBB2342 + .8byte .LBE2342 + .8byte 0 + .8byte 0 + .8byte .LBB2339 + .8byte .LBE2339 + .8byte .LBB2357 + .8byte .LBE2357 + .8byte 0 + .8byte 0 + .8byte .LBB2343 + .8byte .LBE2343 + .8byte .LBB2360 + .8byte .LBE2360 + .8byte 0 + .8byte 0 + .8byte .LBB2351 + .8byte .LBE2351 + .8byte .LBB2356 + .8byte .LBE2356 + .8byte 0 + .8byte 0 + .8byte .LBB2361 + .8byte .LBE2361 + .8byte .LBB2368 + .8byte .LBE2368 + .8byte .LBB2369 + .8byte .LBE2369 + .8byte 0 + .8byte 0 + .8byte .LBB2362 + .8byte .LBE2362 + .8byte .LBB2367 + .8byte .LBE2367 .8byte 0 .8byte 0 .8byte .Ltext0 @@ -66826,7 +67112,7 @@ .string "RPM_REQ_IDLE" .LASF2349: .string "suppliers" -.LASF3043: +.LASF3042: .string "ebc_buffer_manage_init" .LASF2850: .string "EPD_FULL_GCC16" @@ -66904,7 +67190,7 @@ .string "FTR_HIGHER_OR_ZERO_SAFE" .LASF1057: .string "need_qs" -.LASF2984: +.LASF2982: .string "frame_control_timer" .LASF137: .string "panic_notifier_list" @@ -66954,7 +67240,7 @@ .string "system_wq" .LASF603: .string "rcu_read_lock_nesting" -.LASF2981: +.LASF2979: .string "suspend_lock" .LASF2498: .string "gpio_desc" @@ -66996,7 +67282,7 @@ .string "mm_rb" .LASF2155: .string "freeze_late" -.LASF3066: +.LASF3065: .string "buf_info" .LASF409: .string "d_inode" @@ -67058,7 +67344,7 @@ .string "param_ops_uint" .LASF861: .string "softirq_activated" -.LASF3027: +.LASF3026: .string "pdev" .LASF797: .string "system_long_wq" @@ -67200,7 +67486,7 @@ .string "bin_attribute" .LASF1571: .string "percpu_counter" -.LASF2983: +.LASF2981: .string "first_in" .LASF2297: .string "dev_groups" @@ -67248,7 +67534,7 @@ .string "NR_ION_HEAP_POOL" .LASF1392: .string "sysctl_protected_hardlinks" -.LASF3295: +.LASF3296: .string "__arch_copy_from_user" .LASF1145: .string "scan_objects" @@ -67406,8 +67692,6 @@ .string "__tracepoint_page_ref_freeze" .LASF2904: .string "panel_buffer" -.LASF2978: - .string "new_buf_is_comming" .LASF317: .string "__exception_text_end" .LASF2702: @@ -67640,7 +67924,7 @@ .string "func" .LASF1109: .string "perf_event_context" -.LASF2996: +.LASF2995: .string "ebc_auto_task" .LASF94: .string "printk_delay_msec" @@ -67670,7 +67954,7 @@ .string "wake_q_node" .LASF1085: .string "request_key_auth" -.LASF3007: +.LASF3006: .string "waveform_misc" .LASF1922: .string "destroy_inode" @@ -67702,7 +67986,7 @@ .string "show_options" .LASF2111: .string "uevent_helper" -.LASF3001: +.LASF3000: .string "ebc_assist_finished_flag_sem" .LASF2950: .string "lut_buffer_phy" @@ -67722,7 +68006,7 @@ .string "_utime" .LASF2217: .string "pm_subsys_data" -.LASF3300: +.LASF3299: .string "ebc_empty_osd_buf_get" .LASF2318: .string "device_type" @@ -67752,7 +68036,7 @@ .string "fsverity_info" .LASF2009: .string "nr_leaves_on_tree" -.LASF2976: +.LASF2975: .string "prev_osd_buf" .LASF1680: .string "quota_on" @@ -67818,7 +68102,7 @@ .string "_refcount" .LASF466: .string "i_crypt_info" -.LASF3060: +.LASF3059: .string "waveform_mmap" .LASF1840: .string "flc_flock" @@ -67904,13 +68188,13 @@ .string "ebc_pmic_read_temp" .LASF2846: .string "EPD_FULL_GC16" -.LASF3013: +.LASF3012: .string "dev_attr_ebc_state" .LASF2130: .string "kernel_kobj" .LASF2556: .string "funcs" -.LASF2989: +.LASF2987: .string "overlay_enable" .LASF1076: .string "securebits" @@ -67990,7 +68274,7 @@ .string "f_mode" .LASF1398: .string "ki_complete" -.LASF3030: +.LASF3029: .string "ebc_tcon_pdev" .LASF1724: .string "percpu" @@ -68018,7 +68302,7 @@ .string "i_op" .LASF1655: .string "d_rt_spc_hardlimit" -.LASF2995: +.LASF2994: .string "ebc_task" .LASF2095: .string "kobj_ns_type_operations" @@ -68084,7 +68368,7 @@ .string "i_dentry" .LASF2097: .string "grab_current_ns" -.LASF3045: +.LASF3044: .string "fb_size" .LASF854: .string "offset" @@ -68206,8 +68490,6 @@ .string "sysctl_nr_open" .LASF82: .string "reset_devices" -.LASF2968: - .string "auto_image_bg" .LASF447: .string "i_wb" .LASF2055: @@ -68358,11 +68640,11 @@ .string "EPD_RESUME" .LASF3276: .string "sscanf" -.LASF3272: +.LASF3271: .string "ebc_empty_buf_get" .LASF1443: .string "NR_ISOLATED_ANON" -.LASF3047: +.LASF3046: .string "ebc_lut_table_init" .LASF1182: .string "uprobes_state" @@ -68400,15 +68682,15 @@ .string "last_update_time" .LASF1106: .string "robust_list_head" -.LASF3270: +.LASF3269: .string "init_timer_key" .LASF1449: .string "NR_ANON_MAPPED" .LASF383: .string "count" -.LASF3003: +.LASF3002: .string "resume_count_start" -.LASF2999: +.LASF2998: .string "ebc_auto_assist_task" .LASF556: .string "level" @@ -68444,7 +68726,7 @@ .string "usage_count" .LASF2046: .string "show" -.LASF3010: +.LASF3009: .string "dev_attr_pmic_temp" .LASF7: .string "unsigned char" @@ -68460,7 +68742,7 @@ .string "task_rss_stat" .LASF1110: .string "pipe_inode_info" -.LASF2972: +.LASF2971: .string "ebc_power_status" .LASF931: .string "ratelimit" @@ -68572,13 +68854,13 @@ .string "sigval_t" .LASF1902: .string "fa_file" -.LASF2993: +.LASF2992: .string "panel" .LASF2956: .string "auto_need_refresh1" .LASF2401: .string "irq_data" -.LASF3089: +.LASF3088: .string "old_buffer_temp" .LASF2674: .string "sysctl_memory_failure_recovery" @@ -68594,13 +68876,13 @@ .string "get_overlay_image_area" .LASF1945: .string "quota_read" -.LASF3085: +.LASF3084: .string "check_diff_percent" .LASF2694: .string "st_shndx" .LASF2368: .string "free" -.LASF3053: +.LASF3052: .string "pmic_vcom_write" .LASF2102: .string "attribute" @@ -68670,7 +68952,7 @@ .string "path" .LASF2696: .string "st_size" -.LASF3014: +.LASF3013: .string "dev_attr_ebc_buf_state" .LASF189: .string "rmtp" @@ -68710,7 +68992,7 @@ .string "unlink" .LASF2686: .string "d_ptr" -.LASF3055: +.LASF3054: .string "pmic_temp_read" .LASF1621: .string "dqstats" @@ -68854,7 +69136,7 @@ .string "algo_data" .LASF1480: .string "node_zones" -.LASF3011: +.LASF3010: .string "dev_attr_pmic_vcom" .LASF1528: .string "initialized" @@ -68978,7 +69260,7 @@ .string "totalram_pages" .LASF2455: .string "i2c_smbus_data" -.LASF2975: +.LASF2974: .string "curr_dsp_buf" .LASF1039: .string "time_slice" @@ -69016,7 +69298,7 @@ .string "wake_lock" .LASF2239: .string "may_skip_resume" -.LASF2987: +.LASF2985: .string "is_deep_sleep" .LASF1143: .string "shrinker" @@ -69044,13 +69326,13 @@ .string "in_hrtirq" .LASF503: .string "s_master_keys" -.LASF2977: +.LASF2976: .string "curr_osd_buf" .LASF767: .string "ate_match_local_cap_id" .LASF2422: .string "property" -.LASF3048: +.LASF3047: .string "ebc_sysfs_init" .LASF962: .string "wchar" @@ -69116,7 +69398,7 @@ .string "hrtimer_clock_base" .LASF1028: .string "vruntime" -.LASF3094: +.LASF3093: .string "diff_count" .LASF2247: .string "disable_depth" @@ -69130,7 +69412,7 @@ .string "min_free_kbytes" .LASF1240: .string "units" -.LASF3264: +.LASF3263: .string "epd_lut_from_mem_init" .LASF312: .string "__nosave_begin" @@ -69196,17 +69478,17 @@ .string "WORKINGSET_REFAULT" .LASF1609: .string "dqi_dirty_list" -.LASF3050: +.LASF3049: .string "ebc_buf_state_read" .LASF230: .string "prove_locking" .LASF2760: .string "mod_tree_node" -.LASF3049: +.LASF3048: .string "auto_frame_state_read" .LASF2554: .string "regfunc" -.LASF2970: +.LASF2969: .string "auto_wf_index" .LASF242: .string "code" @@ -69258,7 +69540,7 @@ .string "boost_expires" .LASF2884: .string "DMA_BIDIRECTIONAL" -.LASF3296: +.LASF3295: .string "__arch_copy_to_user" .LASF236: .string "spinlock" @@ -69276,13 +69558,13 @@ .string "d_compare" .LASF942: .string "vm_mm" -.LASF3090: +.LASF3089: .string "need_refresh" .LASF2789: .string "platform_bus_type" .LASF3115: .string "data_buf" -.LASF3039: +.LASF3038: .string "ulogo_buf" .LASF3308: .string "__msecs_to_jiffies" @@ -69374,7 +69656,7 @@ .string "page_ext_operations" .LASF2632: .string "KSWAPD_HIGH_WMARK_HIT_QUICKLY" -.LASF3051: +.LASF3050: .string "ebc_state_read" .LASF3287: .string "__stack_chk_fail" @@ -69414,7 +69696,7 @@ .string "thaw_noirq" .LASF940: .string "vm_rb" -.LASF3023: +.LASF3022: .string "kernel_read_file_str" .LASF568: .string "init_user_ns" @@ -69458,7 +69740,7 @@ .string "cb_state" .LASF2894: .string "orig_nents" -.LASF3068: +.LASF3067: .string "buf_addr" .LASF413: .string "d_sb" @@ -69526,6 +69808,8 @@ .string "async_put_work" .LASF2085: .string "kernfs_syscall_ops" +.LASF2991: + .string "ebc_last_display" .LASF1826: .string "mknod" .LASF152: @@ -69568,7 +69852,7 @@ .string "writeback_control" .LASF1873: .string "fl_end" -.LASF3301: +.LASF3300: .string "ebc_find_buf_by_phy_addr" .LASF1920: .string "super_operations" @@ -69658,7 +69942,7 @@ .string "fl_owner" .LASF2817: .string "WF_TYPE_GLD16" -.LASF2988: +.LASF2986: .string "is_power_off" .LASF950: .string "vm_private_data" @@ -69688,7 +69972,7 @@ .string "ino_warnlimit" .LASF1488: .string "pfmemalloc_wait" -.LASF2979: +.LASF2977: .string "waiting_new_buf_time" .LASF115: .string "fasync" @@ -69712,7 +69996,7 @@ .string "holders_dir" .LASF3081: .string "__wq_entry" -.LASF3086: +.LASF3085: .string "new_buffer" .LASF464: .string "i_fsnotify_mask" @@ -69732,7 +70016,7 @@ .string "__ilog2_u64" .LASF547: .string "compat_time_t" -.LASF2980: +.LASF2978: .string "ebc_mode" .LASF400: .string "d_alias" @@ -69848,7 +70132,7 @@ .string "clone_mnt_data" .LASF2746: .string "module_kobject" -.LASF3044: +.LASF3043: .string "memory" .LASF3209: .string "order" @@ -69856,7 +70140,7 @@ .string "active_memcg" .LASF1301: .string "def_flags" -.LASF2994: +.LASF2993: .string "global_ebc" .LASF1442: .string "NR_SLAB_UNRECLAIMABLE" @@ -69886,7 +70170,7 @@ .string "EPD_A2" .LASF2071: .string "kernfs_elem_attr" -.LASF3088: +.LASF3087: .string "new_buffer_temp" .LASF2268: .string "set_latency_tolerance" @@ -69922,7 +70206,7 @@ .string "policy" .LASF1262: .string "shared" -.LASF3017: +.LASF3016: .string "ebc_match" .LASF2922: .string "dclk" @@ -69952,7 +70236,7 @@ .string "__con_initcall_start" .LASF1686: .string "get_dqblk" -.LASF3029: +.LASF3028: .string "ebc_tcon_node" .LASF2786: .string "id_entry" @@ -69980,7 +70264,7 @@ .string "quota_format_ops" .LASF3309: .string "ebc_osd_buf_get" -.LASF3065: +.LASF3064: .string "argp" .LASF1723: .string "args" @@ -70006,7 +70290,7 @@ .string "width" .LASF900: .string "_addr_pkey" -.LASF3058: +.LASF3057: .string "waveform_buffer" .LASF297: .string "__start_rodata" @@ -70024,7 +70308,7 @@ .string "utime" .LASF1303: .string "start_code" -.LASF3018: +.LASF3017: .string "ebc_driver" .LASF2574: .string "dev_page_free_t" @@ -70060,7 +70344,7 @@ .string "cpumask_t" .LASF134: .string "kmsg_fops" -.LASF3297: +.LASF3301: .string "ebc_buf_release" .LASF1994: .string "simple_symlink_inode_operations" @@ -70124,7 +70408,7 @@ .string "fops" .LASF1242: .string "f_path" -.LASF3266: +.LASF3265: .string "kthread_create_on_node" .LASF711: .string "cgroups" @@ -70148,7 +70432,7 @@ .string "userspace_clients" .LASF2112: .string "uevent_seqnum" -.LASF3262: +.LASF3272: .string "memset" .LASF3173: .string "cur_image_addr" @@ -70184,7 +70468,7 @@ .string "file_lock_operations" .LASF344: .string "tp_value" -.LASF3026: +.LASF3025: .string "ebc_remove" .LASF1862: .string "fl_list" @@ -70216,7 +70500,7 @@ .string "panel_16bit" .LASF1291: .string "page_table_lock" -.LASF3016: +.LASF3015: .string "ebc_pm" .LASF2809: .string "sched_priority" @@ -70336,13 +70620,13 @@ .string "d_rt_space" .LASF265: .string "name" -.LASF3271: +.LASF3270: .string "mod_timer" .LASF151: .string "early_boot_irqs_disabled" .LASF658: .string "nvcsw" -.LASF3042: +.LASF3041: .string "ebc_task_init" .LASF2801: .string "KMALLOC_NORMAL" @@ -70378,7 +70662,7 @@ .string "self_exec_id" .LASF1876: .string "fl_downgrade_time" -.LASF2969: +.LASF2968: .string "auto_frame_count" .LASF2073: .string "kernfs_ops" @@ -70408,7 +70692,7 @@ .string "close" .LASF3153: .string "image_fb_data" -.LASF3040: +.LASF3039: .string "klogo_buf" .LASF2864: .string "EPD_POWER_OFF" @@ -70444,7 +70728,7 @@ .string "split" .LASF709: .string "cpuset_mem_spread_rotor" -.LASF2990: +.LASF2988: .string "overlay_bg_update" .LASF2008: .string "assoc_array" @@ -70472,7 +70756,7 @@ .string "map_sg" .LASF1128: .string "nlink" -.LASF3035: +.LASF3034: .string "ulogo_addr_valid" .LASF2546: .string "percpu_ref" @@ -70500,7 +70784,7 @@ .string "mems_allowed_seq" .LASF1739: .string "refcnt" -.LASF3092: +.LASF3091: .string "pbuf_new" .LASF2150: .string "thaw" @@ -70516,7 +70800,7 @@ .string "futex" .LASF996: .string "wait_max" -.LASF3269: +.LASF3268: .string "wakeup_source_add" .LASF3192: .string "ebc_pmic_suspend" @@ -70532,7 +70816,7 @@ .string "mapping" .LASF3224: .string "resource_size" -.LASF3267: +.LASF3266: .string "wake_up_process" .LASF1323: .string "kioctx_table" @@ -70632,7 +70916,7 @@ .string "core_state" .LASF839: .string "timerqueue_head" -.LASF3268: +.LASF3267: .string "sched_setscheduler_nocheck" .LASF1260: .string "f_wb_err" @@ -70670,7 +70954,7 @@ .string "device_driver" .LASF667: .string "real_cred" -.LASF3084: +.LASF3097: .string "one_buffer_start" .LASF2417: .string "fwnode_endpoint" @@ -70718,7 +71002,7 @@ .string "hbp_break" .LASF3159: .string "osd_data" -.LASF3031: +.LASF3030: .string "pmic_node" .LASF139: .string "panic_blink" @@ -70782,7 +71066,7 @@ .string "__s8" .LASF353: .string "fault_code" -.LASF3008: +.LASF3007: .string "dev_attr_waveform_version" .LASF2180: .string "dma_mask" @@ -70982,7 +71266,7 @@ .string "sigpending" .LASF2183: .string "dma_pfn_offset" -.LASF3002: +.LASF3001: .string "resume_frame_count" .LASF1158: .string "radix_tree_node" @@ -70990,7 +71274,7 @@ .string "sign_extend64" .LASF2282: .string "wake_irq" -.LASF3033: +.LASF3032: .string "ulogo_addr" .LASF830: .string "pcpu_fc" @@ -71020,7 +71304,7 @@ .string "pgdat" .LASF2578: .string "page_cluster" -.LASF3015: +.LASF3014: .string "dev_attr_auto_frame_state" .LASF1601: .string "dqb_ihardlimit" @@ -71028,7 +71312,7 @@ .string "d_lockref" .LASF2211: .string "rpm_request" -.LASF3064: +.LASF3063: .string "ebc_io_ctl" .LASF1118: .string "addr" @@ -71060,7 +71344,7 @@ .string "begin" .LASF2705: .string "sh_link" -.LASF3024: +.LASF3023: .string "ebc_suspend" .LASF2326: .string "cls_msk" @@ -71082,13 +71366,13 @@ .string "num_resources" .LASF1544: .string "notifier_fn_t" -.LASF3032: +.LASF3031: .string "pmic_client" .LASF2540: .string "miscdevice" .LASF655: .string "time_in_state" -.LASF3041: +.LASF3040: .string "ebc_logo_init" .LASF1237: .string "kill" @@ -71120,13 +71404,13 @@ .string "i_blkbits" .LASF2424: .string "value" -.LASF2985: +.LASF2983: .string "frame_timer" .LASF2842: .string "needpic" .LASF1003: .string "sum_sleep_runtime" -.LASF3037: +.LASF3036: .string "ulogo_addr_str" .LASF3113: .string "flip" @@ -71210,7 +71494,7 @@ .string "__pm_stay_awake" .LASF2533: .string "vmap_area_list" -.LASF2998: +.LASF2997: .string "ebc_auto_thread_sem" .LASF629: .string "in_execve" @@ -71348,7 +71632,7 @@ .string "RPM_RESUMING" .LASF471: .string "d_weak_revalidate" -.LASF2974: +.LASF2973: .string "prev_dsp_buf" .LASF1461: .string "NR_VMSCAN_IMMEDIATE" @@ -71370,15 +71654,15 @@ .string "write_begin" .LASF2197: .string "groups" -.LASF3046: +.LASF3045: .string "need_res_size" .LASF693: .string "pi_blocked_on" -.LASF3028: +.LASF3027: .string "ebc_probe" .LASF501: .string "s_xattr" -.LASF3038: +.LASF3037: .string "klogo_addr_str" .LASF963: .string "syscr" @@ -71436,7 +71720,7 @@ .string "maj_flt" .LASF229: .string "arch_rwlock_t" -.LASF3298: +.LASF3297: .string "ebc_osd_buf_clone" .LASF162: .string "c_false" @@ -71478,7 +71762,7 @@ .string "high_memory" .LASF49: .string "int32_t" -.LASF3020: +.LASF3019: .string "__exitcall_ebc_exit" .LASF1010: .string "nr_failed_migrations_running" @@ -71520,7 +71804,7 @@ .string "lock_key" .LASF2531: .string "tramp_pg_dir" -.LASF3012: +.LASF3011: .string "dev_attr_ebc_version" .LASF834: .string "PCPU_FC_NR" @@ -71646,7 +71930,7 @@ .string "robust_list" .LASF1683: .string "quota_disable" -.LASF3059: +.LASF3058: .string "waveform_open" .LASF2024: .string "serial_node" @@ -71764,7 +72048,7 @@ .string "__MAX_NR_ZONES" .LASF2432: .string "irq_fwspec" -.LASF3006: +.LASF3005: .string "waveform_ops" .LASF1773: .string "iov_iter" @@ -71832,7 +72116,7 @@ .string "Elf64_Half" .LASF2255: .string "use_autosuspend" -.LASF3021: +.LASF3020: .string "ebc_init" .LASF674: .string "nsproxy" @@ -71874,7 +72158,7 @@ .string "__fls" .LASF1098: .string "ioprio" -.LASF2986: +.LASF2984: .string "is_early_suspend" .LASF1132: .string "rdev" @@ -71946,7 +72230,7 @@ .string "symlink" .LASF1543: .string "mem_map" -.LASF3087: +.LASF3086: .string "old_buffer" .LASF2929: .string "lut_data_set" @@ -72050,7 +72334,7 @@ .string "flc_lease" .LASF2375: .string "unmap_resource" -.LASF2982: +.LASF2980: .string "wake_lock_is_set" .LASF2327: .string "driver_private" @@ -72096,7 +72380,7 @@ .string "pstate_check_t" .LASF801: .string "system_freezable_power_efficient_wq" -.LASF3025: +.LASF3024: .string "__func__" .LASF57: .string "resource_size_t" @@ -72108,7 +72392,7 @@ .string "suid" .LASF2444: .string "irq_domain_ops" -.LASF2991: +.LASF2989: .string "overlay_bg_control" .LASF930: .string "locked_vm" @@ -72134,12 +72418,12 @@ .string "mmap_rnd_compat_bits_max" .LASF41: .string "clockid_t" -.LASF3019: - .string "__addressable_ebc_init3783" .LASF1576: .string "dq_free" .LASF1550: .string "reboot_notifier_list" +.LASF3018: + .string "__addressable_ebc_init3795" .LASF686: .string "parent_exec_id" .LASF2472: @@ -72152,7 +72436,7 @@ .string "page_entry_size" .LASF2964: .string "lut_data" -.LASF3061: +.LASF3060: .string "ebc_other_init" .LASF1415: .string "free_list" @@ -72336,7 +72620,7 @@ .string "shift" .LASF1406: .string "ia_gid" -.LASF3095: +.LASF3094: .string "vaild_size" .LASF36: .string "name_offset" @@ -72358,7 +72642,7 @@ .string "thread_id" .LASF732: .string "default_timer_slack_ns" -.LASF3057: +.LASF3056: .string "waveform_version_read" .LASF1736: .string "source_list" @@ -72394,7 +72678,7 @@ .string "loops_per_jiffy" .LASF2479: .string "i2c_algorithm" -.LASF3091: +.LASF3090: .string "check_size" .LASF3167: .string "ebc_get_8pix_wf3" @@ -72454,13 +72738,13 @@ .string "statfs" .LASF3274: .string "__kmalloc" -.LASF3263: +.LASF3262: .string "_dev_err" .LASF3253: .string "__platform_driver_register" .LASF2948: .string "ebc_buf_real_size" -.LASF2997: +.LASF2996: .string "ebc_thread_wq" .LASF1763: .string "migratepage" @@ -72486,6 +72770,8 @@ .string "drop_ns" .LASF1391: .string "sysctl_protected_symlinks" +.LASF3068: + .string "buf_format" .LASF2592: .string "protection_map" .LASF2733: @@ -72510,7 +72796,7 @@ .string "max_comb_1st_msg_len" .LASF1514: .string "ZONE_MOVABLE" -.LASF3005: +.LASF3004: .string "ebc_misc" .LASF2361: .string "revmap_size" @@ -72564,7 +72850,7 @@ .string "d_real" .LASF2529: .string "swapper_pg_end" -.LASF3009: +.LASF3008: .string "dev_attr_pmic_name" .LASF631: .string "in_user_fault" @@ -72644,13 +72930,13 @@ .string "__idmap_text_start" .LASF1685: .string "set_info" -.LASF3063: +.LASF3062: .string "ebc_mmap" .LASF2588: .string "sysctl_admin_reserve_kbytes" .LASF788: .string "timer_list" -.LASF2992: +.LASF2990: .string "resume_count_enable" .LASF1653: .string "d_ino_warns" @@ -72658,7 +72944,7 @@ .string "lock_ops" .LASF1295: .string "hiwater_vm" -.LASF3054: +.LASF3053: .string "pmic_vcom_read" .LASF3255: .string "misc_deregister" @@ -72702,9 +72988,9 @@ .string "i_rt_spc_timelimit" .LASF140: .string "oops_in_progress" -.LASF3004: +.LASF3003: .string "ebc_ops" -.LASF3034: +.LASF3033: .string "klogo_addr" .LASF1620: .string "qf_next" @@ -72728,7 +73014,7 @@ .string "personality" .LASF1794: .string "bd_queue" -.LASF3022: +.LASF3021: .string "ebc_resume" .LASF2798: .string "init_task" @@ -72830,7 +73116,7 @@ .string "sve_vl" .LASF2623: .string "PGSTEAL_KSWAPD" -.LASF3036: +.LASF3035: .string "klogo_addr_valid" .LASF2571: .string "MEMORY_DEVICE_PUBLIC" @@ -72928,9 +73214,9 @@ .string "procname" .LASF3131: .string "point_data" -.LASF3265: +.LASF3264: .string "epd_lut_from_file_init" -.LASF3000: +.LASF2999: .string "ebc_auto_assist_thread_sem" .LASF1638: .string "mark_dirty" @@ -72960,7 +73246,7 @@ .string "qc_info" .LASF3074: .string "ebc_thread" -.LASF3093: +.LASF3092: .string "pbuf_old" .LASF2860: .string "EPD_A2_ENTER" @@ -72980,7 +73266,7 @@ .string "win_y1" .LASF2841: .string "win_y2" -.LASF3097: +.LASF3096: .string "buf_size" .LASF2057: .string "bitmap" @@ -73018,7 +73304,7 @@ .string "MIGRATE_SYNC_LIGHT" .LASF1008: .string "nr_migrations_cold" -.LASF3052: +.LASF3051: .string "ebc_version_read" .LASF304: .string "__end_once" @@ -73170,7 +73456,7 @@ .string "lock_stat" .LASF2363: .string "revmap_tree_mutex" -.LASF3056: +.LASF3055: .string "pmic_name_read" .LASF1050: .string "dl_throttled" @@ -73196,7 +73482,7 @@ .string "dma_configure" .LASF2261: .string "runtime_error" -.LASF3067: +.LASF3066: .string "temp_offset" .LASF920: .string "__count" @@ -73224,7 +73510,7 @@ .string "text_size" .LASF1622: .string "stat" -.LASF2973: +.LASF2972: .string "lut_ddr_vir" .LASF1290: .string "map_count" @@ -73232,7 +73518,7 @@ .string "pdeath_signal" .LASF620: .string "exit_signal" -.LASF3299: +.LASF3298: .string "ebc_add_to_osd_buf_list" .LASF2825: .string "frame_num" @@ -73324,7 +73610,7 @@ .string "gp_count" .LASF2020: .string "key_restriction" -.LASF3096: +.LASF3095: .string "check_part_mode" .LASF618: .string "exit_state" @@ -73356,7 +73642,7 @@ .string "fs_supers" .LASF1100: .string "last_waited" -.LASF3062: +.LASF3061: .string "ebc_open" .LASF3177: .string "three_win_mode" @@ -73366,7 +73652,7 @@ .string "dqb_bsoftlimit" .LASF219: .string "pending" -.LASF2971: +.LASF2970: .string "direct_buffer" .LASF2461: .string "i2c_client_type" diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_y8_v8.S b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_y8_v8.S new file mode 100644 index 0000000..c63eee0 --- /dev/null +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_y8_v8.S @@ -0,0 +1,74565 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2020 Rockchip Electronics Co. Ltd. + * + * Author: Zorro Liu <zorro.liu@rock-chips.com> + */ + + .arch armv8-a + .file "ebc_dev.c" + .text +.Ltext0: + .cfi_sections .debug_frame +#APP + .section ".initcall6s.init", "a" +__initcall_ebc_init6s: +.long ebc_init - . +.previous + +#NO_APP + .align 2 + .p2align 3,,7 + .type get_overlay_image_area, %function +get_overlay_image_area: +.LFB2822: + .file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" + .loc 1 760 0 + .cfi_startproc +.LVL0: + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + .loc 1 761 0 + adrp x6, .LANCHOR0 + .loc 1 760 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x25, x26, [sp, 64] + .cfi_offset 25, -64 + .cfi_offset 26, -56 + .loc 1 761 0 + ldr x26, [x6, #:lo12:.LANCHOR0] + .loc 1 760 0 + str x0, [x29, 104] + .loc 1 784 0 + ldr x0, [x5, 240] +.LVL1: + .loc 1 776 0 + add x26, x26, 24 + .loc 1 760 0 + stp x19, x20, [sp, 16] + stp x21, x22, [sp, 32] + stp x27, x28, [sp, 80] + stp x23, x24, [sp, 48] + .cfi_offset 19, -112 + .cfi_offset 20, -104 + .cfi_offset 21, -96 + .cfi_offset 22, -88 + .cfi_offset 27, -48 + .cfi_offset 28, -40 + .cfi_offset 23, -80 + .cfi_offset 24, -72 + .loc 1 789 0 + ldr w19, [x5, 96] + .loc 1 786 0 + ldp w7, w23, [x0, 48] + .loc 1 789 0 + add w27, w19, 7 + .loc 1 776 0 + ldr w6, [x26, 156] + str w6, [x29, 124] + .loc 1 784 0 + cmp w7, 0 + .loc 1 787 0 + ldp w6, w28, [x0, 56] + .loc 1 784 0 + add w25, w7, 7 + csel w25, w25, w7, lt + .loc 1 790 0 + ldr w0, [x5, 92] + .loc 1 785 0 + cmp w6, 0 + add w21, w6, 7 + csel w21, w21, w6, lt + .loc 1 789 0 + cmp w19, 0 + csel w27, w27, w19, lt + .loc 1 785 0 + asr w21, w21, 3 + add w21, w21, 1 +.LVL2: + .loc 1 789 0 + asr w27, w27, 3 +.LVL3: + .loc 1 792 0 + cmp w21, w27 + sub w6, w27, #1 + csel w21, w6, w21, ge +.LVL4: + .loc 1 794 0 + cmp w28, w0 + sub w0, w0, #1 +.LVL5: + csel w28, w0, w28, ge +.LVL6: + .loc 1 796 0 + cmp w28, w23 + blt .L1 + asr w25, w25, 3 +.LVL7: + .loc 1 815 0 + mov w22, 1 + lsl w0, w25, 1 + str w0, [x29, 120] + lsl w0, w25, 3 + str w0, [x29, 116] + .loc 1 797 0 + ldr w0, [x29, 124] + mul w20, w23, w27 + .loc 1 896 0 + mov w30, w22 + .loc 1 797 0 + cbz w0, .L6 +.LVL8: + .p2align 2 +.L50: + .loc 1 798 0 + ldp w0, w15, [x26, 84] +.LVL9: + sub w15, w15, #1 + sub w15, w15, w23 + mul w15, w15, w0 + ldr x0, [x29, 104] +.LVL10: + lsr w15, w15, 2 + add x15, x0, x15 +.LVL11: +.L7: + .loc 1 803 0 + mul w19, w23, w19 + .loc 1 806 0 + mov w10, w25 + cmp w21, w25 + ldp w14, w11, [x29, 116] + .loc 1 803 0 + sxtw x19, w19 + .loc 1 806 0 + blt .L20 +.LVL12: + .p2align 2 +.L37: + .loc 1 810 0 + sbfiz x0, x10, 3, 32 +.LVL13: + add x0, x0, x20, sxtw 3 + ldr x8, [x1, x0] + .loc 1 811 0 + ldr x7, [x2, x0] + .loc 1 814 0 + cmp x8, x7 + beq .L10 + add x9, x19, x14, sxtw + .loc 1 809 0 + ldrb w13, [x15, w11, sxtw] + .loc 1 816 0 + eor x6, x8, x7 +.LVL14: + .loc 1 815 0 + str w22, [x5, 60] + .loc 1 818 0 + and x0, x6, 255 + .loc 1 807 0 + add x12, x15, x11, sxtw + .loc 1 818 0 + cmp x0, 0 + ldrb w0, [x3, x9] + .loc 1 813 0 + add x16, x4, x9 + .loc 1 818 0 + ccmp w0, 0, 0, ne + .loc 1 812 0 + add x0, x3, x9 +.LVL15: + .loc 1 818 0 + bne .L11 + .loc 1 820 0 + ldrb w17, [x4, x9] + .loc 1 821 0 + ubfx x24, x8, 3, 5 + .loc 1 820 0 + add x17, x17, 16 + .loc 1 821 0 + ldr x18, [x5, x17, lsl 3] + lsl x17, x7, 2 + and x17, x17, 992 + orr x17, x17, x24 + .loc 1 822 0 + ldrb w17, [x18, x17] + .loc 1 823 0 + strb w22, [x3, x9] + .loc 1 822 0 + orr w13, w17, w13 +.L11: + .loc 1 828 0 + ldrb w9, [x0, 1] + tst x6, 65280 + ccmp w9, 0, 0, ne + bne .L12 + .loc 1 830 0 + ldrb w9, [x16, 1] + .loc 1 831 0 + ubfx x18, x8, 11, 5 + .loc 1 830 0 + add x9, x9, 16 + .loc 1 831 0 + ldr x17, [x5, x9, lsl 3] + lsr x9, x7, 6 + and x9, x9, 992 + orr x9, x9, x18 + .loc 1 832 0 + ldrb w9, [x17, x9] + .loc 1 833 0 + strb w30, [x0, 1] + .loc 1 832 0 + orr w13, w13, w9, lsl 2 + and w13, w13, 255 +.L12: + .loc 1 838 0 + ldrb w9, [x0, 2] + tst x6, 16711680 + ccmp w9, 0, 0, ne + bne .L13 + .loc 1 840 0 + ldrb w9, [x16, 2] + .loc 1 841 0 + ubfx x18, x8, 19, 5 + .loc 1 840 0 + add x9, x9, 16 + .loc 1 841 0 + ldr x17, [x5, x9, lsl 3] + lsr x9, x7, 14 + and x9, x9, 992 + orr x9, x9, x18 + .loc 1 842 0 + ldrb w9, [x17, x9] + .loc 1 843 0 + strb w30, [x0, 2] + .loc 1 842 0 + orr w13, w13, w9, lsl 4 + and w13, w13, 255 +.L13: + .loc 1 848 0 + ldrb w9, [x0, 3] + tst x6, 4278190080 + ccmp w9, 0, 0, ne + bne .L14 + .loc 1 850 0 + ldrb w9, [x16, 3] + .loc 1 851 0 + lsr w18, w8, 27 + .loc 1 850 0 + add x9, x9, 16 + .loc 1 851 0 + ldr x17, [x5, x9, lsl 3] + lsr x9, x7, 22 + and x9, x9, 992 + orr x9, x9, x18 + .loc 1 852 0 + ldrb w9, [x17, x9] + .loc 1 853 0 + strb w30, [x0, 3] + .loc 1 852 0 + orr w13, w13, w9, lsl 6 + and w13, w13, 255 +.L14: + .loc 1 855 0 + strb w13, [x12] + .loc 1 861 0 + tst x6, 1095216660480 + .loc 1 857 0 + ldrb w9, [x12, 1] + .loc 1 861 0 + ldrb w13, [x0, 4] + ccmp w13, 0, 0, ne + bne .L15 + .loc 1 863 0 + ldrb w13, [x16, 4] + .loc 1 864 0 + ubfx x18, x8, 35, 5 + .loc 1 863 0 + add x13, x13, 16 + .loc 1 864 0 + ldr x17, [x5, x13, lsl 3] + lsr x13, x7, 30 + and x13, x13, 992 + orr x13, x13, x18 + .loc 1 865 0 + ldrb w13, [x17, x13] + .loc 1 866 0 + strb w30, [x0, 4] + .loc 1 865 0 + orr w9, w13, w9 +.L15: + .loc 1 871 0 + ldrb w13, [x0, 5] + tst x6, 280375465082880 + ccmp w13, 0, 0, ne + bne .L16 + .loc 1 873 0 + ldrb w13, [x16, 5] + .loc 1 874 0 + ubfx x18, x8, 43, 5 + .loc 1 873 0 + add x13, x13, 16 + .loc 1 874 0 + ldr x17, [x5, x13, lsl 3] + lsr x13, x7, 38 + and x13, x13, 992 + orr x13, x13, x18 + .loc 1 875 0 + ldrb w13, [x17, x13] + .loc 1 876 0 + strb w30, [x0, 5] + .loc 1 875 0 + orr w9, w9, w13, lsl 2 + and w9, w9, 255 +.L16: + .loc 1 881 0 + ldrb w13, [x0, 6] + tst x6, 71776119061217280 + ccmp w13, 0, 0, ne + bne .L17 + .loc 1 883 0 + ldrb w13, [x16, 6] + .loc 1 884 0 + ubfx x18, x8, 51, 5 + .loc 1 883 0 + add x13, x13, 16 + .loc 1 884 0 + ldr x17, [x5, x13, lsl 3] + lsr x13, x7, 46 + and x13, x13, 992 + orr x13, x13, x18 + .loc 1 885 0 + ldrb w13, [x17, x13] + .loc 1 886 0 + strb w30, [x0, 6] + .loc 1 885 0 + orr w9, w9, w13, lsl 4 + and w9, w9, 255 +.L17: + .loc 1 891 0 + tst x6, -72057594037927936 + ldrb w6, [x0, 7] +.LVL16: + ccmp w6, 0, 0, ne + bne .L18 + .loc 1 893 0 + ldrb w6, [x16, 7] + .loc 1 894 0 + lsr x7, x7, 54 +.LVL17: + and x7, x7, 992 + .loc 1 893 0 + add x6, x6, 16 + .loc 1 894 0 + ldr x6, [x5, x6, lsl 3] + add x8, x6, x8, lsr 59 +.LVL18: + .loc 1 895 0 + ldrb w6, [x8, x7] + .loc 1 896 0 + strb w30, [x0, 7] + .loc 1 895 0 + orr w9, w9, w6, lsl 6 + and w9, w9, 255 +.LVL19: +.L18: + .loc 1 898 0 + strb w9, [x12, 1] +.L10: + .loc 1 806 0 discriminator 2 + add w10, w10, 1 + add w11, w11, 2 + add w14, w14, 8 + cmp w21, w10 + bge .L37 +.LVL20: +.L20: + .loc 1 796 0 + add w23, w23, 1 + add w20, w20, w27 + cmp w28, w23 + blt .L1 + .loc 1 797 0 + ldr w0, [x29, 124] +.LVL21: + ldr w19, [x5, 96] + cbnz w0, .L50 +.L6: + .loc 1 800 0 + ldr w15, [x26, 84] +.LVL22: + ldr x0, [x29, 104] +.LVL23: + mul w15, w23, w15 + lsr w15, w15, 2 + add x15, x0, x15 +.LVL24: + b .L7 +.LVL25: +.L1: + .loc 1 902 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL26: + ldp x23, x24, [sp, 48] +.LVL27: + ldp x25, x26, [sp, 64] +.LVL28: + ldp x27, x28, [sp, 80] +.LVL29: + ldp x29, x30, [sp], 128 + .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 +.LFE2822: + .size get_overlay_image_area, .-get_overlay_image_area + .align 2 + .p2align 3,,7 + .type get_auto_image, %function +get_auto_image: +.LFB2825: + .loc 1 1050 0 + .cfi_startproc +.LVL30: + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + .loc 1 1051 0 + adrp x6, .LANCHOR0 + .loc 1 1070 0 + cmp w5, 2 + .loc 1 1050 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 1051 0 + ldr x17, [x6, #:lo12:.LANCHOR0] + .loc 1 1050 0 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + .loc 1 1065 0 + add x19, x4, 60 +.LVL31: + .loc 1 1061 0 + add x17, x17, 24 + .loc 1 1050 0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -16 + .cfi_offset 22, -8 + .loc 1 1058 0 + ldrb w13, [x4, 56] +.LVL32: + .loc 1 1068 0 + ldp w6, w22, [x17, 84] + .loc 1 1061 0 + ldr w30, [x17, 156] + .loc 1 1067 0 + lsr w14, w6, 3 + .loc 1 1070 0 + beq .L106 + .loc 1 1073 0 + cmp w5, 3 + .loc 1 1080 0 + mov w18, 0 +.LVL33: + .loc 1 1073 0 + beq .L107 +.LVL34: +.L55: + .loc 1 1083 0 discriminator 1 + cmp w18, w22 + bge .L79 + sub w16, w14, #1 + .loc 1 1083 0 is_stmt 0 + mov w8, 0 +.LVL35: + add x16, x16, 1 + lsl x16, x16, 3 + .loc 1 1084 0 is_stmt 1 + cbz w30, .L56 +.LVL36: + .p2align 2 +.L116: + .loc 1 1085 0 + ldr w10, [x17, 88] + sub w10, w10, #1 + sub w10, w10, w18 + mul w10, w10, w6 + lsr w10, w10, 2 + add x10, x0, x10 +.LVL37: +.L59: + add x6, x3, 8 + add x10, x10, 2 +.LVL38: + .loc 1 1089 0 discriminator 1 + mov x9, 0 + cbz w14, .L58 + .p2align 2 +.L95: + .loc 1 1092 0 + ldr x7, [x1, x9, lsl 3] + .loc 1 1093 0 + ldr x5, [x2, x9, lsl 3] +.LVL39: + .loc 1 1094 0 + cmp x7, x5 + beq .L60 + .loc 1 1096 0 + eor x8, x7, x5 +.LVL40: + .loc 1 1091 0 + mov w11, 0 + .loc 1 1097 0 + and x12, x8, 255 + cbz x12, .L61 + .loc 1 1098 0 + ldrb w12, [x6, -8] + .loc 1 1100 0 + lsl x11, x5, 2 + and x20, x11, 992 + ldr x21, [x4, 128] + ubfx x11, x7, 3, 5 + orr x11, x20, x11 + .loc 1 1099 0 + lsl w20, w12, 10 + .loc 1 1100 0 + add x11, x21, x11 + .loc 1 1102 0 + add w12, w12, 1 + and w12, w12, 255 + .loc 1 1103 0 + cmp w13, w12 + .loc 1 1100 0 + ldrb w11, [x11, w20, sxtw] + .loc 1 1103 0 + beq .L108 +.L62: + .loc 1 1107 0 + strb w12, [x6, -8] +.L61: + .loc 1 1110 0 + tst x8, 65280 + beq .L63 + .loc 1 1111 0 + ldrb w12, [x6, -7] + .loc 1 1113 0 + lsr x20, x5, 6 + and x21, x20, 992 + ldr x15, [x4, 128] + ubfx x20, x7, 11, 5 + orr x20, x21, x20 + .loc 1 1112 0 + lsl w21, w12, 10 + .loc 1 1113 0 + add x20, x15, x20 + .loc 1 1115 0 + add w12, w12, 1 + and w12, w12, 255 + .loc 1 1116 0 + cmp w13, w12 + .loc 1 1114 0 + ldrb w20, [x20, w21, sxtw] + orr w11, w11, w20, lsl 2 + and w11, w11, 255 + .loc 1 1116 0 + beq .L109 +.L64: + .loc 1 1120 0 + strb w12, [x6, -7] +.L63: + .loc 1 1123 0 + tst x8, 16711680 + beq .L65 + .loc 1 1124 0 + ldrb w12, [x6, -6] + .loc 1 1126 0 + lsr x20, x5, 14 + and x21, x20, 992 + ldr x15, [x4, 128] + ubfx x20, x7, 19, 5 + orr x20, x21, x20 + .loc 1 1125 0 + lsl w21, w12, 10 + .loc 1 1126 0 + add x20, x15, x20 + .loc 1 1128 0 + add w12, w12, 1 + and w12, w12, 255 + .loc 1 1129 0 + cmp w13, w12 + .loc 1 1127 0 + ldrb w20, [x20, w21, sxtw] + orr w11, w11, w20, lsl 4 + and w11, w11, 255 + .loc 1 1129 0 + beq .L110 +.L66: + .loc 1 1133 0 + strb w12, [x6, -6] +.L65: + .loc 1 1136 0 + tst x8, 4278190080 + beq .L67 + .loc 1 1137 0 + ldrb w12, [x6, -5] + .loc 1 1139 0 + lsr x20, x5, 22 + and x21, x20, 992 + ldr x15, [x4, 128] + lsr w20, w7, 27 + orr x20, x21, x20 + .loc 1 1138 0 + lsl w21, w12, 10 + .loc 1 1139 0 + add x20, x15, x20 + .loc 1 1141 0 + add w12, w12, 1 + and w12, w12, 255 + .loc 1 1142 0 + cmp w13, w12 + .loc 1 1140 0 + ldrb w20, [x20, w21, sxtw] + orr w11, w11, w20, lsl 6 + and w11, w11, 255 + .loc 1 1142 0 + beq .L111 +.L68: + .loc 1 1146 0 + strb w12, [x6, -5] +.L67: + .loc 1 1149 0 + strb w11, [x10, -2] + .loc 1 1152 0 + tst x8, 1095216660480 + .loc 1 1151 0 + mov w11, 0 + .loc 1 1152 0 + beq .L69 + .loc 1 1153 0 + ldrb w12, [x6, -4] + .loc 1 1155 0 + lsr x11, x5, 30 + and x20, x11, 992 + ldr x21, [x4, 128] + ubfx x11, x7, 35, 5 + orr x11, x20, x11 + .loc 1 1154 0 + lsl w20, w12, 10 + .loc 1 1155 0 + add x11, x21, x11 + .loc 1 1157 0 + add w12, w12, 1 + and w12, w12, 255 + .loc 1 1158 0 + cmp w13, w12 + .loc 1 1155 0 + ldrb w11, [x11, w20, sxtw] + .loc 1 1158 0 + beq .L112 +.L70: + .loc 1 1162 0 + strb w12, [x6, -4] +.L69: + .loc 1 1165 0 + tst x8, 280375465082880 + beq .L71 + .loc 1 1166 0 + ldrb w12, [x6, -3] + .loc 1 1168 0 + lsr x20, x5, 38 + and x21, x20, 992 + ldr x15, [x4, 128] + ubfx x20, x7, 43, 5 + orr x20, x21, x20 + .loc 1 1167 0 + lsl w21, w12, 10 + .loc 1 1168 0 + add x20, x15, x20 + .loc 1 1170 0 + add w12, w12, 1 + and w12, w12, 255 + .loc 1 1171 0 + cmp w13, w12 + .loc 1 1169 0 + ldrb w20, [x20, w21, sxtw] + orr w11, w11, w20, lsl 2 + and w11, w11, 255 + .loc 1 1171 0 + beq .L113 +.L72: + .loc 1 1175 0 + strb w12, [x6, -3] +.L71: + .loc 1 1178 0 + tst x8, 71776119061217280 + beq .L73 + .loc 1 1179 0 + ldrb w12, [x6, -2] + .loc 1 1181 0 + lsr x20, x5, 46 + and x21, x20, 992 + ldr x15, [x4, 128] + ubfx x20, x7, 51, 5 + orr x20, x21, x20 + .loc 1 1180 0 + lsl w21, w12, 10 + .loc 1 1181 0 + add x20, x15, x20 + .loc 1 1183 0 + add w12, w12, 1 + and w12, w12, 255 + .loc 1 1184 0 + cmp w13, w12 + .loc 1 1182 0 + ldrb w20, [x20, w21, sxtw] + orr w11, w11, w20, lsl 4 + and w11, w11, 255 + .loc 1 1184 0 + beq .L114 +.L74: + .loc 1 1188 0 + strb w12, [x6, -2] +.L73: + .loc 1 1191 0 + tst x8, -72057594037927936 + beq .L75 + .loc 1 1192 0 + ldrb w20, [x6, -1] + .loc 1 1194 0 + lsr x21, x5, 54 + ldr x8, [x4, 128] +.LVL41: + and x21, x21, 992 + .loc 1 1196 0 + add w12, w20, 1 + .loc 1 1193 0 + ubfiz x20, x20, 10, 8 + .loc 1 1196 0 + and w12, w12, 255 + .loc 1 1194 0 + add x8, x8, x20 + .loc 1 1197 0 + cmp w13, w12 + .loc 1 1194 0 + add x8, x8, x7, lsr 59 + .loc 1 1195 0 + ldrb w8, [x8, x21] + orr w11, w11, w8, lsl 6 + and w11, w11, 255 + .loc 1 1197 0 + beq .L115 +.L76: + .loc 1 1201 0 + strb w12, [x6, -1] +.LVL42: +.L75: + .loc 1 1204 0 + str x5, [x2, x9, lsl 3] + .loc 1 1095 0 + mov w8, 1 +.LVL43: + .loc 1 1205 0 + strb w11, [x10, -1] +.L77: + add x9, x9, 1 + add x6, x6, 8 + add x10, x10, 2 + .loc 1 1089 0 discriminator 2 + cmp w14, w9 + bgt .L95 + add x3, x3, x16 + add x2, x2, x16 + add x1, x1, x16 +.LVL44: +.L58: + .loc 1 1083 0 + add w18, w18, 1 + cmp w22, w18 + beq .L53 + ldr w6, [x17, 84] + .loc 1 1084 0 + cbnz w30, .L116 +.L56: + .loc 1 1087 0 + mul w10, w18, w6 + lsr w10, w10, 2 + add x10, x0, x10 +.LVL45: + b .L59 +.LVL46: + .p2align 3 +.L115: + .loc 1 1199 0 + and x5, x5, 72057594037927935 +.LVL47: + and x7, x7, -72057594037927936 +.LVL48: + orr x5, x7, x5 +.LVL49: + .loc 1 1198 0 + mov w12, 0 + b .L76 +.LVL50: + .p2align 3 +.L114: + .loc 1 1186 0 + and x12, x7, 71776119061217280 + and x5, x5, -71776119061217281 +.LVL51: + orr x5, x12, x5 +.LVL52: + .loc 1 1185 0 + mov w12, 0 + b .L74 + .p2align 3 +.L112: + .loc 1 1160 0 + and x12, x7, 1095216660480 + and x5, x5, -1095216660481 +.LVL53: + orr x5, x12, x5 +.LVL54: + .loc 1 1159 0 + mov w12, 0 + b .L70 + .p2align 3 +.L113: + .loc 1 1173 0 + and x12, x7, 280375465082880 + and x5, x5, -280375465082881 +.LVL55: + orr x5, x12, x5 +.LVL56: + .loc 1 1172 0 + mov w12, 0 + b .L72 + .p2align 3 +.L111: + .loc 1 1144 0 + and x12, x7, 4278190080 + and x5, x5, -4278190081 +.LVL57: + orr x5, x12, x5 +.LVL58: + .loc 1 1143 0 + mov w12, 0 + b .L68 + .p2align 3 +.L109: + .loc 1 1118 0 + and x12, x7, 65280 + and x5, x5, -65281 +.LVL59: + orr x5, x12, x5 +.LVL60: + .loc 1 1117 0 + mov w12, 0 + b .L64 + .p2align 3 +.L110: + .loc 1 1131 0 + and x12, x7, 16711680 + and x5, x5, -16711681 +.LVL61: + orr x5, x12, x5 +.LVL62: + .loc 1 1130 0 + mov w12, 0 + b .L66 + .p2align 3 +.L108: + .loc 1 1105 0 + bfi x5, x7, 0, 8 + .loc 1 1104 0 + mov w12, 0 + b .L62 +.LVL63: + .p2align 3 +.L60: + .loc 1 1208 0 + strb wzr, [x10, -2] + .loc 1 1209 0 + strb wzr, [x10, -1] + b .L77 +.LVL64: +.L79: + .loc 1 1083 0 + mov w8, 0 +.LVL65: +.L53: + .loc 1 1216 0 + str w8, [x19] + .loc 1 1217 0 + ldp x19, x20, [sp, 16] +.LVL66: + ldp x21, x22, [sp, 32] +.LVL67: + ldp x29, x30, [sp], 48 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL68: +.L106: + .cfi_restore_state + .loc 1 1072 0 + add w18, w22, w22, lsr 31 + asr w22, w18, 1 + .loc 1 1071 0 + mov w18, 0 +.LVL69: + b .L55 +.LVL70: +.L107: + .loc 1 1074 0 + add w15, w22, w22, lsr 31 + .loc 1 1078 0 + add x19, x4, 64 + .loc 1 1074 0 + asr w18, w15, 1 + .loc 1 1075 0 + mul w5, w14, w18 +.LVL71: + sbfiz x5, x5, 3, 32 + add x1, x1, x5 + .loc 1 1076 0 + add x2, x2, x5 + .loc 1 1077 0 + mul w5, w18, w6 + add x3, x3, x5 + b .L55 + .cfi_endproc +.LFE2825: + .size get_auto_image, .-get_auto_image + .align 2 + .p2align 3,,7 + .type waveform_open, %function +waveform_open: +.LFB2853: + .loc 1 3196 0 + .cfi_startproc +.LVL72: + .loc 1 3200 0 + mov w0, 0 +.LVL73: + .loc 1 3197 0 + str xzr, [x1, 104] + .loc 1 3200 0 + ret + .cfi_endproc +.LFE2853: + .size waveform_open, .-waveform_open + .section .exit.text,"ax",@progbits + .align 2 + .type ebc_exit, %function +ebc_exit: +.LFB2875: + .loc 1 3827 0 + .cfi_startproc + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 3828 0 + adrp x0, .LANCHOR1 + add x0, x0, :lo12:.LANCHOR1 + .loc 1 3827 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3828 0 + bl platform_driver_unregister +.LVL74: + .loc 1 3829 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2875: + .size ebc_exit, .-ebc_exit + .text + .align 2 + .p2align 3,,7 + .type ebc_resume, %function +ebc_resume: +.LFB2873: + .loc 1 3789 0 + .cfi_startproc +.LVL75: + 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 +.LBB1128: +.LBB1129: + .file 2 "./include/linux/device.h" + .loc 2 1181 0 + ldr x19, [x0, 184] +.LBE1129: +.LBE1128: + .loc 1 3793 0 + ldr x1, [x19, 16] +.LBB1130: +.LBB1131: + .file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h" + .loc 3 45 0 + mov x0, x1 +.LVL76: + ldr x1, [x1, 48] + blr x1 +.LVL77: +.LBE1131: +.LBE1130: + .loc 1 3794 0 + str wzr, [x19, 780] + .loc 1 3795 0 + ldr x0, [x19, 296] + adrp x1, .LC0 + add x1, x1, :lo12:.LC0 + bl _dev_info +.LVL78: + .loc 1 3798 0 + ldr x19, [sp, 16] + mov w0, 0 + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2873: + .size ebc_resume, .-ebc_resume + .align 2 + .p2align 3,,7 + .type ebc_frame_control_timeout, %function +ebc_frame_control_timeout: +.LFB2846: + .loc 1 2858 0 + .cfi_startproc +.LVL79: + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 2859 0 + adrp x0, .LANCHOR0 +.LVL80: + .loc 1 2861 0 + mov w3, 1 + .loc 1 2862 0 + adrp x1, .LC1 + .loc 1 2858 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 2859 0 + ldr x2, [x0, #:lo12:.LANCHOR0] + .loc 1 2862 0 + add x1, x1, :lo12:.LC1 + ldr x0, [x2, 296] + .loc 1 2861 0 + str w3, [x2, 792] + .loc 1 2862 0 + bl _dev_info +.LVL81: + .loc 1 2865 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2846: + .size ebc_frame_control_timeout, .-ebc_frame_control_timeout + .align 2 + .p2align 3,,7 + .type ebc_remove, %function +ebc_remove: +.LFB2871: + .loc 1 3765 0 + .cfi_startproc +.LVL82: + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 3766 0 + adrp x0, .LANCHOR1 +.LVL83: + add x0, x0, :lo12:.LANCHOR1 + .loc 1 3765 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3766 0 + add x0, x0, 224 + .loc 1 3765 0 + .loc 1 3766 0 + bl misc_deregister +.LVL84: + .loc 1 3769 0 + mov w0, 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2871: + .size ebc_remove, .-ebc_remove + .align 2 + .p2align 3,,7 + .type ebc_mmap, %function +ebc_mmap: +.LFB2850: + .loc 1 3142 0 + .cfi_startproc +.LVL85: + 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 3142 0 + mov x19, x1 + .loc 1 3145 0 + bl ebc_phy_buf_base_get +.LVL86: + .loc 1 3148 0 + lsr x2, x0, 12 + .loc 1 3146 0 + mov x6, 16384 + .loc 1 3148 0 + mov x0, x19 + .loc 1 3146 0 + ldp x4, x5, [x19, 72] + movk x6, 0x404, lsl 16 + .loc 1 3148 0 + ldp x1, x3, [x19] + .loc 1 3146 0 + orr x5, x5, x6 + str x5, [x19, 80] + .loc 1 3148 0 + sub x3, x3, x1 + bl remap_pfn_range +.LVL87: + .loc 1 3151 0 + cmp w0, 0 + mov w1, -11 + .loc 1 3154 0 + ldr x19, [sp, 16] +.LVL88: + csel w0, w0, w1, eq + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2850: + .size ebc_mmap, .-ebc_mmap + .align 2 + .p2align 3,,7 + .type waveform_mmap, %function +waveform_mmap: +.LFB2852: + .loc 1 3180 0 + .cfi_startproc +.LVL89: + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 3181 0 + adrp x2, .LANCHOR0 + .loc 1 3185 0 + mov x7, 16384 + .loc 1 3187 0 + mov x0, x1 +.LVL90: + .loc 1 3180 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3184 0 + ldr x2, [x2, #:lo12:.LANCHOR0] + .loc 1 3185 0 + movk x7, 0x404, lsl 16 + ldp x4, x5, [x1, 72] + .loc 1 3187 0 + ldp x6, x3, [x1] + .loc 1 3185 0 + orr x5, x5, x7 + .loc 1 3184 0 + ldr x2, [x2, 232] + .loc 1 3185 0 + str x5, [x1, 80] + .loc 1 3187 0 + sub x3, x3, x6 + mov x1, x6 +.LVL91: + lsr x2, x2, 12 + bl remap_pfn_range +.LVL92: + .loc 1 3190 0 + cmp w0, 0 + mov w1, -11 + .loc 1 3193 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + csel w0, w0, w1, eq + ret + .cfi_endproc +.LFE2852: + .size waveform_mmap, .-waveform_mmap + .align 2 + .p2align 3,,7 + .type ebc_io_ctl, %function +ebc_io_ctl: +.LFB2849: + .loc 1 2947 0 + .cfi_startproc +.LVL93: + stp x29, x30, [sp, -160]! + .cfi_def_cfa_offset 160 + .cfi_offset 29, -160 + .cfi_offset 30, -152 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -144 + .cfi_offset 20, -136 + adrp x19, __stack_chk_guard + stp x21, x22, [sp, 32] + add x0, x19, :lo12:__stack_chk_guard +.LVL94: + stp x23, x24, [sp, 48] + .cfi_offset 21, -128 + .cfi_offset 22, -120 + .cfi_offset 23, -112 + .cfi_offset 24, -104 + mov x21, x2 + str x25, [sp, 64] + .cfi_offset 25, -96 + .loc 1 2947 0 + ldr x3, [x0] + str x3, [x29, 152] + mov x3,0 + .loc 1 2957 0 + mov w0, 28679 + .loc 1 2949 0 + adrp x3, .LANCHOR0 + .loc 1 2957 0 + cmp w1, w0 + .loc 1 2949 0 + ldr x20, [x3, #:lo12:.LANCHOR0] + .loc 1 2957 0 + bhi .L136 + mov w0, 28678 + cmp w1, w0 + bcs .L137 + sub w0, w1, #28672 + cmp w0, 3 + bhi .L135 +.L137: + .loc 1 2968 0 + cbz x21, .L253 +.L258: + sub w0, w1, #28672 +.L135: + .loc 1 2977 0 + cmp w0, 17 + bls .L261 + .loc 1 3134 0 + ldr x0, [x20, 296] + adrp x2, .LANCHOR2 + adrp x1, .LC13 +.LVL95: + add x2, x2, :lo12:.LANCHOR2 + add x1, x1, :lo12:.LC13 + bl _dev_err +.LVL96: + .loc 1 3135 0 + mov x0, 0 + b .L134 +.LVL97: + .p2align 3 +.L136: + .loc 1 2957 0 + mov w0, 28681 + cmp w1, w0 + bcc .L258 + mov w0, 28683 + cmp w1, w0 + bls .L137 + mov w0, 28688 + cmp w1, w0 + bne .L258 + .loc 1 2968 0 + cbnz x21, .L258 + b .L253 + .p2align 3 +.L261: + .loc 1 2977 0 + adrp x1, .L141 +.LVL98: + add x1, x1, :lo12:.L141 + ldrh w0, [x1,w0,uxtw #1] + adr x1, .Lrtx141 + add x0, x1, w0, sxth #2 + br x0 +.Lrtx141: + .section .rodata + .align 0 + .align 2 +.L141: + .2byte (.L140 - .Lrtx141) / 4 + .2byte (.L142 - .Lrtx141) / 4 + .2byte (.L143 - .Lrtx141) / 4 + .2byte (.L144 - .Lrtx141) / 4 + .2byte (.L145 - .Lrtx141) / 4 + .2byte (.L146 - .Lrtx141) / 4 + .2byte (.L147 - .Lrtx141) / 4 + .2byte (.L148 - .Lrtx141) / 4 + .2byte (.L259 - .Lrtx141) / 4 + .2byte (.L150 - .Lrtx141) / 4 + .2byte (.L151 - .Lrtx141) / 4 + .2byte (.L152 - .Lrtx141) / 4 + .2byte (.L153 - .Lrtx141) / 4 + .2byte (.L154 - .Lrtx141) / 4 + .2byte (.L155 - .Lrtx141) / 4 + .2byte (.L156 - .Lrtx141) / 4 + .2byte (.L157 - .Lrtx141) / 4 + .2byte (.L158 - .Lrtx141) / 4 + .text + .p2align 3 +.L151: +.LBB1132: +.LBB1133: +.LBB1134: +.LBB1135: +.LBB1136: +.LBB1137: +.LBB1138: + .file 4 "./arch/arm64/include/asm/current.h" + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL99: +#NO_APP +.LBE1138: +.LBE1137: + .file 5 "./arch/arm64/include/asm/uaccess.h" + .loc 5 85 0 + ldr w2, [x0, 52] +.LBE1136: +.LBE1135: +.LBE1134: +.LBE1133: +.LBE1132: + .loc 1 3127 0 + add x22, x20, 440 +.LBB1163: +.LBB1160: +.LBB1157: +.LBB1147: +.LBB1145: + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL100: + .loc 5 84 0 + tbnz x2, 21, .L202 +.LBB1139: +.LBB1140: +.LBB1141: + .file 6 "./include/asm-generic/bitops/non-atomic.h" + .loc 6 106 0 + ldr x2, [x0] +.LBE1141: +.LBE1140: +.LBE1139: +.LBE1145: +.LBE1147: +.LBE1157: +.LBE1160: +.LBE1163: + .loc 1 2948 0 + mov x0, x21 +.LVL101: +.LBB1164: +.LBB1161: +.LBB1158: +.LBB1148: +.LBB1146: + .loc 5 84 0 + tbz x2, 26, .L203 +.LVL102: +.L202: +.LBB1142: +.LBB1143: +.LBB1144: + .file 7 "./include/linux/bitops.h" + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL103: +.LBE1144: +.LBE1143: + .loc 5 86 0 + and x0, x0, x21 +.LVL104: +.L203: +.LBE1142: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 4 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL105: +#NO_APP + mov x3, x0 +.LBE1146: +.LBE1148: + .file 8 "./include/linux/uaccess.h" + .loc 8 114 0 + cbz x0, .L226 +.LBB1149: +.LBB1150: +.LBB1151: +.LBB1152: +.LBB1153: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LBE1153: +.LBE1152: +.LBE1151: +.LBB1154: +.LBB1155: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL106: +#NO_APP +.LBE1155: +.LBE1154: +.LBB1156: + .loc 5 254 0 + and x0, x0, x21 +.LVL107: +.LBE1156: + .loc 5 249 0 + ldr x2, [x1, 8] +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x0, x2 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL108: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1150: +.LBE1149: + .loc 8 116 0 + mov x2, 4 + mov x0, x22 +.LVL109: + bl __arch_copy_from_user +.LVL110: + .loc 8 118 0 + cbnz x0, .L262 +.LBE1158: +.LBE1161: +.LBE1164: + .loc 1 3131 0 + add x20, x20, 192 + ldr w2, [x20, 248] + ldr x0, [x20, 104] +.LVL111: + adrp x1, .LC16 + add x1, x1, :lo12:.LC16 + bl _dev_info +.LVL112: +.L259: + .loc 1 3132 0 + mov x0, 0 +.LVL113: +.L134: + .loc 1 3139 0 + add x19, x19, :lo12:__stack_chk_guard + ldr x2, [x29, 152] + ldr x1, [x19] + eor x1, x2, x1 +.LVL114: + cbnz x1, .L263 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL115: + ldp x23, x24, [sp, 48] +.LVL116: + ldr x25, [sp, 64] + ldp x29, x30, [sp], 160 + .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 +.LVL117: + .p2align 3 +.L157: + .cfi_restore_state +.LBB1165: +.LBB1166: +.LBB1167: +.LBB1168: +.LBB1169: +.LBB1170: +.LBB1171: +.LBB1172: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL118: +#NO_APP +.LBE1172: +.LBE1171: + .loc 5 85 0 + ldr w2, [x1, 52] +.LBE1170: +.LBE1169: +.LBE1168: +.LBE1167: +.LBE1166: + .loc 1 3093 0 + mov w0, 1 + str w0, [x29, 84] +.LVL119: +.LBB1199: +.LBB1196: +.LBB1193: +.LBB1182: +.LBB1179: + .loc 5 77 0 + ldr x0, [x1, 8] +.LVL120: + .loc 5 84 0 + tbz x2, 21, .L264 +.LVL121: +.L187: +.LBB1173: +.LBB1174: +.LBB1175: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL122: +.LBE1175: +.LBE1174: + .loc 5 86 0 + and x1, x1, x21 +.LVL123: +.L188: +.LBE1173: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x1, x1, 4 + csel x0, xzr, x0, hi + csinv x1, x1, xzr, cc + sbcs xzr, x1, x0 + cset x1, ls + +// 0 "" 2 +.LVL124: +#NO_APP +.LBE1179: +.LBE1182: + .loc 8 132 0 + mov x0, 4 +.LVL125: + cbz x1, .L134 +.LBB1183: +.LBB1184: +.LBB1185: +.LBB1186: +.LBB1187: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL126: +.LBE1187: +.LBE1186: +.LBE1185: +.LBB1188: +.LBB1189: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x2, sp_el0 +// 0 "" 2 +.LVL127: +#NO_APP +.LBE1189: +.LBE1188: +.LBB1190: + .loc 5 254 0 + and x1, x1, x21 +.LVL128: +.LBE1190: + .loc 5 249 0 + ldr x2, [x2, 8] +.LVL129: +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x1, x2 + csel x3, x21, xzr, eq + +// 0 "" 2 +.LVL130: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1184: +.LBE1183: + .loc 8 134 0 + mov x2, x0 + add x1, x29, 84 +.LVL131: + mov x0, x3 + bl __arch_copy_to_user +.LVL132: + sxtw x0, w0 + b .L134 +.LVL133: + .p2align 3 +.L156: +.LBE1193: +.LBE1196: +.LBE1199: +.LBE1165: + .loc 1 3078 0 + ldr x0, [x20, 296] + adrp x1, .LC6 + .loc 1 3077 0 + str wzr, [x20, 800] + .loc 1 3078 0 + add x1, x1, :lo12:.LC6 + bl _dev_info +.LVL134: + .loc 1 3079 0 + mov x0, 0 + b .L134 + .p2align 3 +.L155: + .loc 1 3074 0 + ldr x0, [x20, 296] + .loc 1 3073 0 + mov w2, 1 + str w2, [x20, 800] + .loc 1 3074 0 + adrp x1, .LC5 + add x1, x1, :lo12:.LC5 + bl _dev_info +.LVL135: + .loc 1 3075 0 + mov x0, 0 + b .L134 + .p2align 3 +.L154: + .loc 1 3070 0 + ldr x0, [x20, 296] + adrp x1, .LC4 + .loc 1 3069 0 + str wzr, [x20, 796] + .loc 1 3070 0 + add x1, x1, :lo12:.LC4 + bl _dev_info +.LVL136: + .loc 1 3071 0 + mov x0, 0 + b .L134 + .p2align 3 +.L153: + .loc 1 3066 0 + ldr x0, [x20, 296] + .loc 1 3065 0 + mov w2, 1 + str w2, [x20, 796] + .loc 1 3066 0 + adrp x1, .LC3 + add x1, x1, :lo12:.LC3 + bl _dev_info +.LVL137: + .loc 1 3067 0 + mov x0, 0 + b .L134 + .p2align 3 +.L152: +.LBB1202: +.LBB1203: +.LBB1204: +.LBB1205: +.LBB1206: +.LBB1207: +.LBB1208: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL138: +#NO_APP +.LBE1208: +.LBE1207: + .loc 5 85 0 + ldr w2, [x1, 52] + .loc 5 77 0 + ldr x0, [x1, 8] +.LVL139: + .loc 5 84 0 + tbz x2, 21, .L265 +.LVL140: +.L184: +.LBB1209: +.LBB1210: +.LBB1211: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL141: +.LBE1211: +.LBE1210: + .loc 5 86 0 + and x1, x1, x21 +.LVL142: +.L185: +.LBE1209: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x1, x1, 4 + csel x0, xzr, x0, hi + csinv x1, x1, xzr, cc + sbcs xzr, x1, x0 + cset x1, ls + +// 0 "" 2 +.LVL143: +#NO_APP +.LBE1206: +.LBE1205: + .loc 8 132 0 + mov x0, 4 +.LVL144: + cbz x1, .L134 +.LBB1217: +.LBB1218: +.LBB1219: +.LBB1220: +.LBB1221: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL145: +.LBE1221: +.LBE1220: +.LBE1219: +.LBB1222: +.LBB1223: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x2, sp_el0 +// 0 "" 2 +.LVL146: +#NO_APP +.LBE1223: +.LBE1222: +.LBB1224: + .loc 5 254 0 + and x1, x1, x21 +.LVL147: +.LBE1224: + .loc 5 249 0 + ldr x2, [x2, 8] +.LVL148: +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x1, x2 + csel x3, x21, xzr, eq + +// 0 "" 2 +.LVL149: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1218: +.LBE1217: + .loc 8 134 0 + mov x2, x0 + add x1, x20, 788 +.LVL150: + mov x0, x3 + bl __arch_copy_to_user +.LVL151: + sxtw x0, w0 + b .L134 + .p2align 3 +.L150: +.LBE1204: +.LBE1203: +.LBE1202: +.LBB1231: +.LBB1232: +.LBB1233: +.LBB1234: +.LBB1235: +.LBB1236: +.LBB1237: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL152: +#NO_APP +.LBE1237: +.LBE1236: + .loc 5 85 0 + ldr w2, [x0, 52] +.LBE1235: +.LBE1234: +.LBE1233: +.LBE1232: +.LBE1231: + .loc 1 3118 0 + add x22, x20, 280 +.LBB1266: +.LBB1262: +.LBB1258: +.LBB1247: +.LBB1244: + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL153: + .loc 5 84 0 + tbz x2, 21, .L266 +.LVL154: +.L198: +.LBB1238: +.LBB1239: +.LBB1240: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL155: +.LBE1240: +.LBE1239: + .loc 5 86 0 + and x0, x0, x21 +.LVL156: +.L199: +.LBE1238: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 4 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL157: +#NO_APP + mov x3, x0 +.LBE1244: +.LBE1247: + .loc 8 114 0 + cbz x0, .L224 +.LBB1248: +.LBB1249: +.LBB1250: +.LBB1251: +.LBB1252: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LBE1252: +.LBE1251: +.LBE1250: +.LBB1253: +.LBB1254: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL158: +#NO_APP +.LBE1254: +.LBE1253: +.LBB1255: + .loc 5 254 0 + and x0, x0, x21 +.LVL159: +.LBE1255: + .loc 5 249 0 + ldr x2, [x1, 8] +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x0, x2 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL160: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1249: +.LBE1248: + .loc 8 116 0 + mov x2, 4 + mov x0, x22 +.LVL161: + bl __arch_copy_from_user +.LVL162: + .loc 8 118 0 + cbnz x0, .L267 +.LBE1258: +.LBE1262: +.LBE1266: + .loc 1 3122 0 + ldr x0, [x20, 296] +.LVL163: + adrp x1, .LC15 + ldr w2, [x20, 280] + add x1, x1, :lo12:.LC15 + bl _dev_info +.LVL164: + .loc 1 3123 0 + mov x0, 0 + b .L134 + .p2align 3 +.L148: +.LBB1267: +.LBB1268: +.LBB1269: +.LBB1270: +.LBB1271: +.LBB1272: +.LBB1273: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL165: +#NO_APP +.LBE1273: +.LBE1272: + .loc 5 85 0 + ldr w2, [x0, 52] + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL166: + .loc 5 84 0 + tbz x2, 21, .L268 +.LVL167: +.L181: +.LBB1274: +.LBB1275: +.LBB1276: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL168: +.LBE1276: +.LBE1275: + .loc 5 86 0 + and x0, x0, x21 +.LVL169: +.L182: +.LBE1274: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 64 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL170: +#NO_APP +.LBE1271: +.LBE1270: + .loc 8 114 0 + cbz x0, .L260 +.LBB1282: +.LBB1283: +.LBB1284: +.LBB1285: +.LBB1286: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL171: +.LBE1286: +.LBE1285: +.LBE1284: +.LBB1287: +.LBB1288: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL172: +#NO_APP +.LBE1288: +.LBE1287: +.LBB1289: + .loc 5 254 0 + and x0, x0, x21 +.LVL173: +.LBE1289: + .loc 5 249 0 + ldr x2, [x1, 8] +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x0, x2 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL174: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1283: +.LBE1282: + .loc 8 116 0 + mov x2, 64 + add x0, x29, 88 +.LVL175: + bl __arch_copy_from_user +.LVL176: + .loc 8 118 0 + cbnz x0, .L260 +.LBE1269: +.LBE1268: +.LBE1267: + .loc 1 3044 0 + bl ebc_osd_buf_clone +.LVL177: + mov x1, x0 + .loc 1 3045 0 + cbz x0, .L259 + .loc 1 3046 0 + ldr w6, [x29, 92] + .loc 1 3054 0 + add x20, x20, 192 + .loc 1 3050 0 + ldp w5, w3, [x29, 108] + .loc 1 3046 0 + str w6, [x1, 40] + .loc 1 3051 0 + ldp w4, w2, [x29, 116] + .loc 1 3050 0 + stp w5, w3, [x1, 48] + .loc 1 3051 0 + stp w4, w2, [x1, 56] + .loc 1 3053 0 + bl ebc_add_to_osd_buf_list +.LVL178: + .loc 1 3054 0 + ldr w0, [x20, 100] + cbnz w0, .L259 + .loc 1 3055 0 + mov w2, 1 + str w2, [x20, 100] + .loc 1 3056 0 + adrp x0, .LANCHOR1 + add x0, x0, :lo12:.LANCHOR1 + add x0, x0, 304 + mov w1, w2 + bl __wake_up_sync +.LVL179: + mov x0, 0 + b .L134 + .p2align 3 +.L147: + .loc 1 2979 0 + bl ebc_empty_osd_buf_get +.LVL180: + .loc 1 2980 0 + cbz x0, .L167 + .loc 1 2983 0 + ldr x22, [x0, 8] + bl ebc_phy_buf_base_get +.LVL181: +.LBB1296: +.LBB1297: +.LBB1298: +.LBB1299: +.LBB1300: +.LBB1301: +.LBB1302: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL182: +#NO_APP +.LBE1302: +.LBE1301: + .loc 5 85 0 + ldr w2, [x1, 52] +.LBE1300: +.LBE1299: +.LBE1298: +.LBE1297: +.LBE1296: + .loc 1 2983 0 + sub w0, w22, w0 + .loc 1 2987 0 + ldp w5, w4, [x20, 108] + .loc 1 2985 0 + str w0, [x29, 88] + .loc 1 2988 0 + ldr w3, [x20, 176] + .loc 1 2986 0 + stp w4, w5, [x29, 96] + .loc 1 2988 0 + str w3, [x29, 104] + .loc 1 2989 0 + str wzr, [x29, 132] +.LBB1329: +.LBB1326: +.LBB1323: +.LBB1312: +.LBB1309: + .loc 5 77 0 + ldr x0, [x1, 8] +.LVL183: + .loc 5 84 0 + tbz x2, 21, .L269 +.LVL184: +.L160: +.LBB1303: +.LBB1304: +.LBB1305: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL185: +.LBE1305: +.LBE1304: + .loc 5 86 0 + and x1, x1, x21 +.LVL186: +.L161: +.LBE1303: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x1, x1, 64 + csel x0, xzr, x0, hi + csinv x1, x1, xzr, cc + sbcs xzr, x1, x0 + cset x1, ls + +// 0 "" 2 +.LVL187: +#NO_APP +.LBE1309: +.LBE1312: + .loc 8 132 0 + mov x0, 64 +.LVL188: + cbz x1, .L134 +.LBB1313: +.LBB1314: +.LBB1315: +.LBB1316: +.LBB1317: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL189: +.LBE1317: +.LBE1316: +.LBE1315: +.LBB1318: +.LBB1319: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x2, sp_el0 +// 0 "" 2 +.LVL190: +#NO_APP +.LBE1319: +.LBE1318: +.LBB1320: + .loc 5 254 0 + and x1, x1, x21 +.LVL191: +.LBE1320: + .loc 5 249 0 + ldr x2, [x2, 8] +.LVL192: +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x1, x2 + csel x3, x21, xzr, eq + +// 0 "" 2 +.LVL193: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1314: +.LBE1313: + .loc 8 134 0 + mov x2, x0 + add x1, x29, 88 +.LVL194: + mov x0, x3 + bl __arch_copy_to_user +.LVL195: + sxtw x0, w0 + b .L134 + .p2align 3 +.L146: +.LBE1323: +.LBE1326: +.LBE1329: + .loc 1 3086 0 + ldr x0, [x20, 296] + adrp x1, .LC8 + .loc 1 3085 0 + str wzr, [x20, 788] + .loc 1 3086 0 + add x1, x1, :lo12:.LC8 + bl _dev_info +.LVL196: + .loc 1 3087 0 + mov x0, 0 + b .L134 + .p2align 3 +.L145: + .loc 1 3082 0 + ldr x0, [x20, 296] + .loc 1 3081 0 + mov w2, 1 + str w2, [x20, 788] + .loc 1 3082 0 + adrp x1, .LC7 + add x1, x1, :lo12:.LC7 + bl _dev_info +.LVL197: + .loc 1 3083 0 + mov x0, 0 + b .L134 + .p2align 3 +.L144: +.LBB1330: +.LBB1331: +.LBB1332: +.LBB1333: +.LBB1334: +.LBB1335: +.LBB1336: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL198: +#NO_APP +.LBE1336: +.LBE1335: + .loc 5 85 0 + ldr w2, [x0, 52] +.LBE1334: +.LBE1333: +.LBE1332: +.LBE1331: +.LBE1330: + .loc 1 3098 0 + add x22, x20, 276 +.LBB1365: +.LBB1361: +.LBB1357: +.LBB1346: +.LBB1343: + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL199: + .loc 5 84 0 + tbz x2, 21, .L270 +.LVL200: +.L190: +.LBB1337: +.LBB1338: +.LBB1339: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL201: +.LBE1339: +.LBE1338: + .loc 5 86 0 + and x0, x0, x21 +.LVL202: +.L191: +.LBE1337: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 4 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL203: +#NO_APP + mov x3, x0 +.LBE1343: +.LBE1346: + .loc 8 114 0 + cbz x0, .L221 +.LBB1347: +.LBB1348: +.LBB1349: +.LBB1350: +.LBB1351: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LBE1351: +.LBE1350: +.LBE1349: +.LBB1352: +.LBB1353: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL204: +#NO_APP +.LBE1353: +.LBE1352: +.LBB1354: + .loc 5 254 0 + and x0, x0, x21 +.LVL205: +.LBE1354: + .loc 5 249 0 + ldr x2, [x1, 8] +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x0, x2 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL206: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1348: +.LBE1347: + .loc 8 116 0 + mov x2, 4 + mov x0, x22 +.LVL207: + bl __arch_copy_from_user +.LVL208: + .loc 8 118 0 + cbnz x0, .L271 +.LBE1357: +.LBE1361: +.LBE1365: + .loc 1 3102 0 + ldr x0, [x20, 296] +.LVL209: + adrp x1, .LC14 + ldr w2, [x20, 276] + add x1, x1, :lo12:.LC14 + bl _dev_info +.LVL210: + .loc 1 3103 0 + mov x0, 0 + b .L134 + .p2align 3 +.L143: +.LBB1366: +.LBB1367: +.LBB1368: +.LBB1369: +.LBB1370: +.LBB1371: +.LBB1372: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x2, sp_el0 +// 0 "" 2 +.LVL211: +#NO_APP +.LBE1372: +.LBE1371: + .loc 5 85 0 + ldr w3, [x2, 52] +.LBE1370: +.LBE1369: +.LBE1368: +.LBE1367: +.LBE1366: + .loc 1 3109 0 + ldp w1, w0, [x20, 116] + stp w1, w0, [x29, 124] + .loc 1 3106 0 + ldp w6, w5, [x20, 108] + .loc 1 3105 0 + stp w5, w6, [x29, 96] + .loc 1 3107 0 + ldr w4, [x20, 176] + str w4, [x29, 104] + .loc 1 3110 0 + str wzr, [x29, 132] +.LBB1401: +.LBB1397: +.LBB1393: +.LBB1382: +.LBB1379: + .loc 5 77 0 + ldr x1, [x2, 8] +.LVL212: + .loc 5 84 0 + tbz x3, 21, .L272 +.LVL213: +.L194: +.LBB1373: +.LBB1374: +.LBB1375: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL214: +.LBE1375: +.LBE1374: + .loc 5 86 0 + and x0, x0, x21 +.LVL215: +.L195: +.LBE1373: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 64 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL216: +#NO_APP +.LBE1379: +.LBE1382: + .loc 8 132 0 + cbnz x0, .L196 +.L197: +.LBE1393: +.LBE1397: +.LBE1401: + .loc 1 3113 0 + ldr x0, [x20, 296] +.LVL217: + adrp x1, .LC10 +.LVL218: + add x1, x1, :lo12:.LC10 + bl _dev_err +.LVL219: + .loc 1 3114 0 + mov x0, -14 + b .L134 + .p2align 3 +.L142: +.LBB1402: +.LBB1403: +.LBB1404: +.LBB1405: +.LBB1406: +.LBB1407: +.LBB1408: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL220: +#NO_APP +.LBE1408: +.LBE1407: + .loc 5 85 0 + ldr w2, [x0, 52] + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL221: + .loc 5 84 0 + tbz x2, 21, .L273 +.LVL222: +.L174: +.LBB1409: +.LBB1410: +.LBB1411: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL223: +.LBE1411: +.LBE1410: + .loc 5 86 0 + and x0, x0, x21 +.LVL224: +.L175: +.LBE1409: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 64 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL225: +#NO_APP +.LBE1406: +.LBE1405: + .loc 8 114 0 + cbz x0, .L260 +.LBB1417: +.LBB1418: +.LBB1419: +.LBB1420: +.LBB1421: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL226: +.LBE1421: +.LBE1420: +.LBE1419: +.LBB1422: +.LBB1423: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x1, sp_el0 +// 0 "" 2 +.LVL227: +#NO_APP +.LBE1423: +.LBE1422: +.LBB1424: + .loc 5 254 0 + and x0, x0, x21 +.LVL228: +.LBE1424: + .loc 5 249 0 + ldr x2, [x1, 8] +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x0, x2 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL229: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1418: +.LBE1417: + .loc 8 116 0 + mov x2, 64 + add x0, x29, 88 +.LVL230: + bl __arch_copy_from_user +.LVL231: + .loc 8 118 0 + cbnz x0, .L260 +.LBE1404: +.LBE1403: +.LBE1402: + .loc 1 3021 0 + bl ebc_phy_buf_base_get +.LVL232: + ldrsw x1, [x29, 88] + .loc 1 3022 0 + add x0, x1, x0 + bl ebc_find_buf_by_phy_addr +.LVL233: + mov x21, x0 +.LVL234: + .loc 1 3023 0 + cbz x0, .L259 + .loc 1 3024 0 + ldr w1, [x29, 92] + .loc 1 3032 0 + add x20, x20, 192 + .loc 1 3024 0 + str w1, [x21, 40] + .loc 1 3028 0 + ldp w4, w2, [x29, 108] + stp w4, w2, [x21, 48] + .loc 1 3027 0 + ldr w3, [x29, 116] + .loc 1 3029 0 + ldr w1, [x29, 120] + .loc 1 3025 0 + ldr w5, [x29, 132] + .loc 1 3027 0 + str w3, [x21, 56] + .loc 1 3025 0 + stp w1, w5, [x21, 60] + .loc 1 3031 0 + bl ebc_add_to_dsp_buf_list +.LVL235: + .loc 1 3032 0 + ldr w0, [x20, 100] + cbz w0, .L274 +.L179: + .loc 1 3036 0 + ldr w0, [x21, 40] + sub w0, w0, #18 + tst w0, -3 + bne .L259 + .loc 1 3037 0 + mov w1, 1 + mov x0, 0 + str w1, [x20, 612] + b .L134 +.LVL236: + .p2align 3 +.L140: +.LBB1431: +.LBB1432: +.LBB1433: +.LBB1434: +.LBB1435: +.LBB1436: +.LBB1437: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL237: +#NO_APP +.LBE1437: +.LBE1436: + .loc 5 85 0 + ldr w2, [x0, 52] + .loc 5 77 0 + ldr x1, [x0, 8] +.LVL238: + .loc 5 84 0 + tbz x2, 21, .L275 +.LVL239: +.L163: +.LBB1438: +.LBB1439: +.LBB1440: + .loc 7 157 0 + sbfx x0, x21, 0, 56 +.LVL240: +.LBE1440: +.LBE1439: + .loc 5 86 0 + and x0, x0, x21 +.LVL241: +.L164: +.LBE1438: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 64 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL242: +#NO_APP +.LBE1435: +.LBE1434: + .loc 8 114 0 + cbz x0, .L260 +.LBB1446: +.LBB1447: +.LBB1448: +.LBB1449: +.LBB1450: + .loc 7 157 0 + lsl x22, x21, 8 +.LBE1450: +.LBE1449: +.LBE1448: +.LBB1451: +.LBB1452: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL243: +#NO_APP +.LBE1452: +.LBE1451: +.LBB1453: + .loc 5 254 0 + and x2, x21, x22, asr 8 +.LVL244: +.LBE1453: + .loc 5 249 0 + ldr x0, [x0, 8] +.LVL245: +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x2, x0 + csel x1, x21, xzr, eq + +// 0 "" 2 +.LVL246: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1447: +.LBE1446: + .loc 8 116 0 + add x24, x29, 88 + mov x2, 64 +.LVL247: + mov x0, x24 + bl __arch_copy_from_user +.LVL248: + mov x23, x0 +.LVL249: + .loc 8 118 0 + cbnz x0, .L166 +.L169: +.LBE1433: +.LBE1432: +.LBE1431: + .loc 1 2998 0 + add x0, x24, 48 + bl ebc_empty_buf_get +.LVL250: + mov x25, x0 + .loc 1 2999 0 + cbz x0, .L167 + .loc 1 3002 0 + ldr x23, [x0, 8] +.LVL251: + bl ebc_phy_buf_base_get +.LVL252: + .loc 1 3006 0 + ldp w3, w1, [x20, 108] + .loc 1 3005 0 + stp w1, w3, [x29, 96] +.LBB1462: +.LBB1463: +.LBB1464: +.LBB1465: +.LBB1466: +.LBB1467: +.LBB1468: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x2, sp_el0 +// 0 "" 2 +.LVL253: +#NO_APP +.LBE1468: +.LBE1467: + .loc 5 85 0 + ldr w3, [x2, 52] +.LBE1466: +.LBE1465: +.LBE1464: +.LBE1463: +.LBE1462: + .loc 1 3002 0 + sub w0, w23, w0 + .loc 1 3007 0 + ldr w1, [x20, 176] + .loc 1 3008 0 + str wzr, [x29, 132] + .loc 1 3007 0 + str w1, [x29, 104] + .loc 1 3004 0 + str w0, [x29, 88] +.LBB1492: +.LBB1488: +.LBB1484: +.LBB1476: +.LBB1473: + .loc 5 77 0 + ldr x1, [x2, 8] +.LVL254: + .loc 5 84 0 + tbnz x3, 21, .L170 +.LBB1469: +.LBB1470: +.LBB1471: + .loc 6 106 0 + ldr x2, [x2] +.LVL255: +.LBE1471: +.LBE1470: +.LBE1469: +.LBE1473: +.LBE1476: +.LBE1484: +.LBE1488: +.LBE1492: + .loc 1 2948 0 + mov x0, x21 +.LVL256: +.LBB1493: +.LBB1489: +.LBB1485: +.LBB1477: +.LBB1474: + .loc 5 84 0 + tbnz x2, 26, .L170 +.LVL257: +.L171: + .loc 5 89 0 +#APP +// 89 "./arch/arm64/include/asm/uaccess.h" 1 + adds x0, x0, 64 + csel x1, xzr, x1, hi + csinv x0, x0, xzr, cc + sbcs xzr, x0, x1 + cset x0, ls + +// 0 "" 2 +.LVL258: +#NO_APP +.LBE1474: +.LBE1477: + .loc 8 132 0 + cbnz x0, .L172 +.LVL259: +.L173: +.LBE1485: +.LBE1489: +.LBE1493: + .loc 1 3012 0 + mov x0, x25 +.LVL260: + bl ebc_buf_release +.LVL261: + .loc 1 3013 0 + mov x0, -14 + b .L134 +.LVL262: + .p2align 3 +.L158: + .loc 1 3061 0 + bl ebc_drop_one_dsp_buf +.LVL263: + cbz w0, .L259 +.LVL264: + .p2align 2 +.L260: + .loc 1 3100 0 + mov x0, -14 +.LVL265: + b .L134 +.LVL266: + .p2align 3 +.L268: +.LBB1494: +.LBB1294: +.LBB1292: +.LBB1290: +.LBB1280: +.LBB1277: +.LBB1278: +.LBB1279: + .loc 6 106 0 + ldr x2, [x0] +.LBE1279: +.LBE1278: +.LBE1277: +.LBE1280: +.LBE1290: +.LBE1292: +.LBE1294: +.LBE1494: + .loc 1 2948 0 + mov x0, x21 +.LVL267: +.LBB1495: +.LBB1295: +.LBB1293: +.LBB1291: +.LBB1281: + .loc 5 84 0 + tbz x2, 26, .L182 + b .L181 +.LVL268: + .p2align 3 +.L272: +.LBE1281: +.LBE1291: +.LBE1293: +.LBE1295: +.LBE1495: +.LBB1496: +.LBB1398: +.LBB1394: +.LBB1383: +.LBB1380: +.LBB1376: +.LBB1377: +.LBB1378: + .loc 6 106 0 + ldr x2, [x2] +.LVL269: +.LBE1378: +.LBE1377: +.LBE1376: +.LBE1380: +.LBE1383: +.LBE1394: +.LBE1398: +.LBE1496: + .loc 1 2948 0 + mov x0, x21 +.LVL270: +.LBB1497: +.LBB1399: +.LBB1395: +.LBB1384: +.LBB1381: + .loc 5 84 0 + tbz x2, 26, .L195 + b .L194 +.LVL271: + .p2align 3 +.L275: +.LBE1381: +.LBE1384: +.LBE1395: +.LBE1399: +.LBE1497: +.LBB1498: +.LBB1459: +.LBB1456: +.LBB1454: +.LBB1444: +.LBB1441: +.LBB1442: +.LBB1443: + .loc 6 106 0 + ldr x2, [x0] +.LBE1443: +.LBE1442: +.LBE1441: +.LBE1444: +.LBE1454: +.LBE1456: +.LBE1459: +.LBE1498: + .loc 1 2948 0 + mov x0, x21 +.LVL272: +.LBB1499: +.LBB1460: +.LBB1457: +.LBB1455: +.LBB1445: + .loc 5 84 0 + tbz x2, 26, .L164 + b .L163 +.LVL273: + .p2align 3 +.L273: +.LBE1445: +.LBE1455: +.LBE1457: +.LBE1460: +.LBE1499: +.LBB1500: +.LBB1429: +.LBB1427: +.LBB1425: +.LBB1415: +.LBB1412: +.LBB1413: +.LBB1414: + .loc 6 106 0 + ldr x2, [x0] +.LBE1414: +.LBE1413: +.LBE1412: +.LBE1415: +.LBE1425: +.LBE1427: +.LBE1429: +.LBE1500: + .loc 1 2948 0 + mov x0, x21 +.LVL274: +.LBB1501: +.LBB1430: +.LBB1428: +.LBB1426: +.LBB1416: + .loc 5 84 0 + tbz x2, 26, .L175 + b .L174 +.LVL275: + .p2align 3 +.L264: +.LBE1416: +.LBE1426: +.LBE1428: +.LBE1430: +.LBE1501: +.LBB1502: +.LBB1200: +.LBB1197: +.LBB1194: +.LBB1191: +.LBB1180: +.LBB1176: +.LBB1177: +.LBB1178: + .loc 6 106 0 + ldr x2, [x1] +.LBE1178: +.LBE1177: +.LBE1176: +.LBE1180: +.LBE1191: +.LBE1194: +.LBE1197: +.LBE1200: +.LBE1502: + .loc 1 2948 0 + mov x1, x21 +.LVL276: +.LBB1503: +.LBB1201: +.LBB1198: +.LBB1195: +.LBB1192: +.LBB1181: + .loc 5 84 0 + tbz x2, 26, .L188 + b .L187 +.LVL277: + .p2align 3 +.L266: +.LBE1181: +.LBE1192: +.LBE1195: +.LBE1198: +.LBE1201: +.LBE1503: +.LBB1504: +.LBB1263: +.LBB1259: +.LBB1256: +.LBB1245: +.LBB1241: +.LBB1242: +.LBB1243: + .loc 6 106 0 + ldr x2, [x0] +.LBE1243: +.LBE1242: +.LBE1241: +.LBE1245: +.LBE1256: +.LBE1259: +.LBE1263: +.LBE1504: + .loc 1 2948 0 + mov x0, x21 +.LVL278: +.LBB1505: +.LBB1264: +.LBB1260: +.LBB1257: +.LBB1246: + .loc 5 84 0 + tbz x2, 26, .L199 + b .L198 +.LVL279: + .p2align 3 +.L270: +.LBE1246: +.LBE1257: +.LBE1260: +.LBE1264: +.LBE1505: +.LBB1506: +.LBB1362: +.LBB1358: +.LBB1355: +.LBB1344: +.LBB1340: +.LBB1341: +.LBB1342: + .loc 6 106 0 + ldr x2, [x0] +.LBE1342: +.LBE1341: +.LBE1340: +.LBE1344: +.LBE1355: +.LBE1358: +.LBE1362: +.LBE1506: + .loc 1 2948 0 + mov x0, x21 +.LVL280: +.LBB1507: +.LBB1363: +.LBB1359: +.LBB1356: +.LBB1345: + .loc 5 84 0 + tbz x2, 26, .L191 + b .L190 +.LVL281: + .p2align 3 +.L265: +.LBE1345: +.LBE1356: +.LBE1359: +.LBE1363: +.LBE1507: +.LBB1508: +.LBB1229: +.LBB1227: +.LBB1225: +.LBB1215: +.LBB1212: +.LBB1213: +.LBB1214: + .loc 6 106 0 + ldr x2, [x1] +.LBE1214: +.LBE1213: +.LBE1212: +.LBE1215: +.LBE1225: +.LBE1227: +.LBE1229: +.LBE1508: + .loc 1 2948 0 + mov x1, x21 +.LVL282: +.LBB1509: +.LBB1230: +.LBB1228: +.LBB1226: +.LBB1216: + .loc 5 84 0 + tbz x2, 26, .L185 + b .L184 +.LVL283: + .p2align 3 +.L269: +.LBE1216: +.LBE1226: +.LBE1228: +.LBE1230: +.LBE1509: +.LBB1510: +.LBB1327: +.LBB1324: +.LBB1321: +.LBB1310: +.LBB1306: +.LBB1307: +.LBB1308: + .loc 6 106 0 + ldr x2, [x1] +.LBE1308: +.LBE1307: +.LBE1306: +.LBE1310: +.LBE1321: +.LBE1324: +.LBE1327: +.LBE1510: + .loc 1 2948 0 + mov x1, x21 +.LVL284: +.LBB1511: +.LBB1328: +.LBB1325: +.LBB1322: +.LBB1311: + .loc 5 84 0 + tbz x2, 26, .L161 + b .L160 +.LVL285: + .p2align 3 +.L170: +.LBE1311: +.LBE1322: +.LBE1325: +.LBE1328: +.LBE1511: +.LBB1512: +.LBB1490: +.LBB1486: +.LBB1478: +.LBB1475: +.LBB1472: + .loc 5 86 0 + and x0, x21, x22, asr 8 + b .L171 +.LVL286: +.L253: +.LBE1472: +.LBE1475: +.LBE1478: +.LBE1486: +.LBE1490: +.LBE1512: + .loc 1 2969 0 + ldr x0, [x20, 296] + adrp x2, .LANCHOR2 + adrp x1, .LC2 +.LVL287: + add x2, x2, :lo12:.LANCHOR2 + add x1, x1, :lo12:.LC2 + bl _dev_err +.LVL288: + .loc 1 2970 0 + mov x0, -14 + b .L134 +.LVL289: + .p2align 3 +.L196: +.LBB1513: +.LBB1400: +.LBB1396: +.LBB1385: +.LBB1386: +.LBB1387: +.LBB1388: +.LBB1389: + .loc 7 157 0 + sbfx x1, x21, 0, 56 +.LVL290: +.LBE1389: +.LBE1388: +.LBE1387: +.LBB1390: +.LBB1391: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL291: +#NO_APP +.LBE1391: +.LBE1390: +.LBB1392: + .loc 5 254 0 + and x1, x1, x21 +.LVL292: +.LBE1392: + .loc 5 249 0 + ldr x2, [x0, 8] +.LVL293: +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x1, x2 + csel x0, x21, xzr, eq + +// 0 "" 2 +.LVL294: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1386: +.LBE1385: + .loc 8 134 0 + mov x2, 64 + add x1, x29, 88 +.LVL295: + bl __arch_copy_to_user +.LVL296: +.LBE1396: +.LBE1400: +.LBE1513: + .loc 1 3112 0 + cbz x0, .L259 + b .L197 +.LVL297: + .p2align 3 +.L172: +.LBB1514: +.LBB1491: +.LBB1487: +.LBB1479: +.LBB1480: +.LBB1481: +.LBB1482: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x0, sp_el0 +// 0 "" 2 +.LVL298: +#NO_APP +.LBE1482: +.LBE1481: +.LBB1483: + .loc 5 254 0 + and x22, x21, x22, asr 8 +.LVL299: +.LBE1483: + .loc 5 249 0 + ldr x1, [x0, 8] +.LVL300: +#APP +// 249 "./arch/arm64/include/asm/uaccess.h" 1 + bics xzr, x22, x1 + csel x0, x21, xzr, eq + +// 0 "" 2 +.LVL301: + .loc 5 257 0 +// 257 "./arch/arm64/include/asm/uaccess.h" 1 + hint #20 +// 0 "" 2 +#NO_APP +.LBE1480: +.LBE1479: + .loc 8 134 0 + mov x2, 64 +.LVL302: + mov x1, x24 + bl __arch_copy_to_user +.LVL303: +.LBE1487: +.LBE1491: +.LBE1514: + .loc 1 3011 0 + cbz w0, .L259 + b .L173 +.LVL304: + .p2align 3 +.L274: + .loc 1 3033 0 + mov w2, 1 + str w2, [x20, 100] + .loc 1 3034 0 + adrp x0, .LANCHOR1 + add x0, x0, :lo12:.LANCHOR1 + mov w1, w2 + add x0, x0, 304 + bl __wake_up_sync +.LVL305: + b .L179 +.LVL306: +.L221: +.LBB1515: +.LBB1364: +.LBB1360: + .loc 8 112 0 + mov x0, 4 +.LVL307: +.L192: + .loc 8 119 0 + mov x2, x0 + mov w1, 0 +.LVL308: + add x0, x22, x3 +.LVL309: + bl memset +.LVL310: +.LBE1360: +.LBE1364: +.LBE1515: + .loc 1 3099 0 + ldr x0, [x20, 296] + adrp x1, .LC9 + add x1, x1, :lo12:.LC9 + bl _dev_err +.LVL311: + .loc 1 3100 0 + mov x0, -14 + b .L134 +.LVL312: +.L226: +.LBB1516: +.LBB1162: +.LBB1159: + .loc 8 112 0 + mov x0, 4 +.LVL313: +.L204: + .loc 8 119 0 + mov x2, x0 + mov w1, 0 +.LVL314: + add x0, x22, x3 +.LVL315: + bl memset +.LVL316: +.LBE1159: +.LBE1162: +.LBE1516: + .loc 1 3128 0 + ldr x0, [x20, 296] + adrp x1, .LC12 + add x1, x1, :lo12:.LC12 + bl _dev_err +.LVL317: + .loc 1 3129 0 + mov x0, -14 + b .L134 +.LVL318: +.L224: +.LBB1517: +.LBB1265: +.LBB1261: + .loc 8 112 0 + mov x0, 4 +.LVL319: +.L200: + .loc 8 119 0 + mov x2, x0 + mov w1, 0 +.LVL320: + add x0, x22, x3 +.LVL321: + bl memset +.LVL322: +.LBE1261: +.LBE1265: +.LBE1517: + .loc 1 3119 0 + ldr x0, [x20, 296] + adrp x1, .LC11 + add x1, x1, :lo12:.LC11 + bl _dev_err +.LVL323: + .loc 1 3120 0 + mov x0, -14 + b .L134 +.LVL324: +.L167: + .loc 1 2981 0 + mov x0, -1 + b .L134 +.LVL325: +.L263: + .loc 1 3139 0 + bl __stack_chk_fail +.LVL326: +.L166: +.LBB1518: +.LBB1461: +.LBB1458: + .loc 8 119 0 + sub x0, x24, x0 +.LVL327: + mov x2, x23 + mov w1, 0 + add x0, x0, 64 + bl memset +.LVL328: +.LBE1458: +.LBE1461: +.LBE1518: + .loc 1 2995 0 + cbz w23, .L169 + .loc 1 3100 0 + mov x0, -14 + b .L134 +.LVL329: +.L271: + mov x3, 4 + sub x3, x3, x0 +.LVL330: + b .L192 +.LVL331: +.L262: + mov x3, 4 + sub x3, x3, x0 +.LVL332: + b .L204 +.LVL333: +.L267: + mov x3, 4 + sub x3, x3, x0 +.LVL334: + b .L200 + .cfi_endproc +.LFE2849: + .size ebc_io_ctl, .-ebc_io_ctl + .align 2 + .p2align 3,,7 + .type get_overlay_image2, %function +get_overlay_image2: +.LFB2821: + .loc 1 667 0 + .cfi_startproc +.LVL335: + stp x29, x30, [sp, -112]! + .cfi_def_cfa_offset 112 + .cfi_offset 29, -112 + .cfi_offset 30, -104 + .loc 1 668 0 + adrp x7, .LANCHOR0 + .loc 1 677 0 + cmp w6, 2 + .loc 1 667 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x23, x24, [sp, 48] + .cfi_offset 23, -64 + .cfi_offset 24, -56 + mov x23, x0 + .loc 1 668 0 + ldr x0, [x7, #:lo12:.LANCHOR0] +.LVL336: + .loc 1 667 0 + stp x19, x20, [sp, 16] + .cfi_offset 19, -96 + .cfi_offset 20, -88 + mov x19, x5 + stp x25, x26, [sp, 64] + .cfi_offset 25, -48 + .cfi_offset 26, -40 + mov x26, x1 + stp x27, x28, [sp, 80] + mov x20, x2 + stp x21, x22, [sp, 32] + .cfi_offset 27, -32 + .cfi_offset 28, -24 + .cfi_offset 21, -80 + .cfi_offset 22, -72 + .loc 1 667 0 + mov x27, x3 + mov x28, x4 + .loc 1 671 0 + add x25, x5, 60 +.LVL337: + .loc 1 675 0 + ldp w1, w22, [x0, 108] +.LVL338: + .loc 1 674 0 + lsr w24, w1, 3 + .loc 1 677 0 + beq .L431 + .loc 1 680 0 + cmp w6, 3 + beq .L279 + lsr w13, w1, 2 + mov x0, 0 + .loc 1 688 0 + mov w21, 0 +.LVL339: +.L278: + .loc 1 692 0 + sub w2, w22, w21 + add x0, x23, x0 + mov w1, 0 + str w13, [x29, 108] + mul w2, w2, w13 + sxtw x2, w2 + bl memset +.LVL340: + .loc 1 694 0 + cmp w21, w22 + bge .L339 + ldr w13, [x29, 108] + sub w11, w24, #1 + add x11, x11, 1 + mov w3, 0 +.LVL341: + lsl x11, x11, 3 + mul w12, w21, w13 + lsl w13, w13, 1 +.LVL342: + .p2align 2 +.L338: +.LBB1519: + .loc 1 695 0 + add x9, x23, x12, sxtw + .loc 1 696 0 + cbz w24, .L281 + add x1, x27, 8 + add x8, x28, 8 + mov x4, x9 +.LVL343: + mov x7, 0 +.LVL344: + .p2align 2 +.L309: +.LBB1520: + .loc 1 697 0 + ldr x2, [x26, x7] + .loc 1 698 0 + ldr x0, [x20, x7] +.LVL345: + .loc 1 700 0 + cmp x2, x0 + beq .L282 +.LBB1521: + .loc 1 703 0 + eor x5, x2, x0 +.LVL346: + .loc 1 706 0 + and x3, x5, 255 +.LVL347: + cbz x3, .L340 +.LBB1522: + .loc 1 706 0 is_stmt 0 discriminator 1 + ldrb w10, [x8, -8] +.LVL348: + lsr x6, x0, 3 +.LVL349: + ldrb w3, [x1, -8] + ubfx x16, x2, 3, 5 + ubfiz x6, x6, 5, 5 + ldrb w15, [x19, 56] +.LVL350: + add x14, x19, x10, sxtw 3 +.LVL351: + orr x6, x6, x16 + ldrb w17, [x19, 57] + lsl w16, w3, 10 + cmp w10, 0 + add w3, w3, 1 + ldr x14, [x14, 128] + and w3, w3, 255 + csel w15, w15, w17, eq +.LBE1522: + .loc 1 701 0 is_stmt 1 discriminator 1 + mov w10, 0 +.LVL352: +.LBB1523: + .loc 1 706 0 discriminator 1 + add x6, x14, x6 + cmp w15, w3 + ldrb w6, [x6, w16, sxtw] +.LVL353: + beq .L432 +.L285: + .loc 1 706 0 is_stmt 0 discriminator 9 + strb w3, [x1, -8] +.LVL354: +.L283: +.LBE1523: + .loc 1 707 0 is_stmt 1 discriminator 10 + tst x5, 65280 + beq .L286 +.LBB1524: + .loc 1 707 0 is_stmt 0 discriminator 1 + ldrb w16, [x8, -7] +.LVL355: + lsr x17, x0, 11 + ldrb w3, [x1, -7] + ubfx x18, x2, 11, 5 +.LVL356: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x14, x17, x18 +.LVL357: + lsl w17, w3, 10 + ldrb w15, [x19, 56] +.LVL358: + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL359: + and w3, w3, 255 + csel w15, w15, w18, eq + add x14, x16, x14 + cmp w15, w3 + ldrb w14, [x14, w17, sxtw] +.LVL360: + orr w6, w6, w14, lsl 4 + beq .L433 +.L288: + .loc 1 707 0 discriminator 9 + strb w3, [x1, -7] +.LVL361: +.L286: +.LBE1524: + .loc 1 708 0 is_stmt 1 discriminator 10 + tst x5, 16711680 + beq .L289 +.LBB1525: + .loc 1 708 0 is_stmt 0 discriminator 1 + ldrb w16, [x8, -6] +.LVL362: + lsr x17, x0, 19 + ldrb w3, [x1, -6] + ubfx x18, x2, 19, 5 +.LVL363: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x14, x17, x18 +.LVL364: + lsl w17, w3, 10 + ldrb w15, [x19, 56] +.LVL365: + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL366: + and w3, w3, 255 + csel w15, w15, w18, eq + add x14, x16, x14 + cmp w15, w3 + ldrb w14, [x14, w17, sxtw] +.LVL367: + orr w6, w6, w14, lsl 8 + beq .L434 +.L291: + .loc 1 708 0 discriminator 9 + strb w3, [x1, -6] +.LVL368: +.L289: +.LBE1525: + .loc 1 709 0 is_stmt 1 discriminator 10 + tst x5, 4278190080 + beq .L292 +.LBB1526: + .loc 1 709 0 is_stmt 0 discriminator 1 + ldrb w16, [x8, -5] +.LVL369: + lsr x17, x0, 27 + ldrb w3, [x1, -5] + lsr w18, w2, 27 +.LVL370: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x14, x17, x18 +.LVL371: + lsl w17, w3, 10 + ldrb w15, [x19, 56] +.LVL372: + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL373: + and w3, w3, 255 + csel w15, w15, w18, eq + add x14, x16, x14 + cmp w15, w3 + ldrb w14, [x14, w17, sxtw] +.LVL374: + orr w6, w6, w14, lsl 12 + beq .L435 +.L294: + .loc 1 709 0 discriminator 9 + strb w3, [x1, -5] +.LVL375: +.L292: +.LBE1526: + .loc 1 710 0 is_stmt 1 discriminator 10 + tst x5, 1095216660480 + beq .L295 +.LBB1527: + .loc 1 710 0 is_stmt 0 discriminator 1 + ldrb w16, [x8, -4] +.LVL376: + lsr x17, x0, 35 + ldrb w3, [x1, -4] + ubfx x18, x2, 35, 5 +.LVL377: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x14, x17, x18 +.LVL378: + lsl w17, w3, 10 + ldrb w15, [x19, 56] +.LVL379: + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL380: + and w3, w3, 255 + csel w15, w15, w18, eq + add x14, x16, x14 + cmp w15, w3 + ldrb w14, [x14, w17, sxtw] +.LVL381: + orr w6, w6, w14, lsl 16 + beq .L436 +.L297: + .loc 1 710 0 discriminator 9 + strb w3, [x1, -4] +.LVL382: +.L295: +.LBE1527: + .loc 1 711 0 is_stmt 1 discriminator 10 + tst x5, 280375465082880 + beq .L298 +.LBB1528: + .loc 1 711 0 is_stmt 0 discriminator 1 + ldrb w16, [x8, -3] +.LVL383: + lsr x17, x0, 43 + ldrb w3, [x1, -3] + ubfx x18, x2, 43, 5 +.LVL384: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x14, x17, x18 +.LVL385: + lsl w17, w3, 10 + ldrb w15, [x19, 56] +.LVL386: + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL387: + and w3, w3, 255 + csel w15, w15, w18, eq + add x14, x16, x14 + cmp w15, w3 + ldrb w14, [x14, w17, sxtw] +.LVL388: + orr w6, w6, w14, lsl 20 + beq .L437 +.L300: + .loc 1 711 0 discriminator 9 + strb w3, [x1, -3] +.LVL389: +.L298: +.LBE1528: + .loc 1 712 0 is_stmt 1 discriminator 10 + tst x5, 71776119061217280 + beq .L301 +.LBB1529: + .loc 1 712 0 is_stmt 0 discriminator 1 + ldrb w16, [x8, -2] +.LVL390: + lsr x17, x0, 51 + ldrb w3, [x1, -2] + ubfx x18, x2, 51, 5 +.LVL391: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x14, x17, x18 +.LVL392: + lsl w17, w3, 10 + ldrb w15, [x19, 56] +.LVL393: + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL394: + and w3, w3, 255 + csel w15, w15, w18, eq + add x14, x16, x14 + cmp w15, w3 + ldrb w14, [x14, w17, sxtw] +.LVL395: + orr w6, w6, w14, lsl 24 + beq .L438 +.L303: + .loc 1 712 0 discriminator 9 + strb w3, [x1, -2] +.LVL396: +.L301: +.LBE1529: + .loc 1 713 0 is_stmt 1 discriminator 10 + tst x5, -72057594037927936 + beq .L304 +.LBB1530: + .loc 1 713 0 is_stmt 0 discriminator 1 + ldrb w18, [x8, -1] +.LVL397: + lsr x14, x0, 59 +.LVL398: + ldrb w5, [x1, -1] +.LVL399: + lsl x14, x14, 5 + ldrb w15, [x19, 56] +.LVL400: + cmp w18, 0 + add x3, x19, x18, sxtw 3 + ldrb w17, [x19, 57] + ubfiz x16, x5, 10, 8 + add w5, w5, 1 + and w5, w5, 255 + csel w15, w15, w17, eq + ldr x3, [x3, 128] + cmp w15, w5 + add x3, x3, x16 + add x3, x3, x2, lsr 59 + ldrb w3, [x3, x14] +.LVL401: + orr w6, w6, w3, lsl 28 + beq .L439 + .loc 1 713 0 discriminator 9 + strb w5, [x1, -1] +.LVL402: +.L304: +.LBE1530: + .loc 1 714 0 is_stmt 1 discriminator 10 + cbnz w10, .L307 +.L308: + .loc 1 705 0 + mov w3, 1 +.LVL403: + .loc 1 716 0 + str w6, [x4] +.LVL404: +.L282: + add x7, x7, 8 + add x1, x1, 8 + add x8, x8, 8 + add x4, x4, 4 +.LBE1521: +.LBE1520: + .loc 1 696 0 discriminator 2 + cmp x11, x7 + bne .L309 + add x27, x27, x11 +.LVL405: + add x28, x28, x11 +.LVL406: + add x20, x20, x11 +.LVL407: + add x26, x26, x11 + add x1, x27, 8 + add x8, x28, 8 + .loc 1 696 0 is_stmt 0 + mov x7, 0 +.LVL408: + .p2align 2 +.L337: +.LBB1541: + .loc 1 727 0 is_stmt 1 + ldr x5, [x26, x7] +.LVL409: + .loc 1 728 0 + ldr x0, [x20, x7] +.LVL410: + .loc 1 730 0 + cmp x5, x0 + beq .L310 +.LBB1542: + .loc 1 733 0 + eor x6, x5, x0 +.LVL411: + .loc 1 736 0 + and x2, x6, 255 +.LVL412: + cbz x2, .L342 +.LBB1543: + .loc 1 736 0 is_stmt 0 discriminator 1 + ldrb w10, [x8, -8] +.LVL413: + lsr x2, x0, 3 + ldrb w3, [x1, -8] +.LVL414: + ubfx x4, x5, 3, 5 +.LVL415: + cmp w10, 0 + ubfiz x2, x2, 5, 5 + add x16, x19, x10, sxtw 3 + orr x2, x2, x4 + lsl w15, w3, 10 +.LVL416: + ldrb w4, [x19, 57] + ldrb w14, [x19, 56] +.LVL417: + add w3, w3, 1 + ldr x10, [x16, 128] +.LVL418: + and w3, w3, 255 + csel w14, w14, w4, eq +.LBE1543: + .loc 1 731 0 is_stmt 1 discriminator 1 + mov w4, 0 +.LVL419: +.LBB1544: + .loc 1 736 0 discriminator 1 + add x2, x10, x2 + cmp w14, w3 + ldrb w2, [x2, w15, sxtw] +.LVL420: + lsl w2, w2, 2 +.LVL421: + beq .L440 +.L313: + .loc 1 736 0 is_stmt 0 discriminator 9 + strb w3, [x1, -8] +.LVL422: +.L311: +.LBE1544: + .loc 1 737 0 is_stmt 1 discriminator 10 + tst x6, 65280 + beq .L314 +.LBB1545: + .loc 1 737 0 is_stmt 0 discriminator 1 + ldrb w18, [x8, -7] +.LVL423: + lsr x14, x0, 11 +.LVL424: + ldrb w3, [x1, -7] +.LVL425: + ubfiz x14, x14, 5, 5 + ubfx x10, x5, 11, 5 +.LVL426: + ldrb w15, [x19, 56] +.LVL427: + add x17, x19, x18, sxtw 3 + orr x10, x14, x10 + lsl w14, w3, 10 + ldrb w16, [x19, 57] + cmp w18, 0 + add w3, w3, 1 + ldr x17, [x17, 128] + and w3, w3, 255 + csel w15, w15, w16, eq + add x10, x17, x10 + cmp w15, w3 + ldrb w10, [x10, w14, sxtw] +.LVL428: + orr w2, w2, w10, lsl 6 + beq .L441 +.L316: + .loc 1 737 0 discriminator 9 + strb w3, [x1, -7] +.LVL429: +.L314: +.LBE1545: + .loc 1 738 0 is_stmt 1 discriminator 10 + tst x6, 16711680 + beq .L317 +.LBB1546: + .loc 1 738 0 is_stmt 0 discriminator 1 + ldrb w18, [x8, -6] +.LVL430: + lsr x14, x0, 19 +.LVL431: + ldrb w3, [x1, -6] +.LVL432: + ubfiz x14, x14, 5, 5 + ubfx x10, x5, 19, 5 +.LVL433: + ldrb w15, [x19, 56] +.LVL434: + add x17, x19, x18, sxtw 3 + orr x10, x14, x10 + lsl w14, w3, 10 + ldrb w16, [x19, 57] + cmp w18, 0 + add w3, w3, 1 + ldr x17, [x17, 128] + and w3, w3, 255 + csel w15, w15, w16, eq + add x10, x17, x10 + cmp w15, w3 + ldrb w10, [x10, w14, sxtw] +.LVL435: + orr w2, w2, w10, lsl 10 + beq .L442 +.L319: + .loc 1 738 0 discriminator 9 + strb w3, [x1, -6] +.LVL436: +.L317: +.LBE1546: + .loc 1 739 0 is_stmt 1 discriminator 10 + tst x6, 4278190080 + beq .L320 +.LBB1547: + .loc 1 739 0 is_stmt 0 discriminator 1 + ldrb w18, [x8, -5] +.LVL437: + lsr x14, x0, 27 +.LVL438: + ldrb w3, [x1, -5] +.LVL439: + ubfiz x14, x14, 5, 5 + lsr w10, w5, 27 +.LVL440: + ldrb w15, [x19, 56] +.LVL441: + add x17, x19, x18, sxtw 3 + orr x10, x14, x10 + lsl w14, w3, 10 + ldrb w16, [x19, 57] + cmp w18, 0 + add w3, w3, 1 + ldr x17, [x17, 128] + and w3, w3, 255 + csel w15, w15, w16, eq + add x10, x17, x10 + cmp w15, w3 + ldrb w10, [x10, w14, sxtw] +.LVL442: + orr w2, w2, w10, lsl 14 + beq .L443 +.L322: + .loc 1 739 0 discriminator 9 + strb w3, [x1, -5] +.LVL443: +.L320: +.LBE1547: + .loc 1 740 0 is_stmt 1 discriminator 10 + tst x6, 1095216660480 + beq .L323 +.LBB1548: + .loc 1 740 0 is_stmt 0 discriminator 1 + ldrb w18, [x8, -4] +.LVL444: + lsr x14, x0, 35 +.LVL445: + ldrb w3, [x1, -4] +.LVL446: + ubfiz x14, x14, 5, 5 + ubfx x10, x5, 35, 5 +.LVL447: + ldrb w15, [x19, 56] +.LVL448: + add x17, x19, x18, sxtw 3 + orr x10, x14, x10 + lsl w14, w3, 10 + ldrb w16, [x19, 57] + cmp w18, 0 + add w3, w3, 1 + ldr x17, [x17, 128] + and w3, w3, 255 + csel w15, w15, w16, eq + add x10, x17, x10 + cmp w15, w3 + ldrb w10, [x10, w14, sxtw] +.LVL449: + orr w2, w2, w10, lsl 18 + beq .L444 +.L325: + .loc 1 740 0 discriminator 9 + strb w3, [x1, -4] +.LVL450: +.L323: +.LBE1548: + .loc 1 741 0 is_stmt 1 discriminator 10 + tst x6, 280375465082880 + beq .L326 +.LBB1549: + .loc 1 741 0 is_stmt 0 discriminator 1 + ldrb w18, [x8, -3] +.LVL451: + lsr x14, x0, 43 +.LVL452: + ldrb w10, [x1, -3] +.LVL453: + ubfiz x14, x14, 5, 5 + ubfx x3, x5, 43, 5 +.LVL454: + ldrb w15, [x19, 56] +.LVL455: + add x17, x19, x18, sxtw 3 + orr x3, x14, x3 + lsl w14, w10, 10 + ldrb w16, [x19, 57] + cmp w18, 0 + add w10, w10, 1 + ldr x17, [x17, 128] + and w10, w10, 255 + csel w15, w15, w16, eq + add x3, x17, x3 + cmp w15, w10 + ldrb w3, [x3, w14, sxtw] +.LVL456: + orr w2, w2, w3, lsl 22 + beq .L445 +.L328: + .loc 1 741 0 discriminator 9 + strb w10, [x1, -3] +.LVL457: +.L326: +.LBE1549: + .loc 1 742 0 is_stmt 1 discriminator 10 + tst x6, 71776119061217280 + beq .L329 +.LBB1550: + .loc 1 742 0 is_stmt 0 discriminator 1 + ldrb w18, [x8, -2] +.LVL458: + lsr x14, x0, 51 +.LVL459: + ldrb w10, [x1, -2] +.LVL460: + ubfiz x14, x14, 5, 5 + ubfx x3, x5, 51, 5 +.LVL461: + ldrb w15, [x19, 56] +.LVL462: + add x17, x19, x18, sxtw 3 + orr x3, x14, x3 + lsl w14, w10, 10 + ldrb w16, [x19, 57] + cmp w18, 0 + add w10, w10, 1 + ldr x17, [x17, 128] + and w10, w10, 255 + csel w15, w15, w16, eq + add x3, x17, x3 + cmp w15, w10 + ldrb w3, [x3, w14, sxtw] +.LVL463: + orr w2, w2, w3, lsl 26 + beq .L446 +.L331: + .loc 1 742 0 discriminator 9 + strb w10, [x1, -2] +.LVL464: +.L329: +.LBE1550: + .loc 1 743 0 is_stmt 1 discriminator 10 + tst x6, -72057594037927936 + beq .L332 +.LBB1551: + .loc 1 743 0 is_stmt 0 discriminator 1 + ldrb w15, [x8, -1] + lsr x10, x0, 59 +.LVL465: + ldrb w6, [x1, -1] +.LVL466: + lsl x10, x10, 5 + ldrb w14, [x19, 56] +.LVL467: + cmp w15, 0 + add x3, x19, x15, sxtw 3 +.LVL468: + ldrb w17, [x19, 57] + ubfiz x16, x6, 10, 8 + add w6, w6, 1 + and w6, w6, 255 + csel w14, w14, w17, eq + ldr x3, [x3, 128] + cmp w14, w6 + add x3, x3, x16 + add x3, x3, x5, lsr 59 + ldrb w3, [x3, x10] +.LVL469: + orr w2, w2, w3, lsl 30 + beq .L447 + .loc 1 743 0 discriminator 9 + strb w6, [x1, -1] +.LVL470: +.L332: +.LBE1551: + .loc 1 744 0 is_stmt 1 discriminator 10 + cbnz w4, .L335 +.L336: + .loc 1 746 0 + ldr w0, [x9] +.LVL471: + .loc 1 735 0 + mov w3, 1 +.LVL472: + .loc 1 746 0 + orr w2, w0, w2 +.LVL473: + str w2, [x9] +.LVL474: +.L310: + add x7, x7, 8 + add x1, x1, 8 + add x8, x8, 8 + add x9, x9, 4 +.LBE1542: +.LBE1541: + .loc 1 726 0 discriminator 2 + cmp x11, x7 + bne .L337 + add x27, x27, x11 + add x28, x28, x11 + add x20, x20, x11 + add x26, x26, x11 +.LVL475: +.L281: +.LBE1519: + .loc 1 694 0 + add w21, w21, 2 + add w12, w12, w13 + cmp w22, w21 + bgt .L338 + .loc 1 756 0 + str w3, [x25] + .loc 1 757 0 + ldp x19, x20, [sp, 16] +.LVL476: + ldp x21, x22, [sp, 32] +.LVL477: + ldp x23, x24, [sp, 48] +.LVL478: + ldp x25, x26, [sp, 64] +.LVL479: + ldp x27, x28, [sp, 80] +.LVL480: + 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 +.LVL481: + .p2align 3 +.L439: + .cfi_restore_state +.LBB1564: +.LBB1561: +.LBB1539: +.LBB1531: + .loc 1 713 0 discriminator 7 + and x0, x0, 72057594037927935 +.LVL482: + and x2, x2, -72057594037927936 +.LVL483: + orr x0, x2, x0 +.LVL484: + strb wzr, [x1, -1] +.LVL485: +.L307: +.LBE1531: + .loc 1 715 0 + str x0, [x20, x7] + b .L308 +.LVL486: + .p2align 3 +.L438: +.LBB1532: + .loc 1 712 0 discriminator 7 + and x3, x2, 71776119061217280 + and x0, x0, -71776119061217281 +.LVL487: + orr x0, x3, x0 +.LVL488: + mov w10, 1 + mov w3, 0 + b .L303 +.LVL489: + .p2align 3 +.L436: +.LBE1532: +.LBB1533: + .loc 1 710 0 discriminator 7 + and x3, x2, 1095216660480 + and x0, x0, -1095216660481 +.LVL490: + orr x0, x3, x0 +.LVL491: + mov w10, 1 + mov w3, 0 + b .L297 +.LVL492: + .p2align 3 +.L437: +.LBE1533: +.LBB1534: + .loc 1 711 0 discriminator 7 + and x3, x2, 280375465082880 + and x0, x0, -280375465082881 +.LVL493: + orr x0, x3, x0 +.LVL494: + mov w10, 1 + mov w3, 0 + b .L300 +.LVL495: + .p2align 3 +.L435: +.LBE1534: +.LBB1535: + .loc 1 709 0 discriminator 7 + and x3, x2, 4278190080 + and x0, x0, -4278190081 +.LVL496: + orr x0, x3, x0 +.LVL497: + mov w10, 1 + mov w3, 0 + b .L294 +.LVL498: + .p2align 3 +.L433: +.LBE1535: +.LBB1536: + .loc 1 707 0 discriminator 7 + and x3, x2, 65280 + and x0, x0, -65281 +.LVL499: + orr x0, x3, x0 +.LVL500: + mov w10, 1 + mov w3, 0 + b .L288 +.LVL501: + .p2align 3 +.L434: +.LBE1536: +.LBB1537: + .loc 1 708 0 discriminator 7 + and x3, x2, 16711680 + and x0, x0, -16711681 +.LVL502: + orr x0, x3, x0 +.LVL503: + mov w10, 1 + mov w3, 0 + b .L291 +.LVL504: + .p2align 3 +.L432: +.LBE1537: +.LBB1538: + .loc 1 706 0 discriminator 7 + bfi x0, x2, 0, 8 + mov w3, 0 + mov w10, 1 + b .L285 +.LVL505: + .p2align 3 +.L447: +.LBE1538: +.LBE1539: +.LBE1561: +.LBB1562: +.LBB1560: +.LBB1552: + .loc 1 743 0 discriminator 7 + and x0, x0, 72057594037927935 +.LVL506: + and x5, x5, -72057594037927936 +.LVL507: + orr x0, x5, x0 +.LVL508: + strb wzr, [x1, -1] +.LVL509: +.L335: +.LBE1552: + .loc 1 745 0 + str x0, [x20, x7] + b .L336 +.LVL510: + .p2align 3 +.L444: +.LBB1553: + .loc 1 740 0 discriminator 7 + and x3, x5, 1095216660480 + and x0, x0, -1095216660481 +.LVL511: + orr x0, x3, x0 +.LVL512: + mov w4, 1 + mov w3, 0 + b .L325 +.LVL513: + .p2align 3 +.L445: +.LBE1553: +.LBB1554: + .loc 1 741 0 discriminator 7 + and x0, x0, -280375465082881 +.LVL514: + and x3, x5, 280375465082880 +.LVL515: + orr x0, x3, x0 +.LVL516: + mov w10, 0 + mov w4, 1 + b .L328 +.LVL517: + .p2align 3 +.L446: +.LBE1554: +.LBB1555: + .loc 1 742 0 discriminator 7 + and x0, x0, -71776119061217281 +.LVL518: + and x3, x5, 71776119061217280 +.LVL519: + orr x0, x3, x0 +.LVL520: + mov w10, 0 + mov w4, 1 + b .L331 +.LVL521: + .p2align 3 +.L442: +.LBE1555: +.LBB1556: + .loc 1 738 0 discriminator 7 + and x3, x5, 16711680 + and x0, x0, -16711681 +.LVL522: + orr x0, x3, x0 +.LVL523: + mov w4, 1 + mov w3, 0 + b .L319 +.LVL524: + .p2align 3 +.L443: +.LBE1556: +.LBB1557: + .loc 1 739 0 discriminator 7 + and x3, x5, 4278190080 + and x0, x0, -4278190081 +.LVL525: + orr x0, x3, x0 +.LVL526: + mov w4, 1 + mov w3, 0 + b .L322 +.LVL527: + .p2align 3 +.L441: +.LBE1557: +.LBB1558: + .loc 1 737 0 discriminator 7 + and x3, x5, 65280 + and x0, x0, -65281 +.LVL528: + orr x0, x3, x0 +.LVL529: + mov w4, 1 + mov w3, 0 + b .L316 +.LVL530: + .p2align 3 +.L440: +.LBE1558: +.LBB1559: + .loc 1 736 0 discriminator 7 + bfi x0, x5, 0, 8 + mov w3, 0 + mov w4, 1 + b .L313 +.LVL531: + .p2align 3 +.L342: +.LBE1559: + .loc 1 732 0 + mov w2, 0 +.LVL532: + .loc 1 731 0 + mov w4, 0 + b .L311 +.LVL533: + .p2align 3 +.L340: +.LBE1560: +.LBE1562: +.LBB1563: +.LBB1540: + .loc 1 702 0 + mov w6, 0 +.LVL534: + .loc 1 701 0 + mov w10, 0 +.LVL535: + b .L283 +.LVL536: +.L431: +.LBE1540: +.LBE1563: +.LBE1564: + .loc 1 679 0 + add w22, w22, w22, lsr 31 +.LVL537: + lsr w13, w1, 2 + asr w22, w22, 1 +.LVL538: + mov x0, 0 + .loc 1 678 0 + mov w21, 0 +.LVL539: + b .L278 +.LVL540: +.L279: + .loc 1 681 0 + add w21, w22, w22, lsr 31 + lsr w13, w1, 2 + asr w21, w21, 1 +.LVL541: + .loc 1 686 0 + add x25, x5, 64 + .loc 1 682 0 + mul w0, w24, w21 + .loc 1 684 0 + mul w1, w21, w1 + .loc 1 682 0 + sbfiz x0, x0, 3, 32 + .loc 1 684 0 + add x27, x3, x1 + .loc 1 682 0 + add x26, x26, x0 + .loc 1 683 0 + add x20, x2, x0 + mul w0, w21, w13 + .loc 1 685 0 + add x28, x4, x1 + sxtw x0, w0 + b .L278 +.LVL542: +.L339: + .loc 1 670 0 + mov w3, 0 +.LVL543: + .loc 1 756 0 + str w3, [x25] + .loc 1 757 0 + ldp x19, x20, [sp, 16] +.LVL544: + ldp x21, x22, [sp, 32] +.LVL545: + ldp x23, x24, [sp, 48] +.LVL546: + ldp x25, x26, [sp, 64] +.LVL547: + ldp x27, x28, [sp, 80] +.LVL548: + ldp x29, x30, [sp], 112 + .cfi_restore 20 + .cfi_restore 19 + .cfi_restore 22 + .cfi_restore 21 + .cfi_restore 24 + .cfi_restore 23 + .cfi_restore 26 + .cfi_restore 25 + .cfi_restore 28 + .cfi_restore 27 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2821: + .size get_overlay_image2, .-get_overlay_image2 + .align 2 + .p2align 3,,7 + .type get_overlay_image, %function +get_overlay_image: +.LFB2820: + .loc 1 595 0 + .cfi_startproc +.LVL549: + stp x29, x30, [sp, -112]! + .cfi_def_cfa_offset 112 + .cfi_offset 29, -112 + .cfi_offset 30, -104 + .loc 1 596 0 + adrp x7, .LANCHOR0 + .loc 1 605 0 + cmp w6, 2 + .loc 1 595 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x21, x22, [sp, 32] + .cfi_offset 21, -80 + .cfi_offset 22, -72 + mov x21, x1 + .loc 1 596 0 + ldr x22, [x7, #:lo12:.LANCHOR0] + .loc 1 595 0 + stp x19, x20, [sp, 16] + .cfi_offset 19, -96 + .cfi_offset 20, -88 + mov x19, x5 + .loc 1 602 0 + add x22, x22, 24 + .loc 1 595 0 + stp x27, x28, [sp, 80] + stp x23, x24, [sp, 48] + mov x5, x0 +.LVL550: + stp x25, x26, [sp, 64] + .cfi_offset 27, -32 + .cfi_offset 28, -24 + .cfi_offset 23, -64 + .cfi_offset 24, -56 + .cfi_offset 25, -48 + .cfi_offset 26, -40 + .loc 1 595 0 + mov x20, x2 + mov x24, x3 + mov x25, x4 + .loc 1 603 0 + ldp w13, w0, [x22, 84] +.LVL551: + .loc 1 599 0 + add x28, x19, 60 +.LVL552: + .loc 1 602 0 + lsr w27, w13, 3 + .loc 1 605 0 + beq .L530 + mov w26, w0 +.LVL553: + .loc 1 608 0 + cmp w6, 3 + .loc 1 616 0 + mov w23, 0 +.LVL554: + .loc 1 608 0 + beq .L531 +.L450: + .loc 1 620 0 + ldr w1, [x22, 156] + .loc 1 619 0 + lsr w13, w13, 2 +.LVL555: + .loc 1 620 0 + cbz w1, .L451 + .loc 1 621 0 + sub w2, w26, w23 + sub w0, w0, w26 + str x5, [x29, 96] + mov w1, 0 + str w13, [x29, 108] + mul w2, w2, w13 + mul w0, w0, w13 + sxtw x2, w2 + add x0, x5, x0 + bl memset +.LVL556: + .loc 1 622 0 + ldr w0, [x22, 88] + .loc 1 629 0 + cmp w23, w26 + .loc 1 622 0 + ldr w13, [x29, 108] + sub w0, w0, #1 + ldr x5, [x29, 96] +.LVL557: + sub w0, w0, w23 +.LVL558: + mul w0, w0, w13 + .loc 1 623 0 + neg w13, w13 + .loc 1 622 0 + add x22, x5, x0 +.LVL559: + .loc 1 629 0 + bge .L486 +.L540: + sub w12, w27, #1 + sxtw x13, w13 +.LVL560: + add x12, x12, 1 + lsl w11, w27, 1 + lsl x12, x12, 3 + mov w3, 0 +.LVL561: + .p2align 2 +.L453: + .loc 1 630 0 discriminator 1 + cbz w27, .L484 + add x1, x24, 8 + add x6, x25, 8 + .loc 1 630 0 is_stmt 0 + mov w9, 0 + mov x7, 0 + .p2align 2 +.L482: +.LBB1565: + .loc 1 631 0 is_stmt 1 + ldr x2, [x21, x7] + .loc 1 632 0 + ldr x0, [x20, x7] + .loc 1 634 0 + cmp x2, x0 + beq .L455 +.LBB1566: + .loc 1 638 0 + eor x5, x2, x0 + .loc 1 636 0 + add x4, x22, x9, sxtw + .loc 1 641 0 + and x3, x5, 255 +.LVL562: + cbz x3, .L487 +.LBB1567: + .loc 1 641 0 is_stmt 0 discriminator 1 + ldrb w14, [x6, -8] +.LVL563: + lsr x10, x0, 3 + ldrb w3, [x1, -8] + ubfiz x10, x10, 5, 5 + ubfx x8, x2, 3, 5 + ldrb w15, [x19, 56] + add x18, x19, x14, sxtw 3 +.LVL564: + orr x8, x10, x8 + lsl w16, w3, 10 + ldrb w17, [x19, 57] + cmp w14, 0 + add w3, w3, 1 + ldr x10, [x18, 128] + and w3, w3, 255 + csel w15, w15, w17, eq +.LBE1567: + .loc 1 635 0 is_stmt 1 discriminator 1 + mov w14, 0 +.LVL565: +.LBB1568: + .loc 1 641 0 discriminator 1 + add x8, x10, x8 + cmp w15, w3 + ldrb w8, [x8, w16, sxtw] + beq .L532 +.L458: + .loc 1 641 0 is_stmt 0 discriminator 9 + strb w3, [x1, -8] +.LVL566: +.L456: +.LBE1568: + .loc 1 642 0 is_stmt 1 discriminator 10 + tst x5, 65280 + beq .L459 +.LBB1569: + .loc 1 642 0 is_stmt 0 discriminator 1 + ldrb w16, [x6, -7] +.LVL567: + lsr x17, x0, 11 + ldrb w3, [x1, -7] + ubfx x18, x2, 11, 5 +.LVL568: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x10, x17, x18 + lsl w17, w3, 10 + ldrb w15, [x19, 56] + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL569: + and w3, w3, 255 + csel w15, w15, w18, eq + add x10, x16, x10 + cmp w15, w3 + ldrb w10, [x10, w17, sxtw] + ubfiz w10, w10, 2, 6 + orr w8, w10, w8 + beq .L533 +.L461: + .loc 1 642 0 discriminator 9 + strb w3, [x1, -7] +.LVL570: +.L459: +.LBE1569: + .loc 1 643 0 is_stmt 1 discriminator 10 + tst x5, 16711680 + beq .L462 +.LBB1570: + .loc 1 643 0 is_stmt 0 discriminator 1 + ldrb w16, [x6, -6] +.LVL571: + lsr x17, x0, 19 + ldrb w3, [x1, -6] + ubfx x18, x2, 19, 5 +.LVL572: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x10, x17, x18 + lsl w17, w3, 10 + ldrb w15, [x19, 56] + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL573: + and w3, w3, 255 + csel w15, w15, w18, eq + add x10, x16, x10 + cmp w15, w3 + ldrb w10, [x10, w17, sxtw] + ubfiz w10, w10, 4, 4 + orr w8, w10, w8 + beq .L534 +.L464: + .loc 1 643 0 discriminator 9 + strb w3, [x1, -6] +.LVL574: +.L462: +.LBE1570: + .loc 1 644 0 is_stmt 1 discriminator 10 + tst x5, 4278190080 + beq .L465 +.LBB1571: + .loc 1 644 0 is_stmt 0 discriminator 1 + ldrb w16, [x6, -5] +.LVL575: + lsr x17, x0, 27 + ldrb w3, [x1, -5] + lsr w18, w2, 27 +.LVL576: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x10, x17, x18 + lsl w17, w3, 10 + ldrb w15, [x19, 56] + ldrb w18, [x19, 57] + add w3, w3, 1 + ldr x16, [x30, 128] +.LVL577: + and w3, w3, 255 + csel w15, w15, w18, eq + add x10, x16, x10 + cmp w15, w3 + ldrb w10, [x10, w17, sxtw] + ubfiz w10, w10, 6, 2 + orr w8, w10, w8 + beq .L535 +.L467: + .loc 1 644 0 discriminator 9 + strb w3, [x1, -5] +.LVL578: +.L465: +.LBE1571: + .loc 1 645 0 is_stmt 1 discriminator 10 + strb w8, [x4] + .loc 1 647 0 discriminator 10 + tst x5, 1095216660480 + .loc 1 646 0 discriminator 10 + mov w8, 0 + .loc 1 647 0 discriminator 10 + beq .L468 +.LBB1572: + .loc 1 647 0 is_stmt 0 discriminator 1 + ldrb w18, [x6, -4] +.LVL579: + lsr x10, x0, 35 + ldrb w3, [x1, -4] + ubfiz x10, x10, 5, 5 + ubfx x8, x2, 35, 5 + ldrb w15, [x19, 56] + add x17, x19, x18, sxtw 3 + orr x8, x10, x8 + ldrb w16, [x19, 57] + lsl w10, w3, 10 + cmp w18, 0 + add w3, w3, 1 + ldr x17, [x17, 128] + and w3, w3, 255 + csel w15, w15, w16, eq + add x8, x17, x8 + cmp w15, w3 + ldrb w8, [x8, w10, sxtw] + beq .L536 +.L470: + .loc 1 647 0 discriminator 9 + strb w3, [x1, -4] +.LVL580: +.L468: +.LBE1572: + .loc 1 648 0 is_stmt 1 discriminator 10 + tst x5, 280375465082880 + beq .L471 +.LBB1573: + .loc 1 648 0 is_stmt 0 discriminator 1 + ldrb w16, [x6, -3] +.LVL581: + lsr x17, x0, 43 + ldrb w10, [x1, -3] + ubfx x18, x2, 43, 5 +.LVL582: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x3, x17, x18 + lsl w17, w10, 10 + ldrb w15, [x19, 56] + ldrb w18, [x19, 57] + add w10, w10, 1 + ldr x16, [x30, 128] +.LVL583: + and w10, w10, 255 + csel w15, w15, w18, eq + add x3, x16, x3 + cmp w15, w10 + ldrb w3, [x3, w17, sxtw] + ubfiz w3, w3, 2, 6 + orr w8, w3, w8 + beq .L537 +.L473: + .loc 1 648 0 discriminator 9 + strb w10, [x1, -3] +.LVL584: +.L471: +.LBE1573: + .loc 1 649 0 is_stmt 1 discriminator 10 + tst x5, 71776119061217280 + beq .L474 +.LBB1574: + .loc 1 649 0 is_stmt 0 discriminator 1 + ldrb w16, [x6, -2] +.LVL585: + lsr x17, x0, 51 + ldrb w10, [x1, -2] + ubfx x18, x2, 51, 5 +.LVL586: + cmp w16, 0 + ubfiz x17, x17, 5, 5 + add x30, x19, x16, sxtw 3 + orr x3, x17, x18 + lsl w17, w10, 10 + ldrb w15, [x19, 56] + ldrb w18, [x19, 57] + add w10, w10, 1 + ldr x16, [x30, 128] +.LVL587: + and w10, w10, 255 + csel w15, w15, w18, eq + add x3, x16, x3 + cmp w15, w10 + ldrb w3, [x3, w17, sxtw] + ubfiz w3, w3, 4, 4 + orr w8, w3, w8 + beq .L538 +.L476: + .loc 1 649 0 discriminator 9 + strb w10, [x1, -2] +.LVL588: +.L474: +.LBE1574: + .loc 1 650 0 is_stmt 1 discriminator 10 + tst x5, -72057594037927936 + beq .L477 +.LBB1575: + .loc 1 650 0 is_stmt 0 discriminator 1 + ldrb w18, [x6, -1] +.LVL589: + lsr x10, x0, 59 + ldrb w5, [x1, -1] +.LVL590: + lsl x10, x10, 5 + ldrb w15, [x19, 56] + cmp w18, 0 + add x3, x19, x18, sxtw 3 + ldrb w17, [x19, 57] + ubfiz x16, x5, 10, 8 + add w5, w5, 1 + and w5, w5, 255 + csel w15, w15, w17, eq + ldr x3, [x3, 128] + cmp w15, w5 + add x3, x3, x16 + add x3, x3, x2, lsr 59 + ldrb w3, [x3, x10] + ubfiz w3, w3, 6, 2 + orr w8, w3, w8 + beq .L539 + .loc 1 650 0 discriminator 9 + strb w5, [x1, -1] +.LVL591: +.L477: +.LBE1575: + .loc 1 651 0 is_stmt 1 discriminator 10 + cbnz w14, .L480 +.L481: + .loc 1 653 0 + strb w8, [x4, 1] + .loc 1 640 0 + mov w3, 1 +.LVL592: +.L455: + add w9, w9, 2 + add x7, x7, 8 + add x1, x1, 8 + add x6, x6, 8 +.LBE1566: +.LBE1565: + .loc 1 630 0 discriminator 2 + cmp w9, w11 + bne .L482 + add x24, x24, x12 + add x25, x25, x12 + add x20, x20, x12 + add x21, x21, x12 +.L484: + .loc 1 629 0 + add w23, w23, 1 + add x22, x22, x13 + cmp w26, w23 + bne .L453 + .loc 1 663 0 + str w3, [x28] + .loc 1 664 0 + ldp x19, x20, [sp, 16] +.LVL593: + ldp x21, x22, [sp, 32] +.LVL594: + ldp x23, x24, [sp, 48] +.LVL595: + ldp x25, x26, [sp, 64] +.LVL596: + ldp x27, x28, [sp, 80] +.LVL597: + 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 +.LVL598: + .p2align 3 +.L539: + .cfi_restore_state +.LBB1585: +.LBB1584: +.LBB1576: + .loc 1 650 0 discriminator 7 + and x0, x0, 72057594037927935 +.LVL599: + and x2, x2, -72057594037927936 +.LVL600: + orr x0, x2, x0 +.LVL601: + strb wzr, [x1, -1] +.LVL602: +.L480: +.LBE1576: + .loc 1 652 0 + str x0, [x20, x7] + b .L481 +.LVL603: + .p2align 3 +.L538: +.LBB1577: + .loc 1 649 0 discriminator 7 + and x0, x0, -71776119061217281 +.LVL604: + and x3, x2, 71776119061217280 + orr x0, x3, x0 +.LVL605: + mov w10, 0 + mov w14, 1 + b .L476 + .p2align 3 +.L537: +.LBE1577: +.LBB1578: + .loc 1 648 0 discriminator 7 + and x0, x0, -280375465082881 +.LVL606: + and x3, x2, 280375465082880 + orr x0, x3, x0 +.LVL607: + mov w10, 0 + mov w14, 1 + b .L473 + .p2align 3 +.L535: +.LBE1578: +.LBB1579: + .loc 1 644 0 discriminator 7 + and x3, x2, 4278190080 + and x0, x0, -4278190081 +.LVL608: + orr x0, x3, x0 +.LVL609: + mov w14, 1 + mov w3, 0 + b .L467 +.LVL610: + .p2align 3 +.L536: +.LBE1579: +.LBB1580: + .loc 1 647 0 discriminator 7 + and x3, x2, 1095216660480 + and x0, x0, -1095216660481 +.LVL611: + orr x0, x3, x0 +.LVL612: + mov w14, 1 + mov w3, 0 + b .L470 +.LVL613: + .p2align 3 +.L534: +.LBE1580: +.LBB1581: + .loc 1 643 0 discriminator 7 + and x3, x2, 16711680 + and x0, x0, -16711681 +.LVL614: + orr x0, x3, x0 +.LVL615: + mov w14, 1 + mov w3, 0 + b .L464 + .p2align 3 +.L532: +.LBE1581: +.LBB1582: + .loc 1 641 0 discriminator 7 + bfi x0, x2, 0, 8 + mov w3, 0 + mov w14, 1 + b .L458 + .p2align 3 +.L533: +.LBE1582: +.LBB1583: + .loc 1 642 0 discriminator 7 + and x3, x2, 65280 + and x0, x0, -65281 +.LVL616: + orr x0, x3, x0 +.LVL617: + mov w14, 1 + mov w3, 0 + b .L461 +.LVL618: + .p2align 3 +.L487: +.LBE1583: + .loc 1 637 0 + mov w8, 0 + .loc 1 635 0 + mov w14, 0 + b .L456 +.LVL619: +.L451: +.LBE1584: +.LBE1585: + .loc 1 626 0 + sub w2, w26, w23 + .loc 1 625 0 + mul w22, w23, w13 + str w13, [x29, 108] + .loc 1 626 0 + mov w1, 0 + mul w2, w2, w13 + .loc 1 625 0 + add x22, x5, x22, sxtw +.LVL620: + .loc 1 626 0 + mov x0, x22 + sxtw x2, w2 + bl memset +.LVL621: + ldr w13, [x29, 108] + .loc 1 629 0 + cmp w23, w26 + blt .L540 +.LVL622: +.L486: + mov w3, 0 +.LVL623: + .loc 1 663 0 + str w3, [x28] + .loc 1 664 0 + ldp x19, x20, [sp, 16] +.LVL624: + ldp x21, x22, [sp, 32] +.LVL625: + ldp x23, x24, [sp, 48] +.LVL626: + ldp x25, x26, [sp, 64] +.LVL627: + ldp x27, x28, [sp, 80] +.LVL628: + ldp x29, x30, [sp], 112 + .cfi_remember_state + .cfi_restore 20 + .cfi_restore 19 + .cfi_restore 22 + .cfi_restore 21 + .cfi_restore 24 + .cfi_restore 23 + .cfi_restore 26 + .cfi_restore 25 + .cfi_restore 28 + .cfi_restore 27 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa 31, 0 + ret +.LVL629: +.L530: + .cfi_restore_state + .loc 1 607 0 + add w26, w0, w0, lsr 31 + .loc 1 606 0 + mov w23, 0 +.LVL630: + .loc 1 607 0 + asr w26, w26, 1 +.LVL631: + b .L450 +.L531: + .loc 1 609 0 + add w23, w0, w0, lsr 31 +.LVL632: + .loc 1 614 0 + add x28, x19, 64 + .loc 1 609 0 + asr w23, w23, 1 +.LVL633: + .loc 1 610 0 + mul w1, w27, w23 + sbfiz x1, x1, 3, 32 + add x21, x21, x1 + .loc 1 611 0 + add x20, x2, x1 + .loc 1 612 0 + mul w1, w23, w13 + add x24, x3, x1 + .loc 1 613 0 + add x25, x4, x1 + b .L450 + .cfi_endproc +.LFE2820: + .size get_overlay_image, .-get_overlay_image + .align 2 + .p2align 3,,7 + .type frame_done_callback, %function +frame_done_callback: +.LFB2838: + .loc 1 2069 0 + .cfi_startproc + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + .loc 1 2070 0 + adrp x0, .LANCHOR0 + .loc 1 2069 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + .loc 1 2070 0 + ldr x20, [x0, #:lo12:.LANCHOR0] + .loc 1 2069 0 + str x21, [sp, 32] + .cfi_offset 21, -16 + .loc 1 2072 0 + add x19, x20, 192 + ldr w1, [x19, 252] + cmp w1, 3 + beq .L543 + cmp w1, 4 + beq .L560 + add x2, x0, :lo12:.LANCHOR0 + .loc 1 2105 0 + ldr w0, [x19, 72] + cbnz w0, .L561 + .loc 1 2110 0 + ldr x0, [x19, 104] + adrp x1, .LC19 + .loc 1 2109 0 + str wzr, [x19, 52] + .loc 1 2110 0 + add x1, x1, :lo12:.LC19 + bl _dev_info +.LVL634: +.L559: + .loc 1 2111 0 + adrp x0, .LANCHOR1 + add x0, x0, :lo12:.LANCHOR1 + mov w2, 1 + add x0, x0, 304 + mov w1, w2 + bl __wake_up_sync +.LVL635: +.L541: + .loc 1 2115 0 + ldp x19, x20, [sp, 16] + ldr x21, [sp, 32] + ldp x29, x30, [sp], 48 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .p2align 3 +.L560: + .cfi_restore_state + .loc 1 2075 0 + ldr w1, [x19, 60] + .loc 1 2074 0 + mov w21, 1 + str w21, [x19, 76] + .loc 1 2075 0 + cbnz w1, .L548 + .loc 1 2075 0 is_stmt 0 discriminator 1 + ldr w1, [x19, 64] + cbnz w1, .L548 + .loc 1 2077 0 is_stmt 1 + ldr w1, [x19, 68] + cbz w1, .L548 + .loc 1 2081 0 + ldr x0, [x19, 104] + adrp x1, .LC17 + add x1, x1, :lo12:.LC17 + bl _dev_info +.LVL636: + .loc 1 2083 0 + ldp w3, w2, [x19, 92] + mov w1, 0 + ldr x0, [x19, 168] + mul w2, w2, w3 + sxtw x2, w2 + bl memset +.LVL637: + .loc 1 2084 0 + adrp x2, jiffies + add x0, x20, 720 + mov x1, 402653184 + ldr x2, [x2, #:lo12:jiffies] + add x1, x2, x1 + bl mod_timer +.LVL638: + .loc 1 2085 0 + str wzr, [x19, 52] + .loc 1 2086 0 + adrp x0, .LANCHOR1 + add x0, x0, :lo12:.LANCHOR1 + mov w2, w21 + mov w1, w21 + add x0, x0, 304 + bl __wake_up_sync +.LVL639: + b .L541 + .p2align 3 +.L543: + .loc 1 2090 0 + ldr w1, [x19, 60] + cbnz w1, .L548 + .loc 1 2090 0 is_stmt 0 discriminator 1 + ldr w1, [x19, 64] + cbz w1, .L549 +.L548: + .loc 1 2091 0 is_stmt 1 + add x0, x0, :lo12:.LANCHOR0 + ldr x0, [x0, 8] + bl wake_up_process +.LVL640: + .loc 1 2115 0 + ldr x21, [sp, 32] + ldp x19, x20, [sp, 16] + ldp x29, x30, [sp], 48 + .cfi_remember_state + .cfi_restore 20 + .cfi_restore 19 + .cfi_restore 21 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa 31, 0 + ret + .p2align 3 +.L549: + .cfi_restore_state + .loc 1 2092 0 + ldr w1, [x19, 68] + cbz w1, .L548 + .loc 1 2096 0 + ldr x0, [x19, 104] + adrp x1, .LC18 + add x1, x1, :lo12:.LC18 + bl _dev_info +.LVL641: + .loc 1 2098 0 + ldp w3, w2, [x19, 92] + mov w1, 0 + ldr x0, [x19, 168] + mul w2, w2, w3 + sxtw x2, w2 + bl memset +.LVL642: + .loc 1 2099 0 + adrp x2, jiffies + mov x1, 402653184 + add x0, x20, 720 + ldr x2, [x2, #:lo12:jiffies] + add x1, x2, x1 + bl mod_timer +.LVL643: + .loc 1 2100 0 + str wzr, [x19, 52] + b .L559 + .p2align 3 +.L561: + .loc 1 2107 0 + ldr x0, [x2, 8] + .loc 1 2106 0 + mov w1, 1 + str w1, [x19, 52] + .loc 1 2107 0 + bl wake_up_process +.LVL644: + .loc 1 2115 0 + ldr x21, [sp, 32] + ldp x19, x20, [sp, 16] + ldp x29, x30, [sp], 48 + .cfi_restore 20 + .cfi_restore 19 + .cfi_restore 21 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2838: + .size frame_done_callback, .-frame_done_callback + .align 2 + .p2align 3,,7 + .type ebc_frame_timeout, %function +ebc_frame_timeout: +.LFB2847: + .loc 1 2868 0 + .cfi_startproc +.LVL645: + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 2869 0 + bl frame_done_callback +.LVL646: + .loc 1 2871 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2847: + .size ebc_frame_timeout, .-ebc_frame_timeout + .align 2 + .p2align 3,,7 + .type ebc_lut_update, %function +ebc_lut_update: +.LFB2840: + .loc 1 2161 0 + .cfi_startproc +.LVL647: + stp x29, x30, [sp, -64]! + .cfi_def_cfa_offset 64 + .cfi_offset 29, -64 + .cfi_offset 30, -56 + .loc 1 2163 0 + mov w4, 25 + .loc 1 2161 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -48 + .cfi_offset 20, -40 + mov x20, x0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -32 + .cfi_offset 22, -24 + .loc 1 2163 0 + add x0, x29, 64 +.LVL648: + .loc 1 2161 0 + adrp x19, __stack_chk_guard + add x3, x19, :lo12:__stack_chk_guard + .loc 1 2168 0 + ldr x2, [x20, 16] + .loc 1 2161 0 + mov w22, w1 + .loc 1 2163 0 + str w4, [x0, -12]! +.LVL649: + .loc 1 2161 0 + ldr x1, [x3] + str x1, [x29, 56] + mov x1,0 +.LVL650: +.LBB1586: +.LBB1587: + .loc 3 50 0 + mov x1, x0 + mov x0, x2 + ldr x2, [x2, 56] + blr x2 +.LVL651: +.LBE1587: +.LBE1586: + .loc 1 2169 0 + cbnz w0, .L565 +.LVL652: + .loc 1 2170 0 + ldr w2, [x29, 52] + .loc 1 2171 0 + add x21, x20, 192 + .loc 1 2170 0 + tbnz w2, #31, .L588 + .loc 1 2174 0 + cmp w2, 50 + bgt .L589 +.L567: + .loc 1 2182 0 + ldr x0, [x21, 104] + adrp x1, .LC23 + add x1, x1, :lo12:.LC23 + bl _dev_info +.LVL653: + .loc 1 2185 0 + cmp w22, 23 + bls .L590 +.L568: + .loc 1 2241 0 + mov w0, 12 + .loc 1 2242 0 + mov w1, 3 + .loc 1 2241 0 + str w0, [x21, 144] + .p2align 2 +.L571: + .loc 1 2245 0 + ldr w2, [x29, 52] + add x0, x20, 304 + mov w3, 32 + bl epd_lut_get +.LVL654: + mov w20, w0 +.LVL655: + .loc 1 2246 0 + cbz w0, .L564 + .loc 1 2247 0 + ldr x0, [x21, 104] + adrp x1, .LC24 + add x1, x1, :lo12:.LC24 + bl _dev_err +.LVL656: +.L564: + .loc 1 2252 0 + add x19, x19, :lo12:__stack_chk_guard + mov w0, w20 + ldr x2, [x29, 56] + ldr x1, [x19] + eor x1, x2, x1 + cbnz x1, .L591 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL657: + ldp x29, x30, [sp], 64 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL658: + .p2align 3 +.L590: + .cfi_restore_state + .loc 1 2185 0 + adrp x0, .L570 + add x0, x0, :lo12:.L570 + ldrb w0, [x0,w22,uxtw] + adr x1, .Lrtx570 + add x0, x1, w0, sxtb #2 + br x0 +.Lrtx570: + .section .rodata + .align 0 + .align 2 +.L570: + .byte (.L568 - .Lrtx570) / 4 + .byte (.L582 - .Lrtx570) / 4 + .byte (.L568 - .Lrtx570) / 4 + .byte (.L572 - .Lrtx570) / 4 + .byte (.L573 - .Lrtx570) / 4 + .byte (.L574 - .Lrtx570) / 4 + .byte (.L575 - .Lrtx570) / 4 + .byte (.L568 - .Lrtx570) / 4 + .byte (.L572 - .Lrtx570) / 4 + .byte (.L573 - .Lrtx570) / 4 + .byte (.L574 - .Lrtx570) / 4 + .byte (.L575 - .Lrtx570) / 4 + .byte (.L576 - .Lrtx570) / 4 + .byte (.L576 - .Lrtx570) / 4 + .byte (.L577 - .Lrtx570) / 4 + .byte (.L578 - .Lrtx570) / 4 + .byte (.L577 - .Lrtx570) / 4 + .byte (.L579 - .Lrtx570) / 4 + .byte (.L568 - .Lrtx570) / 4 + .byte (.L568 - .Lrtx570) / 4 + .byte (.L568 - .Lrtx570) / 4 + .byte (.L568 - .Lrtx570) / 4 + .byte (.L577 - .Lrtx570) / 4 + .byte (.L578 - .Lrtx570) / 4 + .text +.LVL659: + .p2align 3 +.L565: + .loc 1 2180 0 + add x21, x20, 192 + mov w2, w0 + adrp x1, .LC22 + add x1, x1, :lo12:.LC22 + ldr x0, [x21, 104] + bl _dev_err +.LVL660: + ldr w2, [x29, 52] + b .L567 + .p2align 3 +.L589: + .loc 1 2175 0 + ldr x0, [x21, 104] + adrp x1, .LC21 + add x1, x1, :lo12:.LC21 + bl _dev_info +.LVL661: + .loc 1 2176 0 + mov w2, 50 + str w2, [x29, 52] +.LVL662: + b .L567 + .p2align 3 +.L582: + .loc 1 2185 0 + mov w1, 10 + b .L571 + .p2align 3 +.L579: + .loc 1 2189 0 + mov w1, 0 + .loc 1 2188 0 + str wzr, [x21, 144] + .loc 1 2189 0 + b .L571 + .p2align 3 +.L572: + .loc 1 2222 0 + mov w0, 12 + .loc 1 2223 0 + mov w1, 4 + .loc 1 2222 0 + str w0, [x21, 144] + .loc 1 2223 0 + b .L571 + .p2align 3 +.L573: + .loc 1 2227 0 + mov w0, 12 + .loc 1 2228 0 + mov w1, 5 + .loc 1 2227 0 + str w0, [x21, 144] + .loc 1 2228 0 + b .L571 + .p2align 3 +.L574: + .loc 1 2232 0 + mov w0, 12 + .loc 1 2233 0 + mov w1, 6 + .loc 1 2232 0 + str w0, [x21, 144] + .loc 1 2233 0 + b .L571 + .p2align 3 +.L575: + .loc 1 2237 0 + mov w0, 12 + .loc 1 2238 0 + mov w1, 8 + .loc 1 2237 0 + str w0, [x21, 144] + .loc 1 2238 0 + b .L571 + .p2align 3 +.L576: + .loc 1 2206 0 + mov w1, 7 + str w1, [x21, 144] + .loc 1 2207 0 + b .L571 + .p2align 3 +.L577: + .loc 1 2212 0 + mov w1, 1 + str w1, [x21, 144] + .loc 1 2213 0 + b .L571 + .p2align 3 +.L578: + .loc 1 2217 0 + mov w1, 2 + str w1, [x21, 144] + .loc 1 2218 0 + b .L571 + .p2align 3 +.L588: + .loc 1 2171 0 + ldr x0, [x21, 104] + adrp x1, .LC20 + add x1, x1, :lo12:.LC20 + bl _dev_info +.LVL663: + .loc 1 2172 0 + str wzr, [x29, 52] + mov w2, 0 + b .L567 +.LVL664: +.L591: + .loc 1 2252 0 + bl __stack_chk_fail +.LVL665: + .cfi_endproc +.LFE2840: + .size ebc_lut_update, .-ebc_lut_update + .align 2 + .p2align 3,,7 + .type ebc_state_read, %function +ebc_state_read: +.LFB2860: + .loc 1 3298 0 + .cfi_startproc +.LVL666: + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 3299 0 + adrp x3, .LANCHOR0 + .loc 1 3298 0 + mov x0, x2 +.LVL667: + .loc 1 3299 0 + adrp x1, .LC25 +.LVL668: + .loc 1 3298 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3299 0 + ldr x2, [x3, #:lo12:.LANCHOR0] +.LVL669: + add x1, x1, :lo12:.LC25 + ldr w2, [x2, 656] + bl sprintf +.LVL670: + .loc 1 3300 0 + sxtw x0, w0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2860: + .size ebc_state_read, .-ebc_state_read + .align 2 + .p2align 3,,7 + .type ebc_version_read, %function +ebc_version_read: +.LFB2859: + .loc 1 3289 0 + .cfi_startproc +.LVL671: + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x0, x2 +.LVL672: + .loc 1 3290 0 + adrp x1, .LC27 +.LVL673: + adrp x2, .LC26 +.LVL674: + .loc 1 3289 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3290 0 + add x2, x2, :lo12:.LC26 + .loc 1 3289 0 + .loc 1 3290 0 + add x1, x1, :lo12:.LC27 + bl sprintf +.LVL675: + .loc 1 3291 0 + sxtw x0, w0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2859: + .size ebc_version_read, .-ebc_version_read + .align 2 + .p2align 3,,7 + .type pmic_vcom_read, %function +pmic_vcom_read: +.LFB2857: + .loc 1 3253 0 + .cfi_startproc +.LVL676: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + .loc 1 3254 0 + adrp x0, .LANCHOR0 +.LVL677: + .loc 1 3253 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3257 0 + ldr x0, [x0, #:lo12:.LANCHOR0] + .loc 1 3253 0 + str x19, [sp, 16] + .cfi_offset 19, -16 + .loc 1 3253 0 + mov x19, x2 + .loc 1 3257 0 + ldr x1, [x0, 16] +.LVL678: +.LBB1588: +.LBB1589: + .loc 3 55 0 + mov x0, x1 + ldr x1, [x1, 64] + blr x1 +.LVL679: +.LBE1589: +.LBE1588: + .loc 1 3259 0 + mov w2, w0 + adrp x1, .LC25 + mov x0, x19 + add x1, x1, :lo12:.LC25 + bl sprintf +.LVL680: + .loc 1 3260 0 + sxtw x0, w0 + ldr x19, [sp, 16] +.LVL681: + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2857: + .size pmic_vcom_read, .-pmic_vcom_read + .align 2 + .p2align 3,,7 + .type pmic_temp_read, %function +pmic_temp_read: +.LFB2856: + .loc 1 3239 0 + .cfi_startproc +.LVL682: + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + .loc 1 3240 0 + adrp x0, .LANCHOR0 +.LVL683: + .loc 1 3239 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3243 0 + ldr x0, [x0, #:lo12:.LANCHOR0] +.LBB1590: +.LBB1591: + .loc 3 50 0 + add x1, x29, 36 +.LVL684: +.LBE1591: +.LBE1590: + .loc 1 3239 0 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + .loc 1 3239 0 + adrp x19, __stack_chk_guard + add x19, x19, :lo12:__stack_chk_guard + mov x20, x2 + ldr x2, [x19] + str x2, [x29, 40] + mov x2,0 +.LVL685: + .loc 1 3243 0 + ldr x2, [x0, 16] +.LBB1593: +.LBB1592: + .loc 3 50 0 + mov x0, x2 + ldr x2, [x2, 56] + blr x2 +.LVL686: +.LBE1592: +.LBE1593: + .loc 1 3245 0 + ldr w2, [x29, 36] + adrp x1, .LC25 + mov x0, x20 + add x1, x1, :lo12:.LC25 + bl sprintf +.LVL687: + .loc 1 3246 0 + ldr x2, [x29, 40] + ldr x1, [x19] + eor x1, x2, x1 + cbnz x1, .L601 + ldp x19, x20, [sp, 16] +.LVL688: + sxtw x0, w0 + ldp x29, x30, [sp], 48 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL689: +.L601: + .cfi_restore_state + bl __stack_chk_fail +.LVL690: + .cfi_endproc +.LFE2856: + .size pmic_temp_read, .-pmic_temp_read + .align 2 + .p2align 3,,7 + .type pmic_name_read, %function +pmic_name_read: +.LFB2855: + .loc 1 3228 0 + .cfi_startproc +.LVL691: + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 3229 0 + adrp x3, .LANCHOR0 + .loc 1 3228 0 + mov x0, x2 +.LVL692: + .loc 1 3231 0 + adrp x1, .LC27 +.LVL693: + .loc 1 3228 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3231 0 + ldr x2, [x3, #:lo12:.LANCHOR0] +.LVL694: + add x1, x1, :lo12:.LC27 + ldr x2, [x2, 16] + add x2, x2, 8 + bl sprintf +.LVL695: + .loc 1 3232 0 + sxtw x0, w0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2855: + .size pmic_name_read, .-pmic_name_read + .align 2 + .p2align 3,,7 + .type ebc_buf_state_read, %function +ebc_buf_state_read: +.LFB2861: + .loc 1 3307 0 + .cfi_startproc +.LVL696: + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 3308 0 + mov x0, x2 +.LVL697: + .loc 1 3307 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3308 0 + bl ebc_buf_state_show +.LVL698: + .loc 1 3309 0 + sxtw x0, w0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2861: + .size ebc_buf_state_read, .-ebc_buf_state_read + .align 2 + .p2align 3,,7 + .type pmic_vcom_write, %function +pmic_vcom_write: +.LFB2858: + .loc 1 3265 0 + .cfi_startproc +.LVL699: + stp x29, x30, [sp, -64]! + .cfi_def_cfa_offset 64 + .cfi_offset 29, -64 + .cfi_offset 30, -56 + .loc 1 3266 0 + adrp x0, .LANCHOR0 +.LVL700: + .loc 1 3265 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -48 + .cfi_offset 20, -40 + adrp x19, __stack_chk_guard + stp x21, x22, [sp, 32] + .cfi_offset 21, -32 + .cfi_offset 22, -24 + .loc 1 3265 0 + add x1, x19, :lo12:__stack_chk_guard +.LVL701: + mov x21, x2 + .loc 1 3266 0 + ldr x22, [x0, #:lo12:.LANCHOR0] +.LVL702: + .loc 1 3265 0 + ldr x2, [x1] + str x2, [x29, 56] + mov x2,0 +.LVL703: + mov x20, x3 + .loc 1 3269 0 + add x2, x29, 52 + mov w1, 0 + mov x0, x21 + bl kstrtouint +.LVL704: + .loc 1 3270 0 + cbnz w0, .L613 +.LVL705: + .loc 1 3274 0 + ldr w1, [x29, 52] + ldr x0, [x22, 16] + bl ebc_pmic_set_vcom +.LVL706: + .loc 1 3275 0 + cbnz w0, .L614 +.L606: + .loc 1 3281 0 + add x19, x19, :lo12:__stack_chk_guard + mov x0, x20 +.LVL707: + ldr x2, [x29, 56] + ldr x1, [x19] + eor x1, x2, x1 + cbnz x1, .L615 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL708: + ldp x29, x30, [sp], 64 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL709: + .p2align 3 +.L613: + .cfi_restore_state + .loc 1 3271 0 + ldr x0, [x22] + adrp x1, .LC28 + mov x2, x21 + add x1, x1, :lo12:.LC28 + .loc 1 3272 0 + mov x20, -1 +.LVL710: + .loc 1 3271 0 + bl _dev_err +.LVL711: + .loc 1 3272 0 + b .L606 +.LVL712: + .p2align 3 +.L614: + .loc 1 3276 0 + ldr x0, [x22] + adrp x1, .LC29 + .loc 1 3277 0 + mov x20, -1 +.LVL713: + .loc 1 3276 0 + add x1, x1, :lo12:.LC29 + bl _dev_err +.LVL714: + .loc 1 3277 0 + b .L606 +.L615: + .loc 1 3281 0 + bl __stack_chk_fail +.LVL715: + .cfi_endproc +.LFE2858: + .size pmic_vcom_write, .-pmic_vcom_write + .align 2 + .p2align 3,,7 + .type waveform_version_read, %function +waveform_version_read: +.LFB2854: + .loc 1 3217 0 + .cfi_startproc +.LVL716: + 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 3217 0 + mov x19, x2 + .loc 1 3218 0 + bl epd_lut_get_wf_version +.LVL717: + .loc 1 3220 0 + mov x2, x0 + adrp x1, .LC27 + mov x0, x19 + add x1, x1, :lo12:.LC27 + bl sprintf +.LVL718: + .loc 1 3221 0 + sxtw x0, w0 + ldr x19, [sp, 16] +.LVL719: + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2854: + .size waveform_version_read, .-waveform_version_read + .section .init.text,"ax",@progbits + .align 2 + .type ebc_init, %function +ebc_init: +.LFB2874: + .loc 1 3822 0 + .cfi_startproc + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 3823 0 + mov x1, 0 + adrp x0, .LANCHOR1 + add x0, x0, :lo12:.LANCHOR1 + .loc 1 3822 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3823 0 + bl __platform_driver_register +.LVL720: + .loc 1 3824 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2874: + .size ebc_init, .-ebc_init + .text + .align 2 + .p2align 3,,7 + .type get_overlay_image_area2.isra.0, %function +get_overlay_image_area2.isra.0: +.LFB2876: + .loc 1 997 0 + .cfi_startproc +.LVL721: + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + .loc 1 999 0 + adrp x5, .LANCHOR0 + .loc 1 997 0 + mov x10, x0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 999 0 + ldr x5, [x5, #:lo12:.LANCHOR0] + .loc 1 997 0 + stp x19, x20, [sp, 16] + .loc 1 1027 0 + add x5, x5, 24 + .loc 1 997 0 + stp x5, x0, [x29, 96] + .loc 1 1015 0 + ldr x0, [x4, 240] +.LVL722: + .loc 1 997 0 + stp x21, x22, [sp, 32] + stp x23, x24, [sp, 48] + stp x25, x26, [sp, 64] + stp x27, x28, [sp, 80] + .cfi_offset 19, -112 + .cfi_offset 20, -104 + .cfi_offset 21, -96 + .cfi_offset 22, -88 + .cfi_offset 23, -80 + .cfi_offset 24, -72 + .cfi_offset 25, -64 + .cfi_offset 26, -56 + .cfi_offset 27, -48 + .cfi_offset 28, -40 + .loc 1 1020 0 + ldr w17, [x4, 96] + .loc 1 1017 0 + ldp w7, w21, [x0, 48] + .loc 1 1027 0 + ldr w13, [x5, 84] + .loc 1 1016 0 + ldr w5, [x0, 56] + .loc 1 1015 0 + cmp w7, 0 + add w6, w7, 7 + csel w6, w6, w7, lt + .loc 1 1016 0 + add w30, w5, 7 + cmp w5, 0 + .loc 1 1015 0 + asr w7, w6, 3 +.LVL723: + .loc 1 1016 0 + csel w30, w30, w5, lt + .loc 1 1018 0 + ldr w5, [x0, 60] + .loc 1 1020 0 + cmp w17, 0 + add w0, w17, 7 + csel w0, w0, w17, lt + .loc 1 1016 0 + asr w30, w30, 3 +.LVL724: + .loc 1 1018 0 + mov w9, w5 + .loc 1 1016 0 + add w30, w30, 1 +.LVL725: + .loc 1 1020 0 + asr w5, w0, 3 +.LVL726: + .loc 1 1021 0 + ldr w0, [x4, 92] + .loc 1 1023 0 + cmp w30, w5 +.LVL727: + .loc 1 1027 0 + mul w13, w21, w13 + .loc 1 1020 0 + mov w6, w5 + str w5, [x29, 116] + .loc 1 1023 0 + sub w5, w5, #1 +.LVL728: + .loc 1 1015 0 + str w7, [x29, 124] + .loc 1 1023 0 + csel w30, w5, w30, ge +.LVL729: + .loc 1 1025 0 + cmp w9, w0 + sub w0, w0, #1 +.LVL730: + .loc 1 1027 0 + lsr w13, w13, 2 + .loc 1 1025 0 + csel w0, w0, w9, ge +.LVL731: + str w0, [x29, 120] + .loc 1 1027 0 + add x13, x10, x13 +.LVL732: + .loc 1 1028 0 + cmp w21, w0 + bgt .L620 + mul w18, w21, w6 + .loc 1 1042 0 + mov w19, 1 +.LBB1596: +.LBB1597: + .loc 1 991 0 + mov w16, w19 + lsl w0, w7, 3 +.LVL733: + str w0, [x29, 112] +.LVL734: + .p2align 2 +.L624: +.LBE1597: +.LBE1596: + .loc 1 1029 0 + and w0, w21, 1 +.LVL735: + tbnz x21, 0, .L625 + .loc 1 1030 0 + ldr x5, [x29, 96] + ldr w13, [x5, 84] +.LVL736: + ldr x5, [x29, 104] +.LVL737: + mul w13, w21, w13 + lsr w13, w13, 2 + add x13, x5, x13 +.LVL738: +.L625: + .loc 1 1033 0 + mul w17, w21, w17 + .loc 1 1036 0 + ldr w5, [x29, 124] + cmp w5, w30 + .loc 1 1033 0 + sxtw x17, w17 + .loc 1 1036 0 + bgt .L638 + cmp w0, 0 +.LBB1601: +.LBB1598: + .loc 1 990 0 + ldr w11, [x29, 112] + mov w0, 2 + ldr w9, [x29, 124] +.LVL739: + csel w20, w0, wzr, ne + .loc 1 930 0 + add w28, w20, 4 + .loc 1 940 0 + add w27, w20, 8 + .loc 1 950 0 + add w26, w20, 12 + .loc 1 960 0 + add w25, w20, 16 + .loc 1 970 0 + add w24, w20, 20 + .loc 1 980 0 + add w23, w20, 24 + .loc 1 990 0 + add w22, w20, 28 +.LVL740: + .p2align 2 +.L637: +.LBE1598: +.LBE1601: + .loc 1 1037 0 + sxtw x8, w9 +.LVL741: + lsl x0, x8, 3 + add x0, x0, x18, sxtw 3 + ldr x7, [x1, x0] + .loc 1 1038 0 + ldr x6, [x2, x0] +.LVL742: + .loc 1 1041 0 + cmp x7, x6 + beq .L628 + .loc 1 1039 0 + add x12, x17, x11, sxtw + .loc 1 1042 0 + str w19, [x4, 60] +.LBB1602: +.LBB1599: + .loc 1 914 0 + eor x5, x7, x6 +.LVL743: +.LBE1599: +.LBE1602: + .loc 1 1039 0 + add x0, x3, x12 +.LVL744: +.LBB1603: +.LBB1600: + .loc 1 916 0 + and x14, x5, 255 + .loc 1 913 0 + mov w10, 0 +.LVL745: + .loc 1 916 0 + ldrb w15, [x3, x12] + cmp w15, 0 + ccmp x14, 0, 4, eq + beq .L629 + .loc 1 919 0 + lsl x10, x6, 2 +.LVL746: + ldr x14, [x4, 128] + and x10, x10, 992 + ubfx x15, x7, 3, 5 + orr x10, x10, x15 + ldrb w10, [x14, x10] + .loc 1 921 0 + strb w19, [x3, x12] + .loc 1 920 0 + lsl w10, w10, w20 +.LVL747: +.L629: + .loc 1 926 0 + ldrb w12, [x0, 1] + cmp w12, 0 + and x12, x5, 65280 + ccmp x12, 0, 4, eq + beq .L630 + .loc 1 929 0 + lsr x12, x6, 6 + ldr x14, [x4, 128] + and x12, x12, 992 + ubfx x15, x7, 11, 5 + orr x12, x12, x15 + ldrb w12, [x14, x12] + .loc 1 931 0 + strb w16, [x0, 1] + .loc 1 930 0 + lsl w12, w12, w28 + orr w10, w10, w12 +.L630: + .loc 1 936 0 + ldrb w12, [x0, 2] + cmp w12, 0 + and x12, x5, 16711680 + ccmp x12, 0, 4, eq + beq .L631 + .loc 1 939 0 + lsr x12, x6, 14 + ldr x14, [x4, 128] + and x12, x12, 992 + ubfx x15, x7, 19, 5 + orr x12, x12, x15 + ldrb w12, [x14, x12] + .loc 1 941 0 + strb w16, [x0, 2] + .loc 1 940 0 + lsl w12, w12, w27 + orr w10, w10, w12 +.L631: + .loc 1 946 0 + ldrb w12, [x0, 3] + tst x5, 4278190080 + ccmp w12, 0, 0, ne + bne .L632 + .loc 1 949 0 + lsr x12, x6, 22 + ldr x14, [x4, 128] + and x12, x12, 992 + lsr w15, w7, 27 + orr x12, x12, x15 + ldrb w12, [x14, x12] + .loc 1 951 0 + strb w16, [x0, 3] + .loc 1 950 0 + lsl w12, w12, w26 + orr w10, w10, w12 +.L632: + .loc 1 956 0 + ldrb w12, [x0, 4] + cmp w12, 0 + and x12, x5, 1095216660480 + ccmp x12, 0, 4, eq + beq .L633 + .loc 1 959 0 + lsr x12, x6, 30 + ldr x14, [x4, 128] + and x12, x12, 992 + ubfx x15, x7, 35, 5 + orr x12, x12, x15 + ldrb w12, [x14, x12] + .loc 1 961 0 + strb w16, [x0, 4] + .loc 1 960 0 + lsl w12, w12, w25 + orr w10, w10, w12 +.L633: + .loc 1 966 0 + ldrb w12, [x0, 5] + cmp w12, 0 + and x12, x5, 280375465082880 + ccmp x12, 0, 4, eq + beq .L634 + .loc 1 969 0 + lsr x12, x6, 38 + ldr x14, [x4, 128] + and x12, x12, 992 + ubfx x15, x7, 43, 5 + orr x12, x12, x15 + ldrb w12, [x14, x12] + .loc 1 971 0 + strb w16, [x0, 5] + .loc 1 970 0 + lsl w12, w12, w24 + orr w10, w10, w12 +.L634: + .loc 1 976 0 + ldrb w12, [x0, 6] + tst x5, 71776119061217280 + ccmp w12, 0, 0, ne + bne .L635 + .loc 1 979 0 + lsr x12, x6, 46 + ldr x14, [x4, 128] + and x12, x12, 992 + ubfx x15, x7, 51, 5 + orr x12, x12, x15 + ldrb w12, [x14, x12] + .loc 1 981 0 + strb w16, [x0, 6] + .loc 1 980 0 + lsl w12, w12, w23 + orr w10, w10, w12 +.L635: + .loc 1 986 0 + tst x5, -72057594037927936 + ldrb w5, [x0, 7] +.LVL748: + ccmp w5, 0, 0, ne + bne .L636 + .loc 1 989 0 + ldr x5, [x4, 128] + lsr x6, x6, 54 +.LVL749: + and x6, x6, 992 + add x7, x5, x7, lsr 59 +.LVL750: + ldrb w5, [x7, x6] + .loc 1 991 0 + strb w16, [x0, 7] + .loc 1 990 0 + lsl w0, w5, w22 +.LVL751: + orr w10, w10, w0 +.LVL752: +.L636: +.LBE1600: +.LBE1603: + .loc 1 1043 0 + ldr w0, [x13, x8, lsl 2] +.LVL753: + orr w10, w0, w10 +.LVL754: + str w10, [x13, x8, lsl 2] +.LVL755: +.L628: + .loc 1 1036 0 + add w9, w9, 1 + add w11, w11, 8 + cmp w9, w30 + ble .L637 +.LVL756: +.L638: + ldr w0, [x29, 116] + .loc 1 1028 0 + add w21, w21, 1 + add w18, w18, w0 + ldr w0, [x29, 120] +.LVL757: + cmp w21, w0 + bgt .L620 + ldr w17, [x4, 96] + b .L624 +.L620: + .loc 1 1047 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL758: + ldp x23, x24, [sp, 48] + ldp x25, x26, [sp, 64] + ldp x27, x28, [sp, 80] + ldp x29, x30, [sp], 128 + .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 +.LVL759: + ret + .cfi_endproc +.LFE2876: + .size get_overlay_image_area2.isra.0, .-get_overlay_image_area2.isra.0 + .align 2 + .p2align 3,,7 + .type get_one_auto_image2.isra.1, %function +get_one_auto_image2.isra.1: +.LFB2877: + .loc 1 1219 0 + .cfi_startproc +.LVL760: + .loc 1 1227 0 + ldr x6, [x1] +.LVL761: + .loc 1 1219 0 + and w3, w3, 255 + .loc 1 1230 0 + mov w7, 0 + .loc 1 1231 0 + eor x8, x6, x0 +.LVL762: + .loc 1 1232 0 + and x9, x8, 255 + cbz x9, .L665 + .loc 1 1235 0 + lsl x7, x6, 2 + .loc 1 1233 0 + ldrb w9, [x2] + .loc 1 1235 0 + ubfx x10, x0, 3, 5 + and x7, x7, 992 + orr x7, x7, x10 + ldr x10, [x4] + add x7, x10, x7 + .loc 1 1234 0 + lsl w10, w9, 10 + .loc 1 1237 0 + add w9, w9, 1 + and w9, w9, 255 + .loc 1 1235 0 + ldrb w7, [x7, w10, sxtw] + .loc 1 1238 0 + cmp w9, w3 + .loc 1 1236 0 + lsl w7, w7, w5 + .loc 1 1238 0 + beq .L704 +.L666: + .loc 1 1242 0 + strb w9, [x2] +.L665: + .loc 1 1245 0 + tst x8, 65280 + beq .L667 + .loc 1 1248 0 + lsr x10, x6, 6 + .loc 1 1246 0 + ldrb w9, [x2, 1] + .loc 1 1248 0 + ubfx x11, x0, 11, 5 + and x10, x10, 992 + orr x10, x10, x11 + ldr x11, [x4] + add x10, x11, x10 + .loc 1 1247 0 + lsl w11, w9, 10 + .loc 1 1250 0 + add w9, w9, 1 + and w9, w9, 255 + .loc 1 1248 0 + ldrb w10, [x10, w11, sxtw] + .loc 1 1249 0 + add w11, w5, 4 + .loc 1 1251 0 + cmp w9, w3 + .loc 1 1249 0 + lsl w10, w10, w11 + orr w7, w7, w10 + .loc 1 1251 0 + beq .L705 +.L668: + .loc 1 1255 0 + strb w9, [x2, 1] +.L667: + .loc 1 1258 0 + tst x8, 16711680 + beq .L669 + .loc 1 1261 0 + lsr x10, x6, 14 + .loc 1 1259 0 + ldrb w9, [x2, 2] + .loc 1 1261 0 + ubfx x11, x0, 19, 5 + and x10, x10, 992 + orr x10, x10, x11 + ldr x11, [x4] + add x10, x11, x10 + .loc 1 1260 0 + lsl w11, w9, 10 + .loc 1 1263 0 + add w9, w9, 1 + and w9, w9, 255 + .loc 1 1261 0 + ldrb w10, [x10, w11, sxtw] + .loc 1 1262 0 + add w11, w5, 8 + .loc 1 1264 0 + cmp w9, w3 + .loc 1 1262 0 + lsl w10, w10, w11 + orr w7, w7, w10 + .loc 1 1264 0 + beq .L706 +.L670: + .loc 1 1268 0 + strb w9, [x2, 2] +.L669: + .loc 1 1271 0 + tst x8, 4278190080 + beq .L671 + .loc 1 1274 0 + lsr x10, x6, 22 + .loc 1 1272 0 + ldrb w9, [x2, 3] + .loc 1 1274 0 + lsr w11, w0, 27 + and x10, x10, 992 + orr x10, x10, x11 + ldr x11, [x4] + add x10, x11, x10 + .loc 1 1273 0 + lsl w11, w9, 10 + .loc 1 1276 0 + add w9, w9, 1 + and w9, w9, 255 + .loc 1 1274 0 + ldrb w10, [x10, w11, sxtw] + .loc 1 1275 0 + add w11, w5, 12 + .loc 1 1277 0 + cmp w9, w3 + .loc 1 1275 0 + lsl w10, w10, w11 + orr w7, w7, w10 + .loc 1 1277 0 + beq .L707 +.L672: + .loc 1 1281 0 + strb w9, [x2, 3] +.L671: + .loc 1 1284 0 + tst x8, 1095216660480 + beq .L673 + .loc 1 1287 0 + lsr x10, x6, 30 + .loc 1 1285 0 + ldrb w9, [x2, 4] + .loc 1 1287 0 + ubfx x11, x0, 35, 5 + and x10, x10, 992 + orr x10, x10, x11 + ldr x11, [x4] + add x10, x11, x10 + .loc 1 1286 0 + lsl w11, w9, 10 + .loc 1 1289 0 + add w9, w9, 1 + and w9, w9, 255 + .loc 1 1287 0 + ldrb w10, [x10, w11, sxtw] + .loc 1 1288 0 + add w11, w5, 16 + .loc 1 1290 0 + cmp w9, w3 + .loc 1 1288 0 + lsl w10, w10, w11 + orr w7, w7, w10 + .loc 1 1290 0 + beq .L708 +.L674: + .loc 1 1294 0 + strb w9, [x2, 4] +.L673: + .loc 1 1297 0 + tst x8, 280375465082880 + beq .L675 + .loc 1 1300 0 + lsr x10, x6, 38 + .loc 1 1298 0 + ldrb w9, [x2, 5] + .loc 1 1300 0 + ubfx x11, x0, 43, 5 + and x10, x10, 992 + orr x10, x10, x11 + ldr x11, [x4] + add x10, x11, x10 + .loc 1 1299 0 + lsl w11, w9, 10 + .loc 1 1302 0 + add w9, w9, 1 + and w9, w9, 255 + .loc 1 1300 0 + ldrb w10, [x10, w11, sxtw] + .loc 1 1301 0 + add w11, w5, 20 + .loc 1 1303 0 + cmp w9, w3 + .loc 1 1301 0 + lsl w10, w10, w11 + orr w7, w7, w10 + .loc 1 1303 0 + beq .L709 +.L676: + .loc 1 1307 0 + strb w9, [x2, 5] +.L675: + .loc 1 1310 0 + tst x8, 71776119061217280 + beq .L677 + .loc 1 1313 0 + lsr x10, x6, 46 + .loc 1 1311 0 + ldrb w9, [x2, 6] + .loc 1 1313 0 + ubfx x11, x0, 51, 5 + and x10, x10, 992 + orr x10, x10, x11 + ldr x11, [x4] + add x10, x11, x10 + .loc 1 1312 0 + lsl w11, w9, 10 + .loc 1 1315 0 + add w9, w9, 1 + and w9, w9, 255 + .loc 1 1313 0 + ldrb w10, [x10, w11, sxtw] + .loc 1 1314 0 + add w11, w5, 24 + .loc 1 1316 0 + cmp w9, w3 + .loc 1 1314 0 + lsl w10, w10, w11 + orr w7, w7, w10 + .loc 1 1316 0 + beq .L710 +.L678: + .loc 1 1320 0 + strb w9, [x2, 6] +.L677: + .loc 1 1323 0 + tst x8, -72057594037927936 + beq .L679 + .loc 1 1324 0 + ldrb w8, [x2, 7] +.LVL763: + .loc 1 1327 0 + add w5, w5, 28 +.LVL764: + .loc 1 1326 0 + ldr x9, [x4] + .loc 1 1325 0 + ubfiz x4, x8, 10, 8 + .loc 1 1326 0 + add x9, x9, x4 + .loc 1 1328 0 + add w4, w8, 1 + and w4, w4, 255 + .loc 1 1326 0 + add x8, x9, x0, lsr 59 + .loc 1 1329 0 + cmp w4, w3 + .loc 1 1326 0 + lsr x3, x6, 54 + and x3, x3, 992 + ldrb w3, [x8, x3] + .loc 1 1327 0 + lsl w5, w3, w5 + orr w7, w7, w5 + .loc 1 1329 0 + beq .L711 +.L680: + .loc 1 1333 0 + strb w4, [x2, 7] +.LVL765: +.L679: + .loc 1 1338 0 + mov w0, w7 + .loc 1 1335 0 + str x6, [x1] + .loc 1 1338 0 + ret +.LVL766: + .p2align 3 +.L711: + .loc 1 1331 0 + and x6, x6, 72057594037927935 +.LVL767: + and x0, x0, -72057594037927936 + orr x6, x0, x6 +.LVL768: + .loc 1 1330 0 + mov w4, 0 + b .L680 +.LVL769: + .p2align 3 +.L704: + .loc 1 1240 0 + bfi x6, x0, 0, 8 + .loc 1 1239 0 + mov w9, 0 + b .L666 + .p2align 3 +.L705: + .loc 1 1253 0 + and x9, x0, 65280 + and x6, x6, -65281 +.LVL770: + orr x6, x9, x6 +.LVL771: + .loc 1 1252 0 + mov w9, 0 + b .L668 + .p2align 3 +.L706: + .loc 1 1266 0 + and x9, x0, 16711680 + and x6, x6, -16711681 +.LVL772: + orr x6, x9, x6 +.LVL773: + .loc 1 1265 0 + mov w9, 0 + b .L670 + .p2align 3 +.L707: + .loc 1 1279 0 + and x9, x0, 4278190080 + and x6, x6, -4278190081 +.LVL774: + orr x6, x9, x6 +.LVL775: + .loc 1 1278 0 + mov w9, 0 + b .L672 + .p2align 3 +.L708: + .loc 1 1292 0 + and x9, x0, 1095216660480 + and x6, x6, -1095216660481 +.LVL776: + orr x6, x9, x6 +.LVL777: + .loc 1 1291 0 + mov w9, 0 + b .L674 + .p2align 3 +.L709: + .loc 1 1305 0 + and x9, x0, 280375465082880 + and x6, x6, -280375465082881 +.LVL778: + orr x6, x9, x6 +.LVL779: + .loc 1 1304 0 + mov w9, 0 + b .L676 + .p2align 3 +.L710: + .loc 1 1318 0 + and x9, x0, 71776119061217280 + and x6, x6, -71776119061217281 +.LVL780: + orr x6, x9, x6 +.LVL781: + .loc 1 1317 0 + mov w9, 0 + b .L678 + .cfi_endproc +.LFE2877: + .size get_one_auto_image2.isra.1, .-get_one_auto_image2.isra.1 + .align 2 + .p2align 3,,7 + .type get_auto_image2, %function +get_auto_image2: +.LFB2827: + .loc 1 1341 0 + .cfi_startproc +.LVL782: + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + .loc 1 1342 0 + adrp x6, .LANCHOR0 + .loc 1 1355 0 + cmp w5, 2 + .loc 1 1341 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x23, x24, [sp, 48] + .cfi_offset 23, -80 + .cfi_offset 24, -72 + .loc 1 1342 0 + ldr x24, [x6, #:lo12:.LANCHOR0] + .loc 1 1341 0 + stp x19, x20, [sp, 16] + .cfi_offset 19, -112 + .cfi_offset 20, -104 + mov x20, x1 + .loc 1 1352 0 + add x24, x24, 24 + .loc 1 1341 0 + stp x21, x22, [sp, 32] + stp x25, x26, [sp, 64] + mov x19, x4 + stp x27, x28, [sp, 80] + .cfi_offset 21, -96 + .cfi_offset 22, -88 + .cfi_offset 25, -64 + .cfi_offset 26, -56 + .cfi_offset 27, -48 + .cfi_offset 28, -40 + .loc 1 1341 0 + mov x21, x2 + str x0, [x29, 112] + .loc 1 1350 0 + add x0, x4, 60 +.LVL783: + .loc 1 1353 0 + ldp w1, w25, [x24, 84] +.LVL784: + .loc 1 1350 0 + str x0, [x29, 104] + .loc 1 1341 0 + mov x22, x3 + .loc 1 1352 0 + lsr w0, w1, 3 +.LVL785: + str w0, [x29, 124] + .loc 1 1355 0 + beq .L731 + .loc 1 1358 0 + cmp w5, 3 + mov x0, 0 + .loc 1 1365 0 + mov w23, 0 +.LVL786: + .loc 1 1358 0 + beq .L732 +.LVL787: +.L714: + .loc 1 1368 0 + ldr x2, [x29, 112] +.LVL788: + add x0, x2, x0 + sub w2, w25, w23 +.LVL789: + mul w2, w2, w1 + mov w1, 0 + lsr w2, w2, 2 + bl memset +.LVL790: + .loc 1 1369 0 + cmp w23, w25 + bge .L723 + ldr w0, [x29, 124] + .loc 1 1376 0 + add x13, x19, 128 + .loc 1 1369 0 + mov w9, 0 +.LVL791: + sub w14, w0, #1 + add x14, x14, 1 + lsl x12, x14, 2 + lsl x14, x14, 3 +.LVL792: + .p2align 2 +.L721: + .loc 1 1370 0 + ldr w7, [x24, 84] + ldr x0, [x29, 112] +.LVL793: + mul w7, w23, w7 + lsr w7, w7, 2 + add x26, x0, x7 + .loc 1 1371 0 + ldr w0, [x29, 124] +.LVL794: + cbz w0, .L716 + mov x28, x22 +.LVL795: + mov x15, x21 +.LVL796: + mov x27, x20 +.LVL797: + mov x18, 0 + .p2align 2 +.L718: + .loc 1 1372 0 + ldr x3, [x27] + .loc 1 1376 0 + mov x2, x28 + .loc 1 1374 0 + ldr x10, [x15] + .loc 1 1376 0 + mov x1, x15 + mov w5, 0 + mov x4, x13 + mov x0, x3 + .loc 1 1374 0 + cmp x3, x10 + beq .L717 + .loc 1 1376 0 + ldrb w3, [x19, 56] + bl get_one_auto_image2.isra.1 +.LVL798: + str w0, [x26, x18] + .loc 1 1375 0 + mov w9, 1 +.LVL799: +.L717: + add x18, x18, 4 + .loc 1 1378 0 discriminator 2 + add x15, x15, 8 + .loc 1 1379 0 discriminator 2 + add x27, x27, 8 + .loc 1 1380 0 discriminator 2 + add x28, x28, 8 + .loc 1 1371 0 discriminator 2 + cmp x18, x12 + bne .L718 +.LVL800: + add x21, x21, x14 +.LVL801: + add x20, x20, x14 +.LVL802: + add x22, x22, x14 + .loc 1 1371 0 is_stmt 0 + mov x18, x21 + mov x27, x22 + mov x28, x20 + mov x15, 0 + .p2align 2 +.L720: + .loc 1 1383 0 is_stmt 1 + ldr x3, [x28] + .loc 1 1387 0 + mov x1, x18 + .loc 1 1385 0 + ldr x10, [x18] + .loc 1 1387 0 + mov x2, x27 + mov w5, 2 + mov x4, x13 + .loc 1 1389 0 + add x18, x18, 8 + .loc 1 1390 0 + add x28, x28, 8 + .loc 1 1387 0 + mov x0, x3 + .loc 1 1385 0 + cmp x3, x10 + beq .L719 + .loc 1 1387 0 + ldrb w3, [x19, 56] + bl get_one_auto_image2.isra.1 +.LVL803: + ldr w1, [x26, x15] + .loc 1 1386 0 + mov w9, 1 +.LVL804: + .loc 1 1387 0 + orr w0, w1, w0 + str w0, [x26, x15] +.L719: + add x15, x15, 4 + .loc 1 1391 0 discriminator 2 + add x27, x27, 8 + .loc 1 1382 0 discriminator 2 + cmp x15, x12 + bne .L720 + add x21, x21, x14 + add x20, x20, x14 + add x22, x22, x14 +.L716: + .loc 1 1369 0 + add w23, w23, 2 + cmp w25, w23 + bgt .L721 +.L715: + .loc 1 1394 0 + ldr x0, [x29, 104] +.LVL805: + str w9, [x0] + .loc 1 1395 0 + ldp x19, x20, [sp, 16] +.LVL806: + ldp x21, x22, [sp, 32] +.LVL807: + ldp x23, x24, [sp, 48] +.LVL808: + ldp x25, x26, [sp, 64] +.LVL809: + ldp x27, x28, [sp, 80] + ldp x29, x30, [sp], 128 + .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 +.LVL810: +.L731: + .cfi_restore_state + .loc 1 1357 0 + add w25, w25, w25, lsr 31 +.LVL811: + mov x0, 0 + asr w25, w25, 1 +.LVL812: + .loc 1 1356 0 + mov w23, 0 +.LVL813: + b .L714 +.LVL814: +.L732: + .loc 1 1363 0 + add x0, x4, 64 +.LVL815: + .loc 1 1359 0 + add w23, w25, w25, lsr 31 +.LVL816: + asr w23, w23, 1 +.LVL817: + .loc 1 1363 0 + str x0, [x29, 104] + .loc 1 1360 0 + lsr w0, w1, 3 +.LVL818: + mul w0, w0, w23 + sbfiz x0, x0, 3, 32 + add x20, x20, x0 + .loc 1 1361 0 + add x21, x2, x0 + .loc 1 1362 0 + mul w0, w23, w1 + add x22, x3, x0, uxtw + lsr w0, w0, 2 + b .L714 +.LVL819: +.L723: + .loc 1 1349 0 + mov w9, 0 +.LVL820: + b .L715 + .cfi_endproc +.LFE2827: + .size get_auto_image2, .-get_auto_image2 + .align 2 + .p2align 3,,7 + .type direct_mode_data_change.isra.2, %function +direct_mode_data_change.isra.2: +.LFB2878: + .loc 1 1397 0 + .cfi_startproc +.LVL821: + .loc 1 1399 0 + adrp x7, .LANCHOR0 + .loc 1 1397 0 + and w3, w3, 255 + .loc 1 1404 0 + sub w4, w3, w4 +.LVL822: + .loc 1 1411 0 + cmp w6, 2 + .loc 1 1399 0 + ldr x3, [x7, #:lo12:.LANCHOR0] + .loc 1 1405 0 + lsl w7, w4, 10 + add x5, x5, x7, sxtw +.LVL823: + .loc 1 1408 0 + add x4, x3, 24 +.LVL824: + .loc 1 1409 0 + ldp w7, w3, [x4, 84] + .loc 1 1408 0 + lsr w11, w7, 3 + .loc 1 1411 0 + beq .L753 + .loc 1 1414 0 + cmp w6, 3 + mov w14, w3 +.LVL825: + mov w6, 0 +.LVL826: + .loc 1 1419 0 + mov w12, 0 +.LVL827: + .loc 1 1414 0 + beq .L754 +.L735: + .loc 1 1422 0 + ldr w4, [x4, 156] + cbz w4, .L736 + .loc 1 1423 0 + sub w3, w3, #1 + .loc 1 1424 0 + neg w15, w7, lsr 2 +.LVL828: + .loc 1 1423 0 + sub w3, w3, w6 + mul w3, w3, w7 + lsr w3, w3, 2 + add x10, x0, x3 +.LVL829: +.L739: + .loc 1 1430 0 + cmp w12, w14 + bge .L747 + sub w13, w11, #1 + sxtw x15, w15 +.LVL830: + add x13, x13, 1 + lsl x13, x13, 3 +.L748: + .loc 1 1431 0 + mov x6, 0 + cbz w11, .L755 + .loc 1 1397 0 + 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 + .p2align 2 +.L744: + .loc 1 1433 0 + ldr x0, [x2, x6, lsl 3] +.LVL831: + .loc 1 1432 0 + ldr x3, [x1, x6, lsl 3] +.LVL832: +.LBB1604: +.LBB1605: + .loc 1 270 0 + lsr x17, x0, 30 + .loc 1 268 0 + lsr x4, x0, 14 + .loc 1 270 0 + ubfx x8, x3, 35, 5 + .loc 1 268 0 + ubfx x7, x3, 19, 5 + .loc 1 269 0 + lsr x30, x0, 22 + .loc 1 267 0 + lsr x16, x0, 6 + .loc 1 272 0 + lsr x9, x0, 46 + .loc 1 270 0 + and x17, x17, 992 + .loc 1 268 0 + and x4, x4, 992 + .loc 1 269 0 + lsr w19, w3, 27 + .loc 1 270 0 + orr x17, x17, x8 + .loc 1 267 0 + ubfx x18, x3, 11, 5 + .loc 1 268 0 + orr x4, x4, x7 + .loc 1 271 0 + lsr x8, x0, 38 + .loc 1 272 0 + ubfx x7, x3, 51, 5 + .loc 1 269 0 + and x30, x30, 992 + .loc 1 267 0 + and x16, x16, 992 + .loc 1 272 0 + and x9, x9, 992 + .loc 1 269 0 + orr x30, x30, x19 + .loc 1 267 0 + orr x16, x16, x18 + .loc 1 272 0 + orr x9, x9, x7 + .loc 1 271 0 + ubfx x18, x3, 43, 5 + .loc 1 266 0 + lsl x7, x0, 2 + .loc 1 271 0 + and x8, x8, 992 + orr x8, x8, x18 + .loc 1 266 0 + ubfx x19, x3, 3, 5 + and x7, x7, 992 + .loc 1 273 0 + lsr x0, x0, 54 +.LVL833: + .loc 1 270 0 + ldrb w18, [x5, x17] + .loc 1 266 0 + orr x7, x7, x19 + .loc 1 268 0 + ldrb w17, [x5, x4] + .loc 1 273 0 + and x0, x0, 992 + add x3, x5, x3, lsr 59 +.LVL834: + .loc 1 269 0 + ldrb w4, [x5, x30] + .loc 1 267 0 + ldrb w16, [x5, x16] + .loc 1 272 0 + ldrb w9, [x5, x9] + .loc 1 271 0 + ldrb w8, [x5, x8] + .loc 1 266 0 + ldrb w30, [x5, x7] + .loc 1 268 0 + lsl w7, w17, 4 + .loc 1 273 0 + ldrb w3, [x3, x0] + .loc 1 270 0 + lsl w0, w18, 8 + .loc 1 273 0 + orr w0, w0, w4, lsl 6 + orr w7, w7, w16, lsl 2 + .loc 1 272 0 + lsl w4, w9, 12 + .loc 1 273 0 + orr w0, w0, w7 + orr w4, w4, w8, lsl 10 + orr w3, w30, w3, lsl 14 + orr w0, w0, w4 + orr w0, w0, w3 +.LBE1605: +.LBE1604: + .loc 1 1434 0 + strh w0, [x10, x6, lsl 1] + add x6, x6, 1 + .loc 1 1431 0 + cmp w11, w6 + bgt .L744 + .loc 1 1430 0 + add w12, w12, 1 + add x1, x1, x13 + add x2, x2, x13 + add x10, x10, x15 + cmp w12, w14 + beq .L733 +.L756: + .loc 1 1431 0 + mov x6, 0 + cbnz w11, .L744 + .loc 1 1430 0 + add w12, w12, 1 + add x10, x10, x15 + cmp w12, w14 + bne .L756 +.L733: + .loc 1 1437 0 + ldr x19, [sp, 16] + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + ret +.L755: + .loc 1 1430 0 + add w12, w12, 1 + add x10, x10, x15 + cmp w12, w14 + bne .L748 +.LVL835: +.L747: + ret +.LVL836: +.L736: + .loc 1 1426 0 + mul w3, w7, w6 + .loc 1 1427 0 + lsr w15, w7, 2 +.LVL837: + .loc 1 1426 0 + lsr w3, w3, 2 + add x10, x0, x3 +.LVL838: + b .L739 +.LVL839: +.L753: + .loc 1 1413 0 + add w14, w3, w3, lsr 31 + mov w6, 0 +.LVL840: + asr w14, w14, 1 +.LVL841: + .loc 1 1412 0 + mov w12, 0 +.LVL842: + b .L735 +.L754: + .loc 1 1415 0 + add w12, w3, w3, lsr 31 +.LVL843: + asr w12, w12, 1 +.LVL844: + mov w6, w12 + .loc 1 1416 0 + mul w8, w11, w12 + sbfiz x8, x8, 3, 32 + add x1, x1, x8 + .loc 1 1417 0 + add x2, x2, x8 + b .L735 + .cfi_endproc +.LFE2878: + .size direct_mode_data_change.isra.2, .-direct_mode_data_change.isra.2 + .align 2 + .p2align 3,,7 + .type direct_mode_data_change2.isra.3, %function +direct_mode_data_change2.isra.3: +.LFB2879: + .loc 1 1484 0 + .cfi_startproc +.LVL845: + .loc 1 1486 0 + adrp x7, .LANCHOR0 + .loc 1 1484 0 + and w3, w3, 255 + .loc 1 1491 0 + sub w3, w3, w4 +.LVL846: + .loc 1 1499 0 + cmp w6, 2 + .loc 1 1486 0 + ldr x4, [x7, #:lo12:.LANCHOR0] + .loc 1 1492 0 + lsl w3, w3, 10 +.LVL847: + add x5, x5, x3, sxtw +.LVL848: + .loc 1 1497 0 + ldp w13, w14, [x4, 108] + .loc 1 1496 0 + lsr w9, w13, 3 + .loc 1 1499 0 + beq .L781 + .loc 1 1507 0 + mov w11, 0 +.LVL849: + .loc 1 1502 0 + cmp w6, 3 + beq .L782 +.LVL850: +.L759: + .loc 1 1510 0 + lsr w13, w13, 2 +.LVL851: + .loc 1 1511 0 + cmp w14, w11 + ble .L774 +.L785: + sub w10, w9, #1 + mul w12, w13, w11 + add x10, x10, 1 + lsl w13, w13, 1 +.LVL852: + lsl x10, x10, 3 +.LVL853: +.L775: + .loc 1 1512 0 + add x8, x0, x12, sxtw + .loc 1 1513 0 + cbz w9, .L783 + .loc 1 1484 0 + 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] + stp x21, x22, [sp, 32] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + .cfi_offset 21, -16 + .cfi_offset 22, -8 + .p2align 2 +.L776: + .loc 1 1513 0 + mov x7, 0 + .p2align 2 +.L762: + .loc 1 1515 0 + ldr x3, [x2, x7, lsl 3] + .loc 1 1514 0 + ldr x4, [x1, x7, lsl 3] +.LBB1606: +.LBB1607: + .loc 1 282 0 + lsr x20, x3, 30 + .loc 1 280 0 + lsr x6, x3, 14 +.LVL854: + .loc 1 282 0 + ubfx x16, x4, 35, 5 + .loc 1 280 0 + ubfx x15, x4, 19, 5 + .loc 1 281 0 + lsr x19, x3, 22 + .loc 1 279 0 + lsr x18, x3, 6 + .loc 1 284 0 + lsr x17, x3, 46 + .loc 1 282 0 + and x20, x20, 992 + .loc 1 280 0 + and x6, x6, 992 + .loc 1 281 0 + lsr w22, w4, 27 + .loc 1 282 0 + orr x20, x20, x16 + .loc 1 279 0 + ubfx x21, x4, 11, 5 + .loc 1 280 0 + orr x6, x6, x15 + .loc 1 283 0 + lsr x16, x3, 38 + .loc 1 284 0 + ubfx x15, x4, 51, 5 + .loc 1 281 0 + and x19, x19, 992 + .loc 1 279 0 + and x18, x18, 992 + .loc 1 284 0 + and x17, x17, 992 + .loc 1 281 0 + orr x19, x19, x22 + .loc 1 279 0 + orr x18, x18, x21 + .loc 1 284 0 + orr x17, x17, x15 + .loc 1 283 0 + ubfx x21, x4, 43, 5 + .loc 1 278 0 + lsl x15, x3, 2 + .loc 1 283 0 + and x16, x16, 992 + orr x16, x16, x21 + .loc 1 278 0 + ubfx x22, x4, 3, 5 + and x15, x15, 992 + .loc 1 285 0 + lsr x3, x3, 54 + .loc 1 282 0 + ldrb w21, [x5, x20] + .loc 1 278 0 + orr x15, x15, x22 + .loc 1 280 0 + ldrb w20, [x5, x6] + .loc 1 285 0 + and x3, x3, 992 + add x4, x5, x4, lsr 59 + .loc 1 281 0 + ldrb w6, [x5, x19] + .loc 1 279 0 + ldrb w18, [x5, x18] + .loc 1 284 0 + ldrb w17, [x5, x17] + .loc 1 283 0 + ldrb w16, [x5, x16] + .loc 1 278 0 + ldrb w19, [x5, x15] + .loc 1 280 0 + lsl w15, w20, 8 + .loc 1 285 0 + ldrb w4, [x4, x3] + .loc 1 282 0 + lsl w3, w21, 16 + .loc 1 285 0 + orr w3, w3, w6, lsl 12 + orr w15, w15, w18, lsl 4 + .loc 1 284 0 + lsl w6, w17, 24 + .loc 1 285 0 + orr w3, w3, w15 + orr w6, w6, w16, lsl 20 + orr w4, w19, w4, lsl 28 + orr w3, w3, w6 + orr w3, w3, w4 +.LBE1607: +.LBE1606: + .loc 1 1516 0 + str w3, [x8, x7, lsl 2] + add x7, x7, 1 + .loc 1 1513 0 + cmp w9, w7 + bgt .L762 + add x1, x1, x10 + add x2, x2, x10 + mov x7, 0 + .p2align 2 +.L763: + .loc 1 1520 0 + ldr x3, [x2, x7, lsl 3] + .loc 1 1519 0 + ldr x4, [x1, x7, lsl 3] + .loc 1 1521 0 + ldr w17, [x8, x7, lsl 2] +.LBB1608: +.LBB1609: + .loc 1 293 0 + lsr x20, x3, 22 + .loc 1 291 0 + lsr x30, x3, 6 + .loc 1 293 0 + lsr w16, w4, 27 + .loc 1 291 0 + ubfx x15, x4, 11, 5 + .loc 1 292 0 + lsr x6, x3, 14 + .loc 1 290 0 + lsl x19, x3, 2 + .loc 1 295 0 + lsr x18, x3, 38 + .loc 1 293 0 + and x20, x20, 992 + .loc 1 291 0 + and x30, x30, 992 + .loc 1 292 0 + ubfx x22, x4, 19, 5 + .loc 1 293 0 + orr x20, x20, x16 + .loc 1 290 0 + ubfx x21, x4, 3, 5 + .loc 1 291 0 + orr x30, x30, x15 + .loc 1 294 0 + lsr x16, x3, 30 + .loc 1 295 0 + ubfx x15, x4, 43, 5 + .loc 1 292 0 + and x6, x6, 992 + .loc 1 290 0 + and x19, x19, 992 + .loc 1 295 0 + and x18, x18, 992 + orr x18, x18, x15 + .loc 1 292 0 + orr x6, x6, x22 + .loc 1 290 0 + orr x19, x19, x21 + .loc 1 296 0 + lsr x15, x3, 46 + .loc 1 294 0 + ubfx x21, x4, 35, 5 + and x16, x16, 992 + .loc 1 297 0 + lsr x3, x3, 54 + .loc 1 294 0 + orr x16, x16, x21 + .loc 1 296 0 + ubfx x22, x4, 51, 5 + .loc 1 297 0 + and x3, x3, 992 + add x4, x5, x4, lsr 59 + .loc 1 296 0 + and x15, x15, 992 + .loc 1 293 0 + ldrb w21, [x5, x20] + .loc 1 296 0 + orr x15, x15, x22 + .loc 1 291 0 + ldrb w20, [x5, x30] + .loc 1 292 0 + ldrb w6, [x5, x6] + .loc 1 295 0 + ldrb w30, [x5, x18] + .loc 1 290 0 + ldrb w19, [x5, x19] + .loc 1 294 0 + ldrb w18, [x5, x16] + .loc 1 297 0 + ldrb w16, [x4, x3] + .loc 1 293 0 + lsl w4, w21, 14 + .loc 1 296 0 + ldrb w15, [x5, x15] + .loc 1 291 0 + lsl w3, w20, 6 + .loc 1 297 0 + orr w4, w4, w6, lsl 10 + orr w3, w3, w19, lsl 2 + .loc 1 295 0 + lsl w6, w30, 22 + .loc 1 297 0 + orr w3, w4, w3 + orr w6, w6, w18, lsl 18 + lsl w4, w16, 30 + orr w3, w3, w6 + orr w4, w4, w15, lsl 26 + orr w3, w3, w4 +.LBE1609: +.LBE1608: + .loc 1 1521 0 + orr w3, w17, w3 + str w3, [x8, x7, lsl 2] + add x7, x7, 1 + .loc 1 1518 0 + cmp w9, w7 + bgt .L763 + .loc 1 1511 0 + add w11, w11, 2 + add x1, x1, x10 + add x2, x2, x10 + add w12, w12, w13 + cmp w11, w14 + bge .L784 +.L764: + .loc 1 1512 0 + add x8, x0, x12, sxtw + .loc 1 1513 0 + cbnz w9, .L776 + .loc 1 1511 0 + add w11, w11, 2 + add w12, w12, w13 + cmp w11, w14 + blt .L764 +.L784: + .loc 1 1524 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] + 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 + ret +.LVL855: +.L783: + .loc 1 1511 0 + add w11, w11, 2 + add w12, w12, w13 + cmp w11, w14 + blt .L775 + ret +.LVL856: +.L781: + .loc 1 1501 0 + add w14, w14, w14, lsr 31 +.LVL857: + .loc 1 1500 0 + mov w11, 0 +.LVL858: + .loc 1 1501 0 + asr w14, w14, 1 +.LVL859: + .loc 1 1510 0 + lsr w13, w13, 2 +.LVL860: + .loc 1 1511 0 + cmp w14, w11 + bgt .L785 +.L774: + ret +.LVL861: +.L782: + .loc 1 1503 0 + add w11, w14, w14, lsr 31 +.LVL862: + asr w11, w11, 1 +.LVL863: + .loc 1 1504 0 + mul w3, w9, w11 + sbfiz x3, x3, 3, 32 + add x1, x1, x3 + .loc 1 1505 0 + add x2, x2, x3 + b .L759 + .cfi_endproc +.LFE2879: + .size direct_mode_data_change2.isra.3, .-direct_mode_data_change2.isra.3 + .align 2 + .p2align 3,,7 + .type flip.isra.4, %function +flip.isra.4: +.LFB2880: + .loc 1 1573 0 + .cfi_startproc +.LVL864: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + .loc 1 1577 0 + sxtw x2, w1 + .loc 1 1573 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -16 + .cfi_offset 20, -8 + .loc 1 1573 0 + mov x20, x0 + .loc 1 1575 0 + ldr w19, [x0, 72] + .loc 1 1577 0 + ldr x0, [x0] +.LVL865: +.LBB1610: +.LBB1611: +.LBB1612: +.LBB1613: + .file 9 "./include/linux/dma-mapping.h" + .loc 9 266 0 + cbz x0, .L789 + ldr x3, [x0, 648] + .loc 9 268 0 + adrp x4, dummy_dma_ops + add x4, x4, :lo12:dummy_dma_ops + cmp x3, 0 + csel x3, x4, x3, eq +.L787: +.LBE1613: +.LBE1612: + .loc 9 434 0 + ldr x5, [x3, 88] + sxtw x19, w19 + cbz x5, .L788 +.LBE1611: +.LBE1610: + .loc 1 1577 0 + add x4, x19, x19, lsl 1 +.LBB1619: +.LBB1616: + .loc 9 435 0 + mov w3, 1 +.LBE1616: +.LBE1619: + .loc 1 1577 0 + add x4, x20, x4, lsl 3 +.LBB1620: +.LBB1617: + .loc 9 435 0 + ldr x1, [x4, 32] + blr x5 +.LVL866: +.L788: +.LBE1617: +.LBE1620: + .loc 1 1578 0 + ldr x5, [x20, 8] +.LBB1621: +.LBB1622: + .file 10 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h" + .loc 10 56 0 + mov w4, 0 + mov w3, 0 + mov w2, 0 + mov x0, x5 + mov w1, 0 +.LBE1622: +.LBE1621: + .loc 1 1579 0 + add x19, x19, x19, lsl 1 +.LBB1625: +.LBB1623: + .loc 10 56 0 + ldr x5, [x5, 64] +.LBE1623: +.LBE1625: + .loc 1 1579 0 + add x19, x20, x19, lsl 3 +.LBB1626: +.LBB1624: + .loc 10 56 0 + blr x5 +.LVL867: +.LBE1624: +.LBE1626: + .loc 1 1579 0 + ldr x1, [x20, 8] +.LBB1627: +.LBB1628: + .loc 10 61 0 + mov w2, 0 + mov x0, x1 + ldr x3, [x1, 72] + ldr w1, [x19, 32] + blr x3 +.LVL868: +.LBE1628: +.LBE1627: + .loc 1 1580 0 + ldr x2, [x20, 8] +.LBB1629: +.LBB1630: + .loc 10 76 0 + mov w1, 1 + mov x0, x2 + ldr x2, [x2, 96] + blr x2 +.LVL869: +.LBE1630: +.LBE1629: + .loc 1 1581 0 + ldr w1, [x20, 72] + mov w0, 1 + sub w0, w0, w1 + str w0, [x20, 72] + .loc 1 1582 0 + ldp x19, x20, [sp, 16] +.LVL870: + 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 +.LVL871: + .p2align 3 +.L789: + .cfi_restore_state +.LBB1631: +.LBB1618: +.LBB1615: +.LBB1614: + .loc 9 268 0 + adrp x3, dummy_dma_ops + add x3, x3, :lo12:dummy_dma_ops + b .L787 +.LBE1614: +.LBE1615: +.LBE1618: +.LBE1631: + .cfi_endproc +.LFE2880: + .size flip.isra.4, .-flip.isra.4 + .align 2 + .p2align 3,,7 + .type ebc_power_set.part.7, %function +ebc_power_set.part.7: +.LFB2883: + .loc 1 390 0 + .cfi_startproc +.LVL872: + 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 390 0 + mov x19, x0 + .loc 1 407 0 + str w1, [x0, 392] + .loc 1 408 0 + ldr x1, [x0, 8] +.LVL873: +.LBB1632: +.LBB1633: + .loc 10 50 0 + mov x0, x1 +.LVL874: + ldr x1, [x1, 56] + blr x1 +.LVL875: +.LBE1633: +.LBE1632: + .loc 1 409 0 + ldr x2, [x19, 16] +.LBB1634: +.LBB1635: + .loc 3 35 0 + mov w1, 0 + mov x0, x2 + ldr x2, [x2, 32] + blr x2 +.LVL876: +.LBE1635: +.LBE1634: + .loc 1 410 0 + ldr w0, [x19, 656] + cbnz w0, .L800 + .loc 1 414 0 + ldr x0, [x19] + adrp x1, .LC30 + add x1, x1, :lo12:.LC30 + bl _dev_info +.LVL877: + .loc 1 418 0 + ldp x19, x20, [sp, 16] +.LVL878: + 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 +.LVL879: + .p2align 3 +.L800: + .cfi_restore_state + .loc 1 411 0 + str wzr, [x19, 656] +.LBB1636: +.LBB1637: + .file 11 "./include/linux/wakelock.h" + .loc 11 68 0 + add x0, x19, 448 + bl __pm_relax +.LVL880: +.LBE1637: +.LBE1636: + .loc 1 414 0 + ldr x0, [x19] + adrp x1, .LC30 + add x1, x1, :lo12:.LC30 + bl _dev_info +.LVL881: + .loc 1 418 0 + ldp x19, x20, [sp, 16] +.LVL882: + ldp x29, x30, [sp], 32 + .cfi_restore 20 + .cfi_restore 19 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2883: + .size ebc_power_set.part.7, .-ebc_power_set.part.7 + .align 2 + .p2align 3,,7 + .type ebc_suspend, %function +ebc_suspend: +.LFB2872: + .loc 1 3772 0 + .cfi_startproc +.LVL883: + 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 +.LBB1638: +.LBB1639: + .loc 2 1181 0 + ldr x20, [x0, 184] +.LBE1639: +.LBE1638: + .loc 1 3776 0 + add x19, x20, 192 + ldr w0, [x19, 200] +.LVL884: + cmp w0, 1 + beq .L804 +.L802: + .loc 1 3780 0 + mov w0, 1 + str w0, [x19, 588] + .loc 1 3782 0 + ldr x1, [x20, 16] +.LBB1640: +.LBB1641: + .loc 3 40 0 + mov x0, x1 + ldr x1, [x1, 40] + blr x1 +.LVL885: +.LBE1641: +.LBE1640: + .loc 1 3783 0 + ldr x0, [x19, 104] + adrp x1, .LC32 + add x1, x1, :lo12:.LC32 + bl _dev_info +.LVL886: + .loc 1 3786 0 + mov w0, 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 + .p2align 3 +.L804: + .cfi_restore_state + .loc 1 3777 0 + ldr x0, [x19, 104] + adrp x2, .LANCHOR3 + add x2, x2, :lo12:.LANCHOR3 + adrp x1, .LC31 + add x1, x1, :lo12:.LC31 + bl _dev_info +.LVL887: +.LBB1642: +.LBB1643: + mov w1, 0 + mov x0, x20 + bl ebc_power_set.part.7 +.LVL888: + b .L802 +.LBE1643: +.LBE1642: + .cfi_endproc +.LFE2872: + .size ebc_suspend, .-ebc_suspend + .align 2 + .p2align 3,,7 + .type direct_mode_data_change_part2.isra.8, %function +direct_mode_data_change_part2.isra.8: +.LFB2884: + .loc 1 1527 0 + .cfi_startproc +.LVL889: + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 + .loc 1 1529 0 + adrp x7, .LANCHOR0 + .loc 1 1527 0 + and w3, w3, 255 + .loc 1 1541 0 + cmp w6, 2 + .loc 1 1533 0 + sub w3, w3, w4 +.LVL890: + .loc 1 1527 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 1529 0 + ldr x4, [x7, #:lo12:.LANCHOR0] + .loc 1 1527 0 + stp x19, x20, [sp, 16] + .loc 1 1534 0 + lsl w3, w3, 10 +.LVL891: + .loc 1 1527 0 + stp x21, x22, [sp, 32] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + .cfi_offset 21, -48 + .cfi_offset 22, -40 + .loc 1 1534 0 + add x19, x5, x3, sxtw +.LVL892: + .loc 1 1527 0 + stp x23, x24, [sp, 48] + mov x22, x0 + stp x25, x26, [sp, 64] + .cfi_offset 23, -32 + .cfi_offset 24, -24 + .cfi_offset 25, -16 + .cfi_offset 26, -8 + .loc 1 1527 0 + mov x24, x1 + mov x25, x2 + .loc 1 1539 0 + ldp w9, w23, [x4, 108] + .loc 1 1538 0 + lsr w20, w9, 3 + .loc 1 1541 0 + beq .L870 + .loc 1 1544 0 + cmp w6, 3 + beq .L808 + lsr w26, w9, 2 + mov x0, 0 + .loc 1 1549 0 + mov w21, 0 +.LVL893: +.L807: + .loc 1 1553 0 + sub w2, w23, w21 + add x0, x22, x0 + mov w1, 0 + mul w2, w2, w26 + sxtw x2, w2 + bl memset +.LVL894: + .loc 1 1554 0 + cmp w21, w23 + bge .L805 + sub w7, w20, #1 + mul w8, w21, w26 + add x7, x7, 1 + lsl w9, w26, 1 + lsl x7, x7, 3 +.LBB1644: +.LBB1645: + .loc 1 332 0 + mov w6, 3 +.LBE1645: +.LBE1644: +.LBB1681: +.LBB1682: + .loc 1 362 0 + mov w5, 12 +.LVL895: + .p2align 2 +.L831: +.LBE1682: +.LBE1681: + .loc 1 1555 0 + add x4, x22, x8, sxtw + .loc 1 1556 0 + cbz w20, .L810 + mov x11, 0 +.LVL896: + .p2align 2 +.L820: + .loc 1 1558 0 + ldr x0, [x25, x11, lsl 3] + .loc 1 1557 0 + ldr x2, [x24, x11, lsl 3] +.LBB1723: +.LBB1678: +.LBB1646: +.LBB1647: + .loc 1 280 0 + lsr x3, x0, 14 + .loc 1 282 0 + lsr x17, x0, 30 + .loc 1 280 0 + ubfx x12, x2, 19, 5 + .loc 1 282 0 + ubfx x1, x2, 35, 5 + .loc 1 281 0 + lsr x15, x0, 22 + .loc 1 284 0 + lsr x14, x0, 46 + .loc 1 280 0 + and x3, x3, 992 + .loc 1 282 0 + and x17, x17, 992 + .loc 1 281 0 + lsr w13, w2, 27 + .loc 1 280 0 + orr x3, x3, x12 + .loc 1 281 0 + and x15, x15, 992 + .loc 1 283 0 + lsr x12, x0, 38 + .loc 1 282 0 + orr x17, x17, x1 + .loc 1 284 0 + and x14, x14, 992 + ubfx x1, x2, 51, 5 + .loc 1 279 0 + lsr x16, x0, 6 + .loc 1 283 0 + and x12, x12, 992 + .loc 1 281 0 + orr x15, x15, x13 + .loc 1 284 0 + orr x14, x14, x1 + .loc 1 283 0 + ubfx x13, x2, 43, 5 + .loc 1 278 0 + lsl x1, x0, 2 +.LBE1647: +.LBE1646: + .loc 1 333 0 + eor x10, x2, x0 +.LVL897: +.LBE1678: +.LBE1723: + .loc 1 1559 0 + cmp x2, x0 +.LBB1724: +.LBB1679: +.LBB1663: +.LBB1648: + .loc 1 279 0 + ubfx x30, x2, 11, 5 + .loc 1 278 0 + and x1, x1, 992 + .loc 1 279 0 + and x16, x16, 992 + .loc 1 283 0 + orr x13, x12, x13 + .loc 1 285 0 + lsr x0, x0, 54 + .loc 1 278 0 + ubfx x12, x2, 3, 5 +.LBE1648: +.LBE1663: + .loc 1 338 0 + and x18, x10, 255 +.LBB1664: +.LBB1649: + .loc 1 278 0 + orr x12, x1, x12 + .loc 1 279 0 + orr x16, x16, x30 + .loc 1 285 0 + and x1, x0, 992 + add x2, x19, x2, lsr 59 +.LBE1649: +.LBE1664: +.LBE1679: +.LBE1724: + .loc 1 1559 0 + beq .L811 +.LBB1725: +.LBB1680: + .loc 1 332 0 + cmp x18, 0 +.LBB1665: +.LBB1650: + .loc 1 280 0 + ldrb w18, [x19, x3] +.LBE1650: +.LBE1665: + .loc 1 332 0 + csel w0, w6, wzr, ne + .loc 1 341 0 + tst x10, 65280 + orr w3, w0, 48 +.LBB1666: +.LBB1651: + .loc 1 282 0 + ldrb w17, [x19, x17] +.LBE1651: +.LBE1666: + .loc 1 341 0 + csel w0, w3, w0, ne + .loc 1 343 0 + tst x10, 16711680 + orr w30, w0, 768 +.LBB1667: +.LBB1652: + .loc 1 279 0 + ldrb w3, [x19, x16] +.LBE1652: +.LBE1667: + .loc 1 343 0 + csel w0, w30, w0, ne + .loc 1 345 0 + tst x10, 4278190080 + orr w30, w0, 12288 +.LBB1668: +.LBB1653: + .loc 1 281 0 + ldrb w16, [x19, x15] +.LBE1653: +.LBE1668: + .loc 1 345 0 + csel w0, w30, w0, ne + .loc 1 347 0 + tst x10, 1095216660480 + orr w15, w0, 196608 +.LBB1669: +.LBB1654: + .loc 1 284 0 + ldrb w14, [x19, x14] +.LBE1654: +.LBE1669: + .loc 1 347 0 + csel w0, w15, w0, ne +.LBB1670: +.LBB1655: + .loc 1 283 0 + ldrb w13, [x19, x13] +.LBE1655: +.LBE1670: + .loc 1 349 0 + tst x10, 280375465082880 + orr w15, w0, 3145728 + csel w0, w15, w0, ne +.LBB1671: +.LBB1656: + .loc 1 285 0 + ldrb w2, [x2, x1] + .loc 1 278 0 + ldrb w15, [x19, x12] + .loc 1 280 0 + lsl w1, w18, 8 + .loc 1 282 0 + lsl w12, w17, 16 +.LBE1656: +.LBE1671: + .loc 1 351 0 + tst x10, 71776119061217280 +.LBB1672: +.LBB1657: + .loc 1 285 0 + orr w1, w1, w3, lsl 4 +.LBE1657: +.LBE1672: + .loc 1 351 0 + orr w17, w0, 50331648 +.LBB1673: +.LBB1658: + .loc 1 285 0 + orr w12, w12, w16, lsl 12 + .loc 1 284 0 + lsl w3, w14, 24 +.LBE1658: +.LBE1673: + .loc 1 351 0 + csel w0, w17, w0, ne +.LBB1674: +.LBB1659: + .loc 1 285 0 + orr w1, w1, w12 + orr w3, w3, w13, lsl 20 +.LBE1659: +.LBE1674: + .loc 1 353 0 + tst x10, -72057594037927936 +.LBB1675: +.LBB1660: + .loc 1 285 0 + orr w1, w1, w3 +.LBE1660: +.LBE1675: + .loc 1 353 0 + orr w10, w0, 805306368 +.LVL898: +.LBB1676: +.LBB1661: + .loc 1 285 0 + orr w2, w15, w2, lsl 28 +.LBE1661: +.LBE1676: + .loc 1 353 0 + csel w0, w10, w0, ne +.LBB1677: +.LBB1662: + .loc 1 285 0 + orr w1, w1, w2 +.LBE1662: +.LBE1677: + .loc 1 355 0 + and w0, w1, w0 +.LBE1680: +.LBE1725: + .loc 1 1560 0 + str w0, [x4, x11, lsl 2] +.LVL899: +.L811: + add x11, x11, 1 + .loc 1 1556 0 + cmp w20, w11 + bgt .L820 + add x24, x24, x7 +.LVL900: + add x25, x25, x7 +.LVL901: + mov x11, 0 +.LVL902: + .p2align 2 +.L830: + .loc 1 1565 0 + ldr x0, [x25, x11, lsl 3] + .loc 1 1564 0 + ldr x2, [x24, x11, lsl 3] +.LBB1726: +.LBB1719: +.LBB1683: +.LBB1684: + .loc 1 293 0 + lsr x17, x0, 22 + .loc 1 291 0 + lsr x16, x0, 6 + .loc 1 293 0 + lsr w3, w2, 27 + .loc 1 295 0 + lsr x13, x0, 38 + .loc 1 293 0 + and x17, x17, 992 + .loc 1 291 0 + ubfx x1, x2, 11, 5 + .loc 1 292 0 + lsr x15, x0, 14 + .loc 1 290 0 + lsl x14, x0, 2 + .loc 1 291 0 + and x16, x16, 992 + .loc 1 293 0 + orr x17, x17, x3 + .loc 1 295 0 + and x13, x13, 992 + ubfx x3, x2, 43, 5 + .loc 1 292 0 + ubfx x30, x2, 19, 5 + .loc 1 290 0 + ubfx x12, x2, 3, 5 + .loc 1 292 0 + and x15, x15, 992 + .loc 1 290 0 + and x14, x14, 992 + .loc 1 291 0 + orr x16, x16, x1 + .loc 1 295 0 + orr x13, x13, x3 + .loc 1 294 0 + lsr x1, x0, 30 + .loc 1 296 0 + lsr x3, x0, 46 +.LBE1684: +.LBE1683: + .loc 1 363 0 + eor x10, x2, x0 +.LVL903: +.LBE1719: +.LBE1726: + .loc 1 1566 0 + cmp x2, x0 +.LBB1727: +.LBB1720: +.LBB1702: +.LBB1685: + .loc 1 294 0 + and x1, x1, 992 + .loc 1 292 0 + orr x15, x15, x30 + .loc 1 290 0 + orr x14, x14, x12 + .loc 1 294 0 + ubfx x30, x2, 35, 5 + .loc 1 296 0 + ubfx x12, x2, 51, 5 + .loc 1 297 0 + lsr x0, x0, 54 + .loc 1 296 0 + and x3, x3, 992 + .loc 1 294 0 + orr x30, x1, x30 +.LBE1685: +.LBE1702: + .loc 1 368 0 + and x18, x10, 255 +.LBB1703: +.LBB1686: + .loc 1 297 0 + and x1, x0, 992 + add x2, x19, x2, lsr 59 + .loc 1 296 0 + orr x12, x3, x12 +.LBE1686: +.LBE1703: +.LBE1720: +.LBE1727: + .loc 1 1566 0 + beq .L821 +.LBB1728: +.LBB1721: + .loc 1 362 0 + cmp x18, 0 +.LBB1704: +.LBB1687: + .loc 1 293 0 + ldrb w17, [x19, x17] +.LBE1687: +.LBE1704: + .loc 1 362 0 + csel w0, w5, wzr, ne + .loc 1 371 0 + tst x10, 65280 + orr w3, w0, 192 +.LBB1705: +.LBB1688: + .loc 1 291 0 + ldrb w16, [x19, x16] +.LBE1688: +.LBE1705: + .loc 1 371 0 + csel w0, w3, w0, ne + .loc 1 373 0 + tst x10, 16711680 + orr w18, w0, 3072 +.LBB1706: +.LBB1689: + .loc 1 292 0 + ldrb w3, [x19, x15] +.LBE1689: +.LBE1706: + .loc 1 373 0 + csel w0, w18, w0, ne + .loc 1 375 0 + tst x10, 4278190080 + orr w15, w0, 49152 +.LBB1707: +.LBB1690: + .loc 1 290 0 + ldrb w18, [x19, x14] +.LBE1690: +.LBE1707: + .loc 1 375 0 + csel w0, w15, w0, ne + .loc 1 377 0 + tst x10, 1095216660480 + orr w14, w0, 786432 +.LBB1708: +.LBB1691: + .loc 1 295 0 + ldrb w15, [x19, x13] +.LBE1691: +.LBE1708: + .loc 1 377 0 + csel w0, w14, w0, ne +.LBB1709: +.LBB1692: + .loc 1 297 0 + ldrb w13, [x2, x1] +.LBE1692: +.LBE1709: + .loc 1 379 0 + tst x10, 280375465082880 +.LBB1710: +.LBB1693: + .loc 1 294 0 + ldrb w14, [x19, x30] +.LBE1693: +.LBE1710: + .loc 1 379 0 + orr w1, w0, 12582912 +.LBB1711: +.LBB1694: + .loc 1 296 0 + ldrb w2, [x19, x12] +.LBE1694: +.LBE1711: + .loc 1 379 0 + csel w0, w1, w0, ne +.LBB1712: +.LBB1695: + .loc 1 291 0 + lsl w16, w16, 6 + .loc 1 293 0 + lsl w1, w17, 14 +.LBE1695: +.LBE1712: + .loc 1 381 0 + tst x10, 71776119061217280 +.LBB1713: +.LBB1696: + .loc 1 297 0 + orr w1, w1, w3, lsl 10 +.LBE1696: +.LBE1713: + .loc 1 381 0 + orr w17, w0, 201326592 +.LBB1714: +.LBB1697: + .loc 1 297 0 + orr w3, w16, w18, lsl 2 + .loc 1 295 0 + lsl w12, w15, 22 +.LBE1697: +.LBE1714: + .loc 1 381 0 + csel w0, w17, w0, ne +.LBB1715: +.LBB1698: + .loc 1 297 0 + orr w1, w1, w3 + orr w12, w12, w14, lsl 18 + lsl w3, w13, 30 +.LBE1698: +.LBE1715: + .loc 1 383 0 + tst x10, -72057594037927936 +.LBB1716: +.LBB1699: + .loc 1 297 0 + orr w3, w3, w2, lsl 26 +.LBE1699: +.LBE1716: + .loc 1 383 0 + orr w10, w0, -1073741824 +.LVL904: +.LBB1717: +.LBB1700: + .loc 1 297 0 + orr w1, w1, w12 +.LBE1700: +.LBE1717: +.LBE1721: +.LBE1728: + .loc 1 1567 0 + ldr w2, [x4, x11, lsl 2] +.LBB1729: +.LBB1722: + .loc 1 383 0 + csel w0, w10, w0, ne +.LBB1718: +.LBB1701: + .loc 1 297 0 + orr w1, w1, w3 +.LBE1701: +.LBE1718: + .loc 1 385 0 + and w0, w1, w0 +.LBE1722: +.LBE1729: + .loc 1 1567 0 + orr w0, w2, w0 + str w0, [x4, x11, lsl 2] +.LVL905: +.L821: + add x11, x11, 1 + .loc 1 1563 0 + cmp w20, w11 + bgt .L830 + add x24, x24, x7 + add x25, x25, x7 +.L810: + .loc 1 1554 0 + add w21, w21, 2 + add w8, w8, w9 + cmp w23, w21 + bgt .L831 +.L805: + .loc 1 1571 0 + ldp x19, x20, [sp, 16] +.LVL906: + ldp x21, x22, [sp, 32] +.LVL907: + ldp x23, x24, [sp, 48] +.LVL908: + ldp x25, x26, [sp, 64] +.LVL909: + 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 +.LVL910: +.L870: + .cfi_restore_state + .loc 1 1543 0 + add w23, w23, w23, lsr 31 +.LVL911: + lsr w26, w9, 2 + asr w23, w23, 1 +.LVL912: + mov x0, 0 + .loc 1 1542 0 + mov w21, 0 +.LVL913: + b .L807 +.LVL914: +.L808: + .loc 1 1545 0 + add w21, w23, w23, lsr 31 + lsr w26, w9, 2 + asr w21, w21, 1 +.LVL915: + .loc 1 1546 0 + mul w1, w20, w21 + mul w0, w21, w26 + sbfiz x1, x1, 3, 32 + sxtw x0, w0 + add x24, x24, x1 + .loc 1 1547 0 + add x25, x2, x1 + b .L807 + .cfi_endproc +.LFE2884: + .size direct_mode_data_change_part2.isra.8, .-direct_mode_data_change_part2.isra.8 + .align 2 + .p2align 3,,7 + .type direct_mode_data_change_part.isra.9, %function +direct_mode_data_change_part.isra.9: +.LFB2885: + .loc 1 1439 0 + .cfi_startproc +.LVL916: + stp x29, x30, [sp, -96]! + .cfi_def_cfa_offset 96 + .cfi_offset 29, -96 + .cfi_offset 30, -88 + .loc 1 1441 0 + adrp x7, .LANCHOR0 + .loc 1 1439 0 + and w3, w3, 255 + .loc 1 1452 0 + cmp w6, 2 + .loc 1 1445 0 + sub w4, w3, w4 +.LVL917: + .loc 1 1439 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 1441 0 + ldr x3, [x7, #:lo12:.LANCHOR0] + .loc 1 1439 0 + stp x23, x24, [sp, 48] + .loc 1 1446 0 + lsl w4, w4, 10 +.LVL918: + .cfi_offset 23, -48 + .cfi_offset 24, -40 + .loc 1 1449 0 + add x23, x3, 24 + .loc 1 1439 0 + stp x19, x20, [sp, 16] + stp x21, x22, [sp, 32] + .cfi_offset 19, -80 + .cfi_offset 20, -72 + .cfi_offset 21, -64 + .cfi_offset 22, -56 + mov x20, x1 + str x27, [sp, 80] + .cfi_offset 27, -16 + mov x27, x0 + stp x25, x26, [sp, 64] + .cfi_offset 25, -32 + .cfi_offset 26, -24 + .loc 1 1439 0 + mov x21, x2 + .loc 1 1446 0 + add x19, x5, x4, sxtw +.LVL919: + .loc 1 1450 0 + ldp w10, w0, [x23, 84] +.LVL920: + .loc 1 1449 0 + lsr w22, w10, 3 + .loc 1 1452 0 + beq .L909 + mov w25, w0 +.LVL921: + .loc 1 1455 0 + cmp w6, 3 + .loc 1 1460 0 + mov w24, 0 +.LVL922: + .loc 1 1455 0 + beq .L910 +.L873: + .loc 1 1464 0 + ldr w1, [x23, 156] + .loc 1 1463 0 + lsr w26, w10, 2 +.LVL923: + .loc 1 1464 0 + cbz w1, .L874 + .loc 1 1465 0 + sub w2, w25, w24 + sub w0, w0, w25 + mov w1, 0 + mul w2, w2, w26 + mul w0, w0, w26 + sxtw x2, w2 + add x0, x27, x0 + bl memset +.LVL924: + .loc 1 1466 0 + ldr w0, [x23, 88] + sub w0, w0, #1 + sub w0, w0, w24 + mul w0, w0, w26 + neg w26, w26 + add x27, x27, x0 +.L877: + .loc 1 1473 0 + cmp w25, w24 + ble .L871 + sub w9, w22, #1 + sxtw x10, w26 + add x9, x9, 1 +.LBB1730: +.LBB1731: + .loc 1 302 0 + mov w8, 3 + lsl x9, x9, 3 +.LVL925: + .p2align 2 +.L876: +.LBE1731: +.LBE1730: + .loc 1 1474 0 + mov x5, 0 + cbz w22, .L889 + .p2align 2 +.L906: + .loc 1 1476 0 + ldr x0, [x21, x5, lsl 3] +.LVL926: + .loc 1 1475 0 + ldr x2, [x20, x5, lsl 3] +.LVL927: +.LBB1771: +.LBB1768: +.LBB1732: +.LBB1733: + .loc 1 270 0 + lsr x15, x0, 30 + .loc 1 268 0 + lsr x14, x0, 14 + .loc 1 272 0 + lsr x1, x0, 46 + .loc 1 270 0 + ubfx x6, x2, 35, 5 + .loc 1 268 0 + ubfx x3, x2, 19, 5 + .loc 1 269 0 + lsr x13, x0, 22 + .loc 1 267 0 + lsr x12, x0, 6 + .loc 1 272 0 + and x1, x1, 992 + ubfx x11, x2, 51, 5 + .loc 1 270 0 + and x15, x15, 992 + .loc 1 268 0 + and x14, x14, 992 + .loc 1 269 0 + lsr w7, w2, 27 + and x13, x13, 992 + .loc 1 270 0 + orr x15, x15, x6 + .loc 1 267 0 + and x12, x12, 992 + ubfx x6, x2, 11, 5 + .loc 1 268 0 + orr x14, x14, x3 + .loc 1 272 0 + orr x11, x1, x11 + .loc 1 271 0 + lsr x3, x0, 38 + .loc 1 266 0 + lsl x1, x0, 2 +.LBE1733: +.LBE1732: + .loc 1 303 0 + eor x4, x2, x0 +.LBE1768: +.LBE1771: + .loc 1 1477 0 + cmp x2, x0 +.LBB1772: +.LBB1769: +.LBB1751: +.LBB1734: + .loc 1 266 0 + and x1, x1, 992 + .loc 1 269 0 + orr x13, x13, x7 + .loc 1 267 0 + orr x12, x12, x6 + .loc 1 271 0 + ubfx x7, x2, 43, 5 + .loc 1 266 0 + ubfx x6, x2, 3, 5 + .loc 1 271 0 + and x3, x3, 992 + .loc 1 273 0 + lsr x0, x0, 54 +.LVL928: + .loc 1 266 0 + orr x6, x1, x6 +.LBE1734: +.LBE1751: + .loc 1 308 0 + and x16, x4, 255 +.LBB1752: +.LBB1735: + .loc 1 271 0 + orr x7, x3, x7 + .loc 1 273 0 + and x1, x0, 992 + add x2, x19, x2, lsr 59 +.LVL929: +.LBE1735: +.LBE1752: +.LBE1769: +.LBE1772: + .loc 1 1477 0 + beq .L878 +.LBB1773: +.LBB1770: + .loc 1 302 0 + cmp x16, 0 +.LBB1753: +.LBB1736: + .loc 1 268 0 + ldrb w14, [x19, x14] +.LBE1736: +.LBE1753: + .loc 1 302 0 + csel w0, w8, wzr, ne + .loc 1 311 0 + tst x4, 65280 + orr w3, w0, 12 +.LBB1754: +.LBB1737: + .loc 1 270 0 + ldrb w15, [x19, x15] +.LBE1737: +.LBE1754: + .loc 1 311 0 + csel w0, w3, w0, ne + .loc 1 313 0 + tst x4, 16711680 + orr w16, w0, 48 +.LBB1755: +.LBB1738: + .loc 1 269 0 + ldrb w3, [x19, x13] +.LBE1738: +.LBE1755: + .loc 1 313 0 + csel w0, w16, w0, ne + .loc 1 315 0 + tst x4, 4278190080 + orr w13, w0, 192 +.LBB1756: +.LBB1739: + .loc 1 267 0 + ldrb w12, [x19, x12] +.LBE1739: +.LBE1756: + .loc 1 315 0 + and w13, w13, 65535 +.LBB1757: +.LBB1740: + .loc 1 272 0 + ldrb w11, [x19, x11] +.LBE1740: +.LBE1757: + .loc 1 315 0 + csel w0, w13, w0, ne + .loc 1 317 0 + tst x4, 1095216660480 + orr w16, w0, 768 +.LBB1758: +.LBB1741: + .loc 1 266 0 + ldrb w13, [x19, x6] +.LBE1741: +.LBE1758: + .loc 1 317 0 + and w16, w16, 65535 +.LBB1759: +.LBB1742: + .loc 1 271 0 + ldrb w7, [x19, x7] +.LBE1742: +.LBE1759: + .loc 1 317 0 + csel w0, w16, w0, ne + .loc 1 319 0 + tst x4, 280375465082880 + orr w6, w0, 3072 +.LBB1760: +.LBB1743: + .loc 1 273 0 + ldrb w2, [x2, x1] +.LBE1743: +.LBE1760: + .loc 1 319 0 + and w6, w6, 65535 +.LBB1761: +.LBB1744: + .loc 1 270 0 + lsl w1, w15, 8 +.LBE1744: +.LBE1761: + .loc 1 319 0 + csel w0, w6, w0, ne +.LBB1762: +.LBB1745: + .loc 1 268 0 + lsl w6, w14, 4 +.LBE1745: +.LBE1762: + .loc 1 321 0 + orr w14, w0, 12288 + tst x4, 71776119061217280 + and w14, w14, 65535 +.LBB1763: +.LBB1746: + .loc 1 273 0 + orr w1, w1, w3, lsl 6 +.LBE1746: +.LBE1763: + .loc 1 321 0 + csel w0, w14, w0, ne +.LBB1764: +.LBB1747: + .loc 1 273 0 + orr w12, w6, w12, lsl 2 + .loc 1 272 0 + lsl w6, w11, 12 +.LBE1747: +.LBE1764: + .loc 1 323 0 + orr w3, w0, -16384 +.LBB1765: +.LBB1748: + .loc 1 273 0 + orr w1, w1, w12 + orr w6, w6, w7, lsl 10 +.LBE1748: +.LBE1765: + .loc 1 323 0 + tst x4, -72057594037927936 + and w3, w3, 65535 +.LBB1766: +.LBB1749: + .loc 1 273 0 + orr w1, w1, w6 + orr w2, w13, w2, lsl 14 +.LBE1749: +.LBE1766: + .loc 1 323 0 + csel w0, w3, w0, ne +.LBB1767: +.LBB1750: + .loc 1 273 0 + orr w1, w1, w2 +.LBE1750: +.LBE1767: + .loc 1 325 0 + and w0, w0, w1 +.LBE1770: +.LBE1773: + .loc 1 1478 0 + strh w0, [x27, x5, lsl 1] +.L878: + add x5, x5, 1 + .loc 1 1474 0 + cmp w22, w5 + bgt .L906 + add x20, x20, x9 + add x21, x21, x9 +.L889: + .loc 1 1473 0 + add w24, w24, 1 + add x27, x27, x10 + cmp w25, w24 + bne .L876 +.L871: + .loc 1 1482 0 + ldp x19, x20, [sp, 16] +.LVL930: + ldp x21, x22, [sp, 32] +.LVL931: + ldp x23, x24, [sp, 48] +.LVL932: + ldp x25, x26, [sp, 64] +.LVL933: + ldr x27, [sp, 80] +.LVL934: + 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 +.LVL935: +.L874: + .cfi_restore_state + .loc 1 1470 0 + sub w2, w25, w24 + .loc 1 1469 0 + mul w23, w26, w24 + .loc 1 1470 0 + mov w1, 0 + mul w2, w2, w26 + .loc 1 1469 0 + add x27, x27, x23, sxtw + .loc 1 1470 0 + mov x0, x27 + sxtw x2, w2 + bl memset +.LVL936: + b .L877 +.LVL937: +.L909: + .loc 1 1454 0 + add w25, w0, w0, lsr 31 + .loc 1 1453 0 + mov w24, 0 +.LVL938: + .loc 1 1454 0 + asr w25, w25, 1 +.LVL939: + b .L873 +.L910: + .loc 1 1456 0 + add w24, w0, w0, lsr 31 +.LVL940: + asr w24, w24, 1 +.LVL941: + .loc 1 1457 0 + mul w1, w22, w24 + sbfiz x1, x1, 3, 32 + add x20, x20, x1 + .loc 1 1458 0 + add x21, x2, x1 + b .L873 + .cfi_endproc +.LFE2885: + .size direct_mode_data_change_part.isra.9, .-direct_mode_data_change_part.isra.9 + .align 2 + .p2align 3,,7 + .type ebc_frame_start, %function +ebc_frame_start: +.LFB2835: + .loc 1 1641 0 + .cfi_startproc +.LVL942: + 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 + .loc 1 1643 0 + add x19, x0, 192 + .loc 1 1641 0 + str x21, [sp, 32] + .cfi_offset 21, -16 + .loc 1 1641 0 + mov x20, x0 + .loc 1 1642 0 + add x21, x0, 24 + .loc 1 1645 0 + ldr w6, [x19, 252] + cmp w6, 3 + beq .L913 + cmp w6, 4 + beq .L914 + cmp w6, 1 + beq .L937 + .loc 1 1751 0 + ldrb w4, [x19, 56] + str w4, [x19, 72] + .loc 1 1754 0 + ldp x2, x1, [x19, 216] + .loc 1 1752 0 + ldr w0, [x21, 164] + .loc 1 1753 0 + ldr x5, [x20, 320] + .loc 1 1752 0 + cbnz w0, .L938 + .loc 1 1759 0 + ldr x1, [x1, 16] + mov w3, w4 + ldr x2, [x2, 16] + mov w6, 1 + ldr x0, [x19, 184] + bl direct_mode_data_change.isra.2 +.LVL943: + .loc 1 1764 0 + ldr w4, [x19, 72] + .loc 1 1767 0 + ldp x2, x1, [x19, 216] + .loc 1 1764 0 + sub w4, w4, #1 + str w4, [x19, 72] + .loc 1 1765 0 + ldr w0, [x21, 164] + .loc 1 1766 0 + ldrb w3, [x20, 248] + ldr x5, [x20, 320] + .loc 1 1765 0 + cbz w0, .L932 +.L943: + .loc 1 1766 0 + ldr x1, [x1, 16] + mov w6, 1 + ldr x2, [x2, 16] + ldr x0, [x19, 192] + bl direct_mode_data_change2.isra.3 +.LVL944: + b .L933 + .p2align 3 +.L937: + .loc 1 1721 0 + ldrb w4, [x19, 56] + str w4, [x19, 72] + .loc 1 1725 0 + ldr x1, [x19, 216] + .loc 1 1722 0 + ldr w0, [x21, 164] +.LVL945: + cbnz w0, .L939 + .loc 1 1730 0 + ldr x0, [x19, 224] + .loc 1 1729 0 + mov w3, w4 + ldr x2, [x1, 16] + ldr x5, [x20, 320] + ldr x1, [x0, 16] + ldr x0, [x19, 184] + bl direct_mode_data_change_part.isra.9 +.LVL946: + .loc 1 1735 0 + ldr w4, [x19, 72] + .loc 1 1738 0 + ldp x2, x1, [x19, 216] + .loc 1 1735 0 + sub w4, w4, #1 + str w4, [x19, 72] + .loc 1 1736 0 + ldr w0, [x21, 164] + .loc 1 1737 0 + ldrb w3, [x20, 248] + ldr x5, [x20, 320] + .loc 1 1736 0 + cbz w0, .L928 +.L942: + .loc 1 1737 0 + ldr x1, [x1, 16] + mov w6, 1 + ldr x2, [x2, 16] + ldr x0, [x19, 192] + bl direct_mode_data_change_part2.isra.8 +.LVL947: + b .L933 +.LVL948: + .p2align 3 +.L914: + .loc 1 1647 0 + ldrsw x2, [x19, 32] + mov w1, 0 + ldr x0, [x19, 184] +.LVL949: + bl memset +.LVL950: + .loc 1 1648 0 + ldr w0, [x21, 164] + cbnz w0, .L940 + .loc 1 1656 0 + ldp x1, x2, [x19, 152] + mov x5, x19 + ldp x3, x4, [x19, 168] + ldr x0, [x19, 184] + bl get_overlay_image_area +.LVL951: +.L917: + .loc 1 1662 0 + ldr w0, [x19, 60] + cbz w0, .L918 +.LBB1774: +.LBB1775: + .loc 1 1586 0 + str wzr, [x21, 72] + .loc 1 1587 0 + mov x0, x21 + ldr w1, [x20, 224] + bl flip.isra.4 +.LVL952: +.LBE1775: +.LBE1774: + .loc 1 1664 0 + ldrsw x2, [x19, 32] + mov w1, 0 + ldr x0, [x19, 192] + bl memset +.LVL953: + .loc 1 1665 0 + ldr w0, [x21, 164] + cbz w0, .L919 + .loc 1 1666 0 + ldp x1, x2, [x19, 152] + mov x4, x19 + ldr x3, [x19, 168] + ldr x0, [x19, 192] + bl get_overlay_image_area2.isra.0 +.LVL954: + b .L911 +.LVL955: + .p2align 3 +.L913: + .loc 1 1685 0 + ldr w0, [x21, 164] +.LVL956: + .loc 1 1686 0 + ldp x1, x2, [x19, 152] + ldr x3, [x19, 168] + .loc 1 1685 0 + cbnz w0, .L941 + .loc 1 1693 0 + ldr x0, [x19, 184] + mov w5, 1 + mov x4, x19 + bl get_auto_image +.LVL957: +.L922: + .loc 1 1699 0 + ldr w0, [x19, 60] + cbz w0, .L923 + .loc 1 1700 0 + ldr w0, [x21, 164] + .loc 1 1701 0 + ldp x1, x2, [x19, 152] + ldr x3, [x19, 168] + .loc 1 1700 0 + cbz w0, .L924 + .loc 1 1701 0 + ldr x0, [x19, 192] + mov w5, 1 + mov x4, x19 + bl get_auto_image2 +.LVL958: + .p2align 2 +.L933: +.LBB1776: +.LBB1777: + .loc 1 1586 0 + str wzr, [x21, 72] + .loc 1 1587 0 + mov x0, x21 + ldr w1, [x20, 224] + bl flip.isra.4 +.LVL959: +.L911: +.LBE1777: +.LBE1776: + .loc 1 1782 0 + ldp x19, x20, [sp, 16] +.LVL960: + ldr x21, [sp, 32] + ldp x29, x30, [sp], 48 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL961: + .p2align 3 +.L941: + .cfi_restore_state + .loc 1 1686 0 + ldr x0, [x19, 184] + mov w5, 1 + mov x4, x19 + bl get_auto_image2 +.LVL962: + b .L922 + .p2align 3 +.L940: + .loc 1 1649 0 + ldp x1, x2, [x19, 152] + mov x4, x19 + ldr x3, [x19, 168] + ldr x0, [x19, 184] + bl get_overlay_image_area2.isra.0 +.LVL963: + b .L917 + .p2align 3 +.L939: + .loc 1 1724 0 + ldr x0, [x19, 224] + .loc 1 1723 0 + mov w3, w4 + ldr x2, [x1, 16] + ldr x5, [x20, 320] + ldr x1, [x0, 16] + ldr x0, [x19, 184] + bl direct_mode_data_change_part2.isra.8 +.LVL964: + .loc 1 1735 0 + ldr w4, [x19, 72] + .loc 1 1738 0 + ldp x2, x1, [x19, 216] + .loc 1 1735 0 + sub w4, w4, #1 + str w4, [x19, 72] + .loc 1 1736 0 + ldr w0, [x21, 164] + .loc 1 1737 0 + ldrb w3, [x20, 248] + ldr x5, [x20, 320] + .loc 1 1736 0 + cbnz w0, .L942 +.L928: + .loc 1 1743 0 + ldr x1, [x1, 16] + mov w6, 1 + ldr x2, [x2, 16] + ldr x0, [x19, 192] + bl direct_mode_data_change_part.isra.9 +.LVL965: + b .L933 + .p2align 3 +.L938: + .loc 1 1753 0 + ldr x1, [x1, 16] + mov w3, w4 + ldr x2, [x2, 16] + mov w6, 1 + ldr x0, [x19, 184] + bl direct_mode_data_change2.isra.3 +.LVL966: + .loc 1 1764 0 + ldr w4, [x19, 72] + .loc 1 1767 0 + ldp x2, x1, [x19, 216] + .loc 1 1764 0 + sub w4, w4, #1 + str w4, [x19, 72] + .loc 1 1765 0 + ldr w0, [x21, 164] + .loc 1 1766 0 + ldrb w3, [x20, 248] + ldr x5, [x20, 320] + .loc 1 1765 0 + cbnz w0, .L943 +.L932: + .loc 1 1772 0 + ldr x1, [x1, 16] + mov w6, 1 + ldr x2, [x2, 16] + ldr x0, [x19, 192] + bl direct_mode_data_change.isra.2 +.LVL967: + b .L933 + .p2align 3 +.L924: + .loc 1 1708 0 + ldr x0, [x19, 192] + mov w5, 1 + mov x4, x19 + bl get_auto_image +.LVL968: + b .L933 + .p2align 3 +.L918: + .loc 1 1680 0 + ldr x0, [x19, 104] + adrp x2, .LANCHOR3 + add x2, x2, :lo12:.LANCHOR3 + adrp x1, .LC33 + add x2, x2, 16 + add x1, x1, :lo12:.LC33 + bl _dev_info +.LVL969: + .loc 1 1681 0 + str wzr, [x19, 52] + b .L911 + .p2align 3 +.L919: + .loc 1 1673 0 + ldp x1, x2, [x19, 152] + mov x5, x19 + ldp x3, x4, [x19, 168] + ldr x0, [x19, 192] + bl get_overlay_image_area +.LVL970: + b .L911 + .p2align 3 +.L923: + .loc 1 1716 0 + ldr x0, [x19, 104] + adrp x2, .LANCHOR3 + add x2, x2, :lo12:.LANCHOR3 + adrp x1, .LC34 + add x2, x2, 16 + add x1, x1, :lo12:.LC34 + bl _dev_info +.LVL971: + .loc 1 1717 0 + str wzr, [x19, 52] + b .L911 + .cfi_endproc +.LFE2835: + .size ebc_frame_start, .-ebc_frame_start + .align 2 + .p2align 3,,7 + .type ebc_auto_assist_tast_function, %function +ebc_auto_assist_tast_function: +.LFB2836: + .loc 1 1786 0 + .cfi_startproc +.LVL972: + stp x29, x30, [sp, -96]! + .cfi_def_cfa_offset 96 + .cfi_offset 29, -96 + .cfi_offset 30, -88 + .loc 1 1787 0 + adrp x1, .LANCHOR0 + .loc 1 1786 0 + adrp x0, __stack_chk_guard +.LVL973: + add x0, x0, :lo12:__stack_chk_guard + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + stp x21, x22, [sp, 32] + .cfi_offset 19, -80 + .cfi_offset 20, -72 + .cfi_offset 21, -64 + .cfi_offset 22, -56 + adrp x22, .LANCHOR1 + stp x23, x24, [sp, 48] + .loc 1 1792 0 + add x22, x22, :lo12:.LANCHOR1 + .loc 1 1786 0 + str x25, [sp, 64] + .cfi_offset 23, -48 + .cfi_offset 24, -40 + .cfi_offset 25, -32 + .loc 1 1792 0 + add x20, x22, 328 + .loc 1 1787 0 + ldr x25, [x1, #:lo12:.LANCHOR0] +.LVL974: + .loc 1 1865 0 + add x22, x22, 352 +.LBB1778: +.LBB1779: +.LBB1780: + .file 12 "./include/linux/compiler.h" + .loc 12 290 0 + mov x24, 2 +.LBE1780: +.LBE1779: +.LBE1778: + .loc 1 1786 0 + ldr x1, [x0] + str x1, [x29, 88] + mov x1,0 +.LBB1785: +.LBB1782: +.LBB1783: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x23, sp_el0 +// 0 "" 2 +.LVL975: +#NO_APP +.LBE1783: +.LBE1782: +.LBE1785: + .loc 1 1789 0 + add x19, x25, 192 + add x21, x25, 24 + b .L954 + .p2align 3 +.L966: + .loc 1 1797 0 + cmp w5, 4 + beq .L947 + cmp w5, 1 + beq .L965 + .loc 1 1849 0 + ldr w4, [x19, 72] + cbz w4, .L950 + .loc 1 1851 0 + ldr w0, [x21, 164] + cbz w0, .L953 + .loc 1 1852 0 + ldrsw x0, [x21, 72] + mov w6, 3 + .loc 1 1853 0 + ldp x2, x1, [x19, 216] + .loc 1 1852 0 + add x0, x19, x0, lsl 3 + ldrb w3, [x25, 248] + ldr x5, [x25, 320] + ldr x1, [x1, 16] + ldr x0, [x0, 184] + ldr x2, [x2, 16] + bl direct_mode_data_change2.isra.3 +.LVL976: + .p2align 2 +.L950: + .loc 1 1865 0 + mov x0, x22 + bl up +.LVL977: + .loc 1 1866 0 + mov x0, x20 + bl up +.LVL978: + .loc 1 1867 0 + bl schedule +.LVL979: +.L954: + .loc 1 1792 0 + mov x0, x20 + bl down +.LVL980: +.LBB1786: +.LBB1784: +.LBB1781: + .loc 12 290 0 + str x24, [x23, 32] +.LBE1781: +.LBE1784: +.LBE1786: + .loc 1 1796 0 +#APP +// 1796 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1 + dmb ish +// 0 "" 2 + .loc 1 1797 0 +#NO_APP + ldr w5, [x19, 252] + cmp w5, 3 + bne .L966 + .loc 1 1817 0 + ldr w0, [x21, 164] + cbz w0, .L951 + .loc 1 1818 0 + ldrsw x0, [x21, 72] + mov x4, x19 + ldp x1, x2, [x19, 152] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] + bl get_auto_image2 +.LVL981: + b .L950 + .p2align 3 +.L965: + .loc 1 1833 0 + ldr w4, [x19, 72] + cbz w4, .L950 + .loc 1 1835 0 + ldr w0, [x21, 164] + cbz w0, .L952 + .loc 1 1836 0 + ldrsw x0, [x21, 72] + mov w6, 3 + .loc 1 1837 0 + ldp x2, x1, [x19, 216] + .loc 1 1836 0 + add x0, x19, x0, lsl 3 + ldrb w3, [x25, 248] + ldr x5, [x25, 320] + ldr x1, [x1, 16] + ldr x0, [x0, 184] + ldr x2, [x2, 16] + bl direct_mode_data_change_part2.isra.8 +.LVL982: + b .L950 + .p2align 3 +.L947: + .loc 1 1799 0 + ldr w0, [x21, 164] + cbz w0, .L949 + .loc 1 1800 0 + ldrsw x0, [x21, 72] + mov w6, 3 + ldp x1, x2, [x19, 152] + mov x5, x19 + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] + bl get_overlay_image2 +.LVL983: + b .L950 + .p2align 3 +.L951: + .loc 1 1825 0 + ldrsw x0, [x21, 72] + mov x4, x19 + ldp x1, x2, [x19, 152] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] + bl get_auto_image +.LVL984: + b .L950 + .p2align 3 +.L949: + .loc 1 1808 0 + ldrsw x0, [x21, 72] + mov w6, 3 + ldp x1, x2, [x19, 152] + mov x5, x19 + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] + bl get_overlay_image +.LVL985: + b .L950 + .p2align 3 +.L953: + .loc 1 1858 0 + ldrsw x0, [x21, 72] + mov w6, 3 + .loc 1 1859 0 + ldp x2, x1, [x19, 216] + .loc 1 1858 0 + add x0, x19, x0, lsl 3 + ldrb w3, [x25, 248] + ldr x5, [x25, 320] + ldr x1, [x1, 16] + ldr x0, [x0, 184] + ldr x2, [x2, 16] + bl direct_mode_data_change.isra.2 +.LVL986: + b .L950 + .p2align 3 +.L952: + .loc 1 1842 0 + ldrsw x0, [x21, 72] + mov w6, 3 + .loc 1 1843 0 + ldp x2, x1, [x19, 216] + .loc 1 1842 0 + add x0, x19, x0, lsl 3 + ldrb w3, [x25, 248] + ldr x5, [x25, 320] + ldr x1, [x1, 16] + ldr x0, [x0, 184] + ldr x2, [x2, 16] + bl direct_mode_data_change_part.isra.9 +.LVL987: + b .L950 + .cfi_endproc +.LFE2836: + .size ebc_auto_assist_tast_function, .-ebc_auto_assist_tast_function + .align 2 + .p2align 3,,7 + .type check_black_percent.isra.11, %function +check_black_percent.isra.11: +.LFB2887: + .loc 1 2254 0 + .cfi_startproc + .loc 1 2265 0 + mov w2, 26215 + .loc 1 2266 0 + cmp w1, 0 + .loc 1 2265 0 + movk w2, 0x6666, lsl 16 + .loc 1 2266 0 + add w5, w1, 7 + csel w5, w5, w1, lt + .loc 1 2265 0 + smull x4, w1, w2 + .loc 1 2266 0 + asr w5, w5, 3 + cmp w5, 0 + .loc 1 2265 0 + asr x4, x4, 34 + sub w4, w4, w1, asr 31 +.LVL988: + .loc 1 2266 0 + ble .L968 + mov x1, 0 + mov w2, 0 +.LVL989: + b .L971 + .p2align 3 +.L979: + cmp w5, w1 + ble .L968 +.L971: + .loc 1 2268 0 + ldr x3, [x0, x1, lsl 3] + add x1, x1, 1 + .loc 1 2269 0 + cmp x3, 0 + cinc w2, w2, ne + .loc 1 2270 0 + cmp w4, w2, lsl 3 + bge .L979 + .loc 1 2271 0 + mov w0, 0 + ret +.L968: + .loc 1 2254 0 + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 2274 0 + adrp x0, .LC35 + add x0, x0, :lo12:.LC35 + .loc 1 2254 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 2274 0 + bl printk +.LVL990: + .loc 1 2276 0 + mov w0, 1 + .loc 1 2277 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2887: + .size check_black_percent.isra.11, .-check_black_percent.isra.11 + .align 2 + .p2align 3,,7 + .type check_diff_percent.isra.12, %function +check_diff_percent.isra.12: +.LFB2888: + .loc 1 2302 0 + .cfi_startproc + .loc 1 2313 0 + mul w8, w2, w3 + mov w4, 34079 + movk w4, 0x51eb, lsl 16 + .loc 1 2314 0 + cmp w2, 0 + add w7, w2, 7 + csel w7, w7, w2, lt + .loc 1 2313 0 + smull x4, w8, w4 + .loc 1 2314 0 + asr w7, w7, 3 + cmp w7, 0 + .loc 1 2313 0 + asr x4, x4, 37 + sub w8, w4, w8, asr 31 +.LVL991: + .loc 1 2314 0 + ble .L985 + mov x2, 0 + mov w9, 0 + mov w4, 0 +.LVL992: + .p2align 2 +.L984: + .loc 1 2318 0 + ldr x6, [x0, x2, lsl 3] + ldr x5, [x1, x2, lsl 3] + add x2, x2, 1 + cmp x6, x5 + beq .L982 + .loc 1 2320 0 + add w4, w4, 1 + .loc 1 2319 0 + mov w9, 1 +.L982: + .loc 1 2322 0 + cmp w8, w4, lsl 3 + blt .L991 + .loc 1 2314 0 + cmp w7, w2 + bgt .L984 +.L988: + .loc 1 2329 0 + mov w0, w9 + ret +.LVL993: +.L985: + .loc 1 2306 0 + mov w9, 0 + b .L988 +.LVL994: +.L991: + .loc 1 2302 0 + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov w1, w3 + .loc 1 2323 0 + adrp x0, .LC36 + add x0, x0, :lo12:.LC36 + .loc 1 2302 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 2323 0 + bl printk +.LVL995: + .loc 1 2324 0 + mov w9, 2 + .loc 1 2329 0 + mov w0, w9 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2888: + .size check_diff_percent.isra.12, .-check_diff_percent.isra.12 + .align 2 + .p2align 3,,7 + .type ebc_probe, %function +ebc_probe: +.LFB2870: + .loc 1 3637 0 + .cfi_startproc +.LVL996: + stp x29, x30, [sp, -208]! + .cfi_def_cfa_offset 208 + .cfi_offset 29, -208 + .cfi_offset 30, -200 +.LBB1938: +.LBB1939: + .loc 2 711 0 + mov w2, 32960 + movk w2, 0x60, lsl 16 +.LBE1939: +.LBE1938: + .loc 1 3637 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x21, x22, [sp, 32] + .cfi_offset 21, -176 + .cfi_offset 22, -168 + .loc 1 3638 0 + add x22, x0, 16 + .loc 1 3637 0 + stp x23, x24, [sp, 48] + .cfi_offset 23, -160 + .cfi_offset 24, -152 + adrp x23, __stack_chk_guard + stp x19, x20, [sp, 16] + add x0, x23, :lo12:__stack_chk_guard +.LVL997: + stp x25, x26, [sp, 64] + stp x27, x28, [sp, 80] + .cfi_offset 19, -192 + .cfi_offset 20, -184 + .cfi_offset 25, -144 + .cfi_offset 26, -136 + .cfi_offset 27, -128 + .cfi_offset 28, -120 + .loc 1 3637 0 + ldr x1, [x0] + str x1, [x29, 200] + mov x1,0 +.LBB1941: +.LBB1940: + .loc 2 711 0 + mov x0, x22 + mov x1, 808 + bl devm_kmalloc +.LVL998: +.LBE1940: +.LBE1941: + .loc 1 3653 0 + cbz x0, .L1054 + .loc 1 3657 0 + adrp x24, .LANCHOR0 + mov x20, x0 + .loc 1 3659 0 + adrp x1, .LC37 + mov w2, 0 + .loc 1 3657 0 + str x0, [x24, #:lo12:.LANCHOR0] + .loc 1 3659 0 + add x1, x1, :lo12:.LC37 + ldr x0, [x22, 752] + .loc 1 3656 0 + str x22, [x20] + .loc 1 3659 0 + bl of_parse_phandle +.LVL999: + .loc 1 3660 0 + cbz x0, .L1092 + .loc 1 3665 0 + bl of_find_device_by_node +.LVL1000: + .loc 1 3667 0 + cbz x0, .L996 +.LBB1942: +.LBB1943: +.LBB1944: + .loc 2 1181 0 + ldr x0, [x0, 200] +.LVL1001: +.LBE1944: +.LBE1943: +.LBE1942: + .loc 1 3670 0 + str x0, [x20, 8] + .loc 1 3671 0 + cbz x0, .L996 + .loc 1 3673 0 + adrp x1, frame_done_callback + add x1, x1, :lo12:frame_done_callback + str x1, [x0, 104] + .loc 1 3675 0 + add x2, x29, 96 + adrp x1, .LC39 + add x1, x1, :lo12:.LC39 + ldr x0, [x22, 752] + bl of_get_property +.LVL1002: + mov x21, x0 +.LVL1003: + .loc 1 3676 0 + ldrsw x0, [x29, 96] +.LVL1004: + lsr x0, x0, 2 +.LVL1005: + str w0, [x29, 96] +.LVL1006: + .loc 1 3677 0 + cmp w0, 0 + beq .L997 + .loc 1 3682 0 discriminator 1 + mov w19, 0 +.LVL1007: + bgt .L1078 + b .L999 + .p2align 3 +.L1000: + .loc 1 3690 0 + bl of_find_i2c_device_by_node +.LVL1008: + .loc 1 3692 0 + cbz x0, .L1093 +.LBB1945: +.LBB1946: +.LBB1947: + .loc 2 1181 0 + ldr x0, [x0, 216] +.LVL1009: +.LBE1947: +.LBE1946: +.LBE1945: + .loc 1 3697 0 + str x0, [x20, 16] + .loc 1 3698 0 + cbnz x0, .L1094 + .loc 1 3682 0 discriminator 2 + ldr w0, [x29, 96] + add w19, w19, 1 +.LVL1010: + cmp w0, w19 + ble .L1004 +.L1078: + ldr w0, [x21], 4 + .loc 1 3684 0 + rev w0, w0 + bl of_find_node_by_phandle +.LVL1011: + .loc 1 3685 0 + cbnz x0, .L1000 + .loc 1 3686 0 + adrp x1, .LC41 + mov x0, x22 + add x1, x1, :lo12:.LC41 + .loc 1 3687 0 + mov w25, -19 + .loc 1 3686 0 + bl _dev_err +.LVL1012: + .p2align 2 +.L992: + .loc 1 3762 0 + add x23, x23, :lo12:__stack_chk_guard + mov w0, w25 +.LVL1013: + ldr x2, [x29, 200] + ldr x1, [x23] + eor x1, x2, x1 + cbnz x1, .L1095 + ldp x19, x20, [sp, 16] +.LVL1014: + ldp x21, x22, [sp, 32] +.LVL1015: + ldp x23, x24, [sp, 48] +.LVL1016: + ldp x25, x26, [sp, 64] +.LVL1017: + ldp x27, x28, [sp, 80] +.LVL1018: + ldp x29, x30, [sp], 208 + .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 +.LVL1019: + .p2align 3 +.L1094: + .cfi_restore_state + .loc 1 3699 0 + adrp x1, .LC43 + mov w2, w19 + add x1, x1, :lo12:.LC43 + mov x0, x22 + bl _dev_info +.LVL1020: +.L999: + .loc 1 3704 0 + ldr x0, [x20, 16] + cbz x0, .L1004 + .loc 1 3710 0 + add x19, x20, 192 +.LVL1021: + .loc 1 3712 0 + add x21, x20, 24 +.LVL1022: + .loc 1 3710 0 + str x22, [x19, 104] +.LBB1948: +.LBB1949: +.LBB1950: +.LBB1951: +.LBB1952: + .file 13 "./include/linux/of.h" + .loc 13 499 0 + adrp x1, .LC45 +.LBE1952: +.LBE1951: +.LBE1950: +.LBE1949: +.LBE1948: + .loc 1 3712 0 + str x22, [x20, 24] +.LBB2028: +.LBB2025: +.LBB1959: +.LBB1956: +.LBB1953: + .loc 13 499 0 + mov x4, 0 +.LBE1953: +.LBE1956: +.LBE1959: +.LBE2025: +.LBE2028: + .loc 1 3713 0 + ldr x2, [x20, 8] +.LBB2029: +.LBB2026: +.LBB1960: +.LBB1957: +.LBB1954: + .loc 13 499 0 + add x1, x1, :lo12:.LC45 +.LBE1954: +.LBE1957: +.LBE1960: +.LBE2026: +.LBE2029: + .loc 1 3714 0 + stp x2, x0, [x21, 8] +.LBB2030: +.LBB2027: +.LBB1961: +.LBB1958: +.LBB1955: + .loc 13 499 0 + mov x3, 1 + ldr x0, [x22, 752] + add x2, x20, 100 + bl of_property_read_variable_u32_array +.LVL1023: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1955: +.LBE1958: +.LBE1961: +.LBB1962: +.LBB1963: +.LBB1964: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC79 + mov x4, 0 + mov x3, 1 + add x2, x20, 104 + add x1, x1, :lo12:.LC79 + bl of_property_read_variable_u32_array +.LVL1024: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1964: +.LBE1963: +.LBE1962: +.LBB1965: +.LBB1966: +.LBB1967: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC80 + mov x4, 0 + mov x3, 1 + add x2, x20, 108 + add x1, x1, :lo12:.LC80 + bl of_property_read_variable_u32_array +.LVL1025: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1967: +.LBE1966: +.LBE1965: +.LBB1968: +.LBB1969: +.LBB1970: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC81 + mov x4, 0 + mov x3, 1 + add x2, x20, 112 + add x1, x1, :lo12:.LC81 + bl of_property_read_variable_u32_array +.LVL1026: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1970: +.LBE1969: +.LBE1968: +.LBB1971: +.LBB1972: +.LBB1973: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC82 + mov x4, 0 + mov x3, 1 + add x2, x20, 128 + add x1, x1, :lo12:.LC82 + bl of_property_read_variable_u32_array +.LVL1027: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1973: +.LBE1972: +.LBE1971: +.LBB1974: +.LBB1975: +.LBB1976: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC83 + mov x4, 0 + mov x3, 1 + add x2, x20, 132 + add x1, x1, :lo12:.LC83 + bl of_property_read_variable_u32_array +.LVL1028: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1976: +.LBE1975: +.LBE1974: +.LBB1977: +.LBB1978: +.LBB1979: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC84 + mov x4, 0 + mov x3, 1 + add x2, x20, 136 + add x1, x1, :lo12:.LC84 + bl of_property_read_variable_u32_array +.LVL1029: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1979: +.LBE1978: +.LBE1977: +.LBB1980: +.LBB1981: +.LBB1982: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC85 + mov x4, 0 + mov x3, 1 + add x2, x20, 140 + add x1, x1, :lo12:.LC85 + bl of_property_read_variable_u32_array +.LVL1030: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1982: +.LBE1981: +.LBE1980: +.LBB1983: +.LBB1984: +.LBB1985: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC86 + mov x4, 0 + mov x3, 1 + add x2, x20, 144 + add x1, x1, :lo12:.LC86 + bl of_property_read_variable_u32_array +.LVL1031: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1985: +.LBE1984: +.LBE1983: +.LBB1986: +.LBB1987: +.LBB1988: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC87 + mov x4, 0 + mov x3, 1 + add x2, x20, 148 + add x1, x1, :lo12:.LC87 + bl of_property_read_variable_u32_array +.LVL1032: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1988: +.LBE1987: +.LBE1986: +.LBB1989: +.LBB1990: +.LBB1991: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC88 + mov x4, 0 + mov x3, 1 + add x2, x20, 152 + add x1, x1, :lo12:.LC88 + bl of_property_read_variable_u32_array +.LVL1033: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1991: +.LBE1990: +.LBE1989: +.LBB1992: +.LBB1993: +.LBB1994: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC89 + mov x4, 0 + mov x3, 1 + add x2, x20, 156 + add x1, x1, :lo12:.LC89 + bl of_property_read_variable_u32_array +.LVL1034: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1994: +.LBE1993: +.LBE1992: +.LBB1995: +.LBB1996: +.LBB1997: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC90 + mov x4, 0 + mov x3, 1 + add x2, x20, 160 + add x1, x1, :lo12:.LC90 + bl of_property_read_variable_u32_array +.LVL1035: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE1997: +.LBE1996: +.LBE1995: +.LBB1998: +.LBB1999: +.LBB2000: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC91 + mov x4, 0 + mov x3, 1 + add x2, x20, 164 + add x1, x1, :lo12:.LC91 + bl of_property_read_variable_u32_array +.LVL1036: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE2000: +.LBE1999: +.LBE1998: +.LBB2001: +.LBB2002: +.LBB2003: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC92 + mov x4, 0 + mov x3, 1 + add x2, x20, 168 + add x1, x1, :lo12:.LC92 + bl of_property_read_variable_u32_array +.LVL1037: + .loc 13 501 0 + tbnz w0, #31, .L1006 +.LBE2003: +.LBE2002: +.LBE2001: +.LBB2004: +.LBB2005: +.LBB2006: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC93 + mov x4, 0 + mov x3, 1 + add x2, x20, 172 + add x1, x1, :lo12:.LC93 + bl of_property_read_variable_u32_array +.LVL1038: + .loc 13 501 0 + tbz w0, #31, .L1042 +.LBE2006: +.LBE2005: +.LBE2004: + .loc 1 2923 0 + str wzr, [x21, 148] +.L1042: +.LBB2007: +.LBB2008: +.LBB2009: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC46 + mov x4, 0 + mov x3, 1 + add x2, x20, 176 + add x1, x1, :lo12:.LC46 + bl of_property_read_variable_u32_array +.LVL1039: + .loc 13 501 0 + tbz w0, #31, .L1043 +.LBE2009: +.LBE2008: +.LBE2007: + .loc 1 2926 0 + str wzr, [x21, 152] +.L1043: +.LBB2010: +.LBB2011: +.LBB2012: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC47 + mov x4, 0 + mov x3, 1 + add x2, x20, 180 + add x1, x1, :lo12:.LC47 + bl of_property_read_variable_u32_array +.LVL1040: + .loc 13 501 0 + tbz w0, #31, .L1044 +.LBE2012: +.LBE2011: +.LBE2010: + .loc 1 2929 0 + str wzr, [x21, 156] +.L1044: +.LBB2013: +.LBB2014: +.LBB2015: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC48 + mov x4, 0 + mov x3, 1 + add x2, x20, 116 + add x1, x1, :lo12:.LC48 + bl of_property_read_variable_u32_array +.LVL1041: + .loc 13 501 0 + tbz w0, #31, .L1045 +.LBE2015: +.LBE2014: +.LBE2013: + .loc 1 2932 0 + str wzr, [x21, 92] +.L1045: +.LBB2016: +.LBB2017: +.LBB2018: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC49 + mov x4, 0 + mov x3, 1 + add x2, x20, 120 + add x1, x1, :lo12:.LC49 + bl of_property_read_variable_u32_array +.LVL1042: + .loc 13 501 0 + tbz w0, #31, .L1046 +.LBE2018: +.LBE2017: +.LBE2016: + .loc 1 2935 0 + str wzr, [x21, 96] +.L1046: +.LBB2019: +.LBB2020: +.LBB2021: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC50 + mov x4, 0 + mov x3, 1 + add x2, x20, 184 + add x1, x1, :lo12:.LC50 + bl of_property_read_variable_u32_array +.LVL1043: + .loc 13 501 0 + tbz w0, #31, .L1047 +.LBE2021: +.LBE2020: +.LBE2019: + .loc 1 2938 0 + str wzr, [x21, 160] +.L1047: +.LBB2022: +.LBB2023: +.LBB2024: + .loc 13 499 0 + ldr x0, [x22, 752] + adrp x1, .LC51 + mov x4, 0 + mov x3, 1 + add x2, x20, 188 + add x1, x1, :lo12:.LC51 + bl of_property_read_variable_u32_array +.LVL1044: + .loc 13 501 0 + tbz w0, #31, .L1048 +.LBE2024: +.LBE2023: +.LBE2022: + .loc 1 2941 0 + str wzr, [x21, 164] +.L1048: +.LBE2027: +.LBE2030: + .loc 1 3722 0 + ldr w0, [x21, 88] + str w0, [x19, 92] + .loc 1 3723 0 + ldr w1, [x21, 84] + str w1, [x19, 96] + .loc 1 3724 0 + mul w0, w0, w1 + str w0, [x19, 28] +.LBB2031: +.LBB2032: + .loc 1 3404 0 + cmp w0, 5242880 +.LBE2032: +.LBE2031: + .loc 1 3725 0 + lsr w0, w0, 2 + str w0, [x19, 32] +.LBB2044: +.LBB2037: + .loc 1 3395 0 + ldr x26, [x20] +.LVL1045: + .loc 1 3404 0 + bgt .L1096 + .loc 1 3410 0 + ldr x0, [x26, 752] + adrp x1, .LC53 + mov w2, 0 + add x1, x1, :lo12:.LC53 + bl of_parse_phandle +.LVL1046: + .loc 1 3411 0 + cbz x0, .L1055 + .loc 1 3414 0 + add x2, x29, 104 + mov w1, 0 + bl of_address_to_resource +.LVL1047: + mov w25, w0 + .loc 1 3416 0 + cbnz w0, .L1097 +.LBB2033: +.LBB2034: + .file 14 "./include/linux/ioport.h" + .loc 14 204 0 + ldp x1, x2, [x29, 104] +.LBE2034: +.LBE2033: + .loc 1 3421 0 + str x1, [x20, 192] + .loc 1 3423 0 + mov w0, 53477375 +.LBB2036: +.LBB2035: + .loc 14 204 0 + add x2, x2, 1 + sub x2, x2, x1 +.LBE2035: +.LBE2036: + .loc 1 3422 0 + str w2, [x19, 24] + .loc 1 3423 0 + cmp w2, w0 + ble .L1098 + .loc 1 3427 0 + sxtw x2, w2 + mov x3, 1 + mov x0, x26 + bl devm_memremap +.LVL1048: + str x0, [x19, 8] + .loc 1 3429 0 + cbz x0, .L1099 + .loc 1 3438 0 + mov x1, x0 + ldr w2, [x19, 24] + ldr x0, [x20, 192] + mov w4, 4 + mov w3, 5242880 + bl ebc_buf_init +.LVL1049: + .loc 1 3439 0 + cbnz w0, .L1056 + .loc 1 3442 0 + ldr x1, [x19, 8] + mov x0, 20971520 + .loc 1 3447 0 + mov x4, 2097152 + .loc 1 3446 0 + mov x2, 26214400 + .loc 1 3442 0 + add x0, x1, x0 + str x0, [x19, 16] + .loc 1 3447 0 + str x4, [x21, 40] + .loc 1 3446 0 + add x6, x1, x2 + str x6, [x21, 24] + mov x5, 28311552 + add x3, x1, x5 + .loc 1 3448 0 + ldr x0, [x20, 192] + add x2, x0, x2 + str x2, [x21, 32] + .loc 1 3449 0 + str x6, [x19, 184] + .loc 1 3448 0 + add x0, x0, x5 + .loc 1 3447 0 + str x4, [x21, 64] + .loc 1 3454 0 + mov x2, 35651584 + .loc 1 3448 0 + stp x3, x0, [x21, 48] + .loc 1 3454 0 + add x2, x1, x2 + .loc 1 3453 0 + mov x0, 30408704 + add x0, x1, x0 + .loc 1 3454 0 + stp x0, x2, [x19, 152] + .loc 1 3457 0 + mov x0, 40894464 + .loc 1 3461 0 + mov x2, 51380224 + .loc 1 3457 0 + add x0, x1, x0 + .loc 1 3461 0 + add x2, x1, x2 + .loc 1 3449 0 + str x3, [x19, 192] + .loc 1 3461 0 + str x2, [x19, 128] + .loc 1 3462 0 + mov x2, 52428800 + .loc 1 3457 0 + str x0, [x19, 168] + .loc 1 3458 0 + mov x0, 46137344 + add x0, x1, x0 + .loc 1 3462 0 + add x1, x1, x2 + .loc 1 3458 0 + str x0, [x19, 176] + .loc 1 3462 0 + str x1, [x19, 136] + .loc 1 3464 0 + ldp w2, w1, [x21, 84] + mul w2, w2, w1 + mov w1, 0 + bl memset +.LVL1050: + .loc 1 3465 0 + ldp w3, w2, [x21, 84] + mov w1, 0 + ldr x0, [x19, 168] + mul w2, w3, w2 + bl memset +.LVL1051: +.LBE2037: +.LBE2044: +.LBB2045: +.LBB2046: + .loc 1 3352 0 + ldr x26, [x19, 104] +.LVL1052: + .loc 1 3358 0 + adrp x1, .LC57 + mov w2, 0 + add x1, x1, :lo12:.LC57 + ldr x0, [x26, 752] + bl of_parse_phandle +.LVL1053: + .loc 1 3359 0 + cbz x0, .L1057 + .loc 1 3362 0 + add x2, x29, 104 + mov w1, 0 + bl of_address_to_resource +.LVL1054: + mov w25, w0 + .loc 1 3364 0 + cbz w0, .L1100 +.L1018: +.LBE2046: +.LBE2045: + .loc 1 3737 0 + adrp x1, .LC95 + mov x0, x22 + add x1, x1, :lo12:.LC95 + bl _dev_err +.LVL1055: + .loc 1 3738 0 + b .L992 +.LVL1056: + .p2align 3 +.L1006: + .loc 1 3720 0 + mov w25, -22 + .loc 1 3719 0 + adrp x1, .LC99 + mov w2, w25 + add x1, x1, :lo12:.LC99 + mov x0, x22 + bl _dev_err +.LVL1057: + .loc 1 3720 0 + b .L992 +.LVL1058: + .p2align 3 +.L1093: + .loc 1 3693 0 + adrp x1, .LC42 + mov x0, x22 +.LVL1059: + add x1, x1, :lo12:.LC42 + .loc 1 3694 0 + mov w25, -19 + .loc 1 3693 0 + bl _dev_err +.LVL1060: + .loc 1 3694 0 + b .L992 +.LVL1061: + .p2align 3 +.L1004: + .loc 1 3705 0 + adrp x1, .LC44 + mov x0, x22 + add x1, x1, :lo12:.LC44 + .loc 1 3706 0 + mov w25, -517 + .loc 1 3705 0 + bl _dev_err +.LVL1062: + .loc 1 3706 0 + b .L992 +.LVL1063: +.L1100: +.LBB2055: +.LBB2051: + .loc 1 3373 0 + mov x0, x26 + mov x3, 1 +.LBB2047: +.LBB2048: + .loc 14 204 0 + ldp x1, x26, [x29, 104] +.LVL1064: +.LBE2048: +.LBE2047: + .loc 1 3370 0 + str x1, [x19, 40] +.LBB2050: +.LBB2049: + .loc 14 204 0 + add x26, x26, 1 + sub x26, x26, x1 +.LBE2049: +.LBE2050: + .loc 1 3371 0 + str w26, [x19, 48] + .loc 1 3373 0 + sxtw x2, w26 + bl devm_memremap +.LVL1065: + str x0, [x19, 208] + .loc 1 3375 0 + cbz x0, .L1101 + .loc 1 3380 0 + bl epd_lut_from_mem_init +.LVL1066: + .loc 1 3381 0 + tbnz w0, #31, .L1102 +.L1020: +.LBE2051: +.LBE2055: +.LBB2056: +.LBB2057: + .loc 1 3474 0 + add x24, x24, :lo12:.LANCHOR0 + .loc 1 3472 0 + mov w26, 99 + .loc 1 3474 0 + adrp x3, .LC96 + adrp x0, ebc_auto_tast_function + add x3, x3, :lo12:.LC96 + add x0, x0, :lo12:ebc_auto_tast_function + mov w2, -1 + mov x1, x19 + .loc 1 3472 0 + str w26, [x29, 104] + .loc 1 3474 0 + bl kthread_create_on_node +.LVL1067: + str x0, [x24, 8] + .loc 1 3475 0 + cmn x0, #4096 + bhi .L1103 + .loc 1 3479 0 + add x2, x29, 104 + mov w1, 1 + bl sched_setscheduler_nocheck +.LVL1068: + .loc 1 3480 0 + ldr x2, [x24, 8] +.LBB2058: +.LBB2059: + .file 15 "./arch/arm64/include/asm/atomic_lse.h" + .loc 15 47 0 + mov w0, 1 +.LVL1069: + add x1, x2, 48 +.LVL1070: +#APP +// 47 "./arch/arm64/include/asm/atomic_lse.h" 1 + .arch_extension lse +.if 1 == 1 +661: + bl __ll_sc_atomic_add + +662: +.pushsection .altinstructions,"a" + .word 661b - . + .word 663f - . + .hword 5 + .byte 662b-661b + .byte 664f-663f +.popsection +.pushsection .altinstr_replacement, "a" +663: + .arch_extension lse + stadd w0, [x1] + +664: + .popsection + .org . - (664b-663b) + (662b-661b) + .org . - (662b-661b) + (664b-663b) +.endif + +// 0 "" 2 +.LVL1071: +#NO_APP +.LBE2059: +.LBE2058: + .loc 1 3483 0 + adrp x3, .LC62 + adrp x0, ebc_auto_assist_tast_function +.LVL1072: + add x3, x3, :lo12:.LC62 + add x0, x0, :lo12:ebc_auto_assist_tast_function + mov w2, -1 + mov x1, x19 + bl kthread_create_on_node +.LVL1073: + str x0, [x24, 16] + .loc 1 3484 0 + cmn x0, #4096 + bhi .L1104 + .loc 1 3488 0 + add x2, x29, 104 + mov w1, 1 + bl sched_setscheduler_nocheck +.LVL1074: + .loc 1 3489 0 + ldr x2, [x24, 16] +.LBB2060: +.LBB2061: + .loc 15 47 0 + mov w0, 1 +.LVL1075: + add x1, x2, 48 +.LVL1076: +#APP +// 47 "./arch/arm64/include/asm/atomic_lse.h" 1 + .arch_extension lse +.if 1 == 1 +661: + bl __ll_sc_atomic_add + +662: +.pushsection .altinstructions,"a" + .word 661b - . + .word 663f - . + .hword 5 + .byte 662b-661b + .byte 664f-663f +.popsection +.pushsection .altinstr_replacement, "a" +663: + .arch_extension lse + stadd w0, [x1] + +664: + .popsection + .org . - (664b-663b) + (662b-661b) + .org . - (662b-661b) + (664b-663b) +.endif + +// 0 "" 2 +.LVL1077: +#NO_APP +.LBE2061: +.LBE2060: + .loc 1 3490 0 + ldr x0, [x19, 104] +.LVL1078: + adrp x1, .LC64 + add x1, x1, :lo12:.LC64 + bl _dev_info +.LVL1079: + .loc 1 3493 0 + str w26, [x29, 104] +.LBB2062: + .loc 1 3494 0 + adrp x3, .LC65 + adrp x0, ebc_thread + add x3, x3, :lo12:.LC65 + add x0, x0, :lo12:ebc_thread + mov w2, -1 + mov x1, x19 + bl kthread_create_on_node +.LVL1080: + mov x26, x0 +.LVL1081: + cmn x0, #4096 + bhi .L1023 + bl wake_up_process +.LVL1082: +.LBE2062: + str x26, [x24, 24] + .loc 1 3499 0 + add x2, x29, 104 + mov x0, x26 + mov w1, 1 + bl sched_setscheduler_nocheck +.LVL1083: + .loc 1 3500 0 + ldr x2, [x24, 24] +.LBB2063: +.LBB2064: + .loc 15 47 0 + mov w0, 1 +.LVL1084: + add x1, x2, 48 +.LVL1085: +#APP +// 47 "./arch/arm64/include/asm/atomic_lse.h" 1 + .arch_extension lse +.if 1 == 1 +661: + bl __ll_sc_atomic_add + +662: +.pushsection .altinstructions,"a" + .word 661b - . + .word 663f - . + .hword 5 + .byte 662b-661b + .byte 664f-663f +.popsection +.pushsection .altinstr_replacement, "a" +663: + .arch_extension lse + stadd w0, [x1] + +664: + .popsection + .org . - (664b-663b) + (662b-661b) + .org . - (662b-661b) + (664b-663b) +.endif + +// 0 "" 2 +.LVL1086: +#NO_APP +.LBE2064: +.LBE2063: +.LBE2057: +.LBE2056: +.LBB2068: +.LBB2069: + .loc 1 3509 0 + mov w1, -1 + .loc 1 3510 0 + stp w1, wzr, [x19, 84] + .loc 1 3521 0 + add x1, x19, 512 +.LBB2070: +.LBB2071: + .loc 11 39 0 + add x0, x20, 448 +.LVL1087: +.LBE2071: +.LBE2070: + .loc 1 3514 0 + str wzr, [x19, 52] + .loc 1 3516 0 + mov w27, 1 + .loc 1 3515 0 + str wzr, [x19, 68] + .loc 1 3528 0 + add x24, x20, 664 + .loc 1 3513 0 + str wzr, [x19, 100] + .loc 1 3529 0 + adrp x26, jiffies +.LVL1088: + .loc 1 3508 0 + str wzr, [x19, 200] + .loc 1 3529 0 + mov x28, 268435455 + .loc 1 3516 0 + stp wzr, w27, [x19, 248] + .loc 1 3511 0 + str wzr, [x19, 584] + .loc 1 3512 0 + str wzr, [x19, 588] + .loc 1 3521 0 + stp w27, w27, [x1, 88] + stp w27, wzr, [x1, 96] +.LBB2073: +.LBB2072: + .loc 11 43 0 + adrp x1, .LC66 + .loc 11 42 0 + stp xzr, xzr, [x0] + .loc 11 43 0 + add x1, x1, :lo12:.LC66 + .loc 11 42 0 + stp xzr, xzr, [x0, 16] + stp xzr, xzr, [x0, 32] + stp xzr, xzr, [x0, 48] + stp xzr, xzr, [x0, 64] + stp xzr, xzr, [x0, 80] + stp xzr, xzr, [x0, 96] + stp xzr, xzr, [x0, 112] + stp xzr, xzr, [x0, 128] + stp xzr, xzr, [x0, 144] + stp xzr, xzr, [x0, 160] + stp xzr, xzr, [x0, 176] + stp xzr, xzr, [x0, 192] + .loc 11 43 0 + str x1, [x20, 448] + .loc 11 45 0 + bl wakeup_source_add +.LVL1089: +.LBE2072: +.LBE2073: + .loc 1 3525 0 + str wzr, [x19, 464] + .loc 1 3528 0 + mov x4, 0 + mov x3, 0 + mov w2, 0 + mov x0, x24 + adrp x1, ebc_frame_control_timeout + add x1, x1, :lo12:ebc_frame_control_timeout + bl init_timer_key +.LVL1090: + .loc 1 3529 0 + ldr x1, [x26, #:lo12:jiffies] + mov x0, x24 + .loc 1 3532 0 + add x24, x20, 720 + .loc 1 3529 0 + add x1, x1, x28 + bl mod_timer +.LVL1091: + .loc 1 3532 0 + mov x4, 0 + mov x3, 0 + mov w2, 0 + mov x0, x24 + adrp x1, ebc_frame_timeout + add x1, x1, :lo12:ebc_frame_timeout + bl init_timer_key +.LVL1092: + .loc 1 3533 0 + ldr x1, [x26, #:lo12:jiffies] + mov x0, x24 + add x1, x1, x28 + bl mod_timer +.LVL1093: +.LBE2069: +.LBE2068: +.LBB2074: +.LBB2075: + .loc 1 3555 0 + adrp x0, saved_command_line + adrp x1, .LC67 + .loc 1 3552 0 + stp wzr, wzr, [x29, 100] +.LVL1094: + .loc 1 3555 0 + add x1, x1, :lo12:.LC67 + ldr x24, [x0, #:lo12:saved_command_line] + mov x0, x24 + bl strstr +.LVL1095: + .loc 1 3556 0 + adrp x1, .LC68 + .loc 1 3555 0 + mov x26, x0 +.LVL1096: + .loc 1 3556 0 + add x1, x1, :lo12:.LC68 + mov x0, x24 + bl strstr +.LVL1097: + mov x24, x0 +.LVL1098: + .loc 1 3561 0 + cbz x26, .L1024 + .loc 1 3562 0 + add x2, x29, 100 + mov x0, x26 + adrp x1, .LC69 + add x1, x1, :lo12:.LC69 + bl sscanf +.LVL1099: + .loc 1 3563 0 + ldr w2, [x29, 100] + ldr x0, [x20, 192] + cmp x0, x2, uxtw + bls .L1105 +.L1024: + .loc 1 3575 0 + mov w26, 0 +.LVL1100: + mov x28, 0 +.LVL1101: + .loc 1 3559 0 + mov x27, 0 +.LVL1102: + .loc 1 3575 0 + cbz x24, .L1052 +.L1051: + .loc 1 3576 0 + add x2, x29, 104 + mov x0, x24 + adrp x1, .LC72 + add x1, x1, :lo12:.LC72 + bl sscanf +.LVL1103: + .loc 1 3554 0 + mov w24, 0 +.LVL1104: + .loc 1 3577 0 + ldr w2, [x29, 104] + .loc 1 3559 0 + mov x27, 0 + .loc 1 3577 0 + ldr x0, [x20, 192] + cmp x0, x2, uxtw + bls .L1106 +.L1028: + .loc 1 3589 0 + cbnz w26, .L1027 +.LVL1105: +.L1052: + .loc 1 3590 0 + ldr x0, [x19, 104] + adrp x1, .LC75 + add x1, x1, :lo12:.LC75 + bl _dev_info +.LVL1106: + .loc 1 3591 0 + ldr x0, [x20, 16] + bl ebc_pmic_verity_vcom +.LVL1107: +.LBB2076: +.LBB2077: + .loc 1 2844 0 + adrp x0, .LC76 + add x0, x0, :lo12:.LC76 + bl ebc_empty_buf_get +.LVL1108: + mov x26, x0 +.LVL1109: + .loc 1 2845 0 + ldp w2, w0, [x20, 108] + mov w1, 240 + mul w2, w2, w0 + ldr x0, [x26, 16] + bl memset +.LVL1110: + .loc 1 2848 0 + stp wzr, wzr, [x26, 48] + .loc 1 2846 0 + mov w0, 17 + str w0, [x26, 40] + .loc 1 2851 0 + mov w2, 1 + .loc 1 2852 0 + mov x0, x26 + .loc 1 2849 0 + ldr w1, [x20, 108] + str w1, [x26, 56] + .loc 1 2850 0 + ldr w1, [x20, 112] + .loc 1 2851 0 + stp w1, w2, [x26, 60] + .loc 1 2852 0 + bl ebc_add_to_dsp_buf_list +.LVL1111: +.L1030: +.LBE2077: +.LBE2076: + .loc 1 3609 0 + cbnz w24, .L1107 +.L1035: + .loc 1 3623 0 + ldr w0, [x19, 100] + adrp x21, .LANCHOR1 + cbz w0, .L1108 +.L1040: + .loc 1 3628 0 + cbz x28, .L1041 + .loc 1 3629 0 + mov x0, x28 + bl kfree +.LVL1112: +.L1041: + .loc 1 3630 0 + cbz x27, .L1026 + .loc 1 3631 0 + mov x0, x27 + bl kfree +.LVL1113: +.L1026: +.LBE2075: +.LBE2074: +.LBB2095: +.LBB2096: +.LBB2097: + .loc 2 1186 0 + str x20, [x22, 184] +.LBE2097: +.LBE2096: +.LBE2095: +.LBB2098: +.LBB2099: + .loc 1 3334 0 + add x21, x21, :lo12:.LANCHOR1 + add x0, x21, 224 + bl misc_register +.LVL1114: + .loc 1 3335 0 + add x0, x21, 376 + bl misc_register +.LVL1115: + .loc 1 3337 0 + ldr x0, [x20, 296] + add x1, x21, 456 + bl device_create_file +.LVL1116: + .loc 1 3338 0 + ldr x0, [x20, 296] + add x1, x21, 488 + bl device_create_file +.LVL1117: + .loc 1 3339 0 + ldr x0, [x20, 296] + add x1, x21, 520 + bl device_create_file +.LVL1118: + .loc 1 3340 0 + ldr x0, [x20, 296] + add x1, x21, 552 + bl device_create_file +.LVL1119: + .loc 1 3341 0 + ldr x0, [x20, 296] + add x1, x21, 584 + bl device_create_file +.LVL1120: + .loc 1 3342 0 + ldr x0, [x20, 296] + add x1, x21, 616 + bl device_create_file +.LVL1121: + .loc 1 3343 0 + ldr x0, [x20, 296] + add x1, x21, 648 + bl device_create_file +.LVL1122: + .loc 1 3344 0 + ldr x0, [x20, 296] + add x1, x21, 680 + bl device_create_file +.LVL1123: +.LBE2099: +.LBE2098: + .loc 1 3759 0 + ldr x0, [x19, 104] + adrp x2, .LC26 + adrp x1, .LC78 + add x2, x2, :lo12:.LC26 + add x1, x1, :lo12:.LC78 + bl _dev_info +.LVL1124: + .loc 1 3761 0 + b .L992 +.LVL1125: +.L1097: +.LBB2100: +.LBB2038: + .loc 1 3417 0 + adrp x1, .LC54 + mov x0, x26 + add x1, x1, :lo12:.LC54 + bl _dev_err +.LVL1126: +.L1014: +.LBE2038: +.LBE2100: + .loc 1 3730 0 + adrp x1, .LC94 + mov x0, x22 + add x1, x1, :lo12:.LC94 + bl _dev_err +.LVL1127: + .loc 1 3731 0 + b .L992 +.LVL1128: +.L1108: +.LBB2101: +.LBB2092: + .loc 1 3624 0 + mov w2, 1 + str w2, [x19, 100] + .loc 1 3625 0 + add x0, x21, :lo12:.LANCHOR1 + mov w1, w2 + add x0, x0, 304 + bl __wake_up_sync +.LVL1129: + b .L1040 +.LVL1130: +.L1105: + .loc 1 3565 0 + ldr x0, [x19, 104] + adrp x1, .LC70 + add x1, x1, :lo12:.LC70 + bl _dev_info +.LVL1131: + .loc 1 3566 0 + ldp w0, w1, [x21, 84] + mul w0, w0, w1 +.LBB2078: +.LBB2079: +.LBB2080: + .file 16 "./include/linux/slab.h" + .loc 16 553 0 + mov w1, 32960 + movk w1, 0x60, lsl 16 + lsr w0, w0, 1 + bl __kmalloc +.LVL1132: + mov x28, x0 +.LVL1133: +.LBE2080: +.LBE2079: +.LBE2078: + .loc 1 3567 0 + cbz x0, .L1109 + .loc 1 3571 0 + ldp w2, w1, [x21, 84] + ldr x3, [x20, 192] + mul w2, w2, w1 + ldr w1, [x29, 100] +.LVL1134: + sub x1, x1, x3 +.LVL1135: + ldr x3, [x19, 8] + lsr w2, w2, 1 + add x1, x3, x1 + bl memcpy +.LVL1136: + .loc 1 3575 0 + cbnz x24, .L1110 + .loc 1 3554 0 + mov w24, 0 +.LVL1137: + .loc 1 3559 0 + mov x27, 0 +.LVL1138: +.L1027: + .loc 1 3596 0 + adrp x0, .LC77 + add x0, x0, :lo12:.LC77 + bl ebc_empty_buf_get +.LVL1139: + mov x5, x0 + .loc 1 3597 0 + cbz x0, .L1030 + .loc 1 3598 0 + ldp w4, w0, [x21, 84] +.LBB2081: +.LBB2082: + .loc 1 3541 0 + mov x1, 0 + ldr x2, [x5, 16] +.LVL1140: +.LBE2082: +.LBE2081: + .loc 1 3598 0 + mul w4, w4, w0 + lsr w4, w4, 1 +.LBB2084: +.LBB2083: + .loc 1 3541 0 + cbz w4, .L1033 + .p2align 2 +.L1077: + .loc 1 3542 0 + ldrb w0, [x28, x1] +.LVL1141: + add x1, x1, 1 + .loc 1 3541 0 + cmp w4, w1 + .loc 1 3544 0 + and w3, w0, -16 + .loc 1 3543 0 + lsl w0, w0, 4 +.LVL1142: + strb w0, [x2], 2 + .loc 1 3544 0 + strb w3, [x2, -1] + .loc 1 3541 0 + bgt .L1077 +.L1033: +.LBE2083: +.LBE2084: + .loc 1 3601 0 + stp wzr, wzr, [x5, 48] + .loc 1 3599 0 + mov w0, 7 + str w0, [x5, 40] + .loc 1 3604 0 + mov w2, 1 +.LVL1143: + .loc 1 3605 0 + mov x0, x5 + .loc 1 3602 0 + ldr w1, [x21, 84] + str w1, [x5, 56] + .loc 1 3603 0 + ldr w1, [x21, 88] + .loc 1 3604 0 + stp w1, w2, [x5, 60] + .loc 1 3605 0 + bl ebc_add_to_dsp_buf_list +.LVL1144: + b .L1030 +.LVL1145: +.L1106: + .loc 1 3579 0 + ldr x0, [x19, 104] + adrp x1, .LC73 + add x1, x1, :lo12:.LC73 + bl _dev_info +.LVL1146: + .loc 1 3580 0 + ldp w0, w1, [x21, 84] + mul w0, w0, w1 +.LBB2085: +.LBB2086: +.LBB2087: + .loc 16 553 0 + mov w1, 32960 + movk w1, 0x60, lsl 16 + lsr w0, w0, 1 + bl __kmalloc +.LVL1147: + mov x27, x0 +.LBE2087: +.LBE2086: +.LBE2085: + .loc 1 3581 0 + cbz x0, .L1111 + .loc 1 3585 0 + ldp w2, w1, [x21, 84] + .loc 1 3578 0 + mov w24, 1 + .loc 1 3585 0 + ldr x3, [x20, 192] + mul w2, w2, w1 + ldr w1, [x29, 104] +.LVL1148: + sub x1, x1, x3 +.LVL1149: + ldr x3, [x19, 8] + lsr w2, w2, 1 + add x1, x3, x1 + bl memcpy +.LVL1150: + b .L1028 +.LVL1151: +.L996: +.LBE2092: +.LBE2101: + .loc 1 3668 0 + mov w25, -517 + b .L992 +.LVL1152: +.L1107: +.LBB2102: +.LBB2093: + .loc 1 3610 0 + adrp x0, .LC77 + add x0, x0, :lo12:.LC77 + bl ebc_empty_buf_get +.LVL1153: + .loc 1 3611 0 + cbz x0, .L1035 + .loc 1 3612 0 + ldp w5, w1, [x21, 84] +.LBB2088: +.LBB2089: + .loc 1 3541 0 + mov x2, 0 + ldr x3, [x0, 16] +.LVL1154: +.LBE2089: +.LBE2088: + .loc 1 3612 0 + mul w5, w5, w1 + lsr w5, w5, 1 +.LBB2091: +.LBB2090: + .loc 1 3541 0 + cbz w5, .L1039 + .p2align 2 +.L1076: + .loc 1 3542 0 + ldrb w1, [x27, x2] +.LVL1155: + add x2, x2, 1 + .loc 1 3541 0 + cmp w5, w2 + .loc 1 3544 0 + and w4, w1, -16 + .loc 1 3543 0 + lsl w1, w1, 4 +.LVL1156: + strb w1, [x3], 2 + .loc 1 3544 0 + strb w4, [x3, -1] + .loc 1 3541 0 + bgt .L1076 +.L1039: +.LBE2090: +.LBE2091: + .loc 1 3613 0 + mov w1, 7 + .loc 1 3615 0 + stp wzr, wzr, [x0, 48] + .loc 1 3613 0 + str w1, [x0, 40] + .loc 1 3618 0 + mov w2, 1 + .loc 1 3616 0 + ldr w1, [x21, 84] + str w1, [x0, 56] + .loc 1 3617 0 + ldr w1, [x21, 88] + .loc 1 3618 0 + stp w1, w2, [x0, 60] + .loc 1 3619 0 + bl ebc_add_to_dsp_buf_list +.LVL1157: + b .L1035 +.LVL1158: +.L1054: +.LBE2093: +.LBE2102: + .loc 1 3654 0 + mov w25, -12 + b .L992 +.LVL1159: +.L997: + .loc 1 3678 0 + adrp x1, .LC40 + mov x0, x22 + add x1, x1, :lo12:.LC40 + .loc 1 3679 0 + mov w25, -22 + .loc 1 3678 0 + bl _dev_err +.LVL1160: + .loc 1 3679 0 + b .L992 +.LVL1161: +.L1102: +.LBB2103: +.LBB2052: + .loc 1 3382 0 + ldr x0, [x19, 104] + adrp x1, .LC59 + add x1, x1, :lo12:.LC59 + bl _dev_err +.LVL1162: + .loc 1 3383 0 + ldr x0, [x19, 104] + mov w2, w26 + ldr x1, [x19, 208] + bl epd_lut_from_file_init +.LVL1163: + .loc 1 3384 0 + tbz w0, #31, .L1020 + .loc 1 3385 0 + ldr x0, [x19, 104] + adrp x1, .LC60 + .loc 1 3386 0 + mov w25, -1 + .loc 1 3385 0 + add x1, x1, :lo12:.LC60 + bl _dev_err +.LVL1164: + b .L1018 +.LVL1165: + .p2align 3 +.L1096: +.LBE2052: +.LBE2103: +.LBB2104: +.LBB2039: + .loc 1 3405 0 + adrp x1, .LC52 + mov x0, x26 + add x1, x1, :lo12:.LC52 + .loc 1 3406 0 + mov w25, -19 + .loc 1 3405 0 + bl _dev_err +.LVL1166: + b .L1014 +.LVL1167: +.L1103: +.LBE2039: +.LBE2104: +.LBB2105: +.LBB2065: + .loc 1 3476 0 + ldr x0, [x19, 104] + adrp x1, .LC61 + add x1, x1, :lo12:.LC61 + bl _dev_err +.LVL1168: +.L1021: +.LBE2065: +.LBE2105: + .loc 1 3744 0 + adrp x1, .LC98 + mov x0, x22 + add x1, x1, :lo12:.LC98 + .loc 1 3745 0 + mov w25, -1 + .loc 1 3744 0 + bl _dev_err +.LVL1169: + .loc 1 3745 0 + b .L992 +.LVL1170: +.L1104: +.LBB2106: +.LBB2066: + .loc 1 3485 0 + ldr x0, [x19, 104] + adrp x1, .LC63 + add x1, x1, :lo12:.LC63 + bl _dev_err +.LVL1171: + b .L1021 +.LVL1172: +.L1056: +.LBE2066: +.LBE2106: +.LBB2107: +.LBB2040: + .loc 1 3440 0 + mov w25, -12 + b .L1014 +.LVL1173: +.L1023: +.LBE2040: +.LBE2107: +.LBB2108: +.LBB2067: + .loc 1 3496 0 + ldr x0, [x19, 104] +.LVL1174: + adrp x1, .LC97 + .loc 1 3494 0 + str x26, [x24, 24] + .loc 1 3496 0 + add x1, x1, :lo12:.LC97 + bl _dev_err +.LVL1175: + b .L1021 +.LVL1176: +.L1098: +.LBE2067: +.LBE2108: +.LBB2109: +.LBB2041: + .loc 1 3424 0 + adrp x1, .LC55 + mov w2, 53477376 + add x1, x1, :lo12:.LC55 + mov x0, x26 + .loc 1 3425 0 + mov w25, -19 + .loc 1 3424 0 + bl _dev_err +.LVL1177: + b .L1014 +.LVL1178: +.L1092: +.LBE2041: +.LBE2109: + .loc 1 3661 0 + adrp x1, .LC38 + mov x0, x22 + add x1, x1, :lo12:.LC38 + .loc 1 3662 0 + mov w25, -19 + .loc 1 3661 0 + bl _dev_err +.LVL1179: + .loc 1 3662 0 + b .L992 +.LVL1180: +.L1055: +.LBB2110: +.LBB2042: + .loc 1 3412 0 + mov w25, -19 + b .L1014 +.LVL1181: +.L1057: +.LBE2042: +.LBE2110: +.LBB2111: +.LBB2053: + .loc 1 3360 0 + mov w25, -19 + b .L1018 +.LVL1182: +.L1099: +.LBE2053: +.LBE2111: +.LBB2112: +.LBB2043: + .loc 1 3430 0 + adrp x1, .LC56 + mov x0, x26 + add x1, x1, :lo12:.LC56 + .loc 1 3431 0 + mov w25, -12 + .loc 1 3430 0 + bl _dev_err +.LVL1183: + b .L1014 +.LVL1184: +.L1095: +.LBE2043: +.LBE2112: + .loc 1 3762 0 + bl __stack_chk_fail +.LVL1185: +.L1110: +.LBB2113: +.LBB2094: + .loc 1 3564 0 + mov w26, w27 +.LVL1186: + b .L1051 +.LVL1187: +.L1109: + .loc 1 3568 0 + ldr x0, [x19, 104] +.LVL1188: + adrp x1, .LC71 + adrp x21, .LANCHOR1 + add x1, x1, :lo12:.LC71 + bl _dev_err +.LVL1189: + b .L1026 +.LVL1190: +.L1111: + .loc 1 3582 0 + ldr x0, [x19, 104] +.LVL1191: + adrp x1, .LC74 + adrp x21, .LANCHOR1 + add x1, x1, :lo12:.LC74 + bl _dev_err +.LVL1192: + b .L1026 +.LVL1193: +.L1101: +.LBE2094: +.LBE2113: +.LBB2114: +.LBB2054: + .loc 1 3376 0 + ldr x0, [x19, 104] + adrp x2, .LANCHOR3 + add x2, x2, :lo12:.LANCHOR3 + adrp x1, .LC58 + mov w3, 3376 + add x2, x2, 32 + add x1, x1, :lo12:.LC58 + .loc 1 3377 0 + mov w25, -12 + .loc 1 3376 0 + bl _dev_err +.LVL1194: + b .L1018 +.LBE2054: +.LBE2114: + .cfi_endproc +.LFE2870: + .size ebc_probe, .-ebc_probe + .align 2 + .p2align 3,,7 + .type auto_frame_state_read, %function +auto_frame_state_read: +.LFB2862: + .loc 1 3316 0 + .cfi_startproc +.LVL1195: + .loc 1 3317 0 + adrp x0, .LANCHOR0 +.LVL1196: + ldr x1, [x0, #:lo12:.LANCHOR0] +.LVL1197: + .loc 1 3321 0 + ldp w0, w4, [x1, 108] + mul w4, w4, w0 + cbz w4, .L1113 + .loc 1 3322 0 + ldr x5, [x1, 360] + mov w1, 0 +.LVL1198: + ldrb w3, [x5] + cbz w3, .L1116 + b .L1114 + .p2align 3 +.L1118: + ldrb w3, [x5, w1, sxtw] + cbnz w3, .L1114 +.L1116: + .loc 1 3321 0 discriminator 2 + add w1, w1, 1 + cmp w1, w4 + bne .L1118 +.L1113: +.LBB2117: +.LBB2118: + .loc 1 3327 0 + adrp x1, .LC100 +.LVL1199: + add x1, x1, :lo12:.LC100 + mov x0, 2 + ldrh w3, [x1] + ldrb w1, [x1, 2] + strh w3, [x2] + strb w1, [x2, 2] + ret +.LVL1200: + .p2align 3 +.L1114: +.LBE2118: +.LBE2117: + .loc 1 3316 0 + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x0, x2 + .loc 1 3323 0 + adrp x1, .LC25 +.LVL1201: + mov w2, w3 +.LVL1202: + .loc 1 3316 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 3323 0 + add x1, x1, :lo12:.LC25 + .loc 1 3316 0 + .loc 1 3323 0 + bl sprintf +.LVL1203: + sxtw x0, w0 + .loc 1 3328 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE2862: + .size auto_frame_state_read, .-auto_frame_state_read + .align 2 + .p2align 3,,7 + .type ebc_power_set.constprop.15, %function +ebc_power_set.constprop.15: +.LFB2893: + .loc 1 390 0 + .cfi_startproc +.LVL1204: + 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 396 0 + add x20, x0, 192 + .loc 1 390 0 + mov x19, x0 + .loc 1 396 0 + ldr w0, [x20, 464] +.LVL1205: + cbz w0, .L1131 +.L1129: + .loc 1 400 0 + mov w1, 1 + str w1, [x20, 200] + .loc 1 401 0 + ldr x2, [x19, 16] +.LBB2119: +.LBB2120: + .loc 3 30 0 + mov x0, x2 + ldr x2, [x2, 32] + blr x2 +.LVL1206: +.LBE2120: +.LBE2119: + .loc 1 402 0 + ldr x2, [x19, 8] +.LBB2121: +.LBB2122: + .loc 10 45 0 + add x1, x19, 24 + mov x0, x2 + ldr x2, [x2, 48] + blr x2 +.LVL1207: +.LBE2122: +.LBE2121: + .loc 1 403 0 + ldr x0, [x19] + adrp x1, .LC101 + add x1, x1, :lo12:.LC101 + bl _dev_info +.LVL1208: + .loc 1 418 0 + mov w0, 0 + ldp x19, x20, [sp, 16] +.LVL1209: + 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 +.LVL1210: + .p2align 3 +.L1131: + .cfi_restore_state + .loc 1 397 0 + mov w0, 1 + str w0, [x20, 464] +.LBB2123: +.LBB2124: + .loc 11 58 0 + add x0, x19, 448 + bl __pm_stay_awake +.LVL1211: + b .L1129 +.LBE2124: +.LBE2123: + .cfi_endproc +.LFE2893: + .size ebc_power_set.constprop.15, .-ebc_power_set.constprop.15 + .align 2 + .p2align 3,,7 + .type ebc_open, %function +ebc_open: +.LFB2892: + .cfi_startproc + mov w0, 0 + str xzr, [x1, 104] + ret + .cfi_endproc +.LFE2892: + .size ebc_open, .-ebc_open + .align 2 + .p2align 3,,7 + .global refresh_new_image + .type refresh_new_image, %function +refresh_new_image: +.LFB2818: + .loc 1 486 0 + .cfi_startproc +.LVL1212: + .loc 1 486 0 + 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] + stp x21, x22, [sp, 32] + stp x23, x24, [sp, 48] + str x25, [sp, 64] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + .cfi_offset 21, -48 + .cfi_offset 22, -40 + .cfi_offset 23, -32 + .cfi_offset 24, -24 + .cfi_offset 25, -16 + .loc 1 494 0 + ldp w19, w6, [x5, 92] + cmp w6, 0 + add w12, w6, 7 + csel w12, w12, w6, lt +.LVL1213: + .loc 1 496 0 + cmp w19, 0 + ble .L1133 + asr w12, w12, 3 +.LVL1214: + mov w30, 0 +.LVL1215: + sub w18, w12, #1 +.LBB2125: + .loc 1 510 0 + mov x17, 4026531840 + add x18, x18, 1 +.LBE2125: +.LBB2126: + .loc 1 511 0 + mov x16, 1030792151040 + lsl x18, x18, 3 +.LBE2126: +.LBB2127: + .loc 1 512 0 + mov x15, 263882790666240 +.LBE2127: +.LBB2128: + .loc 1 513 0 + mov x14, 67553994410557440 +.LBE2128: +.LBB2129: + .loc 1 514 0 + mov x13, -1152921504606846976 + mov x24, -2305843009213693952 +.LBE2129: +.LBB2130: + .loc 1 513 0 + mov x23, 63050394783186944 +.LBE2130: +.LBB2131: + .loc 1 512 0 + mov x22, 246290604621824 +.LBE2131: +.LBB2132: + .loc 1 511 0 + mov x21, 962072674304 +.LBE2132: +.LBB2133: + .loc 1 510 0 + mov x20, 3758096384 +.LVL1216: + .p2align 2 +.L1135: +.LBE2133: + .loc 1 497 0 discriminator 1 + mov x8, 0 + cmp w12, 0 + ble .L1200 + .p2align 2 +.L1205: + .loc 1 498 0 + ldr x11, [x3, x8, lsl 3] + .loc 1 499 0 + ldr x7, [x4, x8, lsl 3] +.LVL1217: + .loc 1 500 0 + ldr x6, [x1, x8, lsl 3] +.LVL1218: + .loc 1 501 0 + ldr x9, [x0, x8, lsl 3] + .loc 1 502 0 + ldr x10, [x2, x8, lsl 3] + .loc 1 505 0 + cbnz x11, .L1136 +.LBB2134: + .loc 1 507 0 + and x5, x6, 240 +.LVL1219: + cmp x5, 240 + bne .L1211 + mov x5, 255 +.L1137: +.LBE2134: +.LBB2135: + .loc 1 508 0 + and x7, x6, 61440 +.LVL1220: + cmp x7, 61440 + bne .L1140 + .loc 1 508 0 is_stmt 0 discriminator 1 + orr x5, x5, 65280 +.L1141: +.LBE2135: +.LBB2136: + .loc 1 509 0 is_stmt 1 + and x7, x6, 15728640 +.LVL1221: + cmp x7, 15728640 + bne .L1144 + .loc 1 509 0 is_stmt 0 discriminator 1 + orr x5, x5, 16711680 +.L1145: +.LBE2136: +.LBB2137: + .loc 1 510 0 is_stmt 1 + and x7, x6, 4026531840 +.LVL1222: + cmp x7, x17 + bne .L1148 + .loc 1 510 0 is_stmt 0 discriminator 1 + orr x5, x5, 4278190080 +.L1149: +.LBE2137: +.LBB2138: + .loc 1 511 0 is_stmt 1 + and x7, x6, 1030792151040 +.LVL1223: + cmp x7, x16 + bne .L1152 +.L1214: + .loc 1 511 0 is_stmt 0 discriminator 1 + orr x5, x5, 1095216660480 +.L1153: +.LBE2138: +.LBB2139: + .loc 1 512 0 is_stmt 1 + and x7, x6, 263882790666240 +.LVL1224: + cmp x7, x15 + bne .L1156 +.L1215: + .loc 1 512 0 is_stmt 0 discriminator 1 + orr x5, x5, 280375465082880 +.L1157: +.LBE2139: +.LBB2140: + .loc 1 513 0 is_stmt 1 + and x7, x6, 67553994410557440 +.LVL1225: + cmp x7, x14 + bne .L1160 +.L1216: + .loc 1 513 0 is_stmt 0 discriminator 1 + orr x5, x5, 71776119061217280 +.L1161: +.LBE2140: +.LBB2141: + .loc 1 514 0 is_stmt 1 + and x7, x6, -1152921504606846976 +.LVL1226: + cmp x7, x13 + bne .L1212 +.LVL1227: +.L1208: +.LBE2141: +.LBB2142: + .loc 1 523 0 discriminator 2 + orr x5, x5, -72057594037927936 +.L1165: + eor x6, x9, x10 +.LVL1228: +.LBE2142: + .loc 1 528 0 discriminator 2 + str x11, [x4, x8, lsl 3] + and x5, x6, x5 +.LVL1229: + .loc 1 527 0 discriminator 2 + eor x5, x9, x5 + .loc 1 529 0 discriminator 2 + str x5, [x0, x8, lsl 3] + add x8, x8, 1 + .loc 1 497 0 discriminator 2 + cmp w12, w8 + bgt .L1205 + add x3, x3, x18 + add x1, x1, x18 + add x2, x2, x18 + add x4, x4, x18 + add x0, x0, x18 +.LVL1230: +.L1200: + .loc 1 496 0 discriminator 2 + add w30, w30, 1 + cmp w19, w30 + bne .L1135 +.L1133: + .loc 1 532 0 + ldp x19, x20, [sp, 16] +.LVL1231: + 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 +.LVL1232: + ret +.LVL1233: + .p2align 3 +.L1212: + .cfi_restore_state +.LBB2143: + .loc 1 514 0 discriminator 2 + cbz x7, .L1209 + .loc 1 514 0 is_stmt 0 discriminator 4 + and x9, x9, 72057594037927935 + cmp x7, x24 + beq .L1210 + .loc 1 514 0 discriminator 6 + orr x9, x7, x9 + b .L1165 +.LVL1234: + .p2align 3 +.L1136: +.LBE2143: + .loc 1 516 0 is_stmt 1 + and x25, x11, 255 + .loc 1 503 0 + mov x5, 0 +.LVL1235: + .loc 1 516 0 + cbnz x25, .L1168 +.LBB2144: + .loc 1 516 0 is_stmt 0 discriminator 1 + and x5, x6, 240 +.LBE2144: + and x7, x7, -256 +.LBB2145: + cmp x5, 240 + bne .L1213 + .loc 1 516 0 + mov x5, 255 +.L1168: +.LBE2145: + .loc 1 517 0 is_stmt 1 + tst x11, 65280 + bne .L1171 +.LBB2146: + .loc 1 517 0 is_stmt 0 discriminator 1 + and x25, x6, 61440 +.LVL1236: +.LBE2146: + and x7, x7, -65281 +.LBB2147: + cmp x25, 61440 + bne .L1172 + .loc 1 517 0 discriminator 2 + orr x5, x5, 65280 +.L1171: +.LBE2147: + .loc 1 518 0 is_stmt 1 + tst x11, 16711680 + bne .L1175 +.LBB2148: + .loc 1 518 0 is_stmt 0 discriminator 1 + and x25, x6, 15728640 +.LVL1237: +.LBE2148: + and x7, x7, -16711681 +.LBB2149: + cmp x25, 15728640 + bne .L1176 + .loc 1 518 0 discriminator 2 + orr x5, x5, 16711680 +.LVL1238: +.L1175: +.LBE2149: + .loc 1 519 0 is_stmt 1 + tst x11, 4278190080 + bne .L1179 +.LBB2150: + .loc 1 519 0 is_stmt 0 discriminator 1 + and x25, x6, 4026531840 +.LVL1239: +.LBE2150: + and x7, x7, -4278190081 +.LBB2151: + cmp x25, x17 + bne .L1180 + .loc 1 519 0 discriminator 2 + orr x5, x5, 4278190080 +.LVL1240: +.L1179: +.LBE2151: + .loc 1 520 0 is_stmt 1 + tst x11, 1095216660480 + bne .L1183 +.LBB2152: + .loc 1 520 0 is_stmt 0 discriminator 1 + and x25, x6, 1030792151040 +.LVL1241: +.LBE2152: + and x7, x7, -1095216660481 +.LBB2153: + cmp x25, x16 + bne .L1184 + .loc 1 520 0 discriminator 2 + orr x5, x5, 1095216660480 +.LVL1242: +.L1183: +.LBE2153: + .loc 1 521 0 is_stmt 1 + tst x11, 280375465082880 + bne .L1187 +.LBB2154: + .loc 1 521 0 is_stmt 0 discriminator 1 + and x25, x6, 263882790666240 +.LVL1243: +.LBE2154: + and x7, x7, -280375465082881 +.LBB2155: + cmp x25, x15 + bne .L1188 + .loc 1 521 0 discriminator 2 + orr x5, x5, 280375465082880 +.LVL1244: +.L1187: +.LBE2155: + .loc 1 522 0 is_stmt 1 + tst x11, 71776119061217280 + bne .L1191 +.LBB2156: + .loc 1 522 0 is_stmt 0 discriminator 1 + and x25, x6, 67553994410557440 +.LVL1245: +.LBE2156: + and x7, x7, -71776119061217281 +.LBB2157: + cmp x25, x14 + bne .L1192 + .loc 1 522 0 discriminator 2 + orr x5, x5, 71776119061217280 +.LVL1246: +.L1191: +.LBE2157: + .loc 1 523 0 is_stmt 1 + and x25, x11, -72057594037927936 +.LVL1247: +.LBB2158: + mov x11, x7 +.LBE2158: + cbnz x25, .L1165 +.LBB2159: + .loc 1 523 0 is_stmt 0 discriminator 1 + and x6, x6, -1152921504606846976 +.LVL1248: +.LBE2159: + and x11, x7, 72057594037927935 +.LVL1249: +.LBB2160: + cmp x6, x13 + beq .L1208 + .loc 1 523 0 discriminator 3 + cbz x6, .L1209 + .loc 1 523 0 discriminator 5 + and x9, x9, 72057594037927935 + cmp x6, x24 + beq .L1210 + .loc 1 523 0 discriminator 7 + orr x9, x6, x9 + b .L1165 +.LVL1250: + .p2align 3 +.L1209: + .loc 1 523 0 discriminator 4 + and x9, x9, 72057594037927935 + orr x11, x11, 72057594037927936 + b .L1165 +.LVL1251: + .p2align 3 +.L1148: +.LBE2160: +.LBB2161: + .loc 1 510 0 is_stmt 1 discriminator 2 + and x9, x9, -4278190081 + cbnz x7, .L1150 +.LBE2161: +.LBB2162: + .loc 1 511 0 discriminator 3 + and x7, x6, 1030792151040 +.LVL1252: +.LBE2162: +.LBB2163: + .loc 1 510 0 discriminator 3 + orr x11, x11, 16777216 +.LBE2163: +.LBB2164: + .loc 1 511 0 discriminator 3 + cmp x7, x16 + beq .L1214 + .p2align 2 +.L1152: + .loc 1 511 0 is_stmt 0 discriminator 2 + and x9, x9, -1095216660481 + cbnz x7, .L1154 +.LBE2164: +.LBB2165: + .loc 1 512 0 is_stmt 1 discriminator 3 + and x7, x6, 263882790666240 +.LVL1253: +.LBE2165: +.LBB2166: + .loc 1 511 0 discriminator 3 + orr x11, x11, 4294967296 +.LBE2166: +.LBB2167: + .loc 1 512 0 discriminator 3 + cmp x7, x15 + beq .L1215 + .p2align 2 +.L1156: + .loc 1 512 0 is_stmt 0 discriminator 2 + and x9, x9, -280375465082881 + cbnz x7, .L1158 +.LBE2167: +.LBB2168: + .loc 1 513 0 is_stmt 1 discriminator 3 + and x7, x6, 67553994410557440 +.LVL1254: +.LBE2168: +.LBB2169: + .loc 1 512 0 discriminator 3 + orr x11, x11, 1099511627776 +.LBE2169: +.LBB2170: + .loc 1 513 0 discriminator 3 + cmp x7, x14 + beq .L1216 + .p2align 2 +.L1160: + .loc 1 513 0 is_stmt 0 discriminator 2 + and x9, x9, -71776119061217281 + cbnz x7, .L1162 + .loc 1 513 0 discriminator 3 + orr x11, x11, 281474976710656 + b .L1161 +.LVL1255: + .p2align 3 +.L1144: +.LBE2170: +.LBB2171: + .loc 1 509 0 is_stmt 1 discriminator 2 + and x9, x9, -16711681 + cbnz x7, .L1146 + .loc 1 509 0 is_stmt 0 discriminator 3 + orr x11, x11, 65536 + b .L1145 +.LVL1256: + .p2align 3 +.L1140: +.LBE2171: +.LBB2172: + .loc 1 508 0 is_stmt 1 discriminator 2 + and x9, x9, -65281 + cbnz x7, .L1142 + .loc 1 508 0 is_stmt 0 discriminator 3 + orr x11, x11, 256 + b .L1141 +.LVL1257: + .p2align 3 +.L1211: +.LBE2172: +.LBB2173: + .loc 1 507 0 is_stmt 1 discriminator 2 + cbnz x5, .L1138 + .loc 1 507 0 is_stmt 0 discriminator 3 + and x9, x9, -256 + mov x11, 1 + b .L1137 +.LVL1258: + .p2align 3 +.L1150: +.LBE2173: +.LBB2174: + .loc 1 510 0 is_stmt 1 discriminator 4 + cmp x7, x20 + beq .L1217 + .loc 1 510 0 is_stmt 0 discriminator 6 + orr x9, x7, x9 + b .L1149 +.LVL1259: + .p2align 3 +.L1162: +.LBE2174: +.LBB2175: + .loc 1 513 0 is_stmt 1 discriminator 4 + cmp x7, x23 + beq .L1218 + .loc 1 513 0 is_stmt 0 discriminator 6 + orr x9, x7, x9 + b .L1161 +.LVL1260: + .p2align 3 +.L1146: +.LBE2175: +.LBB2176: + .loc 1 509 0 is_stmt 1 discriminator 4 + cmp x7, 14680064 + beq .L1219 + .loc 1 509 0 is_stmt 0 discriminator 6 + orr x9, x7, x9 + b .L1145 +.LVL1261: + .p2align 3 +.L1158: +.LBE2176: +.LBB2177: + .loc 1 512 0 is_stmt 1 discriminator 4 + cmp x7, x22 + beq .L1220 + .loc 1 512 0 is_stmt 0 discriminator 6 + orr x9, x7, x9 + b .L1157 +.LVL1262: + .p2align 3 +.L1142: +.LBE2177: +.LBB2178: + .loc 1 508 0 is_stmt 1 discriminator 4 + cmp x7, 57344 + beq .L1221 + .loc 1 508 0 is_stmt 0 discriminator 6 + orr x9, x7, x9 + b .L1141 +.LVL1263: + .p2align 3 +.L1154: +.LBE2178: +.LBB2179: + .loc 1 511 0 is_stmt 1 discriminator 4 + cmp x7, x21 + beq .L1222 + .loc 1 511 0 is_stmt 0 discriminator 6 + orr x9, x7, x9 + b .L1153 +.LVL1264: + .p2align 3 +.L1138: +.LBE2179: +.LBB2180: + .loc 1 507 0 is_stmt 1 discriminator 4 + cmp x5, 224 + beq .L1223 + .loc 1 507 0 is_stmt 0 discriminator 6 + and x9, x9, -256 + orr x9, x5, x9 +.LBE2180: + .loc 1 503 0 is_stmt 1 discriminator 6 + mov x5, 0 + b .L1137 +.LVL1265: + .p2align 3 +.L1210: +.LBB2181: + .loc 1 523 0 discriminator 6 + orr x11, x11, 72057594037927936 + orr x9, x9, -1152921504606846976 + b .L1165 +.LVL1266: + .p2align 3 +.L1217: +.LBE2181: +.LBB2182: + .loc 1 510 0 discriminator 5 + orr x11, x11, 16777216 + orr x9, x9, 4026531840 + b .L1149 +.LVL1267: + .p2align 3 +.L1223: +.LBE2182: +.LBB2183: + .loc 1 507 0 discriminator 5 + and x5, x9, -256 +.LVL1268: + mov x11, 1 + orr x9, x5, 240 +.LBE2183: + .loc 1 503 0 discriminator 5 + mov x5, 0 +.LVL1269: +.LBB2184: + b .L1137 +.LVL1270: + .p2align 3 +.L1218: +.LBE2184: +.LBB2185: + .loc 1 513 0 discriminator 5 + orr x11, x11, 281474976710656 + orr x9, x9, 67553994410557440 + b .L1161 +.LVL1271: + .p2align 3 +.L1220: +.LBE2185: +.LBB2186: + .loc 1 512 0 discriminator 5 + orr x11, x11, 1099511627776 + orr x9, x9, 263882790666240 + b .L1157 +.LVL1272: + .p2align 3 +.L1219: +.LBE2186: +.LBB2187: + .loc 1 509 0 discriminator 5 + orr x11, x11, 65536 + orr x9, x9, 15728640 + b .L1145 +.LVL1273: + .p2align 3 +.L1221: +.LBE2187: +.LBB2188: + .loc 1 508 0 discriminator 5 + orr x11, x11, 256 + orr x9, x9, 61440 + b .L1141 +.LVL1274: + .p2align 3 +.L1222: +.LBE2188: +.LBB2189: + .loc 1 511 0 discriminator 5 + orr x11, x11, 4294967296 + orr x9, x9, 1030792151040 + b .L1153 +.LVL1275: +.L1213: +.LBE2189: +.LBB2190: + .loc 1 516 0 discriminator 3 + cbz x5, .L1224 + .loc 1 516 0 is_stmt 0 discriminator 5 + cmp x5, 224 + beq .L1225 + .loc 1 516 0 discriminator 7 + and x9, x9, -256 + orr x9, x5, x9 +.LBE2190: + .loc 1 503 0 is_stmt 1 discriminator 7 + mov x5, 0 + b .L1168 +.LVL1276: +.L1172: +.LBB2191: + .loc 1 517 0 discriminator 3 + and x9, x9, -65281 + cbz x25, .L1226 + .loc 1 517 0 is_stmt 0 discriminator 5 + cmp x25, 57344 + beq .L1227 + .loc 1 517 0 discriminator 7 + orr x9, x25, x9 + b .L1171 +.LVL1277: +.L1176: +.LBE2191: +.LBB2192: + .loc 1 518 0 is_stmt 1 discriminator 3 + and x9, x9, -16711681 + cbz x25, .L1228 + .loc 1 518 0 is_stmt 0 discriminator 5 + cmp x25, 14680064 + beq .L1229 + .loc 1 518 0 discriminator 7 + orr x9, x25, x9 + b .L1175 +.LVL1278: +.L1180: +.LBE2192: +.LBB2193: + .loc 1 519 0 is_stmt 1 discriminator 3 + and x9, x9, -4278190081 + cbz x25, .L1230 + .loc 1 519 0 is_stmt 0 discriminator 5 + cmp x25, x20 + beq .L1231 + .loc 1 519 0 discriminator 7 + orr x9, x25, x9 + b .L1179 +.LVL1279: +.L1184: +.LBE2193: +.LBB2194: + .loc 1 520 0 is_stmt 1 discriminator 3 + and x9, x9, -1095216660481 + cbz x25, .L1232 + .loc 1 520 0 is_stmt 0 discriminator 5 + cmp x25, x21 + beq .L1233 + .loc 1 520 0 discriminator 7 + orr x9, x25, x9 + b .L1183 +.LVL1280: +.L1188: +.LBE2194: +.LBB2195: + .loc 1 521 0 is_stmt 1 discriminator 3 + and x9, x9, -280375465082881 + cbz x25, .L1234 + .loc 1 521 0 is_stmt 0 discriminator 5 + cmp x25, x22 + beq .L1235 + .loc 1 521 0 discriminator 7 + orr x9, x25, x9 + b .L1187 +.LVL1281: +.L1192: +.LBE2195: +.LBB2196: + .loc 1 522 0 is_stmt 1 discriminator 3 + and x9, x9, -71776119061217281 + cbz x25, .L1236 + .loc 1 522 0 is_stmt 0 discriminator 5 + cmp x25, x23 + beq .L1237 + .loc 1 522 0 discriminator 7 + orr x9, x25, x9 + b .L1191 +.L1236: + .loc 1 522 0 discriminator 4 + orr x7, x7, 281474976710656 + b .L1191 +.LVL1282: +.L1234: +.LBE2196: +.LBB2197: + .loc 1 521 0 is_stmt 1 discriminator 4 + orr x7, x7, 1099511627776 + b .L1187 +.LVL1283: +.L1232: +.LBE2197: +.LBB2198: + .loc 1 520 0 discriminator 4 + orr x7, x7, 4294967296 + b .L1183 +.LVL1284: +.L1230: +.LBE2198: +.LBB2199: + .loc 1 519 0 discriminator 4 + orr x7, x7, 16777216 + b .L1179 +.LVL1285: +.L1228: +.LBE2199: +.LBB2200: + .loc 1 518 0 discriminator 4 + orr x7, x7, 65536 + b .L1175 +.LVL1286: +.L1226: +.LBE2200: +.LBB2201: + .loc 1 517 0 discriminator 4 + orr x7, x7, 256 + b .L1171 +.LVL1287: +.L1224: +.LBE2201: +.LBB2202: + .loc 1 516 0 discriminator 4 + and x9, x9, -256 + orr x7, x7, 1 + b .L1168 +.LVL1288: +.L1237: +.LBE2202: +.LBB2203: + .loc 1 522 0 discriminator 6 + orr x7, x7, 281474976710656 + orr x9, x9, 67553994410557440 + b .L1191 +.LVL1289: +.L1225: +.LBE2203: +.LBB2204: + .loc 1 516 0 discriminator 6 + and x5, x9, -256 +.LVL1290: + orr x7, x7, 1 + orr x9, x5, 240 +.LBE2204: + .loc 1 503 0 discriminator 6 + mov x5, 0 +.LVL1291: +.LBB2205: + b .L1168 +.LVL1292: +.L1227: +.LBE2205: +.LBB2206: + .loc 1 517 0 discriminator 6 + orr x7, x7, 256 + orr x9, x9, 61440 + b .L1171 +.LVL1293: +.L1229: +.LBE2206: +.LBB2207: + .loc 1 518 0 discriminator 6 + orr x7, x7, 65536 + orr x9, x9, 15728640 + b .L1175 +.LVL1294: +.L1231: +.LBE2207: +.LBB2208: + .loc 1 519 0 discriminator 6 + orr x7, x7, 16777216 + orr x9, x9, 4026531840 + b .L1179 +.LVL1295: +.L1233: +.LBE2208: +.LBB2209: + .loc 1 520 0 discriminator 6 + orr x7, x7, 4294967296 + orr x9, x9, 1030792151040 + b .L1183 +.LVL1296: +.L1235: +.LBE2209: +.LBB2210: + .loc 1 521 0 discriminator 6 + orr x7, x7, 1099511627776 + orr x9, x9, 263882790666240 + b .L1187 +.LBE2210: + .cfi_endproc +.LFE2818: + .size refresh_new_image, .-refresh_new_image + .align 2 + .p2align 3,,7 + .global refresh_new_image_auto + .type refresh_new_image_auto, %function +refresh_new_image_auto: +.LFB2819: + .loc 1 535 0 + .cfi_startproc +.LVL1297: + .loc 1 542 0 + ldp w14, w4, [x3, 92] + cmp w4, 0 + add w10, w4, 7 + csel w10, w10, w4, lt +.LVL1298: + .loc 1 544 0 + cmp w14, 0 + .loc 1 542 0 + asr w10, w10, 3 +.LVL1299: + .loc 1 544 0 + ble .L1238 + sub w12, w10, #1 + mov w13, 0 +.LVL1300: + add x12, x12, 1 + .loc 1 557 0 + mov x11, 255 + lsl x12, x12, 3 +.LVL1301: + .p2align 2 +.L1240: + .loc 1 545 0 discriminator 1 + cmp w10, 0 + ble .L1251 + add x7, x0, 8 + .loc 1 545 0 is_stmt 0 + mov x5, 0 + .p2align 2 +.L1250: + .loc 1 547 0 is_stmt 1 + ldr x3, [x1, x5, lsl 3] +.LVL1302: + .loc 1 548 0 + ldr x8, [x7, -8] + eor x6, x3, x8 + .loc 1 551 0 + cmp x3, x8 + beq .L1241 + .loc 1 546 0 + ldr x4, [x2, x5, lsl 3] +.LVL1303: + .loc 1 556 0 + and x3, x4, 255 +.LVL1304: + .loc 1 557 0 + cmp x3, 0 + csel x3, xzr, x11, ne +.LVL1305: + .loc 1 561 0 + tst x4, 65280 + orr x9, x3, 65280 + csel x3, x9, x3, eq + .loc 1 565 0 + tst x4, 16711680 + orr x9, x3, 16711680 + csel x3, x9, x3, eq + .loc 1 569 0 + tst x4, 4278190080 + orr x9, x3, 4278190080 + csel x3, x9, x3, eq + .loc 1 573 0 + tst x4, 1095216660480 + orr x9, x3, 1095216660480 + csel x3, x9, x3, eq + .loc 1 577 0 + tst x4, 280375465082880 + orr x9, x3, 280375465082880 + csel x3, x9, x3, eq + .loc 1 581 0 + tst x4, 71776119061217280 + orr x9, x3, 71776119061217280 + csel x3, x9, x3, eq + .loc 1 585 0 + tst x4, -72057594037927936 + orr x4, x3, -72057594037927936 +.LVL1306: + csel x3, x4, x3, eq + and x3, x6, x3 +.LVL1307: + .loc 1 588 0 + eor x3, x3, x8 + .loc 1 589 0 + str x3, [x7, -8] +.LVL1308: +.L1241: + add x5, x5, 1 + add x7, x7, 8 + .loc 1 545 0 discriminator 2 + cmp w10, w5 + bgt .L1250 + add x0, x0, x12 + add x2, x2, x12 + add x1, x1, x12 +.LVL1309: +.L1251: + .loc 1 544 0 discriminator 2 + add w13, w13, 1 + cmp w14, w13 + bne .L1240 +.L1238: + ret + .cfi_endproc +.LFE2819: + .size refresh_new_image_auto, .-refresh_new_image_auto + .align 2 + .p2align 3,,7 + .type ebc_thread, %function +ebc_thread: +.LFB2844: + .loc 1 2348 0 + .cfi_startproc +.LVL1310: + stp x29, x30, [sp, -160]! + .cfi_def_cfa_offset 160 + .cfi_offset 29, -160 + .cfi_offset 30, -152 + .loc 1 2349 0 + adrp x2, .LANCHOR0 + .loc 1 2348 0 + adrp x1, __stack_chk_guard + add x1, x1, :lo12:__stack_chk_guard + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x25, x26, [sp, 64] +.LBB2298: +.LBB2299: +.LBB2300: + .loc 1 2808 0 + adrp x0, .LANCHOR1 +.LVL1311: +.LBE2300: +.LBE2299: +.LBE2298: + .loc 1 2348 0 + stp x23, x24, [sp, 48] +.LBB2313: +.LBB2309: +.LBB2304: + .loc 1 2808 0 + add x0, x0, :lo12:.LANCHOR1 + .cfi_offset 25, -96 + .cfi_offset 26, -88 + .cfi_offset 23, -112 + .cfi_offset 24, -104 +.LBE2304: +.LBE2309: +.LBE2313: + .loc 1 2349 0 + ldr x24, [x2, #:lo12:.LANCHOR0] +.LVL1312: +.LBB2314: +.LBB2310: +.LBB2305: + .loc 1 2808 0 + add x0, x0, 304 +.LBE2305: +.LBE2310: +.LBE2314: + .loc 1 2348 0 + stp x27, x28, [sp, 80] + .loc 1 2356 0 + mov w26, 0 +.LVL1313: + .loc 1 2348 0 + stp x19, x20, [sp, 16] + .loc 1 2350 0 + add x25, x24, 192 + .loc 1 2348 0 + stp x21, x22, [sp, 32] + .cfi_offset 27, -80 + .cfi_offset 28, -72 + .cfi_offset 19, -144 + .cfi_offset 20, -136 + .cfi_offset 21, -128 + .cfi_offset 22, -120 + add x27, x24, 24 + .loc 1 2354 0 + str wzr, [x29, 100] + .loc 1 2348 0 + ldr x2, [x1] + str x2, [x29, 152] + mov x2,0 +.LBB2315: +.LBB2311: +.LBB2306: + .loc 1 2808 0 + str x0, [x29, 104] +.LVL1314: + .p2align 2 +.L1255: +.LBE2306: +.LBE2311: +.LBE2315: + .loc 1 2360 0 + ldr w0, [x25, 592] +.LVL1315: + cbz w0, .L1256 + .loc 1 2360 0 is_stmt 0 discriminator 1 + ldr w0, [x27, 160] + cbz w0, .L1608 +.L1256: + .loc 1 2366 0 is_stmt 1 + cbnz w26, .L1258 + .loc 1 2366 0 is_stmt 0 discriminator 1 + ldr w0, [x25, 612] + cbz w0, .L1609 +.L1258: + .loc 1 2412 0 is_stmt 1 + ldr w0, [x25, 604] + cbz w0, .L1310 + .loc 1 2412 0 is_stmt 0 discriminator 1 + ldr w0, [x25, 600] + cbnz w0, .L1310 + .loc 1 2412 0 discriminator 2 + ldr w0, [x25, 612] + cbnz w0, .L1310 +.L1311: + .loc 1 2807 0 is_stmt 1 + ldr w0, [x25, 100] + cbz w0, .L1610 +.L1433: +.LVL1316: +.L1431: + .loc 1 2833 0 + str wzr, [x25, 100] + b .L1255 +.LVL1317: +.L1608: + .loc 1 2361 0 + ldr w0, [x25, 200] + cmp w0, 1 + beq .L1611 +.L1257: + .loc 1 2838 0 + adrp x0, __stack_chk_guard + add x1, x0, :lo12:__stack_chk_guard + ldr x2, [x29, 152] + ldr x1, [x1] + eor x1, x2, x1 + mov w0, 0 + cbnz x1, .L1612 + ldp x19, x20, [sp, 16] +.LVL1318: + ldp x21, x22, [sp, 32] +.LVL1319: + ldp x23, x24, [sp, 48] +.LVL1320: + ldp x25, x26, [sp, 64] +.LVL1321: + ldp x27, x28, [sp, 80] +.LVL1322: + ldp x29, x30, [sp], 160 + .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 +.LVL1323: +.L1609: + .cfi_restore_state + .loc 1 2367 0 + bl ebc_osd_buf_get +.LVL1324: + mov x19, x0 +.LVL1325: + .loc 1 2368 0 + cbz x0, .L1258 + .loc 1 2369 0 + ldr x0, [x25, 584] + cbnz x0, .L1259 + .loc 1 2369 0 is_stmt 0 discriminator 1 + ldr w26, [x25, 592] +.LVL1326: + cbnz w26, .L1259 + .loc 1 2375 0 is_stmt 1 + ldr w0, [x25, 252] + sub w1, w0, #1 + cmp w1, 1 + bls .L1613 + .loc 1 2378 0 + cmp w0, 3 + beq .L1614 +.L1263: + .loc 1 2384 0 + str x19, [x25, 240] + .loc 1 2385 0 + mov w0, 4 + str w0, [x25, 252] + .loc 1 2388 0 + ldr x3, [x25, 224] +.LBB2316: +.LBB2317: + .loc 1 437 0 + ldp w2, w22, [x19, 48] +.LVL1327: + .loc 1 438 0 + ldp w1, w28, [x19, 56] +.LVL1328: + .loc 1 435 0 + cmp w2, 0 + .loc 1 440 0 + ldr w0, [x24, 288] + .loc 1 435 0 + add w23, w2, 7 +.LVL1329: + csel w23, w23, w2, lt + .loc 1 436 0 + add w14, w1, 7 + cmp w1, 0 + .loc 1 440 0 + add w16, w0, 7 + .loc 1 436 0 + csel w14, w14, w1, lt + .loc 1 440 0 + cmp w0, 0 + csel w16, w16, w0, lt + .loc 1 436 0 + asr w14, w14, 3 + .loc 1 440 0 + asr w16, w16, 3 +.LVL1330: + .loc 1 436 0 + add w14, w14, 1 +.LVL1331: + ldr w1, [x24, 284] + .loc 1 443 0 + cmp w14, w16 +.LBE2317: +.LBE2316: + .loc 1 2390 0 + ldp x11, x8, [x25, 168] +.LVL1332: +.LBB2369: +.LBB2363: + .loc 1 447 0 + mul w0, w22, w16 + .loc 1 443 0 + sub w2, w16, #1 +.LBE2363: +.LBE2369: + .loc 1 2386 0 + ldr x9, [x25, 152] +.LBB2370: +.LBB2364: + .loc 1 443 0 + csel w14, w2, w14, ge +.LBE2364: +.LBE2370: + .loc 1 2388 0 + ldr x12, [x3, 16] +.LVL1333: +.LBB2371: +.LBB2365: + .loc 1 445 0 + cmp w1, w28 + sub w2, w1, #1 +.LBE2365: +.LBE2371: + .loc 1 2387 0 + ldr x13, [x19, 16] +.LBB2372: +.LBB2366: + .loc 1 447 0 + sbfiz x0, x0, 3, 32 + .loc 1 445 0 + csel w28, w2, w28, le + .loc 1 435 0 + asr w23, w23, 3 +.LVL1334: + .loc 1 447 0 + add x9, x9, x0 +.LVL1335: + .loc 1 450 0 + add x11, x11, x0 +.LVL1336: + .loc 1 451 0 + add x8, x8, x0 +.LVL1337: + .loc 1 453 0 + cmp w22, w28 + .loc 1 449 0 + add x12, x12, x0 +.LVL1338: + .loc 1 448 0 + add x13, x13, x0 +.LVL1339: + .loc 1 453 0 + bgt .L1270 + sbfiz x16, x16, 3, 32 +.LVL1340: +.LBB2318: + .loc 1 465 0 + mov x21, 4026531840 +.LVL1341: +.LBE2318: +.LBB2319: + .loc 1 466 0 + mov x20, 1030792151040 +.LVL1342: +.LBE2319: +.LBB2320: + .loc 1 467 0 + mov x19, 263882790666240 +.LBE2320: +.LBB2321: + .loc 1 468 0 + mov x18, 67553994410557440 +.LBE2321: +.LBB2322: + .loc 1 469 0 + mov x17, -1152921504606846976 +.LVL1343: + .p2align 2 +.L1271: +.LBE2322: + .loc 1 454 0 + cmp w23, w14 + mov w5, w23 + ble .L1526 + b .L1305 +.LVL1344: + .p2align 3 +.L1616: +.LBB2323: + .loc 1 462 0 + and x15, x4, 240 +.LVL1345: +.LBE2323: + and x0, x0, -256 +.LBB2324: + cmp x15, 240 + bne .L1615 + mov x2, 255 +.LVL1346: +.L1272: +.LBE2324: + .loc 1 463 0 + tst x1, 65280 + bne .L1275 +.LBB2325: + and x15, x4, 61440 +.LVL1347: +.LBE2325: + and x0, x0, -65281 +.LBB2326: + cmp x15, 61440 + bne .L1276 + orr x2, x2, 65280 +.LVL1348: +.L1275: +.LBE2326: + .loc 1 464 0 + tst x1, 16711680 + bne .L1279 +.LBB2327: + and x15, x4, 15728640 +.LVL1349: +.LBE2327: + and x0, x0, -16711681 +.LBB2328: + cmp x15, 15728640 + bne .L1280 + orr x2, x2, 16711680 +.LVL1350: +.L1279: +.LBE2328: + .loc 1 465 0 + tst x1, 4278190080 + bne .L1283 +.LBB2329: + and x15, x4, 4026531840 +.LVL1351: +.LBE2329: + and x0, x0, -4278190081 +.LBB2330: + cmp x15, x21 + bne .L1284 + orr x2, x2, 4278190080 +.LVL1352: +.L1283: +.LBE2330: + .loc 1 466 0 + tst x1, 1095216660480 + bne .L1287 +.LBB2331: + and x15, x4, 1030792151040 +.LVL1353: +.LBE2331: + and x0, x0, -1095216660481 +.LBB2332: + cmp x15, x20 + bne .L1288 + orr x2, x2, 1095216660480 +.LVL1354: +.L1287: +.LBE2332: + .loc 1 467 0 + tst x1, 280375465082880 + bne .L1291 +.LBB2333: + and x15, x4, 263882790666240 +.LVL1355: +.LBE2333: + and x0, x0, -280375465082881 +.LBB2334: + cmp x15, x19 + bne .L1292 + orr x2, x2, 280375465082880 +.LVL1356: +.L1291: +.LBE2334: + .loc 1 468 0 + tst x1, 71776119061217280 + bne .L1295 +.LBB2335: + and x15, x4, 67553994410557440 +.LVL1357: +.LBE2335: + and x0, x0, -71776119061217281 +.LBB2336: + cmp x15, x18 + bne .L1296 + orr x2, x2, 71776119061217280 +.LVL1358: +.L1295: +.LBE2336: + .loc 1 469 0 + tst x1, -72057594037927936 + bne .L1299 +.LBB2337: + and x4, x4, -1152921504606846976 +.LVL1359: +.LBE2337: + and x0, x0, 72057594037927935 +.LBB2338: + cmp x4, x17 + bne .L1300 + orr x2, x2, -72057594037927936 +.LVL1360: +.L1299: + eor x6, x6, x3 +.LVL1361: +.LBE2338: + .loc 1 473 0 + str x0, [x7] + and x2, x6, x2 +.LVL1362: + .loc 1 454 0 + add w5, w5, 1 + .loc 1 472 0 + eor x2, x3, x2 + .loc 1 474 0 + str x2, [x10] + .loc 1 454 0 + cmp w5, w14 + bgt .L1305 +.L1526: + .loc 1 455 0 + sxtw x0, w5 +.LVL1363: + lsl x7, x0, 3 + add x10, x9, x7 + .loc 1 459 0 + add x7, x8, x7 + .loc 1 458 0 + ldr x1, [x11, x0, lsl 3] + .loc 1 455 0 + ldr x3, [x9, x0, lsl 3] + .loc 1 456 0 + ldr x4, [x13, x0, lsl 3] +.LVL1364: + .loc 1 462 0 + ands x2, x1, 255 +.LVL1365: + .loc 1 457 0 + ldr x6, [x12, x0, lsl 3] +.LVL1366: + .loc 1 459 0 + ldr x0, [x8, x0, lsl 3] +.LVL1367: + .loc 1 462 0 + beq .L1616 + .loc 1 460 0 + mov x2, 0 + b .L1272 +.LVL1368: + .p2align 3 +.L1305: + .loc 1 453 0 + add w22, w22, 1 + .loc 1 476 0 + add x9, x9, x16 + .loc 1 477 0 + add x13, x13, x16 + .loc 1 478 0 + add x12, x12, x16 + .loc 1 479 0 + add x11, x11, x16 + .loc 1 480 0 + add x8, x8, x16 + .loc 1 453 0 + cmp w22, w28 + ble .L1271 +.LVL1369: +.L1270: +.LBE2366: +.LBE2372: + .loc 1 2392 0 + ldr w0, [x25, 52] +.LVL1370: + cbnz w0, .L1306 + .loc 1 2394 0 + ldr w0, [x25, 200] + .loc 1 2393 0 + mov w1, 1 +.LVL1371: + str w1, [x25, 52] + .loc 1 2394 0 + cbz w0, .L1617 +.L1307: + .loc 1 2396 0 + mov w1, 1 + mov x0, x24 + bl ebc_lut_update +.LVL1372: + .loc 1 2398 0 + ldr w3, [x25, 112] + .loc 1 2400 0 + adrp x1, .LC105 + ldr x0, [x25, 104] + add x1, x1, :lo12:.LC105 + and w2, w3, 255 + .loc 1 2398 0 + strb w3, [x25, 56] + .loc 1 2399 0 + lsr w4, w3, 8 + strb w4, [x25, 57] + .loc 1 2400 0 + and w3, w4, 255 + bl _dev_info +.LVL1373: + .loc 1 2401 0 + mov x0, x24 + bl ebc_frame_start +.LVL1374: +.L1308: + .loc 1 2405 0 + ldr x0, [x25, 232] + cbz x0, .L1309 + .loc 1 2406 0 + bl ebc_buf_release +.LVL1375: +.L1309: + .loc 1 2407 0 + ldr x0, [x25, 240] + str x0, [x25, 232] + .loc 1 2409 0 + b .L1255 +.LVL1376: + .p2align 3 +.L1300: +.LBB2373: +.LBB2367: +.LBB2339: + .loc 1 469 0 + cbnz x4, .L1301 + and x3, x3, 72057594037927935 + orr x0, x0, 72057594037927936 + b .L1299 +.LVL1377: + .p2align 3 +.L1292: +.LBE2339: +.LBB2340: + .loc 1 467 0 + cbnz x15, .L1293 + and x3, x3, -280375465082881 + orr x0, x0, 1099511627776 + b .L1291 +.LVL1378: + .p2align 3 +.L1296: +.LBE2340: +.LBB2341: + .loc 1 468 0 + cbnz x15, .L1297 + and x3, x3, -71776119061217281 + orr x0, x0, 281474976710656 + b .L1295 +.LVL1379: + .p2align 3 +.L1615: +.LBE2341: +.LBB2342: + .loc 1 462 0 + cbnz x15, .L1273 + and x3, x3, -256 + orr x0, x0, 1 + b .L1272 +.LVL1380: + .p2align 3 +.L1276: +.LBE2342: +.LBB2343: + .loc 1 463 0 + and x3, x3, -65281 + cbnz x15, .L1277 + orr x0, x0, 256 + b .L1275 +.LVL1381: + .p2align 3 +.L1284: +.LBE2343: +.LBB2344: + .loc 1 465 0 + cbnz x15, .L1285 + and x3, x3, -4278190081 + orr x0, x0, 16777216 + b .L1283 +.LVL1382: + .p2align 3 +.L1280: +.LBE2344: +.LBB2345: + .loc 1 464 0 + and x3, x3, -16711681 + cbnz x15, .L1281 + orr x0, x0, 65536 + b .L1279 +.LVL1383: + .p2align 3 +.L1288: +.LBE2345: +.LBB2346: + .loc 1 466 0 + cbnz x15, .L1289 + and x3, x3, -1095216660481 + orr x0, x0, 4294967296 + b .L1287 +.LVL1384: + .p2align 3 +.L1301: +.LBE2346: +.LBB2347: + .loc 1 469 0 + mov x1, -2305843009213693952 +.LVL1385: + and x3, x3, 72057594037927935 + cmp x4, x1 + beq .L1618 + orr x3, x4, x3 + b .L1299 +.LVL1386: + .p2align 3 +.L1293: +.LBE2347: +.LBB2348: + .loc 1 467 0 + mov x30, 246290604621824 + and x3, x3, -280375465082881 + cmp x15, x30 + beq .L1619 + orr x3, x15, x3 + b .L1291 +.LVL1387: + .p2align 3 +.L1289: +.LBE2348: +.LBB2349: + .loc 1 466 0 + mov x30, 962072674304 + and x3, x3, -1095216660481 + cmp x15, x30 + beq .L1620 + orr x3, x15, x3 + b .L1287 +.LVL1388: + .p2align 3 +.L1273: +.LBE2349: +.LBB2350: + .loc 1 462 0 + cmp x15, 224 + beq .L1621 + bfi x3, x15, 0, 8 + b .L1272 +.LVL1389: + .p2align 3 +.L1297: +.LBE2350: +.LBB2351: + .loc 1 468 0 + mov x30, 63050394783186944 + and x3, x3, -71776119061217281 + cmp x15, x30 + beq .L1622 + orr x3, x15, x3 + b .L1295 +.LVL1390: + .p2align 3 +.L1277: +.LBE2351: +.LBB2352: + .loc 1 463 0 + cmp x15, 57344 + beq .L1623 + orr x3, x15, x3 + b .L1275 +.LVL1391: + .p2align 3 +.L1285: +.LBE2352: +.LBB2353: + .loc 1 465 0 + mov x30, 3758096384 + and x3, x3, -4278190081 + cmp x15, x30 + beq .L1624 + orr x3, x15, x3 + b .L1283 +.LVL1392: + .p2align 3 +.L1281: +.LBE2353: +.LBB2354: + .loc 1 464 0 + cmp x15, 14680064 + beq .L1625 + orr x3, x15, x3 + b .L1279 +.LVL1393: + .p2align 3 +.L1259: +.LBE2354: +.LBE2367: +.LBE2373: + .loc 1 2370 0 + ldr x0, [x25, 104] + adrp x1, .LC102 + add x1, x1, :lo12:.LC102 + .loc 1 2373 0 + mov w26, 0 + .loc 1 2370 0 + bl _dev_info +.LVL1394: + .loc 1 2371 0 + mov x0, x19 + bl ebc_buf_release +.LVL1395: + .loc 1 2373 0 + b .L1255 +.LVL1396: +.L1618: +.LBB2374: +.LBB2368: +.LBB2355: + .loc 1 469 0 + orr x0, x0, 72057594037927936 + orr x3, x3, -1152921504606846976 + b .L1299 +.LVL1397: +.L1619: +.LBE2355: +.LBB2356: + .loc 1 467 0 + orr x0, x0, 1099511627776 + orr x3, x3, 263882790666240 + b .L1291 +.LVL1398: +.L1621: +.LBE2356: +.LBB2357: + .loc 1 462 0 + and x3, x3, -256 + orr x0, x0, 1 + orr x3, x3, 240 + b .L1272 +.LVL1399: +.L1623: +.LBE2357: +.LBB2358: + .loc 1 463 0 + orr x0, x0, 256 + orr x3, x3, 61440 + b .L1275 +.LVL1400: +.L1622: +.LBE2358: +.LBB2359: + .loc 1 468 0 + orr x0, x0, 281474976710656 + orr x3, x3, 67553994410557440 + b .L1295 +.LVL1401: +.L1624: +.LBE2359: +.LBB2360: + .loc 1 465 0 + orr x0, x0, 16777216 + orr x3, x3, 4026531840 + b .L1283 +.LVL1402: +.L1620: +.LBE2360: +.LBB2361: + .loc 1 466 0 + orr x0, x0, 4294967296 + orr x3, x3, 1030792151040 + b .L1287 +.LVL1403: +.L1625: +.LBE2361: +.LBB2362: + .loc 1 464 0 + orr x0, x0, 65536 + orr x3, x3, 15728640 + b .L1279 +.LVL1404: + .p2align 3 +.L1310: +.LBE2362: +.LBE2368: +.LBE2374: + .loc 1 2413 0 + bl ebc_dsp_buf_get +.LVL1405: + mov x19, x0 +.LVL1406: + .loc 1 2414 0 + cbz x0, .L1311 + .loc 1 2415 0 + ldr w1, [x27, 160] + cbnz w1, .L1312 + .loc 1 2416 0 + ldr w1, [x0, 40] + sub w2, w1, #18 + tst w2, -3 + bne .L1313 + .loc 1 2417 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + str wzr, [x0, 32] +.L1314: + .loc 1 2498 0 + ldr w0, [x19, 64] + .loc 1 2496 0 + cbz w26, .L1330 + .loc 1 2498 0 + cbnz w0, .L1327 + .loc 1 2500 0 + mov w0, 1 + str w0, [x19, 64] + .loc 1 2499 0 + mov w0, 21 + str w0, [x19, 40] +.L1328: + .loc 1 2609 0 + ldr w0, [x25, 468] + cbz w0, .L1435 +.L1370: + .loc 1 2672 0 + ldr w0, [x25, 52] + .loc 1 2666 0 + mov w20, 1 +.LVL1407: + .loc 1 2672 0 + cbnz w0, .L1626 +.L1389: +.LVL1408: +.L1386: + .loc 1 2677 0 + ldr w0, [x25, 252] +.LVL1409: + sub w0, w0, #3 + cmp w0, 1 + bls .L1627 +.L1391: + .loc 1 2681 0 + ldr w0, [x19, 40] + sub w1, w0, #7 + .loc 1 2680 0 + cmp w1, 1 + bls .L1628 +.L1392: + .loc 1 2695 0 + sub w0, w0, #2 + .loc 1 2694 0 + cmp w0, 14 + bhi .L1394 + ldr x0, [x25, 216] +.LBB2375: +.LBB2376: + .loc 1 2288 0 + ldr w1, [x25, 28] + ldr x4, [x19, 16] + cmp w1, 0 + ldr x5, [x0, 16] + add w0, w1, 7 + csel w0, w0, w1, lt + asr w0, w0, 3 + cmp w0, 0 + ble .L1396 + .loc 1 2292 0 + ldr x2, [x4] + ldr x1, [x5] + cmp x2, x1 + bne .L1394 + sub w1, w0, #1 + mov x0, 8 + add x1, x1, 1 + lsl x1, x1, 3 + b .L1398 +.L1399: + .loc 1 2289 0 + ldr x3, [x4, x0] + add x0, x0, 8 + .loc 1 2290 0 + add x2, x5, x0 + .loc 1 2292 0 + ldr x2, [x2, -8] + cmp x3, x2 + bne .L1394 +.L1398: + .loc 1 2288 0 + cmp x1, x0 + bne .L1399 +.L1396: +.LBE2376: +.LBE2375: + .loc 1 2697 0 + ldr x0, [x25, 104] + adrp x1, .LC118 + add x1, x1, :lo12:.LC118 + bl _dev_info +.LVL1410: + .loc 1 2699 0 + str x19, [x25, 224] + ldr w0, [x19, 40] + .loc 1 2784 0 + cmp w0, 20 + bne .L1413 +.LVL1411: +.L1643: + .loc 1 2785 0 + mov w0, 1 + str w0, [x25, 592] + .loc 1 2787 0 + ldr x0, [x25, 104] + adrp x1, .LC121 + .loc 1 2786 0 + str wzr, [x25, 612] + .loc 1 2787 0 + add x1, x1, :lo12:.LC121 + bl _dev_info +.LVL1412: + .loc 1 2797 0 + ldr w0, [x25, 468] + cbz w0, .L1416 +.L1645: + .loc 1 2798 0 + ldr x0, [x25, 216] + bl ebc_buf_release +.LVL1413: + b .L1417 +.L1327: + .loc 1 2501 0 + ldr w1, [x19, 40] + cmp w1, 16 + bne .L1329 + .loc 1 2502 0 + mov w1, 21 + str w1, [x19, 40] +.L1330: + .loc 1 2510 0 + cmp w0, 1 + beq .L1331 + .loc 1 2511 0 + ldr w1, [x25, 596] + cbnz w1, .L1332 + .loc 1 2511 0 is_stmt 0 discriminator 1 + ldr w1, [x25, 252] + cmp w1, 4 + beq .L1629 +.L1331: + .loc 1 2609 0 is_stmt 1 + ldr w0, [x25, 468] + cbnz w0, .L1436 +.L1435: + .loc 1 2610 0 + str x19, [x25, 216] +.L1436: + .loc 1 2612 0 + ldr w2, [x19, 40] + cmp w2, 11 + bgt .L1367 + cmp w2, 7 + bge .L1442 + cmp w2, 0 + beq .L1369 + blt .L1366 + cmp w2, 2 + bge .L1370 +.L1366: + .loc 1 2775 0 + ldr x0, [x25, 104] + adrp x1, .LC120 + add x1, x1, :lo12:.LC120 + .loc 1 2778 0 + mov w26, 0 + .loc 1 2775 0 + bl _dev_err +.LVL1414: + .loc 1 2776 0 + mov x0, x19 + bl ebc_buf_release +.LVL1415: + .loc 1 2778 0 + b .L1255 +.LVL1416: +.L1306: + .loc 1 2403 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + ldr x0, [x0, 8] + bl wake_up_process +.LVL1417: + b .L1308 +.L1614: + .loc 1 2378 0 discriminator 1 + ldr w0, [x25, 52] + cbz w0, .L1263 + .loc 1 2380 0 + ldr x0, [x25, 104] + adrp x1, .LC103 + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1418: +.LBB2377: + .loc 1 2381 0 + ldr w0, [x25, 52] + cbnz w0, .L1630 +.L1266: +.LVL1419: +.L1264: +.LBE2377: + .loc 1 2382 0 discriminator 11 + ldr x0, [x25, 104] +.LVL1420: + adrp x1, .LC104 + add x1, x1, :lo12:.LC104 + bl _dev_info +.LVL1421: + b .L1263 +.L1312: + .loc 1 2452 0 + ldr w0, [x0, 40] + cmp w0, 18 + beq .L1631 + .loc 1 2462 0 + cmp w0, 19 + beq .L1632 + .loc 1 2477 0 + cmp w0, 20 + beq .L1633 + .loc 1 2485 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + ldr w1, [x0, 32] + cbz w1, .L1314 + .loc 1 2486 0 + ldr w1, [x0, 36] + cmp w1, 5 + add w1, w1, 1 + str w1, [x0, 36] + ble .L1325 + .loc 1 2487 0 + str wzr, [x0, 32] +.L1325: + .loc 1 2488 0 + ldr w1, [x24, 220] + ldr x0, [x19, 16] + bl check_black_percent.isra.11 +.LVL1422: + cbz w0, .L1314 +.L1591: + .loc 1 2552 0 + mov x0, x19 +.L1592: + bl ebc_buf_release +.LVL1423: + .loc 1 2554 0 + b .L1255 +.LVL1424: +.L1617: + .loc 1 2395 0 + mov x0, x24 + bl ebc_power_set.constprop.15 +.LVL1425: + b .L1307 +.L1613: + .loc 1 2376 0 + ldr x0, [x25, 216] + ldrsw x2, [x25, 28] + ldr x1, [x0, 16] + ldr x0, [x25, 160] + bl memcpy +.LVL1426: + .loc 1 2377 0 + ldr x0, [x25, 224] + ldrsw x2, [x25, 28] + ldr x1, [x0, 16] + ldr x0, [x25, 152] + bl memcpy +.LVL1427: + b .L1263 +.L1313: + .loc 1 2418 0 + adrp x2, .LANCHOR0 + add x20, x2, :lo12:.LANCHOR0 +.LVL1428: + ldr w2, [x20, 32] + cbz w2, .L1315 + .loc 1 2419 0 + ldr w0, [x20, 36] + cmp w0, 5 + add w0, w0, 1 + str w0, [x20, 36] + ble .L1325 + .loc 1 2420 0 + str wzr, [x20, 32] + b .L1325 +.LVL1429: +.L1332: + .loc 1 2512 0 + ldr w1, [x25, 252] + sub w2, w1, #1 + cmp w2, 1 + bls .L1634 + .loc 1 2515 0 + cmp w1, 3 + beq .L1635 +.L1333: + .loc 1 2521 0 + cbnz w0, .L1339 +.L1649: + .loc 1 2522 0 + ldr w3, [x25, 88] + .loc 1 2523 0 + sub w0, w3, #1 + .loc 1 2522 0 + cmp w0, 99 + bhi .L1340 +.LBB2380: + .loc 1 2524 0 + ldr x0, [x25, 216] + ldr w2, [x24, 220] + ldr x1, [x0, 16] + ldr x0, [x19, 16] + bl check_diff_percent.isra.12 +.LVL1430: + .loc 1 2525 0 + cmp w0, 2 + beq .L1636 +.L1340: +.LBE2380: + .loc 1 2540 0 + bl ebc_get_dsp_list_enum_num +.LVL1431: + mov w26, w0 + cbnz w0, .L1637 + .loc 1 2545 0 + ldr w2, [x25, 248] + cmp w2, 0 + ble .L1339 + .loc 1 2547 0 + ldr x0, [x25, 104] + adrp x1, .LC112 + .loc 1 2546 0 + str wzr, [x25, 100] + .loc 1 2547 0 + add x1, x1, :lo12:.LC112 + bl _dev_info +.LVL1432: +.LBB2381: +.LBB2382: +.LBB2383: + .file 17 "./include/linux/jiffies.h" + .loc 17 368 0 + ldr w0, [x25, 248] + bl __msecs_to_jiffies +.LVL1433: +.LBE2383: +.LBE2382: +.LBB2384: + .loc 1 2548 0 + ldr w1, [x25, 100] + cmp w1, 0 + cset w1, ne +.LVL1434: + cmp x0, 0 + cset w0, eq + tst w1, w0 + beq .L1638 +.L1344: +.LVL1435: +.L1342: +.LBE2384: +.LBE2381: + .loc 1 2550 0 discriminator 17 + bl ebc_get_dsp_list_enum_num +.LVL1436: + cbnz w0, .L1593 +.L1339: + ldr w1, [x19, 40] + sub w1, w1, #12 + cmp w1, 11 + bhi .L1639 + adrp x0, .LANCHOR3 + add x0, x0, :lo12:.LANCHOR3 + add x0, x0, 56 + ldr w1, [x0, w1, uxtw 2] + .loc 1 2560 0 + ldr w0, [x25, 144] + cmp w0, 7 + beq .L1640 +.LVL1437: + cmp w1, 12 + cset w2, eq + .loc 1 2561 0 + cmp w0, 1 + beq .L1641 +.L1437: + .loc 1 2562 0 + cmp w0, 2 + cset w0, eq + tst w2, w0 + bne .L1347 +.L1350: + .loc 1 2576 0 + mov w0, 4 + .loc 1 2577 0 + str x19, [x25, 224] + .loc 1 2576 0 + str w0, [x25, 252] + .loc 1 2578 0 + mov x5, x25 + ldr x0, [x25, 152] + ldr x1, [x25, 16] +.LVL1438: + ldp x3, x4, [x25, 168] + ldr x2, [x19, 16] + bl refresh_new_image +.LVL1439: + .loc 1 2584 0 + ldr w0, [x25, 52] + cbz w0, .L1642 + .loc 1 2594 0 + ldr x0, [x25, 224] + ldr w0, [x0, 40] + .loc 1 2596 0 + cmp w0, 0 + .loc 1 2595 0 + sub w1, w0, #22 + .loc 1 2596 0 + ccmp w1, 1, 0, ne + bhi .L1438 +.L1365: + .loc 1 2784 0 + cmp w0, 20 + beq .L1643 +.L1413: + .loc 1 2788 0 + cmp w0, 18 + beq .L1644 +.L1414: + .loc 1 2797 0 + ldr w0, [x25, 468] + cbnz w0, .L1645 +.L1416: + .loc 1 2800 0 + mov w0, 1 + str w0, [x25, 468] +.L1417: + .loc 1 2802 0 + ldr x0, [x25, 224] + mov w26, 0 + str x0, [x25, 216] + b .L1255 +.L1329: + .loc 1 2503 0 + cmp w0, 2 + bne .L1330 + .loc 1 2505 0 + mov w0, 1 + str w0, [x19, 64] + .loc 1 2504 0 + mov w0, 4 + str w0, [x19, 40] + b .L1328 +.LVL1440: +.L1315: + .loc 1 2426 0 + ldr x2, [x25, 584] + cbz x2, .L1314 + .loc 1 2427 0 + cmp w1, 19 + bne .L1592 + .loc 1 2428 0 + str wzr, [x25, 584] + .loc 1 2429 0 + mov x0, 3 + bl ebc_notify +.LVL1441: + .loc 1 2430 0 + ldr x0, [x25, 104] + adrp x1, .LC106 + add x1, x1, :lo12:.LC106 + bl _dev_info +.LVL1442: + .loc 1 2431 0 + ldr w0, [x25, 608] + cbz w0, .L1314 + .loc 1 2432 0 + mov w0, 1 + .loc 1 2434 0 + ldr w1, [x24, 220] + .loc 1 2433 0 + stp w0, wzr, [x20, 32] + .loc 1 2434 0 + ldr x0, [x19, 16] + bl check_black_percent.isra.11 +.LVL1443: + cbz w0, .L1314 + b .L1587 +.LVL1444: + .p2align 3 +.L1639: + .loc 1 2560 0 + ldr w0, [x25, 144] + cmp w0, 7 + beq .L1347 + .loc 1 2561 0 + mov w2, 1 + cmp w0, 1 + bne .L1437 +.LVL1445: +.L1347: + .loc 1 2563 0 + ldr w0, [x25, 52] + cbz w0, .L1350 +.L1668: + .loc 1 2564 0 + ldr x0, [x25, 104] + adrp x1, .LC103 +.LVL1446: + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1447: +.LBB2392: + .loc 1 2565 0 + ldr w0, [x25, 52] + cbnz w0, .L1646 +.L1354: +.LVL1448: +.L1352: +.LBE2392: + .loc 1 2566 0 discriminator 11 + bl ebc_get_dsp_list_enum_num +.LVL1449: + cbz w0, .L1356 + .loc 1 2566 0 is_stmt 0 discriminator 1 + ldr w26, [x19, 64] +.LVL1450: + cbz w26, .L1593 +.L1356: + .loc 1 2572 0 is_stmt 1 + ldr x0, [x25, 104] + adrp x1, .LC104 + add x1, x1, :lo12:.LC104 + bl _dev_info +.LVL1451: + b .L1350 +.LVL1452: +.L1610: +.LBB2395: +.LBB2312: + .loc 1 2808 0 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1453: +.LBB2307: + ldr x20, [x29, 104] +.LVL1454: + mov w2, 1 + add x1, x29, 112 + mov x0, x20 + bl prepare_to_wait_event +.LVL1455: +.LBB2301: + ldr w1, [x25, 100] +.LBE2301: +.LBE2307: + mov x19, 60 +.LBB2308: +.LBB2302: + mov w2, 0 + cmp w1, 0 + cset w1, ne +.LVL1456: +.L1422: +.LBE2302: + .loc 1 2808 0 is_stmt 0 discriminator 9 + orr w1, w1, w2 +.LVL1457: + cbnz w1, .L1421 +.LVL1458: + .loc 1 2808 0 discriminator 11 + cbnz x0, .L1420 + .loc 1 2808 0 discriminator 13 + mov x0, x19 +.LVL1459: + bl schedule_timeout +.LVL1460: + mov w2, 1 + mov x19, x0 + add x1, x29, 112 + mov x0, x20 + bl prepare_to_wait_event +.LVL1461: +.LBB2303: + ldr w1, [x25, 100] + cmp w1, 0 + cset w1, ne +.LVL1462: + cmp x19, 0 + cset w2, eq + tst w1, w2 + beq .L1422 +.L1421: +.LBE2303: +.LBE2308: + .loc 1 2808 0 + ldr x0, [x29, 104] + add x1, x29, 112 +.LVL1463: + bl finish_wait +.LVL1464: +.L1420: +.LBE2312: +.LBE2395: + .loc 1 2809 0 is_stmt 1 discriminator 16 + ldr w0, [x25, 100] +.LVL1465: + cbnz w0, .L1255 + .loc 1 2816 0 + ldr w0, [x25, 52] + cmp w0, 1 + bne .L1424 +.LBB2396: +.LBB2397: + .loc 1 2817 0 discriminator 3 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1466: +.LBB2398: + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1467: + ldr w1, [x25, 52] + cbz w1, .L1425 +.L1647: + .loc 1 2817 0 is_stmt 0 discriminator 7 + ldr w1, [x25, 100] + cbnz w1, .L1425 +.LVL1468: + .loc 1 2817 0 discriminator 9 + cbnz x0, .L1426 + .loc 1 2817 0 discriminator 11 + bl schedule +.LVL1469: + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1470: + ldr w1, [x25, 52] + cbnz w1, .L1647 +.L1425: +.LBE2398: + .loc 1 2817 0 discriminator 8 + ldr x0, [x29, 104] + add x1, x29, 112 + bl finish_wait +.LVL1471: +.L1426: +.LBE2397: +.LBE2396: + .loc 1 2819 0 is_stmt 1 discriminator 14 + bl ebc_get_dsp_list_enum_num +.LVL1472: + cbnz w0, .L1255 + .loc 1 2819 0 is_stmt 0 discriminator 1 + bl ebc_get_osd_list_enum_num +.LVL1473: + cbnz w0, .L1255 + .loc 1 2821 0 is_stmt 1 + ldr w0, [x25, 52] + cbnz w0, .L1429 +.L1604: + .loc 1 2828 0 + ldr w0, [x25, 200] + cmp w0, 1 + bne .L1429 +.LBB2399: +.LBB2400: + mov w1, 0 + mov x0, x24 + bl ebc_power_set.part.7 +.LVL1474: +.L1429: +.LBE2400: +.LBE2399: + .loc 1 2831 0 + ldr w0, [x25, 100] + cbnz w0, .L1431 +.LBB2401: +.LBB2402: + .loc 1 2832 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1475: +.L1434: +.LBB2403: + .loc 1 2832 0 is_stmt 0 discriminator 9 + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1476: + ldr w1, [x25, 100] + cbnz w1, .L1432 +.LVL1477: + .loc 1 2832 0 discriminator 5 + cbnz x0, .L1431 + .loc 1 2832 0 discriminator 7 + bl schedule +.LVL1478: +.LBE2403: + b .L1434 +.LVL1479: + .p2align 3 +.L1442: +.LBE2402: +.LBE2401: + .loc 1 2672 0 is_stmt 1 + ldr w0, [x25, 52] + .loc 1 2612 0 + mov w20, 0 +.LVL1480: + .loc 1 2672 0 + cbz w0, .L1386 +.L1626: + .loc 1 2673 0 + ldr x0, [x25, 104] + adrp x1, .LC117 + add x1, x1, :lo12:.LC117 + bl _dev_info +.LVL1481: +.LBB2405: + .loc 1 2674 0 + ldr w0, [x25, 52] + cbz w0, .L1386 +.LBB2406: + .loc 1 2674 0 is_stmt 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1482: + b .L1390 +.L1648: +.LVL1483: +.LBB2407: + .loc 1 2674 0 discriminator 5 + cbnz x0, .L1386 + .loc 1 2674 0 discriminator 7 + bl schedule +.LVL1484: +.L1390: + .loc 1 2674 0 discriminator 9 + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1485: + ldr w1, [x25, 52] + cbnz w1, .L1648 +.LBE2407: + .loc 1 2674 0 discriminator 4 + ldr x0, [x29, 104] + add x1, x29, 112 + bl finish_wait +.LVL1486: + b .L1386 +.LVL1487: + .p2align 3 +.L1629: +.LBE2406: +.LBE2405: + .loc 1 2511 0 is_stmt 1 discriminator 2 + ldr w1, [x25, 52] + cbz w1, .L1331 + .loc 1 2521 0 + cbnz w0, .L1339 + b .L1649 +.L1635: + .loc 1 2515 0 discriminator 1 + ldr w1, [x25, 52] + cbz w1, .L1333 + .loc 1 2517 0 + ldr x0, [x25, 104] + adrp x1, .LC103 + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1488: +.LBB2408: + .loc 1 2518 0 + ldr w0, [x25, 52] + cbnz w0, .L1650 +.L1337: +.LVL1489: +.L1335: +.LBE2408: + .loc 1 2519 0 discriminator 11 + ldr x0, [x25, 104] +.LVL1490: + adrp x1, .LC104 + add x1, x1, :lo12:.LC104 + bl _dev_info +.LVL1491: + ldr w0, [x19, 64] + .loc 1 2521 0 discriminator 11 + cbnz w0, .L1339 + b .L1649 +.LVL1492: +.L1628: + .loc 1 2682 0 + ldr w3, [x25, 88] + .loc 1 2683 0 + sub w1, w3, #1 + cmp w1, 99 + bhi .L1392 +.LBB2411: + .loc 1 2684 0 + ldr x0, [x25, 216] + ldr w2, [x24, 220] + ldr x1, [x0, 16] + ldr x0, [x19, 16] + bl check_diff_percent.isra.12 +.LVL1493: + mov w21, w0 + .loc 1 2685 0 + cbz w0, .L1396 + .loc 1 2690 0 + cmp w0, 2 + beq .L1598 +.L1394: +.LBE2411: + .loc 1 2705 0 + cbnz w20, .L1443 + .loc 1 2709 0 + ldr w0, [x25, 84] + .loc 1 2704 0 + mov w21, 1 + .loc 1 2709 0 + cmp w0, 0 + ble .L1395 + .loc 1 2710 0 + ldr w1, [x29, 100] +.LVL1494: + add w1, w1, w21 +.LVL1495: + str w1, [x29, 100] + .loc 1 2711 0 + cmp w0, w1 + ble .L1651 +.LVL1496: +.L1395: + .loc 1 2718 0 + ldr w0, [x25, 200] + cbz w0, .L1652 +.L1400: + .loc 1 2721 0 + ldr w1, [x19, 40] +.LVL1497: + mov x0, x24 + bl ebc_lut_update +.LVL1498: + .loc 1 2723 0 + ldr w0, [x19, 64] + cbnz w0, .L1401 + .loc 1 2725 0 + bl ebc_get_dsp_list_enum_num +.LVL1499: + cbnz w0, .L1602 + .loc 1 2739 0 + ldr w0, [x19, 40] + .loc 1 2741 0 + and w1, w0, -3 + cmp w1, 16 + ccmp w0, 20, 4, ne + beq .L1401 + .loc 1 2742 0 + ldr w2, [x25, 248] + cmp w2, 0 + ble .L1401 + .loc 1 2743 0 + ldr x0, [x25, 104] + adrp x1, .LC112 + add x1, x1, :lo12:.LC112 + bl _dev_info +.LVL1500: +.LBB2412: +.LBB2413: +.LBB2414: + .loc 17 368 0 + ldr w0, [x25, 248] + bl __msecs_to_jiffies +.LVL1501: +.LBE2414: +.LBE2413: +.LBB2415: + .loc 1 2744 0 + ldr w1, [x25, 596] + cmp w1, 0 + cset w1, ne +.LVL1502: + cmp x0, 0 + cset w0, eq + tst w1, w0 + bne .L1404 +.LBE2415: + .loc 1 2744 0 is_stmt 0 discriminator 3 + orr w1, w1, w0 +.LVL1503: + cbnz w1, .L1404 +.LBB2416: +.LBB2417: +.LBB2418: + .loc 17 368 0 is_stmt 1 discriminator 4 + ldr w0, [x25, 248] + bl __msecs_to_jiffies +.LVL1504: + mov x20, x0 +.LVL1505: +.LBE2418: +.LBE2417: + .loc 1 2744 0 discriminator 4 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1506: +.L1407: +.LBB2419: + .loc 1 2744 0 is_stmt 0 discriminator 15 + ldr x0, [x29, 104] + mov w2, 1 + add x1, x29, 112 + bl prepare_to_wait_event +.LVL1507: +.LBB2420: + ldr w1, [x25, 596] + cmp w1, 0 + cset w1, ne +.LVL1508: + cmp x20, 0 + cset w2, eq + tst w1, w2 + beq .L1653 +.L1405: +.LBE2420: +.LBE2419: + .loc 1 2744 0 discriminator 10 + ldr x0, [x29, 104] + add x1, x29, 112 +.LVL1509: + bl finish_wait +.LVL1510: +.L1406: +.L1404: +.LBE2416: +.LBE2412: + .loc 1 2746 0 is_stmt 1 discriminator 17 + bl ebc_get_dsp_list_enum_num +.LVL1511: + cbnz w0, .L1602 +.L1401: + .loc 1 2765 0 + ldr w3, [x25, 112] + .loc 1 2766 0 + adrp x1, .LC119 + .loc 1 2765 0 + strb w3, [x25, 56] + .loc 1 2766 0 + add x1, x1, :lo12:.LC119 + .loc 1 2764 0 + str x19, [x25, 224] + .loc 1 2766 0 + and w3, w3, 255 + ldr x0, [x25, 104] + .loc 1 2770 0 + adrp x20, jiffies +.LVL1512: + .loc 1 2766 0 + ldr w2, [x19, 40] + .loc 1 2770 0 + add x19, x24, 720 + .loc 1 2766 0 + bl _dev_info +.LVL1513: + .loc 1 2768 0 + str w21, [x25, 252] + .loc 1 2767 0 + mov w0, 1 + str w0, [x25, 52] + .loc 1 2769 0 + mov x0, x24 + bl ebc_frame_start +.LVL1514: + .loc 1 2770 0 + ldr x1, [x20, #:lo12:jiffies] + mov x0, x19 + add x1, x1, 900 + bl mod_timer +.LVL1515: +.LBB2423: + .loc 1 2771 0 + ldr w0, [x25, 52] + cbnz w0, .L1654 +.L1411: +.LVL1516: +.L1409: +.LBE2423: + .loc 1 2772 0 discriminator 11 + ldr x2, [x20, #:lo12:jiffies] + mov x0, x19 +.LVL1517: + mov x1, 402653184 + add x1, x2, x1 + bl mod_timer +.LVL1518: + ldr x0, [x25, 224] + ldr w0, [x0, 40] + .loc 1 2773 0 discriminator 11 + b .L1365 +.LVL1519: +.L1443: + .loc 1 2718 0 + ldr w0, [x25, 200] + .loc 1 2708 0 + mov w21, 2 + .loc 1 2706 0 + str wzr, [x29, 100] + .loc 1 2718 0 + cbnz w0, .L1400 +.LVL1520: +.L1652: + .loc 1 2719 0 + mov x0, x24 + bl ebc_power_set.constprop.15 +.LVL1521: + b .L1400 +.LVL1522: +.L1367: + .loc 1 2612 0 + cmp w2, 21 + ble .L1370 + cmp w2, 23 + bgt .L1366 +.L1369: + .loc 1 2617 0 + ldr w0, [x25, 252] + .loc 1 2616 0 + str x19, [x25, 224] + .loc 1 2617 0 + sub w1, w0, #1 + cmp w1, 1 + bls .L1655 + .loc 1 2620 0 + cmp w0, 4 + beq .L1656 + .loc 1 2626 0 + ldr x0, [x25, 216] + ldr w1, [x19, 40] + ldr w0, [x0, 40] + cmp w1, w0 + beq .L1374 + .loc 1 2626 0 is_stmt 0 discriminator 1 + ldr w0, [x25, 52] + cbnz w0, .L1657 +.L1381: +.L1374: + .loc 1 2633 0 is_stmt 1 + ldr x1, [x19, 16] + mov x3, x25 + ldr x0, [x25, 152] + ldr x2, [x25, 168] + bl refresh_new_image_auto +.LVL1523: +.L1372: + .loc 1 2639 0 + ldr w0, [x25, 52] + .loc 1 2638 0 + mov w1, 3 + str w1, [x25, 252] + .loc 1 2639 0 + cbnz w0, .L1599 + .loc 1 2640 0 + mov w0, 1 + str w0, [x25, 52] + .loc 1 2641 0 + ldr w0, [x25, 200] + cbz w0, .L1658 +.L1384: + .loc 1 2643 0 + ldr w1, [x19, 40] + mov x0, x24 + bl ebc_lut_update +.LVL1524: + .loc 1 2645 0 + ldr w1, [x25, 112] + .loc 1 2647 0 + ldr x0, [x25, 104] + .loc 1 2645 0 + strb w1, [x25, 56] + .loc 1 2647 0 + and w2, w1, 255 + .loc 1 2646 0 + lsr w1, w1, 8 + strb w1, [x25, 57] + .loc 1 2647 0 + adrp x1, .LC116 + add x1, x1, :lo12:.LC116 + bl _dev_info +.LVL1525: + .loc 1 2648 0 + mov x0, x24 + bl ebc_frame_start +.LVL1526: +.L1599: + ldr x0, [x25, 224] + ldr w0, [x0, 40] + b .L1365 +.L1631: + .loc 1 2453 0 + ldr x0, [x25, 104] + adrp x1, .LC107 + add x1, x1, :lo12:.LC107 + bl _dev_info +.LVL1527: + .loc 1 2454 0 + ldr w0, [x25, 584] + cbnz w0, .L1320 + .loc 1 2455 0 + mov x0, 2 + bl ebc_notify +.LVL1528: +.L1320: + .loc 1 2457 0 + mov w0, 1 + str w0, [x25, 584] +.L1590: + .loc 1 2456 0 + adrp x1, .LANCHOR0 + add x1, x1, :lo12:.LANCHOR0 + .loc 1 2458 0 + str wzr, [x25, 612] + .loc 1 2459 0 + mov x0, x19 + .loc 1 2456 0 + str wzr, [x1, 32] + .loc 1 2552 0 + bl ebc_buf_release +.LVL1529: + b .L1255 +.L1630: +.LBB2426: +.LBB2378: + .loc 1 2381 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1530: + ldr x20, [x29, 104] +.LVL1531: + b .L1267 +.L1659: +.LVL1532: +.LBB2379: + .loc 1 2381 0 is_stmt 0 discriminator 5 + cbnz x0, .L1264 + .loc 1 2381 0 discriminator 7 + bl schedule +.LVL1533: +.L1267: + .loc 1 2381 0 discriminator 9 + add x1, x29, 112 + mov w2, 1 + mov x0, x20 + bl prepare_to_wait_event +.LVL1534: + ldr w1, [x25, 52] + cbnz w1, .L1659 +.LBE2379: + .loc 1 2381 0 discriminator 4 + ldr x0, [x29, 104] + add x1, x29, 112 + bl finish_wait +.LVL1535: + b .L1264 +.L1654: +.LBE2378: +.LBE2426: +.LBB2427: +.LBB2424: + .loc 1 2771 0 is_stmt 1 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1536: + b .L1412 +.L1660: +.LVL1537: +.LBB2425: + .loc 1 2771 0 is_stmt 0 discriminator 5 + cbnz x0, .L1409 + .loc 1 2771 0 discriminator 7 + bl schedule +.LVL1538: +.L1412: + .loc 1 2771 0 discriminator 9 + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1539: + ldr w1, [x25, 52] + cbnz w1, .L1660 +.LBE2425: + .loc 1 2771 0 discriminator 4 + ldr x0, [x29, 104] + add x1, x29, 112 + bl finish_wait +.LVL1540: + b .L1409 +.LVL1541: +.L1602: +.LBE2424: +.LBE2427: + .loc 1 2747 0 is_stmt 1 + ldr w0, [x19, 40] + sub w0, w0, #19 + tst w0, -3 + beq .L1594 + .loc 1 2753 0 + ldr w26, [x19, 64] +.LVL1542: + cbnz w26, .L1401 +.LVL1543: +.L1593: + .loc 1 2551 0 + ldr x0, [x25, 104] + adrp x1, .LC111 + add x1, x1, :lo12:.LC111 + bl _dev_info +.LVL1544: + .loc 1 2552 0 + mov x0, x19 + b .L1592 +.L1642: + .loc 1 2585 0 + mov w0, 1 + str w0, [x25, 52] + .loc 1 2588 0 + mov x0, x24 + ldr w1, [x19, 40] + bl ebc_lut_update +.LVL1545: + .loc 1 2589 0 + ldr w3, [x25, 112] + .loc 1 2591 0 + adrp x1, .LC113 + ldr x2, [x25, 224] + add x1, x1, :lo12:.LC113 + .loc 1 2589 0 + strb w3, [x25, 56] + .loc 1 2590 0 + lsr w4, w3, 8 + strb w4, [x25, 57] + .loc 1 2591 0 + ldr x0, [x25, 104] + and w3, w3, 255 + ldr w2, [x2, 40] + bl _dev_info +.LVL1546: +.LBB2428: +.LBB2429: + .loc 1 1595 0 + ldr w0, [x27, 164] + .loc 1 1596 0 + mov w6, 1 + ldp x1, x2, [x25, 152] + ldp x3, x4, [x25, 168] + .loc 1 1595 0 + cbz w0, .L1358 + .loc 1 1596 0 + ldr x0, [x25, 184] + mov x5, x25 + bl get_overlay_image2 +.LVL1547: + .loc 1 1611 0 + ldr w0, [x25, 60] + cbz w0, .L1360 +.L1665: + .loc 1 1612 0 + ldr w0, [x25, 200] + cbz w0, .L1661 +.L1361: + .loc 1 1614 0 + ldr w0, [x27, 164] + .loc 1 1615 0 + mov w6, 1 + ldp x1, x2, [x25, 152] + ldp x3, x4, [x25, 168] + .loc 1 1614 0 + cbz w0, .L1362 + .loc 1 1615 0 + ldr x0, [x25, 192] + mov x5, x25 + bl get_overlay_image2 +.LVL1548: +.L1363: +.LBB2430: +.LBB2431: + .loc 1 1586 0 + str wzr, [x27, 72] + .loc 1 1587 0 + mov x0, x27 + ldr w1, [x24, 224] + bl flip.isra.4 +.LVL1549: +.L1364: +.LBE2431: +.LBE2430: +.LBE2429: +.LBE2428: + .loc 1 2594 0 + ldr x0, [x25, 224] + ldr w0, [x0, 40] + .loc 1 2596 0 + cmp w0, 0 + .loc 1 2595 0 + sub w1, w0, #22 + .loc 1 2596 0 + ccmp w1, 1, 0, ne + bls .L1365 + .loc 1 2597 0 + ldr w1, [x25, 52] + cbz w1, .L1365 +.L1438: + .loc 1 2600 0 + ldr x0, [x25, 104] + adrp x1, .LC115 + .loc 1 2599 0 + str wzr, [x25, 600] + .loc 1 2600 0 + add x1, x1, :lo12:.LC115 + bl _dev_info +.LVL1550: + .loc 1 2601 0 + ldrb w1, [x25, 56] + lsl w0, w1, 3 + sub w0, w0, w1 +.LBB2435: +.LBB2436: + .loc 17 368 0 + lsl w0, w0, 1 + bl __msecs_to_jiffies +.LVL1551: +.LBE2436: +.LBE2435: + .loc 1 2601 0 + adrp x1, jiffies + ldr x1, [x1, #:lo12:jiffies] + add x1, x1, x0 + add x0, x24, 664 + bl mod_timer +.LVL1552: + ldr x0, [x25, 224] + ldr w0, [x0, 40] + b .L1365 +.L1644: + .loc 1 2789 0 + ldr x0, [x25, 104] + adrp x1, .LC122 + add x1, x1, :lo12:.LC122 + bl _dev_info +.LVL1553: + .loc 1 2790 0 + ldr w0, [x25, 584] + cbz w0, .L1662 + .loc 1 2793 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + .loc 1 2792 0 + mov w1, 1 + .loc 1 2794 0 + str wzr, [x25, 612] + .loc 1 2792 0 + str w1, [x25, 584] + .loc 1 2793 0 + str wzr, [x0, 32] + b .L1414 +.L1633: + .loc 1 2478 0 + ldr x0, [x25, 104] + adrp x1, .LC109 + add x1, x1, :lo12:.LC109 + bl _dev_info +.LVL1554: + .loc 1 2480 0 + mov w0, 1 + str w0, [x25, 592] + b .L1590 +.L1632: + .loc 1 2463 0 + ldr x0, [x25, 104] + adrp x1, .LC108 + add x1, x1, :lo12:.LC108 + bl _dev_info +.LVL1555: + .loc 1 2464 0 + ldr w0, [x25, 584] + cmp w0, 1 + beq .L1663 +.L1322: + .loc 1 2467 0 + ldr w0, [x25, 608] + .loc 1 2466 0 + str wzr, [x25, 584] + .loc 1 2467 0 + cbz w0, .L1591 + .loc 1 2468 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + mov w1, 1 + .loc 1 2469 0 + stp w1, w1, [x0, 32] + .loc 1 2552 0 + mov x0, x19 + b .L1592 +.LVL1556: +.L1611: +.LBB2437: +.LBB2438: + mov w1, 0 + mov x0, x24 + bl ebc_power_set.part.7 +.LVL1557: + b .L1257 +.LVL1558: +.L1662: +.LBE2438: +.LBE2437: + .loc 1 2791 0 + mov x0, 2 + bl ebc_notify +.LVL1559: + .loc 1 2793 0 + adrp x0, .LANCHOR0 + add x0, x0, :lo12:.LANCHOR0 + .loc 1 2792 0 + mov w1, 1 + .loc 1 2794 0 + str wzr, [x25, 612] + .loc 1 2792 0 + str w1, [x25, 584] + .loc 1 2793 0 + str wzr, [x0, 32] + b .L1414 +.LVL1560: +.L1651: + .loc 1 2712 0 + mov w21, 2 +.LVL1561: +.L1598: + str w21, [x19, 40] + .loc 1 2713 0 + str wzr, [x29, 100] + b .L1395 +.LVL1562: +.L1638: +.LBB2439: + .loc 1 2548 0 discriminator 3 + orr w1, w1, w0 +.LVL1563: + cbnz w1, .L1342 +.LBB2385: +.LBB2386: +.LBB2387: + .loc 17 368 0 discriminator 4 + ldr w0, [x25, 248] + bl __msecs_to_jiffies +.LVL1564: + mov x20, x0 +.LVL1565: +.LBE2387: +.LBE2386: + .loc 1 2548 0 discriminator 4 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1566: +.L1345: +.LBB2388: + .loc 1 2548 0 is_stmt 0 discriminator 15 + ldr x0, [x29, 104] + mov w2, 1 + add x1, x29, 112 + bl prepare_to_wait_event +.LVL1567: +.LBB2389: + ldr w1, [x25, 100] + cmp w1, 0 + cset w1, ne +.LVL1568: + cmp x20, 0 + cset w2, eq + tst w1, w2 + beq .L1664 +.L1343: +.LBE2389: +.LBE2388: + .loc 1 2548 0 discriminator 10 + ldr x0, [x29, 104] + add x1, x29, 112 +.LVL1569: + bl finish_wait +.LVL1570: + b .L1342 +.LVL1571: + .p2align 3 +.L1358: +.LBE2385: +.LBE2439: +.LBB2440: +.LBB2432: + .loc 1 1604 0 is_stmt 1 + ldr x0, [x25, 184] + mov x5, x25 + bl get_overlay_image +.LVL1572: + .loc 1 1611 0 + ldr w0, [x25, 60] + cbnz w0, .L1665 +.L1360: + .loc 1 1633 0 + mov w0, 1 + str w0, [x25, 600] + .loc 1 1634 0 + ldr x0, [x25, 104] + adrp x2, .LANCHOR3 + .loc 1 1632 0 + str wzr, [x25, 52] + .loc 1 1634 0 + add x2, x2, :lo12:.LANCHOR3 + add x2, x2, 104 + adrp x1, .LC114 + add x1, x1, :lo12:.LC114 + bl _dev_info +.LVL1573: + b .L1364 +.L1658: +.LBE2432: +.LBE2440: + .loc 1 2642 0 + mov x0, x24 + bl ebc_power_set.constprop.15 +.LVL1574: + b .L1384 +.L1657: + .loc 1 2628 0 + ldr x0, [x25, 104] + adrp x1, .LC103 + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1575: +.LBB2441: + .loc 1 2629 0 + ldr w0, [x25, 52] + cbnz w0, .L1666 +.L1377: +.LVL1576: +.L1375: +.LBE2441: + .loc 1 2624 0 discriminator 11 + ldr x0, [x25, 104] +.LVL1577: + adrp x1, .LC104 + add x1, x1, :lo12:.LC104 + bl _dev_info +.LVL1578: +.L1597: + .loc 1 2625 0 discriminator 11 + ldr x0, [x25, 224] + ldrsw x2, [x25, 28] + ldr x1, [x0, 16] + ldr x0, [x25, 152] + bl memcpy +.LVL1579: + b .L1372 +.L1636: +.LBB2444: + .loc 1 2527 0 + mov w0, 1 + str w0, [x19, 64] + .loc 1 2526 0 + mov w0, 21 + str w0, [x19, 40] + .loc 1 2528 0 + bl ebc_get_dsp_list_enum_num +.LVL1580: + cbz w0, .L1331 +.L1594: + .loc 1 2530 0 + ldr x0, [x25, 104] + adrp x1, .LC110 + add x1, x1, :lo12:.LC110 + bl _dev_info +.LVL1581: +.L1587: + .loc 1 2531 0 + mov x0, x19 + .loc 1 2529 0 + mov w26, 1 + .loc 1 2531 0 + bl ebc_buf_release +.LVL1582: + .loc 1 2533 0 + b .L1255 +.LVL1583: + .p2align 3 +.L1664: +.LBE2444: +.LBB2445: +.LBB2391: +.LBB2390: + .loc 1 2548 0 discriminator 9 + orr w1, w1, w2 +.LVL1584: + cbnz w1, .L1343 +.LVL1585: + .loc 1 2548 0 is_stmt 0 discriminator 11 + cbnz x0, .L1342 + .loc 1 2548 0 discriminator 13 + mov x0, x20 +.LVL1586: + bl schedule_timeout +.LVL1587: + mov x20, x0 +.LBE2390: + b .L1345 +.LVL1588: +.L1634: +.LBE2391: +.LBE2445: + .loc 1 2513 0 is_stmt 1 + ldr x0, [x25, 216] + ldrsw x2, [x25, 28] + ldr x1, [x0, 16] + ldr x0, [x25, 160] + bl memcpy +.LVL1589: + .loc 1 2514 0 + ldr x0, [x25, 224] + ldrsw x2, [x25, 28] + ldr x1, [x0, 16] + ldr x0, [x25, 152] + bl memcpy +.LVL1590: + ldr w0, [x19, 64] + .loc 1 2521 0 + cbnz w0, .L1339 + b .L1649 +.LVL1591: +.L1637: + .loc 1 2541 0 + ldr x0, [x25, 104] +.LVL1592: + adrp x1, .LC111 + add x1, x1, :lo12:.LC111 + .loc 1 2544 0 + mov w26, 0 + .loc 1 2541 0 + bl _dev_info +.LVL1593: + .loc 1 2542 0 + mov x0, x19 + bl ebc_buf_release +.LVL1594: + .loc 1 2544 0 + b .L1255 +.L1656: + .loc 1 2620 0 discriminator 1 + ldr w0, [x25, 52] + cbz w0, .L1374 + .loc 1 2622 0 + ldr x0, [x25, 104] + adrp x1, .LC103 + add x1, x1, :lo12:.LC103 + bl _dev_info +.LVL1595: +.LBB2446: + .loc 1 2623 0 + ldr w0, [x25, 52] + cbz w0, .L1375 +.LBB2447: + .loc 1 2623 0 is_stmt 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1596: + b .L1378 + .p2align 3 +.L1667: +.LVL1597: +.LBB2448: + .loc 1 2623 0 discriminator 5 + cbnz x0, .L1375 + .loc 1 2623 0 discriminator 7 + bl schedule +.LVL1598: +.L1378: + .loc 1 2623 0 discriminator 9 + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1599: + ldr w1, [x25, 52] + cbnz w1, .L1667 +.L1376: +.LBE2448: + .loc 1 2623 0 discriminator 4 + ldr x0, [x29, 104] + add x1, x29, 112 + bl finish_wait +.LVL1600: + b .L1375 + .p2align 3 +.L1655: +.LBE2447: +.LBE2446: + .loc 1 2618 0 is_stmt 1 + ldr x0, [x25, 216] + ldrsw x2, [x25, 28] + ldr x1, [x0, 16] + ldr x0, [x25, 160] + bl memcpy +.LVL1601: + b .L1597 +.LVL1602: +.L1627: + .loc 1 2678 0 + ldr x0, [x25, 216] + ldrsw x2, [x25, 28] + ldr x1, [x25, 160] + ldr x0, [x0, 16] + bl memcpy +.LVL1603: + b .L1391 +.LVL1604: +.L1641: + .loc 1 2561 0 discriminator 1 + cmp w1, 7 + ccmp w1, 1, 4, ne + beq .L1350 + b .L1347 +.LVL1605: + .p2align 3 +.L1640: + .loc 1 2560 0 discriminator 1 + cmp w1, 7 + beq .L1350 + .loc 1 2563 0 + ldr w0, [x25, 52] + cbz w0, .L1350 + b .L1668 +.LVL1606: + .p2align 3 +.L1362: +.LBB2449: +.LBB2433: + .loc 1 1623 0 + ldr x0, [x25, 192] + mov x5, x25 + bl get_overlay_image +.LVL1607: + b .L1363 +.LVL1608: +.L1653: +.LBE2433: +.LBE2449: +.LBB2450: +.LBB2422: +.LBB2421: + .loc 1 2744 0 discriminator 9 + orr w1, w1, w2 +.LVL1609: + cbnz w1, .L1405 +.LVL1610: + .loc 1 2744 0 is_stmt 0 discriminator 11 + cbnz x0, .L1404 + .loc 1 2744 0 discriminator 13 + mov x0, x20 +.LVL1611: + bl schedule_timeout +.LVL1612: + mov x20, x0 +.LBE2421: + b .L1407 +.LVL1613: +.L1650: +.LBE2422: +.LBE2450: +.LBB2451: +.LBB2409: + .loc 1 2518 0 is_stmt 1 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1614: +.LBB2410: + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1615: + ldr w1, [x25, 52] + cbz w1, .L1336 +.L1669: +.LVL1616: + .loc 1 2518 0 is_stmt 0 discriminator 5 + cbnz x0, .L1335 + .loc 1 2518 0 discriminator 7 + bl schedule +.LVL1617: + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1618: + ldr w1, [x25, 52] + cbnz w1, .L1669 +.L1336: +.LBE2410: + .loc 1 2518 0 discriminator 4 + ldr x0, [x29, 104] + add x1, x29, 112 + bl finish_wait +.LVL1619: + b .L1335 +.LVL1620: +.L1612: +.LBE2409: +.LBE2451: + .loc 1 2838 0 is_stmt 1 + bl __stack_chk_fail +.LVL1621: +.L1666: +.LBB2452: +.LBB2442: + .loc 1 2629 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1622: +.LBB2443: + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1623: + ldr w1, [x25, 52] + cbz w1, .L1376 +.L1670: +.LVL1624: + .loc 1 2629 0 is_stmt 0 discriminator 5 + cbnz x0, .L1375 + .loc 1 2629 0 discriminator 7 + bl schedule +.LVL1625: + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1626: + ldr w1, [x25, 52] + cbnz w1, .L1670 + b .L1376 +.LVL1627: +.L1424: +.LBE2443: +.LBE2442: +.LBE2452: + .loc 1 2826 0 is_stmt 1 + bl ebc_get_dsp_list_enum_num +.LVL1628: + cbnz w0, .L1255 + .loc 1 2826 0 is_stmt 0 discriminator 1 + bl ebc_get_osd_list_enum_num +.LVL1629: + cbnz w0, .L1255 + b .L1604 +.LVL1630: +.L1663: + .loc 1 2465 0 is_stmt 1 + mov x0, 3 + bl ebc_notify +.LVL1631: + b .L1322 +.L1646: +.LBB2453: +.LBB2393: + .loc 1 2565 0 discriminator 1 + mov w1, 0 + add x0, x29, 112 + bl init_wait_entry +.LVL1632: + b .L1355 + .p2align 3 +.L1671: +.LVL1633: +.LBB2394: + .loc 1 2565 0 is_stmt 0 discriminator 5 + cbnz x0, .L1352 + .loc 1 2565 0 discriminator 7 + bl schedule +.LVL1634: +.L1355: + .loc 1 2565 0 discriminator 9 + ldr x0, [x29, 104] + add x1, x29, 112 + mov w2, 1 + bl prepare_to_wait_event +.LVL1635: + ldr w1, [x25, 52] + cbnz w1, .L1671 +.LBE2394: + .loc 1 2565 0 discriminator 4 + ldr x0, [x29, 104] + add x1, x29, 112 + bl finish_wait +.LVL1636: + b .L1352 +.L1661: +.LBE2393: +.LBE2453: +.LBB2454: +.LBB2434: + .loc 1 1613 0 is_stmt 1 + mov x0, x24 + bl ebc_power_set.constprop.15 +.LVL1637: + b .L1361 +.LVL1638: +.L1432: +.LBE2434: +.LBE2454: +.LBB2455: +.LBB2404: + .loc 1 2832 0 discriminator 4 + ldr x0, [x29, 104] + add x1, x29, 112 + bl finish_wait +.LVL1639: +.LBE2404: +.LBE2455: + .loc 1 2833 0 discriminator 4 + str wzr, [x25, 100] + b .L1255 + .cfi_endproc +.LFE2844: + .size ebc_thread, .-ebc_thread + .align 2 + .p2align 3,,7 + .type ebc_auto_tast_function, %function +ebc_auto_tast_function: +.LFB2837: + .loc 1 1875 0 + .cfi_startproc +.LVL1640: + stp x29, x30, [sp, -112]! + .cfi_def_cfa_offset 112 + .cfi_offset 29, -112 + .cfi_offset 30, -104 + adrp x0, __stack_chk_guard +.LVL1641: + add x0, x0, :lo12:__stack_chk_guard + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x25, x26, [sp, 64] + .cfi_offset 25, -48 + .cfi_offset 26, -40 + .loc 1 1876 0 + adrp x26, .LANCHOR0 + .loc 1 1875 0 + stp x19, x20, [sp, 16] +.LBB2456: +.LBB2457: +.LBB2458: + .loc 12 290 0 + mov x25, 2 +.LBE2458: +.LBE2457: +.LBE2456: + .loc 1 1875 0 + stp x21, x22, [sp, 32] + stp x23, x24, [sp, 48] + .cfi_offset 19, -96 + .cfi_offset 20, -88 + .cfi_offset 21, -80 + .cfi_offset 22, -72 + .cfi_offset 23, -64 + .cfi_offset 24, -56 + adrp x23, .LANCHOR1 + stp x27, x28, [sp, 80] + .cfi_offset 27, -32 + .cfi_offset 28, -24 + .loc 1 1886 0 + add x23, x23, :lo12:.LANCHOR1 + .loc 1 1876 0 + ldr x22, [x26, #:lo12:.LANCHOR0] +.LVL1642: + .loc 1 1886 0 + add x21, x23, 712 + .loc 1 1875 0 + ldr x1, [x0] + str x1, [x29, 104] + mov x1,0 + .loc 1 1888 0 + add x23, x23, 352 + .loc 1 1877 0 + add x20, x22, 24 + .loc 1 1878 0 + add x19, x22, 192 + add x28, x22, 720 + adrp x27, jiffies +.LBB2463: +.LBB2460: +.LBB2461: + .loc 4 19 0 +#APP +// 19 "./arch/arm64/include/asm/current.h" 1 + mrs x24, sp_el0 +// 0 "" 2 +.LVL1643: +#NO_APP + b .L1696 + .p2align 3 +.L1705: +.LBE2461: +.LBE2460: +.LBE2463: + .loc 1 1894 0 + cmp w0, 4 + beq .L1675 + cmp w0, 1 + beq .L1704 + .loc 1 2040 0 + ldr w1, [x19, 72] + .loc 1 2041 0 + mov x0, x20 + .loc 1 2040 0 + sub w1, w1, #1 + str w1, [x19, 72] + .loc 1 2041 0 + ldr w1, [x22, 224] + bl flip.isra.4 +.LVL1644: + .loc 1 2043 0 + add x0, x26, :lo12:.LANCHOR0 + ldr x0, [x0, 16] + bl wake_up_process +.LVL1645: + .loc 1 2045 0 + ldr w4, [x19, 72] + cbz w4, .L1681 + .loc 1 2047 0 + ldr w0, [x20, 164] + cbz w0, .L1695 + .loc 1 2048 0 + ldrsw x0, [x20, 72] + mov w6, 2 + .loc 1 2049 0 + ldp x2, x1, [x19, 216] + .loc 1 2048 0 + add x0, x19, x0, lsl 3 + ldrb w3, [x22, 248] + ldr x5, [x22, 320] + ldr x1, [x1, 16] + ldr x0, [x0, 184] + ldr x2, [x2, 16] + bl direct_mode_data_change2.isra.3 +.LVL1646: + .p2align 2 +.L1681: + .loc 1 2061 0 + mov x0, x21 + bl up +.LVL1647: + .loc 1 2062 0 + bl schedule +.LVL1648: +.L1696: + .loc 1 1886 0 + mov x0, x21 + bl down +.LVL1649: + .loc 1 1888 0 + mov x0, x23 + bl down +.LVL1650: +.LBB2464: +.LBB2462: +.LBB2459: + .loc 12 290 0 + str x25, [x24, 32] +.LBE2459: +.LBE2462: +.LBE2464: + .loc 1 1893 0 +#APP +// 1893 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1 + dmb ish +// 0 "" 2 + .loc 1 1894 0 +#NO_APP + ldr w0, [x19, 252] + cmp w0, 3 + bne .L1705 + .loc 1 1972 0 + ldr w0, [x19, 60] + .loc 1 1971 0 + str wzr, [x19, 68] + .loc 1 1972 0 + cbnz w0, .L1686 + .loc 1 1972 0 is_stmt 0 discriminator 1 + ldr w0, [x19, 64] + cbz w0, .L1687 +.L1686: + .loc 1 1973 0 is_stmt 1 + ldr w1, [x22, 224] + mov x0, x20 + bl flip.isra.4 +.LVL1651: + .loc 1 1975 0 + add x0, x26, :lo12:.LANCHOR0 + ldr x0, [x0, 16] + bl wake_up_process +.LVL1652: + .loc 1 1977 0 + ldr w0, [x20, 164] + cbz w0, .L1688 + .loc 1 1978 0 + ldrsw x0, [x20, 72] + mov w5, 2 + ldp x1, x2, [x19, 152] + mov x4, x19 + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] + bl get_auto_image2 +.LVL1653: + b .L1681 + .p2align 3 +.L1704: + .loc 1 2019 0 + ldr w1, [x19, 72] + .loc 1 2020 0 + mov x0, x20 + .loc 1 2019 0 + sub w1, w1, #1 + str w1, [x19, 72] + .loc 1 2020 0 + ldr w1, [x22, 224] + bl flip.isra.4 +.LVL1654: + .loc 1 2022 0 + add x0, x26, :lo12:.LANCHOR0 + ldr x0, [x0, 16] + bl wake_up_process +.LVL1655: + .loc 1 2024 0 + ldr w4, [x19, 72] + cbz w4, .L1681 + .loc 1 2026 0 + ldr w0, [x20, 164] + cbz w0, .L1693 + .loc 1 2027 0 + ldrsw x0, [x20, 72] + mov w6, 2 + .loc 1 2028 0 + ldp x2, x1, [x19, 216] + .loc 1 2027 0 + add x0, x19, x0, lsl 3 + ldrb w3, [x22, 248] + ldr x5, [x22, 320] + ldr x1, [x1, 16] + ldr x0, [x0, 184] + ldr x2, [x2, 16] + bl direct_mode_data_change_part2.isra.8 +.LVL1656: + b .L1681 + .p2align 3 +.L1675: + .loc 1 1896 0 + ldr w0, [x19, 76] + cbz w0, .L1677 + .loc 1 1899 0 + ldr w0, [x19, 60] + .loc 1 1898 0 + str wzr, [x19, 68] + .loc 1 1897 0 + str wzr, [x19, 76] + .loc 1 1899 0 + cbnz w0, .L1678 + .loc 1 1899 0 is_stmt 0 discriminator 1 + ldr w0, [x19, 64] + cbz w0, .L1679 +.L1678: + .loc 1 1900 0 is_stmt 1 + ldr w1, [x22, 224] + mov x0, x20 + bl flip.isra.4 +.LVL1657: + .loc 1 1902 0 + add x0, x26, :lo12:.LANCHOR0 + ldr x0, [x0, 16] + bl wake_up_process +.LVL1658: + .loc 1 1904 0 + ldr w0, [x20, 164] + cbz w0, .L1680 + .loc 1 1905 0 + ldrsw x0, [x20, 72] + mov w6, 2 + ldp x1, x2, [x19, 152] + mov x5, x19 + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] + bl get_overlay_image2 +.LVL1659: + b .L1681 + .p2align 3 +.L1688: + .loc 1 1985 0 + ldrsw x0, [x20, 72] + mov w5, 2 + ldp x1, x2, [x19, 152] + mov x4, x19 + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] + bl get_auto_image +.LVL1660: + b .L1681 + .p2align 3 +.L1677: + .loc 1 1952 0 + mov x0, x23 + bl up +.LVL1661: + .loc 1 1954 0 + ldr w0, [x20, 164] + cbz w0, .L1685 + .loc 1 1955 0 + ldrsw x0, [x20, 72] + mov x4, x19 + ldp x1, x2, [x19, 152] + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] + bl get_overlay_image_area2.isra.0 +.LVL1662: + b .L1681 + .p2align 3 +.L1680: + .loc 1 1913 0 + ldrsw x0, [x20, 72] + mov w6, 2 + ldp x1, x2, [x19, 152] + mov x5, x19 + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] + bl get_overlay_image +.LVL1663: + b .L1681 + .p2align 3 +.L1695: + .loc 1 2054 0 + ldrsw x0, [x20, 72] + mov w6, 2 + .loc 1 2055 0 + ldp x2, x1, [x19, 216] + .loc 1 2054 0 + add x0, x19, x0, lsl 3 + ldrb w3, [x22, 248] + ldr x5, [x22, 320] + ldr x1, [x1, 16] + ldr x0, [x0, 184] + ldr x2, [x2, 16] + bl direct_mode_data_change.isra.2 +.LVL1664: + b .L1681 + .p2align 3 +.L1693: + .loc 1 2033 0 + ldrsw x0, [x20, 72] + mov w6, 2 + .loc 1 2034 0 + ldp x2, x1, [x19, 216] + .loc 1 2033 0 + add x0, x19, x0, lsl 3 + ldrb w3, [x22, 248] + ldr x5, [x22, 320] + ldr x1, [x1, 16] + ldr x0, [x0, 184] + ldr x2, [x2, 16] + bl direct_mode_data_change_part.isra.9 +.LVL1665: + b .L1681 + .p2align 3 +.L1687: + .loc 1 1993 0 + mov x0, x23 + bl up +.LVL1666: + .loc 1 1995 0 + ldr w0, [x19, 612] + cbz w0, .L1706 +.L1689: + .loc 1 2000 0 + ldr w0, [x20, 164] + cbz w0, .L1690 + .loc 1 2001 0 + ldrsw x0, [x20, 72] + mov w5, 1 + ldp x1, x2, [x19, 152] + mov x4, x19 + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] + bl get_auto_image2 +.LVL1667: +.L1691: + .loc 1 2014 0 + mov w0, 1 + .loc 1 2015 0 + ldr x1, [x27, #:lo12:jiffies] + .loc 1 2014 0 + str w0, [x19, 68] + .loc 1 2015 0 + mov x0, x28 + add x1, x1, 1 + bl mod_timer +.LVL1668: + b .L1681 + .p2align 3 +.L1679: + .loc 1 1922 0 + mov x0, x23 + bl up +.LVL1669: + .loc 1 1924 0 + ldr w0, [x19, 612] + cbz w0, .L1707 +.L1682: + .loc 1 1931 0 + ldr w0, [x20, 164] + cbz w0, .L1683 + .loc 1 1932 0 + ldrsw x0, [x20, 72] + mov w6, 1 + ldp x1, x2, [x19, 152] + mov x5, x19 + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] + bl get_overlay_image2 +.LVL1670: + b .L1691 + .p2align 3 +.L1685: + .loc 1 1962 0 + ldrsw x0, [x20, 72] + mov x5, x19 + ldp x1, x2, [x19, 152] + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] + bl get_overlay_image_area +.LVL1671: + b .L1681 + .p2align 3 +.L1690: + .loc 1 2008 0 + ldrsw x0, [x20, 72] + mov w5, 1 + ldp x1, x2, [x19, 152] + mov x4, x19 + add x0, x19, x0, lsl 3 + ldr x3, [x19, 168] + ldr x0, [x0, 184] + bl get_auto_image +.LVL1672: + b .L1691 + .p2align 3 +.L1683: + .loc 1 1940 0 + ldrsw x0, [x20, 72] + mov w6, 1 + ldp x1, x2, [x19, 152] + mov x5, x19 + add x0, x19, x0, lsl 3 + ldp x3, x4, [x19, 168] + ldr x0, [x0, 184] + bl get_overlay_image +.LVL1673: + b .L1691 + .p2align 3 +.L1706: + .loc 1 1997 0 + ldr x1, [x19, 224] + .loc 1 1996 0 + mov x3, x19 + ldr x0, [x19, 152] + ldr x2, [x19, 168] + ldr x1, [x1, 16] + bl refresh_new_image_auto +.LVL1674: + b .L1689 + .p2align 3 +.L1707: + .loc 1 1927 0 + ldr x2, [x19, 224] + .loc 1 1925 0 + mov x5, x19 + ldr x1, [x19, 16] + ldr x0, [x19, 152] + ldp x3, x4, [x19, 168] + ldr x2, [x2, 16] + bl refresh_new_image +.LVL1675: + b .L1682 + .cfi_endproc +.LFE2837: + .size ebc_auto_tast_function, .-ebc_auto_tast_function + .data + .align 3 + .set .LANCHOR1,. + 0 + .type ebc_driver, %object + .size ebc_driver, 224 +ebc_driver: + .xword ebc_probe + .xword ebc_remove + .zero 24 + .xword .LC123 + .zero 32 + .xword ebc_match + .zero 64 + .xword ebc_pm + .zero 48 + .zero 16 + .type ebc_misc, %object + .size ebc_misc, 80 +ebc_misc: + .word 243 + .zero 4 + .xword .LC66 + .xword ebc_ops + .zero 56 + .type ebc_thread_wq, %object + .size ebc_thread_wq, 24 +ebc_thread_wq: + .word 0 + .zero 4 + .xword ebc_thread_wq+8 + .xword ebc_thread_wq+8 + .type ebc_auto_assist_thread_sem, %object + .size ebc_auto_assist_thread_sem, 24 +ebc_auto_assist_thread_sem: + .word 0 + .word 1 + .xword ebc_auto_assist_thread_sem+8 + .xword ebc_auto_assist_thread_sem+8 + .type ebc_assist_finished_flag_sem, %object + .size ebc_assist_finished_flag_sem, 24 +ebc_assist_finished_flag_sem: + .word 0 + .word 1 + .xword ebc_assist_finished_flag_sem+8 + .xword ebc_assist_finished_flag_sem+8 + .type waveform_misc, %object + .size waveform_misc, 80 +waveform_misc: + .word 244 + .zero 4 + .xword .LC132 + .xword waveform_ops + .zero 56 + .type dev_attr_waveform_version, %object + .size dev_attr_waveform_version, 32 +dev_attr_waveform_version: + .xword .LC131 + .hword 292 + .zero 6 + .xword waveform_version_read + .xword 0 + .type dev_attr_pmic_name, %object + .size dev_attr_pmic_name, 32 +dev_attr_pmic_name: + .xword .LC130 + .hword 292 + .zero 6 + .xword pmic_name_read + .xword 0 + .type dev_attr_pmic_temp, %object + .size dev_attr_pmic_temp, 32 +dev_attr_pmic_temp: + .xword .LC129 + .hword 292 + .zero 6 + .xword pmic_temp_read + .xword 0 + .type dev_attr_pmic_vcom, %object + .size dev_attr_pmic_vcom, 32 +dev_attr_pmic_vcom: + .xword .LC128 + .hword 420 + .zero 6 + .xword pmic_vcom_read + .xword pmic_vcom_write + .type dev_attr_ebc_version, %object + .size dev_attr_ebc_version, 32 +dev_attr_ebc_version: + .xword .LC127 + .hword 292 + .zero 6 + .xword ebc_version_read + .xword 0 + .type dev_attr_ebc_state, %object + .size dev_attr_ebc_state, 32 +dev_attr_ebc_state: + .xword .LC126 + .hword 292 + .zero 6 + .xword ebc_state_read + .xword 0 + .type dev_attr_ebc_buf_state, %object + .size dev_attr_ebc_buf_state, 32 +dev_attr_ebc_buf_state: + .xword .LC125 + .hword 292 + .zero 6 + .xword ebc_buf_state_read + .xword 0 + .type dev_attr_auto_frame_state, %object + .size dev_attr_auto_frame_state, 32 +dev_attr_auto_frame_state: + .xword .LC124 + .hword 292 + .zero 6 + .xword auto_frame_state_read + .xword 0 + .type ebc_auto_thread_sem, %object + .size ebc_auto_thread_sem, 24 +ebc_auto_thread_sem: + .word 0 + .word 1 + .xword ebc_auto_thread_sem+8 + .xword ebc_auto_thread_sem+8 + .bss + .align 3 + .set .LANCHOR0,. + 0 + .type global_ebc, %object + .size global_ebc, 8 +global_ebc: + .zero 8 + .type ebc_auto_task, %object + .size ebc_auto_task, 8 +ebc_auto_task: + .zero 8 + .type ebc_auto_assist_task, %object + .size ebc_auto_assist_task, 8 +ebc_auto_assist_task: + .zero 8 + .type ebc_task, %object + .size ebc_task, 8 +ebc_task: + .zero 8 + .type resume_count_start, %object + .size resume_count_start, 4 +resume_count_start: + .zero 4 + .type resume_frame_count, %object + .size resume_frame_count, 4 +resume_frame_count: + .zero 4 + .section .rodata + .align 3 + .set .LANCHOR2,. + 0 + .type __func__.35512, %object + .size __func__.35512, 11 +__func__.35512: + .string "ebc_io_ctl" + .align 3 + .set .LANCHOR3,. + 0 + .type __func__.35860, %object + .size __func__.35860, 12 +__func__.35860: + .string "ebc_suspend" + .zero 4 + .type __func__.35152, %object + .size __func__.35152, 16 +__func__.35152: + .string "ebc_frame_start" + .type __func__.35784, %object + .size __func__.35784, 19 +__func__.35784: + .string "ebc_lut_table_init" + .zero 5 + .type CSWTCH.299, %object + .size CSWTCH.299, 48 +CSWTCH.299: + .word 7 + .word 7 + .word 1 + .word 2 + .word 1 + .word 12 + .word 12 + .word 12 + .word 12 + .word 12 + .word 1 + .word 2 + .type __func__.35145, %object + .size __func__.35145, 27 +__func__.35145: + .string "ebc_overlay_bg_frame_start" + .zero 5 + .type ebc_match, %object + .size ebc_match, 400 +ebc_match: + .zero 64 + .string "rockchip,ebc-dev" + .zero 111 + .zero 8 + .zero 200 + .type ebc_pm, %object + .size ebc_pm, 184 +ebc_pm: + .zero 16 + .xword ebc_suspend + .xword ebc_resume + .zero 152 + .type waveform_ops, %object + .size waveform_ops, 288 +waveform_ops: + .xword 0 + .zero 80 + .xword waveform_mmap + .zero 8 + .xword waveform_open + .zero 176 + .type ebc_ops, %object + .size ebc_ops, 288 +ebc_ops: + .xword 0 + .zero 64 + .xword ebc_io_ctl + .xword ebc_io_ctl + .xword ebc_mmap + .zero 8 + .xword ebc_open + .zero 176 + .section .discard.addressable,"aw",@progbits + .align 3 + .type __addressable_ebc_init3831, %object + .size __addressable_ebc_init3831, 8 +__addressable_ebc_init3831: + .xword ebc_init + .section .exitcall.exit,"aw",@progbits + .align 3 + .type __exitcall_ebc_exit, %object + .size __exitcall_ebc_exit, 8 +__exitcall_ebc_exit: + .xword ebc_exit + .section .rodata.str1.8,"aMS",@progbits,1 + .align 3 +.LC0: + .string "device resume\n" + .zero 1 +.LC1: + .string "ebc_frame_control_timeout, overlay_bg_update=1\n" +.LC2: + .string "%s: argp NULL\n" + .zero 1 +.LC3: + .string "enable bg control\n" + .zero 5 +.LC4: + .string "disable bg control\n" + .zero 4 +.LC5: + .string "enable resume count\n" + .zero 3 +.LC6: + .string "disable resume count\n" + .zero 2 +.LC7: + .string "enable ebc overlay, you can use osd buf to show somthing over the system display\n" + .zero 6 +.LC8: + .string "disable ebc overlay\n" + .zero 3 +.LC9: + .string "EBC_SET_FULL_MODE_NUM failed\n" + .zero 2 +.LC10: + .string "EBC_GET_BUFFER_INFO failed\n" + .zero 4 +.LC11: + .string "EBC_SET_DIFF_PERCENT failed\n" + .zero 3 +.LC12: + .string "EBC_WAIT_NEW_BUF_TIME failed\n" + .zero 2 +.LC13: + .string "%s: unknow cmd\n" +.LC14: + .string "full_mode_num = %d\n" + .zero 4 +.LC15: + .string "diff_percent = %d\n" + .zero 5 +.LC16: + .string "waiting_new_buf_time = %d\n" + .zero 5 +.LC17: + .string "overlay frame done\n" + .zero 4 +.LC18: + .string "auto frame done\n" + .zero 7 +.LC19: + .string "frame done\n" + .zero 4 +.LC20: + .string "temperature = %d, out of range0~50 ,use 0 \n" + .zero 4 +.LC21: + .string "temperature = %d, out of range0~50 ,use 50 \n" + .zero 3 +.LC22: + .string "ebc_pmic_read_temp failed, ret = %d\n" + .zero 3 +.LC23: + .string "lut update use temperature = %d\n" + .zero 7 +.LC24: + .string "get lut data failed\n" + .zero 3 +.LC25: + .string "%d\n" + .zero 4 +.LC26: + .string "5.04_y8" +.LC27: + .string "%s\n" + .zero 4 +.LC28: + .string "invalid value = %s\n" + .zero 4 +.LC29: + .string "set vcom value failed\n" + .zero 1 +.LC30: + .string "ebc hw power off\n" + .zero 6 +.LC31: + .string "%s: device is busy now...\n" + .zero 5 +.LC32: + .string "device suspend\n" +.LC33: + .string "%s: overlay no need to update\n" + .zero 1 +.LC34: + .string "%s: auto no need to update\n" + .zero 4 +.LC35: + .string "black point > 90percent, skip this frame\n" + .zero 6 +.LC36: + .string "diff point > %d percent, force full\n" + .zero 3 +.LC37: + .string "ebc_tcon" + .zero 7 +.LC38: + .string "not find ebc tcon\n" + .zero 5 +.LC39: + .string "pmic" + .zero 3 +.LC40: + .string "wrong pmics number\n" + .zero 4 +.LC41: + .string "not find pmic node\n" + .zero 4 +.LC42: + .string "not find pmic i2c client\n" + .zero 6 +.LC43: + .string "use pmic%d\n" + .zero 4 +.LC44: + .string "get drvdata from pmic client failed\n" + .zero 3 +.LC45: + .string "panel,width" + .zero 4 +.LC46: + .string "panel,panel_color" + .zero 6 +.LC47: + .string "panel,mirror" + .zero 3 +.LC48: + .string "panel,width-mm" + .zero 1 +.LC49: + .string "panel,height-mm" +.LC50: + .string "panel,disable_logo" + .zero 5 +.LC51: + .string "panel,rearrange" +.LC52: + .string "too large resolution, not support\n" + .zero 5 +.LC53: + .string "memory-region" + .zero 2 +.LC54: + .string "Couldn't address to resource for reserved memory\n" + .zero 6 +.LC55: + .string "reserved memory not enough, need %d\n" + .zero 3 +.LC56: + .string "Couldn't remap for reserved memory\n" + .zero 4 +.LC57: + .string "waveform-region" +.LC58: + .string "%s:%d: failed to get mem from reserved\n" +.LC59: + .string "Failed to read waveform from mem, we use waveform file from kernel file instead\n" + .zero 7 +.LC60: + .string "Failed to read waveform file from kernel, no waveform!!!\n" + .zero 6 +.LC61: + .string "failed to create ebc_task thread\n" + .zero 6 +.LC62: + .string "ebc_taskup" + .zero 5 +.LC63: + .string "failed to create ebc_taskup thread\n" + .zero 4 +.LC64: + .string "use double thread calcu\n" + .zero 7 +.LC65: + .string "ebc_thread" + .zero 5 +.LC66: + .string "ebc" + .zero 4 +.LC67: + .string "ulogo_addr=" + .zero 4 +.LC68: + .string "klogo_addr=" + .zero 4 +.LC69: + .string "ulogo_addr=0x%x" +.LC70: + .string "have ulogo display, ulogo addr = 0x%x\n" + .zero 1 +.LC71: + .string "malloc ulogo buffer failed\n" + .zero 4 +.LC72: + .string "klogo_addr=0x%x" +.LC73: + .string "need show klogo, klogo addr = 0x%x\n" + .zero 4 +.LC74: + .string "malloc klogo buffer failed\n" + .zero 4 +.LC75: + .string "no uboot logo, panel init\n" + .zero 5 +.LC76: + .string "ebc_dev_reset" + .zero 2 +.LC77: + .string "ebc_dev_logo" + .zero 3 +.LC78: + .string "rockchip ebc driver %s probe success\n" + .zero 2 +.LC79: + .string "panel,height" + .zero 3 +.LC80: + .string "panel,vir_width" +.LC81: + .string "panel,vir_height" + .zero 7 +.LC82: + .string "panel,sdck" + .zero 5 +.LC83: + .string "panel,lsl" + .zero 6 +.LC84: + .string "panel,lbl" + .zero 6 +.LC85: + .string "panel,ldl" + .zero 6 +.LC86: + .string "panel,lel" + .zero 6 +.LC87: + .string "panel,gdck-sta" + .zero 1 +.LC88: + .string "panel,lgonl" + .zero 4 +.LC89: + .string "panel,fsl" + .zero 6 +.LC90: + .string "panel,fbl" + .zero 6 +.LC91: + .string "panel,fdl" + .zero 6 +.LC92: + .string "panel,fel" + .zero 6 +.LC93: + .string "panel,panel_16bit" + .zero 6 +.LC94: + .string "buffer manage init failed\n" + .zero 5 +.LC95: + .string "lut table init failed\n" + .zero 1 +.LC96: + .string "ebc_task" + .zero 7 +.LC97: + .string "failed to run ebc thread\n" + .zero 6 +.LC98: + .string "task init failed\n" + .zero 6 +.LC99: + .string "failed to probe panel: %d\n" + .zero 5 +.LC100: + .string "0\n" + .zero 5 +.LC101: + .string "ebc hw power on\n" + .zero 7 +.LC102: + .string "ebc suspend, drop osd buf\n" + .zero 5 +.LC103: + .string "ebc is busy now, waiting prev mode end...\n" + .zero 5 +.LC104: + .string "prev refresh mode end\n" + .zero 1 +.LC105: + .string "overlay mode start, frame_total=%d, bw_frame = %d\n" + .zero 5 +.LC106: + .string "early resume\n" + .zero 2 +.LC107: + .string "customer logo, early suspend\n" + .zero 2 +.LC108: + .string "customer logo, early resume\n" + .zero 3 +.LC109: + .string "customer logo, power off\n" + .zero 6 +.LC110: + .string "have new frame, cancel this frame, force full next frame\n" + .zero 6 +.LC111: + .string "have new frame, cancel this frame\n" + .zero 5 +.LC112: + .string "waiting new frame %dms\n" +.LC113: + .string "frame start under overlay, mode = %d, framecount = %d\n" + .zero 1 +.LC114: + .string "%s: overlay bg no need to update, overlay_bg_update=1\n" + .zero 1 +.LC115: + .string "control bg update under overlay mode, overlay_bg_update=0\n" + .zero 5 +.LC116: + .string "auto mode start, frame_total=%d\n" + .zero 7 +.LC117: + .string "waiting prev mode end...\n" + .zero 6 +.LC118: + .string "check_part_mode==0, no need refresh\n" + .zero 3 +.LC119: + .string "frame start, mode = %d, framecount = %d\n" + .zero 7 +.LC120: + .string "ebc buffer mode %d error!!!\n" + .zero 3 +.LC121: + .string "power off\n" + .zero 5 +.LC122: + .string "early suspend\n" + .zero 1 +.LC123: + .string "ebc-dev" +.LC124: + .string "auto_frame_state" + .zero 7 +.LC125: + .string "ebc_buf_state" + .zero 2 +.LC126: + .string "ebc_state" + .zero 6 +.LC127: + .string "ebc_version" + .zero 4 +.LC128: + .string "pmic_vcom" + .zero 6 +.LC129: + .string "pmic_temp" + .zero 6 +.LC130: + .string "pmic_name" + .zero 6 +.LC131: + .string "waveform_version" + .zero 7 +.LC132: + .string "waveform" + .text +.Letext0: + .file 18 "./include/uapi/asm-generic/int-ll64.h" + .file 19 "./include/asm-generic/int-ll64.h" + .file 20 "./include/uapi/asm-generic/posix_types.h" + .file 21 "./include/uapi/linux/types.h" + .file 22 "./include/linux/export.h" + .file 23 "./include/linux/types.h" + .file 24 "./arch/arm64/include/asm/insn.h" + .file 25 "./include/linux/init.h" + .file 26 "./arch/arm64/include/asm/alternative.h" + .file 27 "./include/asm-generic/atomic-long.h" + .file 28 "./arch/arm64/include/asm/cache.h" + .file 29 "./include/linux/printk.h" + .file 30 "./include/linux/fs.h" + .file 31 "./include/linux/kernel.h" + .file 32 "./include/linux/notifier.h" + .file 33 "./include/asm-generic/bug.h" + .file 34 "./include/linux/time64.h" + .file 35 "./include/uapi/linux/time.h" + .file 36 "./include/linux/restart_block.h" + .file 37 "./include/linux/compat_time.h" + .file 38 "./arch/arm64/include/asm/memory.h" + .file 39 "./arch/arm64/include/asm/thread_info.h" + .file 40 "./arch/arm64/include/asm/hwcap.h" + .file 41 "./arch/arm64/include/uapi/asm/ptrace.h" + .file 42 "./include/asm-generic/qspinlock_types.h" + .file 43 "./include/asm-generic/qrwlock_types.h" + .file 44 "./include/linux/lockdep.h" + .file 45 "./include/linux/spinlock_types.h" + .file 46 "./include/linux/rwlock_types.h" + .file 47 "./include/linux/jump_label.h" + .file 48 "./arch/arm64/include/asm/jump_label.h" + .file 49 "./arch/arm64/include/asm/cpufeature.h" + .file 50 "./include/asm-generic/sections.h" + .file 51 "./arch/arm64/include/asm/stack_pointer.h" + .file 52 "./arch/arm64/include/asm/sections.h" + .file 53 "./arch/arm64/include/asm/virt.h" + .file 54 "./arch/arm64/include/asm/processor.h" + .file 55 "./arch/arm64/include/asm/fpsimd.h" + .file 56 "./include/linux/sched/debug.h" + .file 57 "./include/linux/wait.h" + .file 58 "./include/linux/cpumask.h" + .file 59 "./include/linux/rcupdate.h" + .file 60 "./include/linux/list_bl.h" + .file 61 "./include/linux/seqlock.h" + .file 62 "./include/linux/lockref.h" + .file 63 "./include/linux/dcache.h" + .file 64 "./include/linux/path.h" + .file 65 "./include/linux/pid.h" + .file 66 "./include/linux/highuid.h" + .file 67 "./include/linux/uidgid.h" + .file 68 "./include/linux/osq_lock.h" + .file 69 "./include/linux/debug_locks.h" + .file 70 "./include/linux/mutex.h" + .file 71 "./include/linux/sched.h" + .file 72 "./include/linux/time.h" + .file 73 "./include/linux/llist.h" + .file 74 "./include/linux/smp.h" + .file 75 "./include/asm-generic/percpu.h" + .file 76 "./arch/arm64/include/asm/smp.h" + .file 77 "./include/clocksource/arm_arch_timer.h" + .file 78 "./arch/arm64/include/asm/arch_timer.h" + .file 79 "./include/linux/timex.h" + .file 80 "./include/linux/ktime.h" + .file 81 "./include/linux/timekeeping.h" + .file 82 "./include/linux/timer.h" + .file 83 "./include/linux/workqueue.h" + .file 84 "./include/linux/refcount.h" + .file 85 "./arch/arm64/include/asm/pgtable-types.h" + .file 86 "./include/asm-generic/pgtable-nop4d-hack.h" + .file 87 "./arch/arm64/include/asm/page.h" + .file 88 "./include/linux/mm_types.h" + .file 89 "./include/linux/plist.h" + .file 90 "./include/linux/rbtree.h" + .file 91 "./include/linux/percpu.h" + .file 92 "./include/linux/timerqueue.h" + .file 93 "./include/linux/hrtimer.h" + .file 94 "./include/linux/seccomp.h" + .file 95 "./include/linux/nodemask.h" + .file 96 "./include/uapi/asm-generic/signal.h" + .file 97 "./include/uapi/asm-generic/siginfo.h" + .file 98 "./include/linux/sched/user.h" + .file 99 "./include/linux/signal_types.h" + .file 100 "./include/linux/mm_types_task.h" + .file 101 "./include/linux/task_io_accounting.h" + .file 102 "./include/uapi/linux/rseq.h" + .file 103 "./include/linux/completion.h" + .file 104 "./include/linux/cred.h" + .file 105 "./include/linux/iocontext.h" + .file 106 "./include/linux/uprobes.h" + .file 107 "./include/linux/vmalloc.h" + .file 108 "./include/linux/stat.h" + .file 109 "./include/linux/shrinker.h" + .file 110 "./include/linux/list_lru.h" + .file 111 "./include/linux/radix-tree.h" + .file 112 "./include/linux/rwsem.h" + .file 113 "./arch/arm64/include/asm/uprobes.h" + .file 114 "./arch/arm64/include/asm/mmu.h" + .file 115 "./include/linux/memremap.h" + .file 116 "./include/linux/mm.h" + .file 117 "./include/linux/capability.h" + .file 118 "./include/linux/semaphore.h" + .file 119 "./include/uapi/linux/fiemap.h" + .file 120 "./include/linux/migrate_mode.h" + .file 121 "./include/linux/rcuwait.h" + .file 122 "./include/linux/rcu_sync.h" + .file 123 "./include/linux/percpu-rwsem.h" + .file 124 "./include/linux/delayed_call.h" + .file 125 "./include/uapi/linux/uuid.h" + .file 126 "./include/linux/uuid.h" + .file 127 "./include/linux/errseq.h" + .file 128 "./include/asm-generic/ioctl.h" + .file 129 "./include/uapi/linux/fs.h" + .file 130 "./include/linux/mmzone.h" + .file 131 "./arch/arm64/include/asm/topology.h" + .file 132 "./include/linux/arch_topology.h" + .file 133 "./include/linux/gfp.h" + .file 134 "./include/linux/percpu_counter.h" + .file 135 "./include/linux/quota.h" + .file 136 "./include/linux/projid.h" + .file 137 "./include/linux/module.h" + .file 138 "./include/linux/nfs_fs_i.h" + .file 139 "./include/linux/key.h" + .file 140 "./include/linux/seq_file.h" + .file 141 "./include/linux/kobject.h" + .file 142 "./include/linux/sysctl.h" + .file 143 "./include/linux/assoc_array.h" + .file 144 "./include/linux/ratelimit.h" + .file 145 "./include/linux/debugfs.h" + .file 146 "./include/linux/delay.h" + .file 147 "./include/linux/idr.h" + .file 148 "./include/linux/kernfs.h" + .file 149 "./include/linux/kobject_ns.h" + .file 150 "./include/linux/sysfs.h" + .file 151 "./include/linux/kref.h" + .file 152 "./include/linux/klist.h" + .file 153 "./include/linux/pm.h" + .file 154 "./include/linux/pm_wakeup.h" + .file 155 "./arch/arm64/include/asm/device.h" + .file 156 "./include/linux/mod_devicetable.h" + .file 157 "./include/linux/fwnode.h" + .file 158 "./include/linux/irqdomain.h" + .file 159 "./include/linux/rtmutex.h" + .file 160 "./include/uapi/linux/i2c.h" + .file 161 "./include/linux/i2c.h" + .file 162 "./include/linux/irqnr.h" + .file 163 "./arch/arm64/include/asm/hardirq.h" + .file 164 "./include/linux/irq_cpustat.h" + .file 165 "./include/linux/interrupt.h" + .file 166 "./include/linux/stddef.h" + .file 167 "./arch/arm64/include/asm/pgtable.h" + .file 168 "./include/xen/xen.h" + .file 169 "./include/linux/io.h" + .file 170 "./include/linux/kthread.h" + .file 171 "./include/linux/miscdevice.h" + .file 172 "./include/linux/percpu-refcount.h" + .file 173 "./include/linux/page_ext.h" + .file 174 "./include/linux/tracepoint-defs.h" + .file 175 "./include/linux/page_ref.h" + .file 176 "./include/linux/huge_mm.h" + .file 177 "./include/linux/vm_event_item.h" + .file 178 "./include/linux/vmstat.h" + .file 179 "./include/linux/umh.h" + .file 180 "./include/linux/kmod.h" + .file 181 "./include/uapi/linux/elf.h" + .file 182 "./include/linux/elf.h" + .file 183 "./include/linux/moduleparam.h" + .file 184 "./include/linux/rbtree_latch.h" + .file 185 "./arch/arm64/include/asm/module.h" + .file 186 "./arch/arm64/include/asm/extable.h" + .file 187 "./include/linux/node.h" + .file 188 "./include/linux/cpu.h" + .file 189 "./include/linux/platform_device.h" + .file 190 "./include/linux/of_platform.h" + .file 191 "./include/linux/sched/task.h" + .file 192 "./include/uapi/linux/sched/types.h" + .file 193 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h" + .file 194 "drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h" + .file 195 "drivers/gpu/drm/rockchip/ebc-dev/pmic/../ebc_dev.h" + .file 196 "./include/linux/dma-direction.h" + .file 197 "./include/linux/scatterlist.h" + .file 198 "./include/xen/arm/hypervisor.h" + .file 199 "./arch/arm64/include/asm/dma-mapping.h" + .file 200 "drivers/gpu/drm/rockchip/ebc-dev/tcon/../ebc_panel.h" + .file 201 "./include/linux/thread_info.h" + .file 202 "./include/linux/dma-debug.h" + .file 203 "./include/linux/err.h" + .file 204 "./include/asm-generic/getorder.h" + .file 205 "./include/linux/log2.h" + .file 206 "./include/uapi/linux/byteorder/little_endian.h" + .file 207 "./include/uapi/linux/swab.h" + .file 208 "./include/asm-generic/bitops/fls64.h" + .file 209 "./include/asm-generic/bitops/builtin-__fls.h" + .file 210 "./include/linux/kasan-checks.h" + .file 211 "./include/linux/of_address.h" + .file 212 "./arch/arm64/include/asm/string.h" + .file 213 "./include/linux/string.h" + .section .debug_info,"",@progbits +.Ldebug_info0: + .4byte 0x16f4b + .2byte 0x4 + .4byte .Ldebug_abbrev0 + .byte 0x8 + .uleb128 0x1 + .4byte .LASF3323 + .byte 0x1 + .4byte .LASF3324 + .4byte .LASF3325 + .4byte .Ldebug_ranges0+0x26d0 + .8byte 0 + .4byte .Ldebug_line0 + .uleb128 0x2 + .byte 0x8 + .byte 0x7 + .4byte .LASF0 + .uleb128 0x3 + .4byte 0x29 + .uleb128 0x4 + .4byte 0x29 + .uleb128 0x3 + .4byte 0x35 + .uleb128 0x5 + .4byte 0x29 + .4byte 0x4f + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x2 + .byte 0x8 + .byte 0x7 + .4byte .LASF1 + .uleb128 0x7 + .byte 0x8 + .4byte 0x68 + .uleb128 0x3 + .4byte 0x56 + .uleb128 0x2 + .byte 0x1 + .byte 0x8 + .4byte .LASF2 + .uleb128 0x3 + .4byte 0x61 + .uleb128 0x2 + .byte 0x4 + .byte 0x7 + .4byte .LASF3 + .uleb128 0x3 + .4byte 0x6d + .uleb128 0x8 + .4byte .LASF5 + .byte 0x12 + .byte 0x14 + .4byte 0x84 + .uleb128 0x2 + .byte 0x1 + .byte 0x6 + .4byte .LASF4 + .uleb128 0x8 + .4byte .LASF6 + .byte 0x12 + .byte 0x15 + .4byte 0x96 + .uleb128 0x2 + .byte 0x1 + .byte 0x8 + .4byte .LASF7 + .uleb128 0x3 + .4byte 0x96 + .uleb128 0x2 + .byte 0x2 + .byte 0x5 + .4byte .LASF8 + .uleb128 0x8 + .4byte .LASF9 + .byte 0x12 + .byte 0x18 + .4byte 0xb4 + .uleb128 0x2 + .byte 0x2 + .byte 0x7 + .4byte .LASF10 + .uleb128 0x8 + .4byte .LASF11 + .byte 0x12 + .byte 0x1a + .4byte 0xc6 + .uleb128 0x9 + .byte 0x4 + .byte 0x5 + .string "int" + .uleb128 0x3 + .4byte 0xc6 + .uleb128 0x8 + .4byte .LASF12 + .byte 0x12 + .byte 0x1b + .4byte 0x6d + .uleb128 0x3 + .4byte 0xd2 + .uleb128 0x8 + .4byte .LASF13 + .byte 0x12 + .byte 0x1e + .4byte 0xed + .uleb128 0x2 + .byte 0x8 + .byte 0x5 + .4byte .LASF14 + .uleb128 0x8 + .4byte .LASF15 + .byte 0x12 + .byte 0x1f + .4byte 0xff + .uleb128 0x2 + .byte 0x8 + .byte 0x7 + .4byte .LASF16 + .uleb128 0xa + .string "s8" + .byte 0x13 + .byte 0x10 + .4byte 0x79 + .uleb128 0xa + .string "u8" + .byte 0x13 + .byte 0x11 + .4byte 0x8b + .uleb128 0x3 + .4byte 0x110 + .uleb128 0xa + .string "u16" + .byte 0x13 + .byte 0x13 + .4byte 0xa9 + .uleb128 0x3 + .4byte 0x11f + .uleb128 0xa + .string "s32" + .byte 0x13 + .byte 0x14 + .4byte 0xbb + .uleb128 0x3 + .4byte 0x12f + .uleb128 0xa + .string "u32" + .byte 0x13 + .byte 0x15 + .4byte 0xd2 + .uleb128 0x3 + .4byte 0x13f + .uleb128 0xa + .string "s64" + .byte 0x13 + .byte 0x16 + .4byte 0xe2 + .uleb128 0xa + .string "u64" + .byte 0x13 + .byte 0x17 + .4byte 0xf4 + .uleb128 0xb + .byte 0x4 + .4byte 0x6d + .byte 0xa6 + .byte 0xa + .4byte 0x17e + .uleb128 0xc + .4byte .LASF17 + .byte 0 + .uleb128 0xc + .4byte .LASF18 + .byte 0x1 + .byte 0 + .uleb128 0x5 + .4byte 0x29 + .4byte 0x18e + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x8 + .4byte .LASF19 + .byte 0x14 + .byte 0xf + .4byte 0x199 + .uleb128 0x2 + .byte 0x8 + .byte 0x5 + .4byte .LASF20 + .uleb128 0x4 + .4byte 0x199 + .uleb128 0x8 + .4byte .LASF21 + .byte 0x14 + .byte 0x10 + .4byte 0x29 + .uleb128 0x8 + .4byte .LASF22 + .byte 0x14 + .byte 0x1c + .4byte 0xc6 + .uleb128 0x8 + .4byte .LASF23 + .byte 0x14 + .byte 0x31 + .4byte 0x6d + .uleb128 0x8 + .4byte .LASF24 + .byte 0x14 + .byte 0x32 + .4byte 0x6d + .uleb128 0x8 + .4byte .LASF25 + .byte 0x14 + .byte 0x48 + .4byte 0x1a5 + .uleb128 0x8 + .4byte .LASF26 + .byte 0x14 + .byte 0x49 + .4byte 0x18e + .uleb128 0x8 + .4byte .LASF27 + .byte 0x14 + .byte 0x58 + .4byte 0xed + .uleb128 0x8 + .4byte .LASF28 + .byte 0x14 + .byte 0x59 + .4byte 0x18e + .uleb128 0x8 + .4byte .LASF29 + .byte 0x14 + .byte 0x5b + .4byte 0x18e + .uleb128 0x8 + .4byte .LASF30 + .byte 0x14 + .byte 0x5c + .4byte 0xc6 + .uleb128 0x8 + .4byte .LASF31 + .byte 0x14 + .byte 0x5d + .4byte 0xc6 + .uleb128 0x7 + .byte 0x8 + .4byte 0x61 + .uleb128 0x3 + .4byte 0x21e + .uleb128 0x8 + .4byte .LASF32 + .byte 0x15 + .byte 0x1f + .4byte 0xd2 + .uleb128 0x8 + .4byte .LASF33 + .byte 0x15 + .byte 0x20 + .4byte 0xd2 + .uleb128 0x3 + .4byte 0x234 + .uleb128 0x8 + .4byte .LASF34 + .byte 0x15 + .byte 0x34 + .4byte 0x6d + .uleb128 0xd + .4byte .LASF62 + .byte 0x8 + .byte 0x16 + .byte 0x3d + .4byte 0x274 + .uleb128 0xe + .4byte .LASF35 + .byte 0x16 + .byte 0x3e + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF36 + .byte 0x16 + .byte 0x3f + .4byte 0xc6 + .byte 0x4 + .byte 0 + .uleb128 0x3 + .4byte 0x24f + .uleb128 0x8 + .4byte .LASF37 + .byte 0x17 + .byte 0xd + .4byte 0x13f + .uleb128 0x8 + .4byte .LASF38 + .byte 0x17 + .byte 0x10 + .4byte 0x279 + .uleb128 0x8 + .4byte .LASF39 + .byte 0x17 + .byte 0x13 + .4byte 0xb4 + .uleb128 0x8 + .4byte .LASF40 + .byte 0x17 + .byte 0x16 + .4byte 0x1b0 + .uleb128 0x8 + .4byte .LASF41 + .byte 0x17 + .byte 0x1b + .4byte 0x213 + .uleb128 0x8 + .4byte .LASF42 + .byte 0x17 + .byte 0x1e + .4byte 0x2bb + .uleb128 0x2 + .byte 0x1 + .byte 0x2 + .4byte .LASF43 + .uleb128 0x8 + .4byte .LASF44 + .byte 0x17 + .byte 0x20 + .4byte 0x1bb + .uleb128 0x8 + .4byte .LASF45 + .byte 0x17 + .byte 0x21 + .4byte 0x1c6 + .uleb128 0x8 + .4byte .LASF46 + .byte 0x17 + .byte 0x2e + .4byte 0x1e7 + .uleb128 0x8 + .4byte .LASF47 + .byte 0x17 + .byte 0x37 + .4byte 0x1d1 + .uleb128 0x8 + .4byte .LASF48 + .byte 0x17 + .byte 0x3c + .4byte 0x1dc + .uleb128 0x8 + .4byte .LASF49 + .byte 0x17 + .byte 0x67 + .4byte 0x12f + .uleb128 0x8 + .4byte .LASF50 + .byte 0x17 + .byte 0x6d + .4byte 0x13f + .uleb128 0x8 + .4byte .LASF51 + .byte 0x17 + .byte 0x86 + .4byte 0x29 + .uleb128 0x8 + .4byte .LASF52 + .byte 0x17 + .byte 0x87 + .4byte 0x29 + .uleb128 0x8 + .4byte .LASF53 + .byte 0x17 + .byte 0x99 + .4byte 0x15a + .uleb128 0x8 + .4byte .LASF54 + .byte 0x17 + .byte 0x9e + .4byte 0x6d + .uleb128 0x8 + .4byte .LASF55 + .byte 0x17 + .byte 0xa0 + .4byte 0x6d + .uleb128 0x8 + .4byte .LASF56 + .byte 0x17 + .byte 0xa3 + .4byte 0x15a + .uleb128 0x8 + .4byte .LASF57 + .byte 0x17 + .byte 0xa8 + .4byte 0x346 + .uleb128 0x8 + .4byte .LASF58 + .byte 0x17 + .byte 0xae + .4byte 0x29 + .uleb128 0xf + .byte 0x4 + .byte 0x17 + .byte 0xb0 + .4byte 0x37c + .uleb128 0xe + .4byte .LASF59 + .byte 0x17 + .byte 0xb1 + .4byte 0xc6 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF60 + .byte 0x17 + .byte 0xb2 + .4byte 0x367 + .uleb128 0xf + .byte 0x8 + .byte 0x17 + .byte 0xb5 + .4byte 0x39c + .uleb128 0xe + .4byte .LASF59 + .byte 0x17 + .byte 0xb6 + .4byte 0x199 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF61 + .byte 0x17 + .byte 0xb7 + .4byte 0x387 + .uleb128 0xd + .4byte .LASF63 + .byte 0x10 + .byte 0x17 + .byte 0xba + .4byte 0x3cc + .uleb128 0xe + .4byte .LASF64 + .byte 0x17 + .byte 0xbb + .4byte 0x3cc + .byte 0 + .uleb128 0xe + .4byte .LASF65 + .byte 0x17 + .byte 0xbb + .4byte 0x3cc + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3a7 + .uleb128 0xd + .4byte .LASF66 + .byte 0x8 + .byte 0x17 + .byte 0xbe + .4byte 0x3eb + .uleb128 0xe + .4byte .LASF67 + .byte 0x17 + .byte 0xbf + .4byte 0x410 + .byte 0 + .byte 0 + .uleb128 0xd + .4byte .LASF68 + .byte 0x10 + .byte 0x17 + .byte 0xc2 + .4byte 0x410 + .uleb128 0xe + .4byte .LASF64 + .byte 0x17 + .byte 0xc3 + .4byte 0x410 + .byte 0 + .uleb128 0xe + .4byte .LASF69 + .byte 0x17 + .byte 0xc3 + .4byte 0x416 + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3eb + .uleb128 0x7 + .byte 0x8 + .4byte 0x410 + .uleb128 0xd + .4byte .LASF70 + .byte 0x10 + .byte 0x17 + .byte 0xe0 + .4byte 0x441 + .uleb128 0xe + .4byte .LASF64 + .byte 0x17 + .byte 0xe1 + .4byte 0x441 + .byte 0 + .uleb128 0xe + .4byte .LASF71 + .byte 0x17 + .byte 0xe2 + .4byte 0x452 + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x41c + .uleb128 0x10 + .4byte 0x452 + .uleb128 0x11 + .4byte 0x441 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x447 + .uleb128 0x12 + .byte 0x8 + .uleb128 0x13 + .4byte .LASF72 + .byte 0x18 + .2byte 0x1da + .4byte 0x466 + .uleb128 0x14 + .4byte 0x2b0 + .4byte 0x475 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x5 + .4byte 0x490 + .4byte 0x485 + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x3 + .4byte 0x475 + .uleb128 0x7 + .byte 0x8 + .4byte 0x45a + .uleb128 0x3 + .4byte 0x48a + .uleb128 0x15 + .4byte .LASF75 + .byte 0x18 + .2byte 0x1db + .4byte 0x485 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4a7 + .uleb128 0x16 + .4byte 0xc6 + .uleb128 0x8 + .4byte .LASF73 + .byte 0x19 + .byte 0x75 + .4byte 0x4b7 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4bd + .uleb128 0x17 + .uleb128 0x8 + .4byte .LASF74 + .byte 0x19 + .byte 0x78 + .4byte 0xc6 + .uleb128 0x5 + .4byte 0x4be + .4byte 0x4d4 + .uleb128 0x18 + .byte 0 + .uleb128 0x19 + .4byte .LASF76 + .byte 0x19 + .byte 0x87 + .4byte 0x4c9 + .uleb128 0x19 + .4byte .LASF77 + .byte 0x19 + .byte 0x87 + .4byte 0x4c9 + .uleb128 0x19 + .4byte .LASF78 + .byte 0x19 + .byte 0x88 + .4byte 0x4c9 + .uleb128 0x19 + .4byte .LASF79 + .byte 0x19 + .byte 0x88 + .4byte 0x4c9 + .uleb128 0x5 + .4byte 0x61 + .4byte 0x50b + .uleb128 0x18 + .byte 0 + .uleb128 0x19 + .4byte .LASF80 + .byte 0x19 + .byte 0x8f + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF81 + .byte 0x19 + .byte 0x90 + .4byte 0x21e + .uleb128 0x19 + .4byte .LASF82 + .byte 0x19 + .byte 0x91 + .4byte 0x6d + .uleb128 0x19 + .4byte .LASF83 + .byte 0x19 + .byte 0x9a + .4byte 0x2b0 + .uleb128 0x19 + .4byte .LASF84 + .byte 0x19 + .byte 0xa0 + .4byte 0x4b7 + .uleb128 0x19 + .4byte .LASF85 + .byte 0x19 + .byte 0xa2 + .4byte 0x2b0 + .uleb128 0x19 + .4byte .LASF86 + .byte 0x1a + .byte 0x11 + .4byte 0xc6 + .uleb128 0x8 + .4byte .LASF87 + .byte 0x1b + .byte 0x18 + .4byte 0x39c + .uleb128 0x19 + .4byte .LASF88 + .byte 0x1c + .byte 0x3f + .4byte 0x29 + .uleb128 0x5 + .4byte 0x68 + .4byte 0x579 + .uleb128 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0x56e + .uleb128 0x19 + .4byte .LASF89 + .byte 0x1d + .byte 0xb + .4byte 0x579 + .uleb128 0x19 + .4byte .LASF90 + .byte 0x1d + .byte 0xc + .4byte 0x56 + .uleb128 0x19 + .4byte .LASF91 + .byte 0x1d + .byte 0xd + .4byte 0x579 + .uleb128 0x5 + .4byte 0xc6 + .4byte 0x5aa + .uleb128 0x18 + .byte 0 + .uleb128 0x19 + .4byte .LASF92 + .byte 0x1d + .byte 0x40 + .4byte 0x59f + .uleb128 0x19 + .4byte .LASF93 + .byte 0x1d + .byte 0x54 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF94 + .byte 0x1d + .byte 0xc1 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF95 + .byte 0x1d + .byte 0xc2 + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF96 + .byte 0x1d + .2byte 0x11d + .4byte 0xc6 + .uleb128 0x1a + .4byte .LASF97 + .2byte 0x120 + .byte 0x1d + .2byte 0x1dd + .4byte 0x7c9 + .uleb128 0x1b + .4byte .LASF98 + .byte 0x1e + .2byte 0x710 + .4byte 0x74a1 + .byte 0 + .uleb128 0x1b + .4byte .LASF99 + .byte 0x1e + .2byte 0x711 + .4byte 0x87a4 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF100 + .byte 0x1e + .2byte 0x712 + .4byte 0x87ce + .byte 0x10 + .uleb128 0x1b + .4byte .LASF101 + .byte 0x1e + .2byte 0x713 + .4byte 0x87f2 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF102 + .byte 0x1e + .2byte 0x714 + .4byte 0x784e + .byte 0x20 + .uleb128 0x1b + .4byte .LASF103 + .byte 0x1e + .2byte 0x715 + .4byte 0x784e + .byte 0x28 + .uleb128 0x1b + .4byte .LASF104 + .byte 0x1e + .2byte 0x716 + .4byte 0x880c + .byte 0x30 + .uleb128 0x1b + .4byte .LASF105 + .byte 0x1e + .2byte 0x717 + .4byte 0x880c + .byte 0x38 + .uleb128 0x1b + .4byte .LASF106 + .byte 0x1e + .2byte 0x718 + .4byte 0x8831 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF107 + .byte 0x1e + .2byte 0x719 + .4byte 0x8850 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF108 + .byte 0x1e + .2byte 0x71a + .4byte 0x8850 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF109 + .byte 0x1e + .2byte 0x71b + .4byte 0x886a + .byte 0x58 + .uleb128 0x1b + .4byte .LASF110 + .byte 0x1e + .2byte 0x71c + .4byte 0x29 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF111 + .byte 0x1e + .2byte 0x71d + .4byte 0x8884 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF112 + .byte 0x1e + .2byte 0x71e + .4byte 0x889e + .byte 0x70 + .uleb128 0x1b + .4byte .LASF113 + .byte 0x1e + .2byte 0x71f + .4byte 0x8884 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF114 + .byte 0x1e + .2byte 0x720 + .4byte 0x88c2 + .byte 0x80 + .uleb128 0x1b + .4byte .LASF115 + .byte 0x1e + .2byte 0x721 + .4byte 0x88e1 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF116 + .byte 0x1e + .2byte 0x722 + .4byte 0x8900 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF117 + .byte 0x1e + .2byte 0x723 + .4byte 0x892e + .byte 0x98 + .uleb128 0x1b + .4byte .LASF118 + .byte 0x1e + .2byte 0x724 + .4byte 0x5924 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF119 + .byte 0x1e + .2byte 0x725 + .4byte 0x8943 + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF120 + .byte 0x1e + .2byte 0x726 + .4byte 0x8900 + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF121 + .byte 0x1e + .2byte 0x727 + .4byte 0x896c + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF122 + .byte 0x1e + .2byte 0x728 + .4byte 0x8995 + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF123 + .byte 0x1e + .2byte 0x729 + .4byte 0x89bf + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF124 + .byte 0x1e + .2byte 0x72a + .4byte 0x89e3 + .byte 0xd0 + .uleb128 0x1b + .4byte .LASF125 + .byte 0x1e + .2byte 0x72c + .4byte 0x8aa7 + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF126 + .byte 0x1e + .2byte 0x730 + .4byte 0x8ad5 + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF127 + .byte 0x1e + .2byte 0x732 + .4byte 0x8afe + .byte 0xe8 + .uleb128 0x1b + .4byte .LASF128 + .byte 0x1e + .2byte 0x734 + .4byte 0x8afe + .byte 0xf0 + .uleb128 0x1b + .4byte .LASF129 + .byte 0x1e + .2byte 0x736 + .4byte 0x88c2 + .byte 0xf8 + .uleb128 0x1c + .4byte .LASF130 + .byte 0x1e + .2byte 0x738 + .4byte 0x15a + .2byte 0x100 + .uleb128 0x1c + .4byte .LASF131 + .byte 0x1e + .2byte 0x739 + .4byte 0x15a + .2byte 0x108 + .uleb128 0x1c + .4byte .LASF132 + .byte 0x1e + .2byte 0x73a + .4byte 0x15a + .2byte 0x110 + .uleb128 0x1c + .4byte .LASF133 + .byte 0x1e + .2byte 0x73b + .4byte 0x15a + .2byte 0x118 + .byte 0 + .uleb128 0x3 + .4byte 0x5e2 + .uleb128 0x15 + .4byte .LASF134 + .byte 0x1d + .2byte 0x1dd + .4byte 0x7c9 + .uleb128 0x1d + .4byte .LASF135 + .byte 0x10 + .byte 0x1f + .2byte 0x129 + .4byte 0x800 + .uleb128 0xe + .4byte .LASF116 + .byte 0x20 + .byte 0x3d + .4byte 0xe65 + .byte 0 + .uleb128 0xe + .4byte .LASF136 + .byte 0x20 + .byte 0x3e + .4byte 0x66ee + .byte 0x8 + .byte 0 + .uleb128 0x15 + .4byte .LASF137 + .byte 0x1f + .2byte 0x129 + .4byte 0x7da + .uleb128 0x10 + .4byte 0x817 + .uleb128 0x11 + .4byte 0x15a + .byte 0 + .uleb128 0x15 + .4byte .LASF138 + .byte 0x1f + .2byte 0x12a + .4byte 0x823 + .uleb128 0x7 + .byte 0x8 + .4byte 0x80c + .uleb128 0x14 + .4byte 0x199 + .4byte 0x838 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x15 + .4byte .LASF139 + .byte 0x1f + .2byte 0x12b + .4byte 0x844 + .uleb128 0x7 + .byte 0x8 + .4byte 0x829 + .uleb128 0x15 + .4byte .LASF140 + .byte 0x1f + .2byte 0x1f6 + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF141 + .byte 0x1f + .2byte 0x1f7 + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF142 + .byte 0x1f + .2byte 0x1f8 + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF143 + .byte 0x1f + .2byte 0x1f9 + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF144 + .byte 0x1f + .2byte 0x1fa + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF145 + .byte 0x1f + .2byte 0x1fb + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF146 + .byte 0x1f + .2byte 0x1fc + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF147 + .byte 0x1f + .2byte 0x1fd + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF148 + .byte 0x1f + .2byte 0x1ff + .4byte 0x2b0 + .uleb128 0x15 + .4byte .LASF149 + .byte 0x1f + .2byte 0x206 + .4byte 0x37c + .uleb128 0x15 + .4byte .LASF150 + .byte 0x1f + .2byte 0x21a + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF151 + .byte 0x1f + .2byte 0x21c + .4byte 0x2b0 + .uleb128 0x1e + .4byte .LASF180 + .byte 0x4 + .4byte 0x6d + .byte 0x1f + .2byte 0x222 + .4byte 0x916 + .uleb128 0xc + .4byte .LASF152 + .byte 0 + .uleb128 0xc + .4byte .LASF153 + .byte 0x1 + .uleb128 0xc + .4byte .LASF154 + .byte 0x2 + .uleb128 0xc + .4byte .LASF155 + .byte 0x3 + .uleb128 0xc + .4byte .LASF156 + .byte 0x4 + .uleb128 0xc + .4byte .LASF157 + .byte 0x5 + .uleb128 0xc + .4byte .LASF158 + .byte 0x6 + .byte 0 + .uleb128 0x15 + .4byte .LASF159 + .byte 0x1f + .2byte 0x22a + .4byte 0x8da + .uleb128 0x1d + .4byte .LASF160 + .byte 0x3 + .byte 0x1f + .2byte 0x241 + .4byte 0x957 + .uleb128 0x1b + .4byte .LASF161 + .byte 0x1f + .2byte 0x242 + .4byte 0x61 + .byte 0 + .uleb128 0x1b + .4byte .LASF162 + .byte 0x1f + .2byte 0x243 + .4byte 0x61 + .byte 0x1 + .uleb128 0x1b + .4byte .LASF163 + .byte 0x1f + .2byte 0x244 + .4byte 0x2b0 + .byte 0x2 + .byte 0 + .uleb128 0x3 + .4byte 0x922 + .uleb128 0x5 + .4byte 0x957 + .4byte 0x96c + .uleb128 0x6 + .4byte 0x4f + .byte 0x11 + .byte 0 + .uleb128 0x3 + .4byte 0x95c + .uleb128 0x15 + .4byte .LASF164 + .byte 0x1f + .2byte 0x247 + .4byte 0x96c + .uleb128 0x15 + .4byte .LASF165 + .byte 0x1f + .2byte 0x249 + .4byte 0x579 + .uleb128 0x15 + .4byte .LASF166 + .byte 0x1f + .2byte 0x254 + .4byte 0x579 + .uleb128 0xd + .4byte .LASF167 + .byte 0xc + .byte 0x21 + .byte 0x17 + .4byte 0x9d2 + .uleb128 0xe + .4byte .LASF168 + .byte 0x21 + .byte 0x1b + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF169 + .byte 0x21 + .byte 0x21 + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF170 + .byte 0x21 + .byte 0x23 + .4byte 0xb4 + .byte 0x8 + .uleb128 0xe + .4byte .LASF171 + .byte 0x21 + .byte 0x25 + .4byte 0xb4 + .byte 0xa + .byte 0 + .uleb128 0x8 + .4byte .LASF172 + .byte 0x22 + .byte 0x8 + .4byte 0xe2 + .uleb128 0xd + .4byte .LASF173 + .byte 0x10 + .byte 0x23 + .byte 0xa + .4byte 0xa02 + .uleb128 0xe + .4byte .LASF174 + .byte 0x23 + .byte 0xb + .4byte 0x1f2 + .byte 0 + .uleb128 0xe + .4byte .LASF175 + .byte 0x23 + .byte 0xc + .4byte 0x199 + .byte 0x8 + .byte 0 + .uleb128 0xd + .4byte .LASF176 + .byte 0x8 + .byte 0x23 + .byte 0x15 + .4byte 0xa27 + .uleb128 0xe + .4byte .LASF177 + .byte 0x23 + .byte 0x16 + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF178 + .byte 0x23 + .byte 0x17 + .4byte 0xc6 + .byte 0x4 + .byte 0 + .uleb128 0xd + .4byte .LASF179 + .byte 0x10 + .byte 0x22 + .byte 0x15 + .4byte 0xa4c + .uleb128 0xe + .4byte .LASF174 + .byte 0x22 + .byte 0x16 + .4byte 0x9d2 + .byte 0 + .uleb128 0xe + .4byte .LASF175 + .byte 0x22 + .byte 0x17 + .4byte 0x199 + .byte 0x8 + .byte 0 + .uleb128 0x1f + .4byte .LASF181 + .byte 0x4 + .4byte 0x6d + .byte 0x24 + .byte 0x10 + .4byte 0xa6f + .uleb128 0xc + .4byte .LASF182 + .byte 0 + .uleb128 0xc + .4byte .LASF183 + .byte 0x1 + .uleb128 0xc + .4byte .LASF184 + .byte 0x2 + .byte 0 + .uleb128 0xf + .byte 0x28 + .byte 0x24 + .byte 0x1d + .4byte 0xac0 + .uleb128 0xe + .4byte .LASF185 + .byte 0x24 + .byte 0x1e + .4byte 0xac0 + .byte 0 + .uleb128 0x20 + .string "val" + .byte 0x24 + .byte 0x1f + .4byte 0x13f + .byte 0x8 + .uleb128 0xe + .4byte .LASF171 + .byte 0x24 + .byte 0x20 + .4byte 0x13f + .byte 0xc + .uleb128 0xe + .4byte .LASF186 + .byte 0x24 + .byte 0x21 + .4byte 0x13f + .byte 0x10 + .uleb128 0xe + .4byte .LASF187 + .byte 0x24 + .byte 0x22 + .4byte 0x15a + .byte 0x18 + .uleb128 0xe + .4byte .LASF188 + .byte 0x24 + .byte 0x23 + .4byte 0xac0 + .byte 0x20 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x13f + .uleb128 0x21 + .byte 0x8 + .byte 0x24 + .byte 0x29 + .4byte 0xae5 + .uleb128 0x22 + .4byte .LASF189 + .byte 0x24 + .byte 0x2a + .4byte 0xae5 + .uleb128 0x22 + .4byte .LASF190 + .byte 0x24 + .byte 0x2b + .4byte 0xb10 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9dd + .uleb128 0xd + .4byte .LASF191 + .byte 0x8 + .byte 0x25 + .byte 0xa + .4byte 0xb10 + .uleb128 0xe + .4byte .LASF174 + .byte 0x25 + .byte 0xb + .4byte 0x22bb + .byte 0 + .uleb128 0xe + .4byte .LASF175 + .byte 0x25 + .byte 0xc + .4byte 0x12f + .byte 0x4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xaeb + .uleb128 0xf + .byte 0x18 + .byte 0x24 + .byte 0x26 + .4byte 0xb49 + .uleb128 0xe + .4byte .LASF192 + .byte 0x24 + .byte 0x27 + .4byte 0x2a5 + .byte 0 + .uleb128 0xe + .4byte .LASF193 + .byte 0x24 + .byte 0x28 + .4byte 0xa4c + .byte 0x4 + .uleb128 0x23 + .4byte 0xac6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF194 + .byte 0x24 + .byte 0x2d + .4byte 0x15a + .byte 0x10 + .byte 0 + .uleb128 0xf + .byte 0x20 + .byte 0x24 + .byte 0x30 + .4byte 0xb8e + .uleb128 0xe + .4byte .LASF195 + .byte 0x24 + .byte 0x31 + .4byte 0xb93 + .byte 0 + .uleb128 0xe + .4byte .LASF196 + .byte 0x24 + .byte 0x32 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF197 + .byte 0x24 + .byte 0x33 + .4byte 0xc6 + .byte 0xc + .uleb128 0xe + .4byte .LASF174 + .byte 0x24 + .byte 0x34 + .4byte 0x29 + .byte 0x10 + .uleb128 0xe + .4byte .LASF175 + .byte 0x24 + .byte 0x35 + .4byte 0x29 + .byte 0x18 + .byte 0 + .uleb128 0x24 + .4byte .LASF244 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb8e + .uleb128 0x21 + .byte 0x28 + .byte 0x24 + .byte 0x1b + .4byte 0xbc3 + .uleb128 0x22 + .4byte .LASF198 + .byte 0x24 + .byte 0x24 + .4byte 0xa6f + .uleb128 0x22 + .4byte .LASF199 + .byte 0x24 + .byte 0x2e + .4byte 0xb16 + .uleb128 0x22 + .4byte .LASF106 + .byte 0x24 + .byte 0x36 + .4byte 0xb49 + .byte 0 + .uleb128 0xd + .4byte .LASF200 + .byte 0x30 + .byte 0x24 + .byte 0x19 + .4byte 0xbe1 + .uleb128 0x20 + .string "fn" + .byte 0x24 + .byte 0x1a + .4byte 0xbf6 + .byte 0 + .uleb128 0x23 + .4byte 0xb99 + .byte 0x8 + .byte 0 + .uleb128 0x14 + .4byte 0x199 + .4byte 0xbf0 + .uleb128 0x11 + .4byte 0xbf0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbc3 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbe1 + .uleb128 0x19 + .4byte .LASF201 + .byte 0x26 + .byte 0xb7 + .4byte 0x14f + .uleb128 0x19 + .4byte .LASF202 + .byte 0x26 + .byte 0xbc + .4byte 0x15a + .uleb128 0x19 + .4byte .LASF203 + .byte 0x26 + .byte 0xbf + .4byte 0x15a + .uleb128 0x25 + .4byte .LASF311 + .byte 0x33 + .byte 0x8 + .4byte 0x29 + .uleb128 0x8 + .4byte .LASF204 + .byte 0x27 + .byte 0x22 + .4byte 0x29 + .uleb128 0xd + .4byte .LASF205 + .byte 0x20 + .byte 0x27 + .byte 0x27 + .4byte 0xc70 + .uleb128 0xe + .4byte .LASF171 + .byte 0x27 + .byte 0x28 + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF206 + .byte 0x27 + .byte 0x29 + .4byte 0xc28 + .byte 0x8 + .uleb128 0xe + .4byte .LASF207 + .byte 0x27 + .byte 0x2b + .4byte 0x15a + .byte 0x10 + .uleb128 0xe + .4byte .LASF208 + .byte 0x27 + .byte 0x2d + .4byte 0xc6 + .byte 0x18 + .byte 0 + .uleb128 0x19 + .4byte .LASF209 + .byte 0x28 + .byte 0x34 + .4byte 0x6d + .uleb128 0x19 + .4byte .LASF210 + .byte 0x28 + .byte 0x34 + .4byte 0x6d + .uleb128 0x19 + .4byte .LASF211 + .byte 0x28 + .byte 0x3f + .4byte 0x29 + .uleb128 0x5 + .4byte 0xca1 + .4byte 0xca1 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1f + .byte 0 + .uleb128 0x2 + .byte 0x10 + .byte 0x7 + .4byte .LASF212 + .uleb128 0x5 + .4byte 0xd2 + .4byte 0xcb8 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x26 + .4byte .LASF213 + .2byte 0x210 + .byte 0x29 + .byte 0x4f + .4byte 0xcf9 + .uleb128 0xe + .4byte .LASF214 + .byte 0x29 + .byte 0x50 + .4byte 0xc91 + .byte 0 + .uleb128 0x27 + .4byte .LASF215 + .byte 0x29 + .byte 0x51 + .4byte 0xd2 + .2byte 0x200 + .uleb128 0x27 + .4byte .LASF216 + .byte 0x29 + .byte 0x52 + .4byte 0xd2 + .2byte 0x204 + .uleb128 0x27 + .4byte .LASF217 + .byte 0x29 + .byte 0x53 + .4byte 0xcf9 + .2byte 0x208 + .byte 0 + .uleb128 0x5 + .4byte 0xd2 + .4byte 0xd09 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0xf + .byte 0x2 + .byte 0x2a + .byte 0x29 + .4byte 0xd2a + .uleb128 0xe + .4byte .LASF218 + .byte 0x2a + .byte 0x2a + .4byte 0x110 + .byte 0 + .uleb128 0xe + .4byte .LASF219 + .byte 0x2a + .byte 0x2b + .4byte 0x110 + .byte 0x1 + .byte 0 + .uleb128 0xf + .byte 0x4 + .byte 0x2a + .byte 0x2d + .4byte 0xd4b + .uleb128 0xe + .4byte .LASF220 + .byte 0x2a + .byte 0x2e + .4byte 0x11f + .byte 0 + .uleb128 0xe + .4byte .LASF221 + .byte 0x2a + .byte 0x2f + .4byte 0x11f + .byte 0x2 + .byte 0 + .uleb128 0x21 + .byte 0x4 + .byte 0x2a + .byte 0x20 + .4byte 0xd69 + .uleb128 0x28 + .string "val" + .byte 0x2a + .byte 0x21 + .4byte 0x37c + .uleb128 0x29 + .4byte 0xd09 + .uleb128 0x29 + .4byte 0xd2a + .byte 0 + .uleb128 0xd + .4byte .LASF222 + .byte 0x4 + .byte 0x2a + .byte 0x1f + .4byte 0xd7c + .uleb128 0x23 + .4byte 0xd4b + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF223 + .byte 0x2a + .byte 0x3d + .4byte 0xd69 + .uleb128 0xf + .byte 0x4 + .byte 0x2b + .byte 0x10 + .4byte 0xda8 + .uleb128 0xe + .4byte .LASF224 + .byte 0x2b + .byte 0x12 + .4byte 0x110 + .byte 0 + .uleb128 0xe + .4byte .LASF225 + .byte 0x2b + .byte 0x13 + .4byte 0xda8 + .byte 0x1 + .byte 0 + .uleb128 0x5 + .4byte 0x110 + .4byte 0xdb8 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x21 + .byte 0x4 + .byte 0x2b + .byte 0xe + .4byte 0xdd1 + .uleb128 0x22 + .4byte .LASF226 + .byte 0x2b + .byte 0xf + .4byte 0x37c + .uleb128 0x29 + .4byte 0xd87 + .byte 0 + .uleb128 0xd + .4byte .LASF227 + .byte 0x8 + .byte 0x2b + .byte 0xd + .4byte 0xdf0 + .uleb128 0x23 + .4byte 0xdb8 + .byte 0 + .uleb128 0xe + .4byte .LASF228 + .byte 0x2b + .byte 0x1a + .4byte 0xd7c + .byte 0x4 + .byte 0 + .uleb128 0x8 + .4byte .LASF229 + .byte 0x2b + .byte 0x1b + .4byte 0xdd1 + .uleb128 0x19 + .4byte .LASF230 + .byte 0x2c + .byte 0x11 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF231 + .byte 0x2c + .byte 0x12 + .4byte 0xc6 + .uleb128 0x2a + .4byte .LASF958 + .byte 0 + .byte 0x2c + .2byte 0x1b1 + .uleb128 0xd + .4byte .LASF232 + .byte 0x4 + .byte 0x2d + .byte 0x14 + .4byte 0xe33 + .uleb128 0xe + .4byte .LASF233 + .byte 0x2d + .byte 0x15 + .4byte 0xd7c + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF234 + .byte 0x2d + .byte 0x1d + .4byte 0xe1a + .uleb128 0x21 + .byte 0x4 + .byte 0x2d + .byte 0x3e + .4byte 0xe52 + .uleb128 0x22 + .4byte .LASF235 + .byte 0x2d + .byte 0x3f + .4byte 0xe1a + .byte 0 + .uleb128 0xd + .4byte .LASF236 + .byte 0x4 + .byte 0x2d + .byte 0x3d + .4byte 0xe65 + .uleb128 0x23 + .4byte 0xe3e + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF237 + .byte 0x2d + .byte 0x49 + .4byte 0xe52 + .uleb128 0xf + .byte 0x8 + .byte 0x2e + .byte 0xb + .4byte 0xe85 + .uleb128 0xe + .4byte .LASF233 + .byte 0x2e + .byte 0xc + .4byte 0xdf0 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF238 + .byte 0x2e + .byte 0x14 + .4byte 0xe70 + .uleb128 0x19 + .4byte .LASF239 + .byte 0x2f + .byte 0x4f + .4byte 0x2b0 + .uleb128 0x21 + .byte 0x8 + .byte 0x2f + .byte 0x66 + .4byte 0xec5 + .uleb128 0x22 + .4byte .LASF193 + .byte 0x2f + .byte 0x67 + .4byte 0x29 + .uleb128 0x22 + .4byte .LASF240 + .byte 0x2f + .byte 0x68 + .4byte 0xef6 + .uleb128 0x22 + .4byte .LASF64 + .byte 0x2f + .byte 0x69 + .4byte 0xf01 + .byte 0 + .uleb128 0xd + .4byte .LASF241 + .byte 0x18 + .byte 0x30 + .byte 0x3b + .4byte 0xef6 + .uleb128 0xe + .4byte .LASF242 + .byte 0x30 + .byte 0x3c + .4byte 0xf26 + .byte 0 + .uleb128 0xe + .4byte .LASF243 + .byte 0x30 + .byte 0x3d + .4byte 0xf26 + .byte 0x8 + .uleb128 0x20 + .string "key" + .byte 0x30 + .byte 0x3e + .4byte 0xf26 + .byte 0x10 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xec5 + .uleb128 0x24 + .4byte .LASF245 + .uleb128 0x7 + .byte 0x8 + .4byte 0xefc + .uleb128 0xd + .4byte .LASF246 + .byte 0x10 + .byte 0x2f + .byte 0x57 + .4byte 0xf26 + .uleb128 0xe + .4byte .LASF247 + .byte 0x2f + .byte 0x58 + .4byte 0x37c + .byte 0 + .uleb128 0x23 + .4byte 0xe9b + .byte 0x8 + .byte 0 + .uleb128 0x8 + .4byte .LASF248 + .byte 0x30 + .byte 0x39 + .4byte 0x15a + .uleb128 0x5 + .4byte 0xec5 + .4byte 0xf3c + .uleb128 0x18 + .byte 0 + .uleb128 0x19 + .4byte .LASF249 + .byte 0x2f + .byte 0x92 + .4byte 0xf31 + .uleb128 0x19 + .4byte .LASF250 + .byte 0x2f + .byte 0x93 + .4byte 0xf31 + .uleb128 0x1d + .4byte .LASF251 + .byte 0x10 + .byte 0x2f + .2byte 0x120 + .4byte 0xf6d + .uleb128 0x2b + .string "key" + .byte 0x2f + .2byte 0x121 + .4byte 0xf07 + .byte 0 + .byte 0 + .uleb128 0x1f + .4byte .LASF252 + .byte 0x4 + .4byte 0x6d + .byte 0x31 + .byte 0x2f + .4byte 0xf96 + .uleb128 0xc + .4byte .LASF253 + .byte 0 + .uleb128 0xc + .4byte .LASF254 + .byte 0x1 + .uleb128 0xc + .4byte .LASF255 + .byte 0x2 + .uleb128 0xc + .4byte .LASF256 + .byte 0x3 + .byte 0 + .uleb128 0xd + .4byte .LASF257 + .byte 0x18 + .byte 0x31 + .byte 0x42 + .4byte 0xff7 + .uleb128 0xe + .4byte .LASF258 + .byte 0x31 + .byte 0x43 + .4byte 0x2b0 + .byte 0 + .uleb128 0xe + .4byte .LASF259 + .byte 0x31 + .byte 0x44 + .4byte 0x2b0 + .byte 0x1 + .uleb128 0xe + .4byte .LASF260 + .byte 0x31 + .byte 0x45 + .4byte 0x2b0 + .byte 0x2 + .uleb128 0xe + .4byte .LASF193 + .byte 0x31 + .byte 0x46 + .4byte 0xf6d + .byte 0x4 + .uleb128 0xe + .4byte .LASF261 + .byte 0x31 + .byte 0x47 + .4byte 0x110 + .byte 0x8 + .uleb128 0xe + .4byte .LASF262 + .byte 0x31 + .byte 0x48 + .4byte 0x110 + .byte 0x9 + .uleb128 0xe + .4byte .LASF263 + .byte 0x31 + .byte 0x49 + .4byte 0x14f + .byte 0x10 + .byte 0 + .uleb128 0x3 + .4byte 0xf96 + .uleb128 0xd + .4byte .LASF264 + .byte 0x30 + .byte 0x31 + .byte 0x51 + .4byte 0x1051 + .uleb128 0xe + .4byte .LASF265 + .byte 0x31 + .byte 0x52 + .4byte 0x56 + .byte 0 + .uleb128 0xe + .4byte .LASF266 + .byte 0x31 + .byte 0x53 + .4byte 0x15a + .byte 0x8 + .uleb128 0xe + .4byte .LASF267 + .byte 0x31 + .byte 0x54 + .4byte 0x15a + .byte 0x10 + .uleb128 0xe + .4byte .LASF268 + .byte 0x31 + .byte 0x55 + .4byte 0x15a + .byte 0x18 + .uleb128 0xe + .4byte .LASF269 + .byte 0x31 + .byte 0x56 + .4byte 0x15a + .byte 0x20 + .uleb128 0xe + .4byte .LASF270 + .byte 0x31 + .byte 0x57 + .4byte 0x1051 + .byte 0x28 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xff7 + .uleb128 0x19 + .4byte .LASF271 + .byte 0x31 + .byte 0x5a + .4byte 0xffc + .uleb128 0x5 + .4byte 0x29 + .4byte 0x1072 + .uleb128 0x6 + .4byte 0x4f + .byte 0 + .byte 0 + .uleb128 0x15 + .4byte .LASF272 + .byte 0x31 + .2byte 0x165 + .4byte 0x1062 + .uleb128 0x5 + .4byte 0xf52 + .4byte 0x108e + .uleb128 0x6 + .4byte 0x4f + .byte 0x3d + .byte 0 + .uleb128 0x15 + .4byte .LASF273 + .byte 0x31 + .2byte 0x166 + .4byte 0x107e + .uleb128 0x15 + .4byte .LASF274 + .byte 0x31 + .2byte 0x167 + .4byte 0xf52 + .uleb128 0x19 + .4byte .LASF275 + .byte 0x32 + .byte 0x23 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF276 + .byte 0x32 + .byte 0x23 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF277 + .byte 0x32 + .byte 0x23 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF278 + .byte 0x32 + .byte 0x24 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF279 + .byte 0x32 + .byte 0x24 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF280 + .byte 0x32 + .byte 0x24 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF281 + .byte 0x32 + .byte 0x25 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF282 + .byte 0x32 + .byte 0x25 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF283 + .byte 0x32 + .byte 0x26 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF284 + .byte 0x32 + .byte 0x26 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF285 + .byte 0x32 + .byte 0x27 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF286 + .byte 0x32 + .byte 0x27 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF287 + .byte 0x32 + .byte 0x28 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF288 + .byte 0x32 + .byte 0x28 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF289 + .byte 0x32 + .byte 0x29 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF290 + .byte 0x32 + .byte 0x2a + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF291 + .byte 0x32 + .byte 0x2a + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF292 + .byte 0x32 + .byte 0x2a + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF293 + .byte 0x32 + .byte 0x2b + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF294 + .byte 0x32 + .byte 0x2b + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF295 + .byte 0x32 + .byte 0x2c + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF296 + .byte 0x32 + .byte 0x2c + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF297 + .byte 0x32 + .byte 0x2d + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF298 + .byte 0x32 + .byte 0x2d + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF299 + .byte 0x32 + .byte 0x2e + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF300 + .byte 0x32 + .byte 0x2e + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF301 + .byte 0x32 + .byte 0x2f + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF302 + .byte 0x32 + .byte 0x2f + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF303 + .byte 0x32 + .byte 0x30 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF304 + .byte 0x32 + .byte 0x30 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF305 + .byte 0x32 + .byte 0x33 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF306 + .byte 0x32 + .byte 0x33 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF307 + .byte 0x32 + .byte 0x36 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF308 + .byte 0x32 + .byte 0x36 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF309 + .byte 0x32 + .byte 0x39 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF310 + .byte 0x32 + .byte 0x39 + .4byte 0x500 + .uleb128 0x2c + .4byte .LASF312 + .byte 0x32 + .byte 0x3b + .uleb128 0x2c + .4byte .LASF313 + .byte 0x32 + .byte 0x3b + .uleb128 0x19 + .4byte .LASF314 + .byte 0x34 + .byte 0x15 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF315 + .byte 0x34 + .byte 0x15 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF316 + .byte 0x34 + .byte 0x16 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF317 + .byte 0x34 + .byte 0x16 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF318 + .byte 0x34 + .byte 0x17 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF319 + .byte 0x34 + .byte 0x17 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF320 + .byte 0x34 + .byte 0x18 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF321 + .byte 0x34 + .byte 0x18 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF322 + .byte 0x34 + .byte 0x19 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF323 + .byte 0x34 + .byte 0x19 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF324 + .byte 0x34 + .byte 0x1a + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF325 + .byte 0x34 + .byte 0x1a + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF326 + .byte 0x34 + .byte 0x1b + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF327 + .byte 0x34 + .byte 0x1b + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF328 + .byte 0x34 + .byte 0x1c + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF329 + .byte 0x34 + .byte 0x1c + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF330 + .byte 0x34 + .byte 0x1e + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF331 + .byte 0x34 + .byte 0x1e + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF332 + .byte 0x34 + .byte 0x1f + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF333 + .byte 0x34 + .byte 0x1f + .4byte 0x500 + .uleb128 0x5 + .4byte 0x13f + .4byte 0x132c + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x19 + .4byte .LASF334 + .byte 0x35 + .byte 0x4a + .4byte 0x131c + .uleb128 0x19 + .4byte .LASF335 + .byte 0x36 + .byte 0x56 + .4byte 0x346 + .uleb128 0x26 + .4byte .LASF336 + .2byte 0x110 + .byte 0x36 + .byte 0x59 + .4byte 0x138c + .uleb128 0xe + .4byte .LASF337 + .byte 0x36 + .byte 0x5c + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF338 + .byte 0x36 + .byte 0x5e + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF339 + .byte 0x36 + .byte 0x5f + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF340 + .byte 0x36 + .byte 0x61 + .4byte 0x138c + .byte 0x10 + .uleb128 0xe + .4byte .LASF341 + .byte 0x36 + .byte 0x62 + .4byte 0x138c + .byte 0x90 + .byte 0 + .uleb128 0x5 + .4byte 0x139c + .4byte 0x139c + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x13a2 + .uleb128 0x24 + .4byte .LASF342 + .uleb128 0xd + .4byte .LASF343 + .byte 0x68 + .byte 0x36 + .byte 0x66 + .4byte 0x144d + .uleb128 0x20 + .string "x19" + .byte 0x36 + .byte 0x67 + .4byte 0x29 + .byte 0 + .uleb128 0x20 + .string "x20" + .byte 0x36 + .byte 0x68 + .4byte 0x29 + .byte 0x8 + .uleb128 0x20 + .string "x21" + .byte 0x36 + .byte 0x69 + .4byte 0x29 + .byte 0x10 + .uleb128 0x20 + .string "x22" + .byte 0x36 + .byte 0x6a + .4byte 0x29 + .byte 0x18 + .uleb128 0x20 + .string "x23" + .byte 0x36 + .byte 0x6b + .4byte 0x29 + .byte 0x20 + .uleb128 0x20 + .string "x24" + .byte 0x36 + .byte 0x6c + .4byte 0x29 + .byte 0x28 + .uleb128 0x20 + .string "x25" + .byte 0x36 + .byte 0x6d + .4byte 0x29 + .byte 0x30 + .uleb128 0x20 + .string "x26" + .byte 0x36 + .byte 0x6e + .4byte 0x29 + .byte 0x38 + .uleb128 0x20 + .string "x27" + .byte 0x36 + .byte 0x6f + .4byte 0x29 + .byte 0x40 + .uleb128 0x20 + .string "x28" + .byte 0x36 + .byte 0x70 + .4byte 0x29 + .byte 0x48 + .uleb128 0x20 + .string "fp" + .byte 0x36 + .byte 0x71 + .4byte 0x29 + .byte 0x50 + .uleb128 0x20 + .string "sp" + .byte 0x36 + .byte 0x72 + .4byte 0x29 + .byte 0x58 + .uleb128 0x20 + .string "pc" + .byte 0x36 + .byte 0x73 + .4byte 0x29 + .byte 0x60 + .byte 0 + .uleb128 0x2d + .2byte 0x220 + .byte 0x36 + .byte 0x7e + .4byte 0x147b + .uleb128 0xe + .4byte .LASF344 + .byte 0x36 + .byte 0x7f + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF345 + .byte 0x36 + .byte 0x80 + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF346 + .byte 0x36 + .byte 0x81 + .4byte 0xcb8 + .byte 0x10 + .byte 0 + .uleb128 0x26 + .4byte .LASF347 + .2byte 0x3d0 + .byte 0x36 + .byte 0x76 + .4byte 0x14fb + .uleb128 0xe + .4byte .LASF343 + .byte 0x36 + .byte 0x77 + .4byte 0x13a7 + .byte 0 + .uleb128 0x20 + .string "uw" + .byte 0x36 + .byte 0x82 + .4byte 0x144d + .byte 0x70 + .uleb128 0x27 + .4byte .LASF348 + .byte 0x36 + .byte 0x84 + .4byte 0x6d + .2byte 0x290 + .uleb128 0x27 + .4byte .LASF349 + .byte 0x36 + .byte 0x85 + .4byte 0x458 + .2byte 0x298 + .uleb128 0x27 + .4byte .LASF350 + .byte 0x36 + .byte 0x86 + .4byte 0x6d + .2byte 0x2a0 + .uleb128 0x27 + .4byte .LASF351 + .byte 0x36 + .byte 0x87 + .4byte 0x6d + .2byte 0x2a4 + .uleb128 0x27 + .4byte .LASF352 + .byte 0x36 + .byte 0x88 + .4byte 0x29 + .2byte 0x2a8 + .uleb128 0x27 + .4byte .LASF353 + .byte 0x36 + .byte 0x89 + .4byte 0x29 + .2byte 0x2b0 + .uleb128 0x27 + .4byte .LASF354 + .byte 0x36 + .byte 0x8a + .4byte 0x1342 + .2byte 0x2b8 + .byte 0 + .uleb128 0x15 + .4byte .LASF355 + .byte 0x36 + .2byte 0x111 + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF356 + .byte 0x37 + .byte 0x59 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF357 + .byte 0x38 + .byte 0x30 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF358 + .byte 0x38 + .byte 0x30 + .4byte 0x500 + .uleb128 0xd + .4byte .LASF359 + .byte 0x28 + .byte 0x39 + .byte 0x1c + .4byte 0x1565 + .uleb128 0xe + .4byte .LASF171 + .byte 0x39 + .byte 0x1d + .4byte 0x6d + .byte 0 + .uleb128 0xe + .4byte .LASF360 + .byte 0x39 + .byte 0x1e + .4byte 0x458 + .byte 0x8 + .uleb128 0xe + .4byte .LASF71 + .byte 0x39 + .byte 0x1f + .4byte 0x1565 + .byte 0x10 + .uleb128 0xe + .4byte .LASF361 + .byte 0x39 + .byte 0x20 + .4byte 0x3a7 + .byte 0x18 + .byte 0 + .uleb128 0x8 + .4byte .LASF362 + .byte 0x39 + .byte 0x11 + .4byte 0x1570 + .uleb128 0x7 + .byte 0x8 + .4byte 0x1576 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x1594 + .uleb128 0x11 + .4byte 0x1594 + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x1528 + .uleb128 0xd + .4byte .LASF363 + .byte 0x18 + .byte 0x39 + .byte 0x23 + .4byte 0x15bf + .uleb128 0xe + .4byte .LASF116 + .byte 0x39 + .byte 0x24 + .4byte 0xe65 + .byte 0 + .uleb128 0xe + .4byte .LASF136 + .byte 0x39 + .byte 0x25 + .4byte 0x3a7 + .byte 0x8 + .byte 0 + .uleb128 0x8 + .4byte .LASF364 + .byte 0x39 + .byte 0x27 + .4byte 0x159a + .uleb128 0xd + .4byte .LASF365 + .byte 0x8 + .byte 0x3a + .byte 0x10 + .4byte 0x15e3 + .uleb128 0xe + .4byte .LASF366 + .byte 0x3a + .byte 0x10 + .4byte 0x1062 + .byte 0 + .byte 0 + .uleb128 0x3 + .4byte 0x15ca + .uleb128 0x8 + .4byte .LASF367 + .byte 0x3a + .byte 0x10 + .4byte 0x15ca + .uleb128 0x19 + .4byte .LASF368 + .byte 0x3a + .byte 0x26 + .4byte 0x6d + .uleb128 0x19 + .4byte .LASF369 + .byte 0x3a + .byte 0x59 + .4byte 0x15ca + .uleb128 0x19 + .4byte .LASF370 + .byte 0x3a + .byte 0x5a + .4byte 0x15ca + .uleb128 0x19 + .4byte .LASF371 + .byte 0x3a + .byte 0x5b + .4byte 0x15ca + .uleb128 0x19 + .4byte .LASF372 + .byte 0x3a + .byte 0x5c + .4byte 0x15ca + .uleb128 0x13 + .4byte .LASF373 + .byte 0x3a + .2byte 0x2d2 + .4byte 0x1636 + .uleb128 0x5 + .4byte 0x15ca + .4byte 0x1646 + .uleb128 0x6 + .4byte 0x4f + .byte 0 + .byte 0 + .uleb128 0x5 + .4byte 0x30 + .4byte 0x1656 + .uleb128 0x6 + .4byte 0x4f + .byte 0 + .byte 0 + .uleb128 0x3 + .4byte 0x1646 + .uleb128 0x15 + .4byte .LASF374 + .byte 0x3a + .2byte 0x303 + .4byte 0x1656 + .uleb128 0x5 + .4byte 0x30 + .4byte 0x167d + .uleb128 0x6 + .4byte 0x4f + .byte 0x40 + .uleb128 0x6 + .4byte 0x4f + .byte 0 + .byte 0 + .uleb128 0x3 + .4byte 0x1667 + .uleb128 0x15 + .4byte .LASF375 + .byte 0x3a + .2byte 0x357 + .4byte 0x167d + .uleb128 0x19 + .4byte .LASF376 + .byte 0x3b + .byte 0x67 + .4byte 0xc6 + .uleb128 0xd + .4byte .LASF377 + .byte 0x8 + .byte 0x3c + .byte 0x22 + .4byte 0x16b2 + .uleb128 0xe + .4byte .LASF67 + .byte 0x3c + .byte 0x23 + .4byte 0x16d7 + .byte 0 + .byte 0 + .uleb128 0xd + .4byte .LASF378 + .byte 0x10 + .byte 0x3c + .byte 0x26 + .4byte 0x16d7 + .uleb128 0xe + .4byte .LASF64 + .byte 0x3c + .byte 0x27 + .4byte 0x16d7 + .byte 0 + .uleb128 0xe + .4byte .LASF69 + .byte 0x3c + .byte 0x27 + .4byte 0x16dd + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x16b2 + .uleb128 0x7 + .byte 0x8 + .4byte 0x16d7 + .uleb128 0xd + .4byte .LASF379 + .byte 0x4 + .byte 0x3d + .byte 0x30 + .4byte 0x16fc + .uleb128 0xe + .4byte .LASF380 + .byte 0x3d + .byte 0x31 + .4byte 0x6d + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF381 + .byte 0x3d + .byte 0x35 + .4byte 0x16e3 + .uleb128 0x2e + .byte 0x8 + .byte 0x3d + .2byte 0x19b + .4byte 0x172b + .uleb128 0x1b + .4byte .LASF379 + .byte 0x3d + .2byte 0x19c + .4byte 0x16e3 + .byte 0 + .uleb128 0x1b + .4byte .LASF116 + .byte 0x3d + .2byte 0x19d + .4byte 0xe65 + .byte 0x4 + .byte 0 + .uleb128 0x13 + .4byte .LASF382 + .byte 0x3d + .2byte 0x19e + .4byte 0x1707 + .uleb128 0xf + .byte 0x8 + .byte 0x3e + .byte 0x1e + .4byte 0x1758 + .uleb128 0xe + .4byte .LASF116 + .byte 0x3e + .byte 0x1f + .4byte 0xe65 + .byte 0 + .uleb128 0xe + .4byte .LASF383 + .byte 0x3e + .byte 0x20 + .4byte 0xc6 + .byte 0x4 + .byte 0 + .uleb128 0x21 + .byte 0x8 + .byte 0x3e + .byte 0x1a + .4byte 0x1771 + .uleb128 0x22 + .4byte .LASF384 + .byte 0x3e + .byte 0x1c + .4byte 0xf4 + .uleb128 0x29 + .4byte 0x1737 + .byte 0 + .uleb128 0xd + .4byte .LASF385 + .byte 0x8 + .byte 0x3e + .byte 0x19 + .4byte 0x1784 + .uleb128 0x23 + .4byte 0x1758 + .byte 0 + .byte 0 + .uleb128 0xf + .byte 0x8 + .byte 0x3f + .byte 0x32 + .4byte 0x17a5 + .uleb128 0xe + .4byte .LASF386 + .byte 0x3f + .byte 0x33 + .4byte 0x13f + .byte 0 + .uleb128 0x20 + .string "len" + .byte 0x3f + .byte 0x33 + .4byte 0x13f + .byte 0x4 + .byte 0 + .uleb128 0x21 + .byte 0x8 + .byte 0x3f + .byte 0x31 + .4byte 0x17be + .uleb128 0x29 + .4byte 0x1784 + .uleb128 0x22 + .4byte .LASF387 + .byte 0x3f + .byte 0x35 + .4byte 0x15a + .byte 0 + .uleb128 0xd + .4byte .LASF388 + .byte 0x10 + .byte 0x3f + .byte 0x30 + .4byte 0x17dd + .uleb128 0x23 + .4byte 0x17a5 + .byte 0 + .uleb128 0xe + .4byte .LASF265 + .byte 0x3f + .byte 0x37 + .4byte 0x17e2 + .byte 0x8 + .byte 0 + .uleb128 0x3 + .4byte 0x17be + .uleb128 0x7 + .byte 0x8 + .4byte 0x9d + .uleb128 0x19 + .4byte .LASF389 + .byte 0x3f + .byte 0x3c + .4byte 0x17dd + .uleb128 0x19 + .4byte .LASF390 + .byte 0x3f + .byte 0x3d + .4byte 0x17dd + .uleb128 0xd + .4byte .LASF391 + .byte 0x30 + .byte 0x3f + .byte 0x3f + .4byte 0x1847 + .uleb128 0xe + .4byte .LASF392 + .byte 0x3f + .byte 0x40 + .4byte 0x199 + .byte 0 + .uleb128 0xe + .4byte .LASF393 + .byte 0x3f + .byte 0x41 + .4byte 0x199 + .byte 0x8 + .uleb128 0xe + .4byte .LASF394 + .byte 0x3f + .byte 0x42 + .4byte 0x199 + .byte 0x10 + .uleb128 0xe + .4byte .LASF395 + .byte 0x3f + .byte 0x43 + .4byte 0x199 + .byte 0x18 + .uleb128 0xe + .4byte .LASF396 + .byte 0x3f + .byte 0x44 + .4byte 0x1847 + .byte 0x20 + .byte 0 + .uleb128 0x5 + .4byte 0x199 + .4byte 0x1857 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x19 + .4byte .LASF397 + .byte 0x3f + .byte 0x46 + .4byte 0x17fe + .uleb128 0x21 + .byte 0x10 + .byte 0x3f + .byte 0x6b + .4byte 0x1881 + .uleb128 0x22 + .4byte .LASF398 + .byte 0x3f + .byte 0x6c + .4byte 0x3a7 + .uleb128 0x22 + .4byte .LASF399 + .byte 0x3f + .byte 0x6d + .4byte 0x1881 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x15bf + .uleb128 0x21 + .byte 0x10 + .byte 0x3f + .byte 0x74 + .4byte 0x18b1 + .uleb128 0x22 + .4byte .LASF400 + .byte 0x3f + .byte 0x75 + .4byte 0x3eb + .uleb128 0x22 + .4byte .LASF401 + .byte 0x3f + .byte 0x76 + .4byte 0x16b2 + .uleb128 0x22 + .4byte .LASF402 + .byte 0x3f + .byte 0x77 + .4byte 0x41c + .byte 0 + .uleb128 0xd + .4byte .LASF403 + .byte 0xd0 + .byte 0x3f + .byte 0x59 + .4byte 0x1990 + .uleb128 0xe + .4byte .LASF404 + .byte 0x3f + .byte 0x5b + .4byte 0x6d + .byte 0 + .uleb128 0xe + .4byte .LASF405 + .byte 0x3f + .byte 0x5c + .4byte 0x16fc + .byte 0x4 + .uleb128 0xe + .4byte .LASF406 + .byte 0x3f + .byte 0x5d + .4byte 0x16b2 + .byte 0x8 + .uleb128 0xe + .4byte .LASF407 + .byte 0x3f + .byte 0x5e + .4byte 0x1995 + .byte 0x18 + .uleb128 0xe + .4byte .LASF408 + .byte 0x3f + .byte 0x5f + .4byte 0x17be + .byte 0x20 + .uleb128 0xe + .4byte .LASF409 + .byte 0x3f + .byte 0x60 + .4byte 0x1c7f + .byte 0x30 + .uleb128 0xe + .4byte .LASF410 + .byte 0x3f + .byte 0x62 + .4byte 0x1c85 + .byte 0x38 + .uleb128 0xe + .4byte .LASF411 + .byte 0x3f + .byte 0x65 + .4byte 0x1771 + .byte 0x58 + .uleb128 0xe + .4byte .LASF412 + .byte 0x3f + .byte 0x66 + .4byte 0x1d6d + .byte 0x60 + .uleb128 0xe + .4byte .LASF413 + .byte 0x3f + .byte 0x67 + .4byte 0x20e7 + .byte 0x68 + .uleb128 0xe + .4byte .LASF414 + .byte 0x3f + .byte 0x68 + .4byte 0x29 + .byte 0x70 + .uleb128 0xe + .4byte .LASF415 + .byte 0x3f + .byte 0x69 + .4byte 0x458 + .byte 0x78 + .uleb128 0x23 + .4byte 0x1862 + .byte 0x80 + .uleb128 0xe + .4byte .LASF416 + .byte 0x3f + .byte 0x6f + .4byte 0x3a7 + .byte 0x90 + .uleb128 0xe + .4byte .LASF417 + .byte 0x3f + .byte 0x70 + .4byte 0x3a7 + .byte 0xa0 + .uleb128 0x20 + .string "d_u" + .byte 0x3f + .byte 0x78 + .4byte 0x1887 + .byte 0xb0 + .uleb128 0xe + .4byte .LASF130 + .byte 0x3f + .byte 0x7a + .4byte 0x15a + .byte 0xc0 + .uleb128 0xe + .4byte .LASF131 + .byte 0x3f + .byte 0x7b + .4byte 0x15a + .byte 0xc8 + .byte 0 + .uleb128 0x3 + .4byte 0x18b1 + .uleb128 0x7 + .byte 0x8 + .4byte 0x18b1 + .uleb128 0x1a + .4byte .LASF418 + .2byte 0x2a0 + .byte 0x1e + .2byte 0x263 + .4byte 0x1c7a + .uleb128 0x1b + .4byte .LASF419 + .byte 0x1e + .2byte 0x264 + .4byte 0x28f + .byte 0 + .uleb128 0x1b + .4byte .LASF420 + .byte 0x1e + .2byte 0x265 + .4byte 0xb4 + .byte 0x2 + .uleb128 0x1b + .4byte .LASF421 + .byte 0x1e + .2byte 0x266 + .4byte 0x240a + .byte 0x4 + .uleb128 0x1b + .4byte .LASF422 + .byte 0x1e + .2byte 0x267 + .4byte 0x242a + .byte 0x8 + .uleb128 0x1b + .4byte .LASF423 + .byte 0x1e + .2byte 0x268 + .4byte 0x6d + .byte 0xc + .uleb128 0x1b + .4byte .LASF424 + .byte 0x1e + .2byte 0x26b + .4byte 0x7b62 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF425 + .byte 0x1e + .2byte 0x26c + .4byte 0x7b62 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF426 + .byte 0x1e + .2byte 0x26f + .4byte 0x7cdb + .byte 0x20 + .uleb128 0x1b + .4byte .LASF427 + .byte 0x1e + .2byte 0x270 + .4byte 0x20e7 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF428 + .byte 0x1e + .2byte 0x271 + .4byte 0x509c + .byte 0x30 + .uleb128 0x1b + .4byte .LASF429 + .byte 0x1e + .2byte 0x274 + .4byte 0x458 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF430 + .byte 0x1e + .2byte 0x278 + .4byte 0x29 + .byte 0x40 + .uleb128 0x23 + .4byte 0x7ac8 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF431 + .byte 0x1e + .2byte 0x284 + .4byte 0x284 + .byte 0x4c + .uleb128 0x1b + .4byte .LASF432 + .byte 0x1e + .2byte 0x285 + .4byte 0x2d8 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF433 + .byte 0x1e + .2byte 0x286 + .4byte 0xa27 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF434 + .byte 0x1e + .2byte 0x287 + .4byte 0xa27 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF435 + .byte 0x1e + .2byte 0x288 + .4byte 0xa27 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF436 + .byte 0x1e + .2byte 0x289 + .4byte 0xe65 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF437 + .byte 0x1e + .2byte 0x28a + .4byte 0xb4 + .byte 0x8c + .uleb128 0x1b + .4byte .LASF438 + .byte 0x1e + .2byte 0x28b + .4byte 0x110 + .byte 0x8e + .uleb128 0x1b + .4byte .LASF439 + .byte 0x1e + .2byte 0x28c + .4byte 0x110 + .byte 0x8f + .uleb128 0x1b + .4byte .LASF440 + .byte 0x1e + .2byte 0x28d + .4byte 0x31a + .byte 0x90 + .uleb128 0x1b + .4byte .LASF441 + .byte 0x1e + .2byte 0x294 + .4byte 0x29 + .byte 0x98 + .uleb128 0x1b + .4byte .LASF442 + .byte 0x1e + .2byte 0x295 + .4byte 0x4d5c + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF443 + .byte 0x1e + .2byte 0x297 + .4byte 0x29 + .byte 0xd0 + .uleb128 0x1b + .4byte .LASF444 + .byte 0x1e + .2byte 0x298 + .4byte 0x29 + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF445 + .byte 0x1e + .2byte 0x29a + .4byte 0x3eb + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF446 + .byte 0x1e + .2byte 0x29b + .4byte 0x3a7 + .byte 0xf0 + .uleb128 0x1c + .4byte .LASF447 + .byte 0x1e + .2byte 0x29d + .4byte 0x7ce6 + .2byte 0x100 + .uleb128 0x1c + .4byte .LASF448 + .byte 0x1e + .2byte 0x2a0 + .4byte 0xc6 + .2byte 0x108 + .uleb128 0x1c + .4byte .LASF449 + .byte 0x1e + .2byte 0x2a1 + .4byte 0x11f + .2byte 0x10c + .uleb128 0x1c + .4byte .LASF450 + .byte 0x1e + .2byte 0x2a2 + .4byte 0x11f + .2byte 0x10e + .uleb128 0x1c + .4byte .LASF451 + .byte 0x1e + .2byte 0x2a4 + .4byte 0x3a7 + .2byte 0x110 + .uleb128 0x1c + .4byte .LASF452 + .byte 0x1e + .2byte 0x2a5 + .4byte 0x3a7 + .2byte 0x120 + .uleb128 0x1c + .4byte .LASF453 + .byte 0x1e + .2byte 0x2a6 + .4byte 0x3a7 + .2byte 0x130 + .uleb128 0x2f + .4byte 0x7aea + .2byte 0x140 + .uleb128 0x1c + .4byte .LASF454 + .byte 0x1e + .2byte 0x2ab + .4byte 0x39c + .2byte 0x150 + .uleb128 0x1c + .4byte .LASF455 + .byte 0x1e + .2byte 0x2ac + .4byte 0x39c + .2byte 0x158 + .uleb128 0x1c + .4byte .LASF456 + .byte 0x1e + .2byte 0x2ad + .4byte 0x37c + .2byte 0x160 + .uleb128 0x1c + .4byte .LASF457 + .byte 0x1e + .2byte 0x2ae + .4byte 0x37c + .2byte 0x164 + .uleb128 0x1c + .4byte .LASF458 + .byte 0x1e + .2byte 0x2af + .4byte 0x37c + .2byte 0x168 + .uleb128 0x1c + .4byte .LASF459 + .byte 0x1e + .2byte 0x2b3 + .4byte 0x7cec + .2byte 0x170 + .uleb128 0x1c + .4byte .LASF460 + .byte 0x1e + .2byte 0x2b4 + .4byte 0x7d34 + .2byte 0x178 + .uleb128 0x1c + .4byte .LASF461 + .byte 0x1e + .2byte 0x2b5 + .4byte 0x4f97 + .2byte 0x180 + .uleb128 0x1c + .4byte .LASF462 + .byte 0x1e + .2byte 0x2b6 + .4byte 0x3a7 + .2byte 0x250 + .uleb128 0x2f + .4byte 0x7b0c + .2byte 0x260 + .uleb128 0x1c + .4byte .LASF463 + .byte 0x1e + .2byte 0x2bf + .4byte 0xd2 + .2byte 0x268 + .uleb128 0x1c + .4byte .LASF464 + .byte 0x1e + .2byte 0x2c2 + .4byte 0xd2 + .2byte 0x26c + .uleb128 0x1c + .4byte .LASF465 + .byte 0x1e + .2byte 0x2c3 + .4byte 0x7d3f + .2byte 0x270 + .uleb128 0x1c + .4byte .LASF466 + .byte 0x1e + .2byte 0x2c7 + .4byte 0x7d4a + .2byte 0x278 + .uleb128 0x1c + .4byte .LASF467 + .byte 0x1e + .2byte 0x2cb + .4byte 0x7d55 + .2byte 0x280 + .uleb128 0x1c + .4byte .LASF468 + .byte 0x1e + .2byte 0x2ce + .4byte 0x458 + .2byte 0x288 + .uleb128 0x1c + .4byte .LASF130 + .byte 0x1e + .2byte 0x2d0 + .4byte 0x15a + .2byte 0x290 + .uleb128 0x1c + .4byte .LASF131 + .byte 0x1e + .2byte 0x2d1 + .4byte 0x15a + .2byte 0x298 + .byte 0 + .uleb128 0x3 + .4byte 0x199b + .uleb128 0x7 + .byte 0x8 + .4byte 0x199b + .uleb128 0x5 + .4byte 0x96 + .4byte 0x1c95 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1f + .byte 0 + .uleb128 0xd + .4byte .LASF469 + .byte 0xc0 + .byte 0x3f + .byte 0x8a + .4byte 0x1d68 + .uleb128 0xe + .4byte .LASF470 + .byte 0x3f + .byte 0x8b + .4byte 0x2184 + .byte 0 + .uleb128 0xe + .4byte .LASF471 + .byte 0x3f + .byte 0x8c + .4byte 0x2184 + .byte 0x8 + .uleb128 0xe + .4byte .LASF406 + .byte 0x3f + .byte 0x8d + .4byte 0x21aa + .byte 0x10 + .uleb128 0xe + .4byte .LASF472 + .byte 0x3f + .byte 0x8e + .4byte 0x21d4 + .byte 0x18 + .uleb128 0xe + .4byte .LASF473 + .byte 0x3f + .byte 0x90 + .4byte 0x21e9 + .byte 0x20 + .uleb128 0xe + .4byte .LASF474 + .byte 0x3f + .byte 0x91 + .4byte 0x21fe + .byte 0x28 + .uleb128 0xe + .4byte .LASF475 + .byte 0x3f + .byte 0x92 + .4byte 0x220f + .byte 0x30 + .uleb128 0xe + .4byte .LASF476 + .byte 0x3f + .byte 0x93 + .4byte 0x220f + .byte 0x38 + .uleb128 0xe + .4byte .LASF477 + .byte 0x3f + .byte 0x94 + .4byte 0x2225 + .byte 0x40 + .uleb128 0xe + .4byte .LASF478 + .byte 0x3f + .byte 0x95 + .4byte 0x2244 + .byte 0x48 + .uleb128 0xe + .4byte .LASF479 + .byte 0x3f + .byte 0x96 + .4byte 0x2264 + .byte 0x50 + .uleb128 0xe + .4byte .LASF480 + .byte 0x3f + .byte 0x97 + .4byte 0x227e + .byte 0x58 + .uleb128 0xe + .4byte .LASF481 + .byte 0x3f + .byte 0x98 + .4byte 0x229e + .byte 0x60 + .uleb128 0x23 + .4byte 0x2152 + .byte 0x68 + .uleb128 0xe + .4byte .LASF131 + .byte 0x3f + .byte 0x9c + .4byte 0x15a + .byte 0x70 + .uleb128 0xe + .4byte .LASF132 + .byte 0x3f + .byte 0x9d + .4byte 0x15a + .byte 0x78 + .uleb128 0xe + .4byte .LASF133 + .byte 0x3f + .byte 0x9e + .4byte 0x15a + .byte 0x80 + .byte 0 + .uleb128 0x3 + .4byte 0x1c95 + .uleb128 0x7 + .byte 0x8 + .4byte 0x1d68 + .uleb128 0x1a + .4byte .LASF482 + .2byte 0x6c0 + .byte 0x1e + .2byte 0x585 + .4byte 0x20e7 + .uleb128 0x1b + .4byte .LASF483 + .byte 0x1e + .2byte 0x586 + .4byte 0x3a7 + .byte 0 + .uleb128 0x1b + .4byte .LASF484 + .byte 0x1e + .2byte 0x587 + .4byte 0x284 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF485 + .byte 0x1e + .2byte 0x588 + .4byte 0x96 + .byte 0x14 + .uleb128 0x1b + .4byte .LASF486 + .byte 0x1e + .2byte 0x589 + .4byte 0x29 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF487 + .byte 0x1e + .2byte 0x58a + .4byte 0x2d8 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF488 + .byte 0x1e + .2byte 0x58b + .4byte 0x83b4 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF489 + .byte 0x1e + .2byte 0x58c + .4byte 0x858a + .byte 0x30 + .uleb128 0x1b + .4byte .LASF490 + .byte 0x1e + .2byte 0x58d + .4byte 0x8590 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF491 + .byte 0x1e + .2byte 0x58e + .4byte 0x8596 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF492 + .byte 0x1e + .2byte 0x58f + .4byte 0x85a6 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF493 + .byte 0x1e + .2byte 0x590 + .4byte 0x29 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF494 + .byte 0x1e + .2byte 0x591 + .4byte 0x29 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF495 + .byte 0x1e + .2byte 0x592 + .4byte 0x29 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF496 + .byte 0x1e + .2byte 0x593 + .4byte 0x1995 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF497 + .byte 0x1e + .2byte 0x594 + .4byte 0x4d5c + .byte 0x70 + .uleb128 0x1b + .4byte .LASF498 + .byte 0x1e + .2byte 0x595 + .4byte 0xc6 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF499 + .byte 0x1e + .2byte 0x596 + .4byte 0x37c + .byte 0xa4 + .uleb128 0x1b + .4byte .LASF500 + .byte 0x1e + .2byte 0x598 + .4byte 0x458 + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF501 + .byte 0x1e + .2byte 0x59a + .4byte 0x85b6 + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF502 + .byte 0x1e + .2byte 0x59c + .4byte 0x85cc + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF503 + .byte 0x1e + .2byte 0x59d + .4byte 0x869f + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF504 + .byte 0x1e + .2byte 0x5a0 + .4byte 0x86af + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF505 + .byte 0x1e + .2byte 0x5a3 + .4byte 0x86ba + .byte 0xd0 + .uleb128 0x1b + .4byte .LASF506 + .byte 0x1e + .2byte 0x5a4 + .4byte 0xa9 + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF507 + .byte 0x1e + .2byte 0x5a6 + .4byte 0x1699 + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF508 + .byte 0x1e + .2byte 0x5a7 + .4byte 0x3a7 + .byte 0xe8 + .uleb128 0x1b + .4byte .LASF509 + .byte 0x1e + .2byte 0x5a8 + .4byte 0x7aac + .byte 0xf8 + .uleb128 0x1c + .4byte .LASF510 + .byte 0x1e + .2byte 0x5a9 + .4byte 0x478c + .2byte 0x100 + .uleb128 0x1c + .4byte .LASF511 + .byte 0x1e + .2byte 0x5aa + .4byte 0x86c5 + .2byte 0x108 + .uleb128 0x1c + .4byte .LASF512 + .byte 0x1e + .2byte 0x5ab + .4byte 0x3eb + .2byte 0x110 + .uleb128 0x1c + .4byte .LASF513 + .byte 0x1e + .2byte 0x5ac + .4byte 0x6d + .2byte 0x120 + .uleb128 0x1c + .4byte .LASF514 + .byte 0x1e + .2byte 0x5ad + .4byte 0x74a7 + .2byte 0x128 + .uleb128 0x1c + .4byte .LASF515 + .byte 0x1e + .2byte 0x5af + .4byte 0x825c + .2byte 0x268 + .uleb128 0x1c + .4byte .LASF516 + .byte 0x1e + .2byte 0x5b1 + .4byte 0x86cb + .2byte 0x420 + .uleb128 0x1c + .4byte .LASF517 + .byte 0x1e + .2byte 0x5b2 + .4byte 0x5c9a + .2byte 0x440 + .uleb128 0x1c + .4byte .LASF518 + .byte 0x1e + .2byte 0x5b4 + .4byte 0x458 + .2byte 0x450 + .uleb128 0x1c + .4byte .LASF519 + .byte 0x1e + .2byte 0x5b5 + .4byte 0x6d + .2byte 0x458 + .uleb128 0x1c + .4byte .LASF520 + .byte 0x1e + .2byte 0x5b6 + .4byte 0x33b + .2byte 0x45c + .uleb128 0x1c + .4byte .LASF521 + .byte 0x1e + .2byte 0x5ba + .4byte 0x13f + .2byte 0x460 + .uleb128 0x1c + .4byte .LASF522 + .byte 0x1e + .2byte 0x5c0 + .4byte 0x2464 + .2byte 0x468 + .uleb128 0x1c + .4byte .LASF523 + .byte 0x1e + .2byte 0x5c6 + .4byte 0x21e + .2byte 0x488 + .uleb128 0x1c + .4byte .LASF524 + .byte 0x1e + .2byte 0x5c8 + .4byte 0x1d6d + .2byte 0x490 + .uleb128 0x1c + .4byte .LASF525 + .byte 0x1e + .2byte 0x5cd + .4byte 0xc6 + .2byte 0x498 + .uleb128 0x1c + .4byte .LASF526 + .byte 0x1e + .2byte 0x5cf + .4byte 0x4ae2 + .2byte 0x4a0 + .uleb128 0x1c + .4byte .LASF527 + .byte 0x1e + .2byte 0x5d2 + .4byte 0x558 + .2byte 0x4e0 + .uleb128 0x1c + .4byte .LASF528 + .byte 0x1e + .2byte 0x5d5 + .4byte 0x558 + .2byte 0x4e8 + .uleb128 0x1c + .4byte .LASF529 + .byte 0x1e + .2byte 0x5d8 + .4byte 0xc6 + .2byte 0x4f0 + .uleb128 0x1c + .4byte .LASF530 + .byte 0x1e + .2byte 0x5db + .4byte 0x3253 + .2byte 0x4f8 + .uleb128 0x1c + .4byte .LASF531 + .byte 0x1e + .2byte 0x5dc + .4byte 0x3d2 + .2byte 0x500 + .uleb128 0x1c + .4byte .LASF532 + .byte 0x1e + .2byte 0x5e3 + .4byte 0x595c + .2byte 0x508 + .uleb128 0x1c + .4byte .LASF533 + .byte 0x1e + .2byte 0x5e9 + .4byte 0x4c1c + .2byte 0x540 + .uleb128 0x1c + .4byte .LASF534 + .byte 0x1e + .2byte 0x5ea + .4byte 0x4c1c + .2byte 0x580 + .uleb128 0x30 + .string "rcu" + .byte 0x1e + .2byte 0x5eb + .4byte 0x41c + .2byte 0x5a0 + .uleb128 0x1c + .4byte .LASF535 + .byte 0x1e + .2byte 0x5ec + .4byte 0x3205 + .2byte 0x5b0 + .uleb128 0x1c + .4byte .LASF536 + .byte 0x1e + .2byte 0x5ee + .4byte 0x2464 + .2byte 0x5e0 + .uleb128 0x1c + .4byte .LASF537 + .byte 0x1e + .2byte 0x5f3 + .4byte 0xc6 + .2byte 0x600 + .uleb128 0x1c + .4byte .LASF538 + .byte 0x1e + .2byte 0x5f6 + .4byte 0xe65 + .2byte 0x640 + .uleb128 0x1c + .4byte .LASF539 + .byte 0x1e + .2byte 0x5f7 + .4byte 0x3a7 + .2byte 0x648 + .uleb128 0x1c + .4byte .LASF540 + .byte 0x1e + .2byte 0x5f9 + .4byte 0xe65 + .2byte 0x658 + .uleb128 0x1c + .4byte .LASF541 + .byte 0x1e + .2byte 0x5fa + .4byte 0x3a7 + .2byte 0x660 + .uleb128 0x1c + .4byte .LASF130 + .byte 0x1e + .2byte 0x5fc + .4byte 0x15a + .2byte 0x670 + .uleb128 0x1c + .4byte .LASF131 + .byte 0x1e + .2byte 0x5fd + .4byte 0x15a + .2byte 0x678 + .uleb128 0x1c + .4byte .LASF132 + .byte 0x1e + .2byte 0x5fe + .4byte 0x15a + .2byte 0x680 + .uleb128 0x1c + .4byte .LASF133 + .byte 0x1e + .2byte 0x5ff + .4byte 0x15a + .2byte 0x688 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x1d73 + .uleb128 0xf + .byte 0x8 + .byte 0x3f + .byte 0x9a + .4byte 0x2102 + .uleb128 0xe + .4byte .LASF130 + .byte 0x3f + .byte 0x9a + .4byte 0x15a + .byte 0 + .byte 0 + .uleb128 0x10 + .4byte 0x2112 + .uleb128 0x11 + .4byte 0x2112 + .uleb128 0x11 + .4byte 0x2142 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x213d + .uleb128 0xd + .4byte .LASF542 + .byte 0x10 + .byte 0x40 + .byte 0x8 + .4byte 0x213d + .uleb128 0x20 + .string "mnt" + .byte 0x40 + .byte 0x9 + .4byte 0x225e + .byte 0 + .uleb128 0xe + .4byte .LASF403 + .byte 0x40 + .byte 0xa + .4byte 0x1995 + .byte 0x8 + .byte 0 + .uleb128 0x3 + .4byte 0x2118 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2118 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2102 + .uleb128 0x31 + .byte 0 + .byte 0x3f + .byte 0x9a + .uleb128 0x21 + .byte 0x8 + .byte 0x3f + .byte 0x9a + .4byte 0x2170 + .uleb128 0x22 + .4byte .LASF543 + .byte 0x3f + .byte 0x9a + .4byte 0x2148 + .uleb128 0x29 + .4byte 0x20ed + .uleb128 0x29 + .4byte 0x214e + .byte 0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x2184 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2170 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x219e + .uleb128 0x11 + .4byte 0x219e + .uleb128 0x11 + .4byte 0x21a4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x1990 + .uleb128 0x7 + .byte 0x8 + .4byte 0x17be + .uleb128 0x7 + .byte 0x8 + .4byte 0x218a + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x21ce + .uleb128 0x11 + .4byte 0x219e + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x21ce + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x17dd + .uleb128 0x7 + .byte 0x8 + .4byte 0x21b0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x21e9 + .uleb128 0x11 + .4byte 0x219e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x21da + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x21fe + .uleb128 0x11 + .4byte 0x1995 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x21ef + .uleb128 0x10 + .4byte 0x220f + .uleb128 0x11 + .4byte 0x1995 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2204 + .uleb128 0x10 + .4byte 0x2225 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x1c7f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2215 + .uleb128 0x14 + .4byte 0x21e + .4byte 0x2244 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x21e + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x222b + .uleb128 0x24 + .4byte .LASF544 + .uleb128 0x14 + .4byte 0x225e + .4byte 0x225e + .uleb128 0x11 + .4byte 0x2142 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x224a + .uleb128 0x7 + .byte 0x8 + .4byte 0x224f + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x227e + .uleb128 0x11 + .4byte 0x2112 + .uleb128 0x11 + .4byte 0x2b0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x226a + .uleb128 0x14 + .4byte 0x1995 + .4byte 0x2298 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x2298 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x1c7a + .uleb128 0x7 + .byte 0x8 + .4byte 0x2284 + .uleb128 0x19 + .4byte .LASF545 + .byte 0x3f + .byte 0xe6 + .4byte 0x172b + .uleb128 0x15 + .4byte .LASF546 + .byte 0x3f + .2byte 0x1fe + .4byte 0xc6 + .uleb128 0x8 + .4byte .LASF547 + .byte 0x25 + .byte 0x8 + .4byte 0x12f + .uleb128 0x1f + .4byte .LASF548 + .byte 0x4 + .4byte 0x6d + .byte 0x41 + .byte 0x8 + .4byte 0x22f5 + .uleb128 0xc + .4byte .LASF549 + .byte 0 + .uleb128 0xc + .4byte .LASF550 + .byte 0x1 + .uleb128 0xc + .4byte .LASF551 + .byte 0x2 + .uleb128 0xc + .4byte .LASF552 + .byte 0x3 + .uleb128 0xc + .4byte .LASF553 + .byte 0x4 + .byte 0 + .uleb128 0xd + .4byte .LASF554 + .byte 0x10 + .byte 0x41 + .byte 0x35 + .4byte 0x2318 + .uleb128 0x20 + .string "nr" + .byte 0x41 + .byte 0x36 + .4byte 0xc6 + .byte 0 + .uleb128 0x20 + .string "ns" + .byte 0x41 + .byte 0x37 + .4byte 0x231d + .byte 0x8 + .byte 0 + .uleb128 0x24 + .4byte .LASF555 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2318 + .uleb128 0x32 + .string "pid" + .byte 0x60 + .byte 0x41 + .byte 0x3a + .4byte 0x2378 + .uleb128 0xe + .4byte .LASF383 + .byte 0x41 + .byte 0x3c + .4byte 0x37c + .byte 0 + .uleb128 0xe + .4byte .LASF556 + .byte 0x41 + .byte 0x3d + .4byte 0x6d + .byte 0x4 + .uleb128 0xe + .4byte .LASF557 + .byte 0x41 + .byte 0x3f + .4byte 0x2378 + .byte 0x8 + .uleb128 0xe + .4byte .LASF558 + .byte 0x41 + .byte 0x41 + .4byte 0x15bf + .byte 0x28 + .uleb128 0x20 + .string "rcu" + .byte 0x41 + .byte 0x42 + .4byte 0x41c + .byte 0x40 + .uleb128 0xe + .4byte .LASF559 + .byte 0x41 + .byte 0x43 + .4byte 0x2388 + .byte 0x50 + .byte 0 + .uleb128 0x5 + .4byte 0x3d2 + .4byte 0x2388 + .uleb128 0x6 + .4byte 0x4f + .byte 0x3 + .byte 0 + .uleb128 0x5 + .4byte 0x22f5 + .4byte 0x2398 + .uleb128 0x6 + .4byte 0x4f + .byte 0 + .byte 0 + .uleb128 0x19 + .4byte .LASF560 + .byte 0x41 + .byte 0x46 + .4byte 0x2323 + .uleb128 0x19 + .4byte .LASF561 + .byte 0x41 + .byte 0x48 + .4byte 0x7c9 + .uleb128 0x19 + .4byte .LASF562 + .byte 0x41 + .byte 0x62 + .4byte 0x2318 + .uleb128 0x19 + .4byte .LASF563 + .byte 0x42 + .byte 0x23 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF564 + .byte 0x42 + .byte 0x24 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF565 + .byte 0x42 + .byte 0x52 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF566 + .byte 0x42 + .byte 0x53 + .4byte 0xc6 + .uleb128 0x24 + .4byte .LASF567 + .uleb128 0x19 + .4byte .LASF568 + .byte 0x43 + .byte 0x13 + .4byte 0x23e5 + .uleb128 0xf + .byte 0x4 + .byte 0x43 + .byte 0x15 + .4byte 0x240a + .uleb128 0x20 + .string "val" + .byte 0x43 + .byte 0x16 + .4byte 0x2c2 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF569 + .byte 0x43 + .byte 0x17 + .4byte 0x23f5 + .uleb128 0xf + .byte 0x4 + .byte 0x43 + .byte 0x1a + .4byte 0x242a + .uleb128 0x20 + .string "val" + .byte 0x43 + .byte 0x1b + .4byte 0x2cd + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF570 + .byte 0x43 + .byte 0x1c + .4byte 0x2415 + .uleb128 0xd + .4byte .LASF571 + .byte 0x4 + .byte 0x44 + .byte 0xf + .4byte 0x244e + .uleb128 0xe + .4byte .LASF221 + .byte 0x44 + .byte 0x14 + .4byte 0x37c + .byte 0 + .byte 0 + .uleb128 0x19 + .4byte .LASF572 + .byte 0x45 + .byte 0xb + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF573 + .byte 0x45 + .byte 0xc + .4byte 0xc6 + .uleb128 0xd + .4byte .LASF574 + .byte 0x20 + .byte 0x46 + .byte 0x35 + .4byte 0x24a1 + .uleb128 0xe + .4byte .LASF98 + .byte 0x46 + .byte 0x36 + .4byte 0x558 + .byte 0 + .uleb128 0xe + .4byte .LASF228 + .byte 0x46 + .byte 0x37 + .4byte 0xe65 + .byte 0x8 + .uleb128 0x20 + .string "osq" + .byte 0x46 + .byte 0x39 + .4byte 0x2435 + .byte 0xc + .uleb128 0xe + .4byte .LASF575 + .byte 0x46 + .byte 0x3b + .4byte 0x3a7 + .byte 0x10 + .byte 0 + .uleb128 0x1a + .4byte .LASF576 + .2byte 0xe80 + .byte 0x47 + .2byte 0x287 + .4byte 0x2eff + .uleb128 0x1b + .4byte .LASF205 + .byte 0x47 + .2byte 0x28d + .4byte 0xc33 + .byte 0 + .uleb128 0x1b + .4byte .LASF577 + .byte 0x47 + .2byte 0x290 + .4byte 0x1a0 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF578 + .byte 0x47 + .2byte 0x298 + .4byte 0x458 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF579 + .byte 0x47 + .2byte 0x299 + .4byte 0x37c + .byte 0x30 + .uleb128 0x1b + .4byte .LASF171 + .byte 0x47 + .2byte 0x29b + .4byte 0x6d + .byte 0x34 + .uleb128 0x1b + .4byte .LASF580 + .byte 0x47 + .2byte 0x29c + .4byte 0x6d + .byte 0x38 + .uleb128 0x1b + .4byte .LASF581 + .byte 0x47 + .2byte 0x29f + .4byte 0x2f10 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF582 + .byte 0x47 + .2byte 0x2a0 + .4byte 0xc6 + .byte 0x48 + .uleb128 0x2b + .string "cpu" + .byte 0x47 + .2byte 0x2a3 + .4byte 0x6d + .byte 0x4c + .uleb128 0x1b + .4byte .LASF583 + .byte 0x47 + .2byte 0x2a5 + .4byte 0x6d + .byte 0x50 + .uleb128 0x1b + .4byte .LASF584 + .byte 0x47 + .2byte 0x2a6 + .4byte 0x29 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF585 + .byte 0x47 + .2byte 0x2a7 + .4byte 0x2eff + .byte 0x60 + .uleb128 0x1b + .4byte .LASF586 + .byte 0x47 + .2byte 0x2b0 + .4byte 0xc6 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF587 + .byte 0x47 + .2byte 0x2b1 + .4byte 0xc6 + .byte 0x6c + .uleb128 0x1b + .4byte .LASF588 + .byte 0x47 + .2byte 0x2b3 + .4byte 0xc6 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF589 + .byte 0x47 + .2byte 0x2b5 + .4byte 0xc6 + .byte 0x74 + .uleb128 0x1b + .4byte .LASF590 + .byte 0x47 + .2byte 0x2b6 + .4byte 0xc6 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF591 + .byte 0x47 + .2byte 0x2b7 + .4byte 0xc6 + .byte 0x7c + .uleb128 0x1b + .4byte .LASF592 + .byte 0x47 + .2byte 0x2b8 + .4byte 0x6d + .byte 0x80 + .uleb128 0x1b + .4byte .LASF593 + .byte 0x47 + .2byte 0x2ba + .4byte 0x451e + .byte 0x88 + .uleb128 0x2b + .string "se" + .byte 0x47 + .2byte 0x2bb + .4byte 0x415b + .byte 0xc0 + .uleb128 0x30 + .string "rt" + .byte 0x47 + .2byte 0x2bc + .4byte 0x4288 + .2byte 0x2c0 + .uleb128 0x1c + .4byte .LASF594 + .byte 0x47 + .2byte 0x2bf + .4byte 0x15a + .2byte 0x310 + .uleb128 0x1c + .4byte .LASF595 + .byte 0x47 + .2byte 0x2c0 + .4byte 0xc6 + .2byte 0x318 + .uleb128 0x1c + .4byte .LASF596 + .byte 0x47 + .2byte 0x2c1 + .4byte 0x15a + .2byte 0x320 + .uleb128 0x1c + .4byte .LASF597 + .byte 0x47 + .2byte 0x2c2 + .4byte 0x15a + .2byte 0x328 + .uleb128 0x1c + .4byte .LASF598 + .byte 0x47 + .2byte 0x2c5 + .4byte 0x4529 + .2byte 0x330 + .uleb128 0x30 + .string "dl" + .byte 0x47 + .2byte 0x2c7 + .4byte 0x432b + .2byte 0x338 + .uleb128 0x1c + .4byte .LASF599 + .byte 0x47 + .2byte 0x2d9 + .4byte 0x6d + .2byte 0x420 + .uleb128 0x1c + .4byte .LASF600 + .byte 0x47 + .2byte 0x2da + .4byte 0xc6 + .2byte 0x424 + .uleb128 0x1c + .4byte .LASF601 + .byte 0x47 + .2byte 0x2db + .4byte 0x15e8 + .2byte 0x428 + .uleb128 0x1c + .4byte .LASF602 + .byte 0x47 + .2byte 0x2dc + .4byte 0x15e8 + .2byte 0x430 + .uleb128 0x1c + .4byte .LASF603 + .byte 0x47 + .2byte 0x2df + .4byte 0xc6 + .2byte 0x438 + .uleb128 0x1c + .4byte .LASF604 + .byte 0x47 + .2byte 0x2e0 + .4byte 0x4456 + .2byte 0x43c + .uleb128 0x1c + .4byte .LASF605 + .byte 0x47 + .2byte 0x2e1 + .4byte 0x3a7 + .2byte 0x440 + .uleb128 0x1c + .4byte .LASF606 + .byte 0x47 + .2byte 0x2e2 + .4byte 0x4534 + .2byte 0x450 + .uleb128 0x1c + .4byte .LASF607 + .byte 0x47 + .2byte 0x2e6 + .4byte 0x29 + .2byte 0x458 + .uleb128 0x1c + .4byte .LASF608 + .byte 0x47 + .2byte 0x2e7 + .4byte 0x110 + .2byte 0x460 + .uleb128 0x1c + .4byte .LASF609 + .byte 0x47 + .2byte 0x2e8 + .4byte 0x110 + .2byte 0x461 + .uleb128 0x1c + .4byte .LASF610 + .byte 0x47 + .2byte 0x2e9 + .4byte 0xc6 + .2byte 0x464 + .uleb128 0x1c + .4byte .LASF611 + .byte 0x47 + .2byte 0x2ea + .4byte 0x3a7 + .2byte 0x468 + .uleb128 0x1c + .4byte .LASF612 + .byte 0x47 + .2byte 0x2ed + .4byte 0x3ed9 + .2byte 0x478 + .uleb128 0x1c + .4byte .LASF557 + .byte 0x47 + .2byte 0x2ef + .4byte 0x3a7 + .2byte 0x498 + .uleb128 0x1c + .4byte .LASF613 + .byte 0x47 + .2byte 0x2f1 + .4byte 0x33e5 + .2byte 0x4a8 + .uleb128 0x1c + .4byte .LASF614 + .byte 0x47 + .2byte 0x2f2 + .4byte 0x3416 + .2byte 0x4d0 + .uleb128 0x30 + .string "mm" + .byte 0x47 + .2byte 0x2f5 + .4byte 0x455d + .2byte 0x4e8 + .uleb128 0x1c + .4byte .LASF615 + .byte 0x47 + .2byte 0x2f6 + .4byte 0x455d + .2byte 0x4f0 + .uleb128 0x1c + .4byte .LASF616 + .byte 0x47 + .2byte 0x2f9 + .4byte 0x3bb4 + .2byte 0x4f8 + .uleb128 0x1c + .4byte .LASF617 + .byte 0x47 + .2byte 0x2fc + .4byte 0x3d14 + .2byte 0x520 + .uleb128 0x1c + .4byte .LASF618 + .byte 0x47 + .2byte 0x2fe + .4byte 0xc6 + .2byte 0x538 + .uleb128 0x1c + .4byte .LASF619 + .byte 0x47 + .2byte 0x2ff + .4byte 0xc6 + .2byte 0x53c + .uleb128 0x1c + .4byte .LASF620 + .byte 0x47 + .2byte 0x300 + .4byte 0xc6 + .2byte 0x540 + .uleb128 0x1c + .4byte .LASF621 + .byte 0x47 + .2byte 0x302 + .4byte 0xc6 + .2byte 0x544 + .uleb128 0x1c + .4byte .LASF622 + .byte 0x47 + .2byte 0x304 + .4byte 0x29 + .2byte 0x548 + .uleb128 0x1c + .4byte .LASF623 + .byte 0x47 + .2byte 0x307 + .4byte 0x6d + .2byte 0x550 + .uleb128 0x33 + .4byte .LASF624 + .byte 0x47 + .2byte 0x30a + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1f + .2byte 0x554 + .uleb128 0x33 + .4byte .LASF625 + .byte 0x47 + .2byte 0x30b + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1e + .2byte 0x554 + .uleb128 0x33 + .4byte .LASF626 + .byte 0x47 + .2byte 0x30c + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1d + .2byte 0x554 + .uleb128 0x33 + .4byte .LASF627 + .byte 0x47 + .2byte 0x30d + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1c + .2byte 0x554 + .uleb128 0x33 + .4byte .LASF628 + .byte 0x47 + .2byte 0x30f + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1b + .2byte 0x554 + .uleb128 0x33 + .4byte .LASF629 + .byte 0x47 + .2byte 0x318 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1f + .2byte 0x558 + .uleb128 0x33 + .4byte .LASF630 + .byte 0x47 + .2byte 0x319 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1e + .2byte 0x558 + .uleb128 0x33 + .4byte .LASF631 + .byte 0x47 + .2byte 0x31e + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1d + .2byte 0x558 + .uleb128 0x33 + .4byte .LASF632 + .byte 0x47 + .2byte 0x320 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1c + .2byte 0x558 + .uleb128 0x33 + .4byte .LASF633 + .byte 0x47 + .2byte 0x328 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1b + .2byte 0x558 + .uleb128 0x33 + .4byte .LASF634 + .byte 0x47 + .2byte 0x32c + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1a + .2byte 0x558 + .uleb128 0x1c + .4byte .LASF635 + .byte 0x47 + .2byte 0x32f + .4byte 0x29 + .2byte 0x560 + .uleb128 0x1c + .4byte .LASF200 + .byte 0x47 + .2byte 0x331 + .4byte 0xbc3 + .2byte 0x568 + .uleb128 0x30 + .string "pid" + .byte 0x47 + .2byte 0x333 + .4byte 0x29a + .2byte 0x598 + .uleb128 0x1c + .4byte .LASF636 + .byte 0x47 + .2byte 0x334 + .4byte 0x29a + .2byte 0x59c + .uleb128 0x1c + .4byte .LASF637 + .byte 0x47 + .2byte 0x338 + .4byte 0x29 + .2byte 0x5a0 + .uleb128 0x1c + .4byte .LASF638 + .byte 0x47 + .2byte 0x341 + .4byte 0x2eff + .2byte 0x5a8 + .uleb128 0x1c + .4byte .LASF639 + .byte 0x47 + .2byte 0x344 + .4byte 0x2eff + .2byte 0x5b0 + .uleb128 0x1c + .4byte .LASF640 + .byte 0x47 + .2byte 0x349 + .4byte 0x3a7 + .2byte 0x5b8 + .uleb128 0x1c + .4byte .LASF641 + .byte 0x47 + .2byte 0x34a + .4byte 0x3a7 + .2byte 0x5c8 + .uleb128 0x1c + .4byte .LASF642 + .byte 0x47 + .2byte 0x34b + .4byte 0x2eff + .2byte 0x5d8 + .uleb128 0x1c + .4byte .LASF643 + .byte 0x47 + .2byte 0x353 + .4byte 0x3a7 + .2byte 0x5e0 + .uleb128 0x1c + .4byte .LASF644 + .byte 0x47 + .2byte 0x354 + .4byte 0x3a7 + .2byte 0x5f0 + .uleb128 0x1c + .4byte .LASF645 + .byte 0x47 + .2byte 0x357 + .4byte 0x4563 + .2byte 0x600 + .uleb128 0x1c + .4byte .LASF646 + .byte 0x47 + .2byte 0x358 + .4byte 0x4569 + .2byte 0x608 + .uleb128 0x1c + .4byte .LASF647 + .byte 0x47 + .2byte 0x359 + .4byte 0x3a7 + .2byte 0x648 + .uleb128 0x1c + .4byte .LASF648 + .byte 0x47 + .2byte 0x35a + .4byte 0x3a7 + .2byte 0x658 + .uleb128 0x1c + .4byte .LASF649 + .byte 0x47 + .2byte 0x35c + .4byte 0x459e + .2byte 0x668 + .uleb128 0x1c + .4byte .LASF650 + .byte 0x47 + .2byte 0x35f + .4byte 0x45a4 + .2byte 0x670 + .uleb128 0x1c + .4byte .LASF651 + .byte 0x47 + .2byte 0x362 + .4byte 0x45a4 + .2byte 0x678 + .uleb128 0x1c + .4byte .LASF652 + .byte 0x47 + .2byte 0x364 + .4byte 0x15a + .2byte 0x680 + .uleb128 0x1c + .4byte .LASF653 + .byte 0x47 + .2byte 0x365 + .4byte 0x15a + .2byte 0x688 + .uleb128 0x1c + .4byte .LASF654 + .byte 0x47 + .2byte 0x36a + .4byte 0x15a + .2byte 0x690 + .uleb128 0x1c + .4byte .LASF655 + .byte 0x47 + .2byte 0x36c + .4byte 0x45aa + .2byte 0x698 + .uleb128 0x1c + .4byte .LASF656 + .byte 0x47 + .2byte 0x36d + .4byte 0x6d + .2byte 0x6a0 + .uleb128 0x1c + .4byte .LASF657 + .byte 0x47 + .2byte 0x36f + .4byte 0x3e74 + .2byte 0x6a8 + .uleb128 0x1c + .4byte .LASF658 + .byte 0x47 + .2byte 0x378 + .4byte 0x29 + .2byte 0x6c0 + .uleb128 0x1c + .4byte .LASF659 + .byte 0x47 + .2byte 0x379 + .4byte 0x29 + .2byte 0x6c8 + .uleb128 0x1c + .4byte .LASF660 + .byte 0x47 + .2byte 0x37c + .4byte 0x15a + .2byte 0x6d0 + .uleb128 0x1c + .4byte .LASF661 + .byte 0x47 + .2byte 0x37f + .4byte 0x15a + .2byte 0x6d8 + .uleb128 0x1c + .4byte .LASF662 + .byte 0x47 + .2byte 0x382 + .4byte 0x29 + .2byte 0x6e0 + .uleb128 0x1c + .4byte .LASF663 + .byte 0x47 + .2byte 0x383 + .4byte 0x29 + .2byte 0x6e8 + .uleb128 0x1c + .4byte .LASF664 + .byte 0x47 + .2byte 0x386 + .4byte 0x3ea5 + .2byte 0x6f0 + .uleb128 0x1c + .4byte .LASF665 + .byte 0x47 + .2byte 0x387 + .4byte 0x45b0 + .2byte 0x708 + .uleb128 0x1c + .4byte .LASF666 + .byte 0x47 + .2byte 0x38d + .4byte 0x46f8 + .2byte 0x738 + .uleb128 0x1c + .4byte .LASF667 + .byte 0x47 + .2byte 0x390 + .4byte 0x46f8 + .2byte 0x740 + .uleb128 0x1c + .4byte .LASF668 + .byte 0x47 + .2byte 0x393 + .4byte 0x46f8 + .2byte 0x748 + .uleb128 0x1c + .4byte .LASF669 + .byte 0x47 + .2byte 0x39c + .4byte 0x46fe + .2byte 0x750 + .uleb128 0x1c + .4byte .LASF670 + .byte 0x47 + .2byte 0x39e + .4byte 0x4713 + .2byte 0x760 + .uleb128 0x1c + .4byte .LASF671 + .byte 0x47 + .2byte 0x3a5 + .4byte 0x29 + .2byte 0x768 + .uleb128 0x1c + .4byte .LASF672 + .byte 0x47 + .2byte 0x3a6 + .4byte 0x29 + .2byte 0x770 + .uleb128 0x30 + .string "fs" + .byte 0x47 + .2byte 0x3a9 + .4byte 0x471e + .2byte 0x778 + .uleb128 0x1c + .4byte .LASF673 + .byte 0x47 + .2byte 0x3ac + .4byte 0x4729 + .2byte 0x780 + .uleb128 0x1c + .4byte .LASF674 + .byte 0x47 + .2byte 0x3af + .4byte 0x4734 + .2byte 0x788 + .uleb128 0x1c + .4byte .LASF675 + .byte 0x47 + .2byte 0x3b2 + .4byte 0x473f + .2byte 0x790 + .uleb128 0x1c + .4byte .LASF676 + .byte 0x47 + .2byte 0x3b3 + .4byte 0x474a + .2byte 0x798 + .uleb128 0x1c + .4byte .LASF677 + .byte 0x47 + .2byte 0x3b4 + .4byte 0x3819 + .2byte 0x7a0 + .uleb128 0x1c + .4byte .LASF678 + .byte 0x47 + .2byte 0x3b5 + .4byte 0x3819 + .2byte 0x7a8 + .uleb128 0x1c + .4byte .LASF679 + .byte 0x47 + .2byte 0x3b7 + .4byte 0x3819 + .2byte 0x7b0 + .uleb128 0x1c + .4byte .LASF219 + .byte 0x47 + .2byte 0x3b8 + .4byte 0x3b8f + .2byte 0x7b8 + .uleb128 0x1c + .4byte .LASF680 + .byte 0x47 + .2byte 0x3b9 + .4byte 0x29 + .2byte 0x7d0 + .uleb128 0x1c + .4byte .LASF681 + .byte 0x47 + .2byte 0x3ba + .4byte 0x2e3 + .2byte 0x7d8 + .uleb128 0x1c + .4byte .LASF682 + .byte 0x47 + .2byte 0x3bb + .4byte 0x6d + .2byte 0x7e0 + .uleb128 0x1c + .4byte .LASF683 + .byte 0x47 + .2byte 0x3bd + .4byte 0x441 + .2byte 0x7e8 + .uleb128 0x1c + .4byte .LASF684 + .byte 0x47 + .2byte 0x3bf + .4byte 0x4755 + .2byte 0x7f0 + .uleb128 0x1c + .4byte .LASF685 + .byte 0x47 + .2byte 0x3c4 + .4byte 0x378d + .2byte 0x7f8 + .uleb128 0x1c + .4byte .LASF686 + .byte 0x47 + .2byte 0x3c7 + .4byte 0x15a + .2byte 0x808 + .uleb128 0x1c + .4byte .LASF687 + .byte 0x47 + .2byte 0x3c8 + .4byte 0x15a + .2byte 0x810 + .uleb128 0x1c + .4byte .LASF688 + .byte 0x47 + .2byte 0x3cb + .4byte 0xe65 + .2byte 0x818 + .uleb128 0x1c + .4byte .LASF689 + .byte 0x47 + .2byte 0x3ce + .4byte 0xe33 + .2byte 0x81c + .uleb128 0x1c + .4byte .LASF690 + .byte 0x47 + .2byte 0x3d0 + .4byte 0x4478 + .2byte 0x820 + .uleb128 0x1c + .4byte .LASF691 + .byte 0x47 + .2byte 0x3d4 + .4byte 0x3466 + .2byte 0x828 + .uleb128 0x1c + .4byte .LASF692 + .byte 0x47 + .2byte 0x3d6 + .4byte 0x2eff + .2byte 0x838 + .uleb128 0x1c + .4byte .LASF693 + .byte 0x47 + .2byte 0x3d8 + .4byte 0x4760 + .2byte 0x840 + .uleb128 0x1c + .4byte .LASF694 + .byte 0x47 + .2byte 0x400 + .4byte 0x458 + .2byte 0x848 + .uleb128 0x1c + .4byte .LASF695 + .byte 0x47 + .2byte 0x403 + .4byte 0x476b + .2byte 0x850 + .uleb128 0x1c + .4byte .LASF696 + .byte 0x47 + .2byte 0x407 + .4byte 0x4776 + .2byte 0x858 + .uleb128 0x1c + .4byte .LASF697 + .byte 0x47 + .2byte 0x40b + .4byte 0x4781 + .2byte 0x860 + .uleb128 0x1c + .4byte .LASF698 + .byte 0x47 + .2byte 0x40d + .4byte 0x478c + .2byte 0x868 + .uleb128 0x1c + .4byte .LASF699 + .byte 0x47 + .2byte 0x40f + .4byte 0x4823 + .2byte 0x870 + .uleb128 0x1c + .4byte .LASF700 + .byte 0x47 + .2byte 0x412 + .4byte 0x29 + .2byte 0x878 + .uleb128 0x1c + .4byte .LASF701 + .byte 0x47 + .2byte 0x413 + .4byte 0x4829 + .2byte 0x880 + .uleb128 0x1c + .4byte .LASF702 + .byte 0x47 + .2byte 0x415 + .4byte 0x3dab + .2byte 0x888 + .uleb128 0x1c + .4byte .LASF703 + .byte 0x47 + .2byte 0x418 + .4byte 0x6d + .2byte 0x8c8 + .uleb128 0x1c + .4byte .LASF704 + .byte 0x47 + .2byte 0x41c + .4byte 0x15a + .2byte 0x8d0 + .uleb128 0x1c + .4byte .LASF705 + .byte 0x47 + .2byte 0x41e + .4byte 0x15a + .2byte 0x8d8 + .uleb128 0x1c + .4byte .LASF706 + .byte 0x47 + .2byte 0x420 + .4byte 0x15a + .2byte 0x8e0 + .uleb128 0x1c + .4byte .LASF707 + .byte 0x47 + .2byte 0x424 + .4byte 0x37d2 + .2byte 0x8e8 + .uleb128 0x1c + .4byte .LASF708 + .byte 0x47 + .2byte 0x426 + .4byte 0x16fc + .2byte 0x8f0 + .uleb128 0x1c + .4byte .LASF709 + .byte 0x47 + .2byte 0x427 + .4byte 0xc6 + .2byte 0x8f4 + .uleb128 0x1c + .4byte .LASF710 + .byte 0x47 + .2byte 0x428 + .4byte 0xc6 + .2byte 0x8f8 + .uleb128 0x1c + .4byte .LASF711 + .byte 0x47 + .2byte 0x42c + .4byte 0x4834 + .2byte 0x900 + .uleb128 0x1c + .4byte .LASF712 + .byte 0x47 + .2byte 0x42e + .4byte 0x3a7 + .2byte 0x908 + .uleb128 0x1c + .4byte .LASF713 + .byte 0x47 + .2byte 0x435 + .4byte 0x483f + .2byte 0x918 + .uleb128 0x1c + .4byte .LASF714 + .byte 0x47 + .2byte 0x437 + .4byte 0x484a + .2byte 0x920 + .uleb128 0x1c + .4byte .LASF715 + .byte 0x47 + .2byte 0x439 + .4byte 0x3a7 + .2byte 0x928 + .uleb128 0x1c + .4byte .LASF716 + .byte 0x47 + .2byte 0x43a + .4byte 0x4855 + .2byte 0x938 + .uleb128 0x1c + .4byte .LASF717 + .byte 0x47 + .2byte 0x43d + .4byte 0x485b + .2byte 0x940 + .uleb128 0x1c + .4byte .LASF718 + .byte 0x47 + .2byte 0x43e + .4byte 0x2464 + .2byte 0x950 + .uleb128 0x1c + .4byte .LASF719 + .byte 0x47 + .2byte 0x43f + .4byte 0x3a7 + .2byte 0x970 + .uleb128 0x1c + .4byte .LASF720 + .byte 0x47 + .2byte 0x47d + .4byte 0x4876 + .2byte 0x980 + .uleb128 0x1c + .4byte .LASF721 + .byte 0x47 + .2byte 0x47e + .4byte 0x13f + .2byte 0x988 + .uleb128 0x1c + .4byte .LASF722 + .byte 0x47 + .2byte 0x47f + .4byte 0x13f + .2byte 0x98c + .uleb128 0x1c + .4byte .LASF723 + .byte 0x47 + .2byte 0x484 + .4byte 0x29 + .2byte 0x990 + .uleb128 0x1c + .4byte .LASF724 + .byte 0x47 + .2byte 0x487 + .4byte 0x3da3 + .2byte 0x998 + .uleb128 0x30 + .string "rcu" + .byte 0x47 + .2byte 0x489 + .4byte 0x41c + .2byte 0x998 + .uleb128 0x1c + .4byte .LASF725 + .byte 0x47 + .2byte 0x48c + .4byte 0x4881 + .2byte 0x9a8 + .uleb128 0x1c + .4byte .LASF726 + .byte 0x47 + .2byte 0x48e + .4byte 0x3d72 + .2byte 0x9b0 + .uleb128 0x1c + .4byte .LASF727 + .byte 0x47 + .2byte 0x491 + .4byte 0x488c + .2byte 0x9c0 + .uleb128 0x1c + .4byte .LASF728 + .byte 0x47 + .2byte 0x49c + .4byte 0xc6 + .2byte 0x9c8 + .uleb128 0x1c + .4byte .LASF729 + .byte 0x47 + .2byte 0x49d + .4byte 0xc6 + .2byte 0x9cc + .uleb128 0x1c + .4byte .LASF730 + .byte 0x47 + .2byte 0x49f + .4byte 0x29 + .2byte 0x9d0 + .uleb128 0x1c + .4byte .LASF731 + .byte 0x47 + .2byte 0x4a9 + .4byte 0x15a + .2byte 0x9d8 + .uleb128 0x1c + .4byte .LASF732 + .byte 0x47 + .2byte 0x4aa + .4byte 0x15a + .2byte 0x9e0 + .uleb128 0x1c + .4byte .LASF733 + .byte 0x47 + .2byte 0x4c7 + .4byte 0x29 + .2byte 0x9e8 + .uleb128 0x1c + .4byte .LASF734 + .byte 0x47 + .2byte 0x4ca + .4byte 0x29 + .2byte 0x9f0 + .uleb128 0x1c + .4byte .LASF735 + .byte 0x47 + .2byte 0x4e4 + .4byte 0x4897 + .2byte 0x9f8 + .uleb128 0x1c + .4byte .LASF736 + .byte 0x47 + .2byte 0x4e5 + .4byte 0x330 + .2byte 0xa00 + .uleb128 0x1c + .4byte .LASF737 + .byte 0x47 + .2byte 0x4e6 + .4byte 0xc6 + .2byte 0xa04 + .uleb128 0x1c + .4byte .LASF738 + .byte 0x47 + .2byte 0x4e9 + .4byte 0x6d + .2byte 0xa08 + .uleb128 0x1c + .4byte .LASF739 + .byte 0x47 + .2byte 0x4ec + .4byte 0x4897 + .2byte 0xa10 + .uleb128 0x1c + .4byte .LASF740 + .byte 0x47 + .2byte 0x4f0 + .4byte 0x48a2 + .2byte 0xa18 + .uleb128 0x1c + .4byte .LASF741 + .byte 0x47 + .2byte 0x4f4 + .4byte 0x48f7 + .2byte 0xa20 + .uleb128 0x1c + .4byte .LASF742 + .byte 0x47 + .2byte 0x4fd + .4byte 0xc6 + .2byte 0xa28 + .uleb128 0x1c + .4byte .LASF743 + .byte 0x47 + .2byte 0x4ff + .4byte 0x2eff + .2byte 0xa30 + .uleb128 0x1c + .4byte .LASF744 + .byte 0x47 + .2byte 0x502 + .4byte 0x496a + .2byte 0xa38 + .uleb128 0x1c + .4byte .LASF745 + .byte 0x47 + .2byte 0x506 + .4byte 0x37c + .2byte 0xa40 + .uleb128 0x1c + .4byte .LASF746 + .byte 0x47 + .2byte 0x50d + .4byte 0x458 + .2byte 0xa48 + .uleb128 0x2f + .4byte 0x44b5 + .2byte 0xa50 + .uleb128 0x2f + .4byte 0x44f4 + .2byte 0xa58 + .uleb128 0x1c + .4byte .LASF747 + .byte 0x47 + .2byte 0x521 + .4byte 0x2464 + .2byte 0xa60 + .uleb128 0x1c + .4byte .LASF748 + .byte 0x47 + .2byte 0x524 + .4byte 0x15a + .2byte 0xa80 + .uleb128 0x1c + .4byte .LASF749 + .byte 0x47 + .2byte 0x525 + .4byte 0x15a + .2byte 0xa88 + .uleb128 0x1c + .4byte .LASF750 + .byte 0x47 + .2byte 0x52e + .4byte 0x147b + .2byte 0xa90 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x24a1 + .uleb128 0x19 + .4byte .LASF751 + .byte 0x48 + .byte 0xa + .4byte 0xa02 + .uleb128 0xd + .4byte .LASF752 + .byte 0x8 + .byte 0x49 + .byte 0x46 + .4byte 0x2f29 + .uleb128 0xe + .4byte .LASF64 + .byte 0x49 + .byte 0x47 + .4byte 0x2f29 + .byte 0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2f10 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2f35 + .uleb128 0x10 + .4byte 0x2f40 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x19 + .4byte .LASF753 + .byte 0x4a + .byte 0x1e + .4byte 0x6d + .uleb128 0x5 + .4byte 0x29 + .4byte 0x2f5b + .uleb128 0x6 + .4byte 0x4f + .byte 0x7 + .byte 0 + .uleb128 0x19 + .4byte .LASF754 + .byte 0x4b + .byte 0x13 + .4byte 0x2f4b + .uleb128 0x19 + .4byte .LASF755 + .byte 0x4c + .byte 0x26 + .4byte 0xc6 + .uleb128 0x10 + .4byte 0x2f81 + .uleb128 0x11 + .4byte 0x2f81 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x15e3 + .uleb128 0x19 + .4byte .LASF756 + .byte 0x4c + .byte 0x48 + .4byte 0x2f92 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2f71 + .uleb128 0xd + .4byte .LASF757 + .byte 0x18 + .byte 0x4c + .byte 0x5b + .4byte 0x2fc9 + .uleb128 0xe + .4byte .LASF578 + .byte 0x4c + .byte 0x5c + .4byte 0x458 + .byte 0 + .uleb128 0xe + .4byte .LASF758 + .byte 0x4c + .byte 0x5d + .4byte 0x2eff + .byte 0x8 + .uleb128 0xe + .4byte .LASF759 + .byte 0x4c + .byte 0x5e + .4byte 0x199 + .byte 0x10 + .byte 0 + .uleb128 0x19 + .4byte .LASF757 + .byte 0x4c + .byte 0x61 + .4byte 0x2f98 + .uleb128 0x19 + .4byte .LASF760 + .byte 0x4c + .byte 0x62 + .4byte 0x199 + .uleb128 0x19 + .4byte .LASF761 + .byte 0x4a + .byte 0x7c + .4byte 0x6d + .uleb128 0x19 + .4byte .LASF762 + .byte 0x4a + .byte 0x80 + .4byte 0xc6 + .uleb128 0x16 + .4byte 0x15a + .uleb128 0x19 + .4byte .LASF763 + .byte 0x4d + .byte 0x60 + .4byte 0x3005 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2ff5 + .uleb128 0x19 + .4byte .LASF764 + .byte 0x4e + .byte 0x22 + .4byte 0xf52 + .uleb128 0x1f + .4byte .LASF765 + .byte 0x4 + .4byte 0x6d + .byte 0x4e + .byte 0x29 + .4byte 0x3039 + .uleb128 0xc + .4byte .LASF766 + .byte 0 + .uleb128 0xc + .4byte .LASF767 + .byte 0x1 + .uleb128 0xc + .4byte .LASF768 + .byte 0x2 + .byte 0 + .uleb128 0xd + .4byte .LASF769 + .byte 0x48 + .byte 0x4e + .byte 0x31 + .4byte 0x30b1 + .uleb128 0xe + .4byte .LASF770 + .byte 0x4e + .byte 0x32 + .4byte 0x3016 + .byte 0 + .uleb128 0x20 + .string "id" + .byte 0x4e + .byte 0x33 + .4byte 0x30b6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF771 + .byte 0x4e + .byte 0x34 + .4byte 0x56 + .byte 0x10 + .uleb128 0xe + .4byte .LASF772 + .byte 0x4e + .byte 0x35 + .4byte 0x30c2 + .byte 0x18 + .uleb128 0xe + .4byte .LASF773 + .byte 0x4e + .byte 0x36 + .4byte 0x30c2 + .byte 0x20 + .uleb128 0xe + .4byte .LASF774 + .byte 0x4e + .byte 0x37 + .4byte 0x3005 + .byte 0x28 + .uleb128 0xe + .4byte .LASF775 + .byte 0x4e + .byte 0x38 + .4byte 0x3005 + .byte 0x30 + .uleb128 0xe + .4byte .LASF776 + .byte 0x4e + .byte 0x39 + .4byte 0x30e7 + .byte 0x38 + .uleb128 0xe + .4byte .LASF777 + .byte 0x4e + .byte 0x3a + .4byte 0x30e7 + .byte 0x40 + .byte 0 + .uleb128 0x3 + .4byte 0x3039 + .uleb128 0x7 + .byte 0x8 + .4byte 0x30bc + .uleb128 0x34 + .uleb128 0x16 + .4byte 0x13f + .uleb128 0x7 + .byte 0x8 + .4byte 0x30bd + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x30dc + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x30dc + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x30e2 + .uleb128 0x24 + .4byte .LASF778 + .uleb128 0x7 + .byte 0x8 + .4byte 0x30c8 + .uleb128 0x19 + .4byte .LASF779 + .byte 0x4e + .byte 0x3d + .4byte 0x30f8 + .uleb128 0x7 + .byte 0x8 + .4byte 0x30b1 + .uleb128 0x19 + .4byte .LASF780 + .byte 0x4f + .byte 0x8b + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF781 + .byte 0x4f + .byte 0x8c + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF782 + .byte 0x11 + .byte 0x4e + .4byte 0x15a + .uleb128 0x19 + .4byte .LASF783 + .byte 0x11 + .byte 0x4f + .4byte 0x35 + .uleb128 0x19 + .4byte .LASF784 + .byte 0x11 + .byte 0xbc + .4byte 0x29 + .uleb128 0x8 + .4byte .LASF785 + .byte 0x50 + .byte 0x1c + .4byte 0x14f + .uleb128 0x19 + .4byte .LASF786 + .byte 0x51 + .byte 0xa + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF787 + .byte 0x51 + .2byte 0x11e + .4byte 0xc6 + .uleb128 0x14 + .4byte 0x458 + .4byte 0x3166 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3157 + .uleb128 0xd + .4byte .LASF788 + .byte 0x38 + .byte 0x52 + .byte 0xc + .4byte 0x31c1 + .uleb128 0xe + .4byte .LASF361 + .byte 0x52 + .byte 0x11 + .4byte 0x3eb + .byte 0 + .uleb128 0xe + .4byte .LASF194 + .byte 0x52 + .byte 0x12 + .4byte 0x29 + .byte 0x10 + .uleb128 0xe + .4byte .LASF789 + .byte 0x52 + .byte 0x13 + .4byte 0x31d2 + .byte 0x18 + .uleb128 0xe + .4byte .LASF171 + .byte 0x52 + .byte 0x14 + .4byte 0x13f + .byte 0x20 + .uleb128 0xe + .4byte .LASF130 + .byte 0x52 + .byte 0x1a + .4byte 0x15a + .byte 0x28 + .uleb128 0xe + .4byte .LASF131 + .byte 0x52 + .byte 0x1b + .4byte 0x15a + .byte 0x30 + .byte 0 + .uleb128 0x10 + .4byte 0x31cc + .uleb128 0x11 + .4byte 0x31cc + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x316c + .uleb128 0x7 + .byte 0x8 + .4byte 0x31c1 + .uleb128 0x19 + .4byte .LASF790 + .byte 0x52 + .byte 0xc3 + .4byte 0x6d + .uleb128 0x8 + .4byte .LASF791 + .byte 0x53 + .byte 0x16 + .4byte 0x31ee + .uleb128 0x7 + .byte 0x8 + .4byte 0x31f4 + .uleb128 0x10 + .4byte 0x31ff + .uleb128 0x11 + .4byte 0x31ff + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3205 + .uleb128 0xd + .4byte .LASF792 + .byte 0x30 + .byte 0x53 + .byte 0x67 + .4byte 0x324e + .uleb128 0xe + .4byte .LASF793 + .byte 0x53 + .byte 0x68 + .4byte 0x558 + .byte 0 + .uleb128 0xe + .4byte .LASF361 + .byte 0x53 + .byte 0x69 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0xe + .4byte .LASF71 + .byte 0x53 + .byte 0x6a + .4byte 0x31e3 + .byte 0x18 + .uleb128 0xe + .4byte .LASF130 + .byte 0x53 + .byte 0x6e + .4byte 0x15a + .byte 0x20 + .uleb128 0xe + .4byte .LASF131 + .byte 0x53 + .byte 0x6f + .4byte 0x15a + .byte 0x28 + .byte 0 + .uleb128 0x24 + .4byte .LASF794 + .uleb128 0x7 + .byte 0x8 + .4byte 0x324e + .uleb128 0x15 + .4byte .LASF795 + .byte 0x53 + .2byte 0x187 + .4byte 0x3253 + .uleb128 0x15 + .4byte .LASF796 + .byte 0x53 + .2byte 0x188 + .4byte 0x3253 + .uleb128 0x15 + .4byte .LASF797 + .byte 0x53 + .2byte 0x189 + .4byte 0x3253 + .uleb128 0x15 + .4byte .LASF798 + .byte 0x53 + .2byte 0x18a + .4byte 0x3253 + .uleb128 0x15 + .4byte .LASF799 + .byte 0x53 + .2byte 0x18b + .4byte 0x3253 + .uleb128 0x15 + .4byte .LASF800 + .byte 0x53 + .2byte 0x18c + .4byte 0x3253 + .uleb128 0x15 + .4byte .LASF801 + .byte 0x53 + .2byte 0x18d + .4byte 0x3253 + .uleb128 0xd + .4byte .LASF802 + .byte 0x4 + .byte 0x54 + .byte 0x13 + .4byte 0x32c6 + .uleb128 0xe + .4byte .LASF803 + .byte 0x54 + .byte 0x14 + .4byte 0x37c + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF804 + .byte 0x54 + .byte 0x15 + .4byte 0x32ad + .uleb128 0x8 + .4byte .LASF805 + .byte 0x55 + .byte 0x19 + .4byte 0x15a + .uleb128 0x8 + .4byte .LASF806 + .byte 0x55 + .byte 0x1a + .4byte 0x15a + .uleb128 0x8 + .4byte .LASF807 + .byte 0x55 + .byte 0x1c + .4byte 0x15a + .uleb128 0xf + .byte 0x8 + .byte 0x55 + .byte 0x21 + .4byte 0x3307 + .uleb128 0x20 + .string "pte" + .byte 0x55 + .byte 0x21 + .4byte 0x32d1 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF808 + .byte 0x55 + .byte 0x21 + .4byte 0x32f2 + .uleb128 0xf + .byte 0x8 + .byte 0x55 + .byte 0x26 + .4byte 0x3327 + .uleb128 0x20 + .string "pmd" + .byte 0x55 + .byte 0x26 + .4byte 0x32dc + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF809 + .byte 0x55 + .byte 0x26 + .4byte 0x3312 + .uleb128 0xf + .byte 0x8 + .byte 0x55 + .byte 0x31 + .4byte 0x3347 + .uleb128 0x20 + .string "pgd" + .byte 0x55 + .byte 0x31 + .4byte 0x32e7 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF810 + .byte 0x55 + .byte 0x31 + .4byte 0x3332 + .uleb128 0xf + .byte 0x8 + .byte 0x55 + .byte 0x35 + .4byte 0x3367 + .uleb128 0xe + .4byte .LASF811 + .byte 0x55 + .byte 0x35 + .4byte 0x32d1 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF812 + .byte 0x55 + .byte 0x35 + .4byte 0x3352 + .uleb128 0xf + .byte 0x8 + .byte 0x56 + .byte 0xf + .4byte 0x3387 + .uleb128 0x20 + .string "pgd" + .byte 0x56 + .byte 0xf + .4byte 0x3347 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF813 + .byte 0x56 + .byte 0xf + .4byte 0x3372 + .uleb128 0x8 + .4byte .LASF814 + .byte 0x57 + .byte 0x2a + .4byte 0x339d + .uleb128 0x7 + .byte 0x8 + .4byte 0x33a3 + .uleb128 0xd + .4byte .LASF815 + .byte 0x40 + .byte 0x58 + .byte 0x47 + .4byte 0x33e0 + .uleb128 0xe + .4byte .LASF171 + .byte 0x58 + .byte 0x48 + .4byte 0x29 + .byte 0 + .uleb128 0x23 + .4byte 0x52f6 + .byte 0x8 + .uleb128 0x23 + .4byte 0x5328 + .byte 0x30 + .uleb128 0xe + .4byte .LASF816 + .byte 0x58 + .byte 0xb8 + .4byte 0x37c + .byte 0x34 + .uleb128 0xe + .4byte .LASF817 + .byte 0x58 + .byte 0xbb + .4byte 0x4897 + .byte 0x38 + .byte 0 + .uleb128 0x3 + .4byte 0x33a3 + .uleb128 0xd + .4byte .LASF818 + .byte 0x28 + .byte 0x59 + .byte 0x55 + .4byte 0x3416 + .uleb128 0xe + .4byte .LASF589 + .byte 0x59 + .byte 0x56 + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF819 + .byte 0x59 + .byte 0x57 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0xe + .4byte .LASF820 + .byte 0x59 + .byte 0x58 + .4byte 0x3a7 + .byte 0x18 + .byte 0 + .uleb128 0xd + .4byte .LASF821 + .byte 0x18 + .byte 0x5a + .byte 0x24 + .4byte 0x3447 + .uleb128 0xe + .4byte .LASF822 + .byte 0x5a + .byte 0x25 + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF823 + .byte 0x5a + .byte 0x26 + .4byte 0x3447 + .byte 0x8 + .uleb128 0xe + .4byte .LASF824 + .byte 0x5a + .byte 0x27 + .4byte 0x3447 + .byte 0x10 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3416 + .uleb128 0xd + .4byte .LASF825 + .byte 0x8 + .byte 0x5a + .byte 0x2b + .4byte 0x3466 + .uleb128 0xe + .4byte .LASF821 + .byte 0x5a + .byte 0x2c + .4byte 0x3447 + .byte 0 + .byte 0 + .uleb128 0xd + .4byte .LASF826 + .byte 0x10 + .byte 0x5a + .byte 0x39 + .4byte 0x348b + .uleb128 0xe + .4byte .LASF825 + .byte 0x5a + .byte 0x3a + .4byte 0x344d + .byte 0 + .uleb128 0xe + .4byte .LASF827 + .byte 0x5a + .byte 0x3b + .4byte 0x3447 + .byte 0x8 + .byte 0 + .uleb128 0x19 + .4byte .LASF828 + .byte 0x5b + .byte 0x47 + .4byte 0x458 + .uleb128 0x19 + .4byte .LASF829 + .byte 0x5b + .byte 0x48 + .4byte 0x34a1 + .uleb128 0x7 + .byte 0x8 + .4byte 0x30 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6d + .uleb128 0x1f + .4byte .LASF830 + .byte 0x4 + .4byte 0x6d + .byte 0x5b + .byte 0x5d + .4byte 0x34d6 + .uleb128 0xc + .4byte .LASF831 + .byte 0 + .uleb128 0xc + .4byte .LASF832 + .byte 0x1 + .uleb128 0xc + .4byte .LASF833 + .byte 0x2 + .uleb128 0xc + .4byte .LASF834 + .byte 0x3 + .byte 0 + .uleb128 0x5 + .4byte 0x5c + .4byte 0x34e6 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x3 + .4byte 0x34d6 + .uleb128 0x19 + .4byte .LASF835 + .byte 0x5b + .byte 0x64 + .4byte 0x34e6 + .uleb128 0x19 + .4byte .LASF836 + .byte 0x5b + .byte 0x66 + .4byte 0x34ad + .uleb128 0xd + .4byte .LASF837 + .byte 0x20 + .byte 0x5c + .byte 0x9 + .4byte 0x3526 + .uleb128 0xe + .4byte .LASF838 + .byte 0x5c + .byte 0xa + .4byte 0x3416 + .byte 0 + .uleb128 0xe + .4byte .LASF194 + .byte 0x5c + .byte 0xb + .4byte 0x3135 + .byte 0x18 + .byte 0 + .uleb128 0xd + .4byte .LASF839 + .byte 0x10 + .byte 0x5c + .byte 0xe + .4byte 0x354b + .uleb128 0xe + .4byte .LASF136 + .byte 0x5c + .byte 0xf + .4byte 0x344d + .byte 0 + .uleb128 0xe + .4byte .LASF64 + .byte 0x5c + .byte 0x10 + .4byte 0x354b + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3501 + .uleb128 0x1f + .4byte .LASF840 + .byte 0x4 + .4byte 0x6d + .byte 0x52 + .byte 0xbe + .4byte 0x356e + .uleb128 0xc + .4byte .LASF841 + .byte 0 + .uleb128 0xc + .4byte .LASF842 + .byte 0x1 + .byte 0 + .uleb128 0xd + .4byte .LASF843 + .byte 0x48 + .byte 0x5d + .byte 0x6f + .4byte 0x35db + .uleb128 0xe + .4byte .LASF838 + .byte 0x5d + .byte 0x70 + .4byte 0x3501 + .byte 0 + .uleb128 0xe + .4byte .LASF844 + .byte 0x5d + .byte 0x71 + .4byte 0x3135 + .byte 0x20 + .uleb128 0xe + .4byte .LASF789 + .byte 0x5d + .byte 0x72 + .4byte 0x35f0 + .byte 0x28 + .uleb128 0xe + .4byte .LASF845 + .byte 0x5d + .byte 0x73 + .4byte 0x3663 + .byte 0x30 + .uleb128 0xe + .4byte .LASF577 + .byte 0x5d + .byte 0x74 + .4byte 0x110 + .byte 0x38 + .uleb128 0xe + .4byte .LASF846 + .byte 0x5d + .byte 0x75 + .4byte 0x110 + .byte 0x39 + .uleb128 0xe + .4byte .LASF847 + .byte 0x5d + .byte 0x76 + .4byte 0x110 + .byte 0x3a + .uleb128 0xe + .4byte .LASF130 + .byte 0x5d + .byte 0x78 + .4byte 0x15a + .byte 0x40 + .byte 0 + .uleb128 0x14 + .4byte 0x3551 + .4byte 0x35ea + .uleb128 0x11 + .4byte 0x35ea + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x356e + .uleb128 0x7 + .byte 0x8 + .4byte 0x35db + .uleb128 0xd + .4byte .LASF848 + .byte 0x40 + .byte 0x5d + .byte 0x99 + .4byte 0x3663 + .uleb128 0xe + .4byte .LASF849 + .byte 0x5d + .byte 0x9a + .4byte 0x374f + .byte 0 + .uleb128 0xe + .4byte .LASF850 + .byte 0x5d + .byte 0x9b + .4byte 0x6d + .byte 0x8 + .uleb128 0xe + .4byte .LASF192 + .byte 0x5d + .byte 0x9c + .4byte 0x2a5 + .byte 0xc + .uleb128 0x20 + .string "seq" + .byte 0x5d + .byte 0x9d + .4byte 0x16fc + .byte 0x10 + .uleb128 0xe + .4byte .LASF851 + .byte 0x5d + .byte 0x9e + .4byte 0x35ea + .byte 0x18 + .uleb128 0xe + .4byte .LASF852 + .byte 0x5d + .byte 0x9f + .4byte 0x3526 + .byte 0x20 + .uleb128 0xe + .4byte .LASF853 + .byte 0x5d + .byte 0xa0 + .4byte 0x375a + .byte 0x30 + .uleb128 0xe + .4byte .LASF854 + .byte 0x5d + .byte 0xa1 + .4byte 0x3135 + .byte 0x38 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x35f6 + .uleb128 0x26 + .4byte .LASF855 + .2byte 0x240 + .byte 0x5d + .byte 0xcc + .4byte 0x374f + .uleb128 0xe + .4byte .LASF116 + .byte 0x5d + .byte 0xcd + .4byte 0xe33 + .byte 0 + .uleb128 0x20 + .string "cpu" + .byte 0x5d + .byte 0xce + .4byte 0x6d + .byte 0x4 + .uleb128 0xe + .4byte .LASF856 + .byte 0x5d + .byte 0xcf + .4byte 0x6d + .byte 0x8 + .uleb128 0xe + .4byte .LASF857 + .byte 0x5d + .byte 0xd0 + .4byte 0x6d + .byte 0xc + .uleb128 0x35 + .4byte .LASF858 + .byte 0x5d + .byte 0xd1 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1f + .byte 0x10 + .uleb128 0x35 + .4byte .LASF859 + .byte 0x5d + .byte 0xd2 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1e + .byte 0x10 + .uleb128 0x35 + .4byte .LASF860 + .byte 0x5d + .byte 0xd3 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1d + .byte 0x10 + .uleb128 0x35 + .4byte .LASF861 + .byte 0x5d + .byte 0xd4 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1c + .byte 0x10 + .uleb128 0xe + .4byte .LASF862 + .byte 0x5d + .byte 0xd6 + .4byte 0x6d + .byte 0x14 + .uleb128 0xe + .4byte .LASF863 + .byte 0x5d + .byte 0xd7 + .4byte 0xb4 + .byte 0x18 + .uleb128 0xe + .4byte .LASF864 + .byte 0x5d + .byte 0xd8 + .4byte 0xb4 + .byte 0x1a + .uleb128 0xe + .4byte .LASF865 + .byte 0x5d + .byte 0xd9 + .4byte 0x6d + .byte 0x1c + .uleb128 0xe + .4byte .LASF866 + .byte 0x5d + .byte 0xdb + .4byte 0x3135 + .byte 0x20 + .uleb128 0xe + .4byte .LASF867 + .byte 0x5d + .byte 0xdc + .4byte 0x35ea + .byte 0x28 + .uleb128 0xe + .4byte .LASF868 + .byte 0x5d + .byte 0xdd + .4byte 0x3135 + .byte 0x30 + .uleb128 0xe + .4byte .LASF869 + .byte 0x5d + .byte 0xde + .4byte 0x35ea + .byte 0x38 + .uleb128 0xe + .4byte .LASF870 + .byte 0x5d + .byte 0xdf + .4byte 0x3760 + .byte 0x40 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3669 + .uleb128 0x16 + .4byte 0x3135 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3755 + .uleb128 0x5 + .4byte 0x35f6 + .4byte 0x3770 + .uleb128 0x6 + .4byte 0x4f + .byte 0x7 + .byte 0 + .uleb128 0x15 + .4byte .LASF871 + .byte 0x5d + .2byte 0x135 + .4byte 0x6d + .uleb128 0x24 + .4byte .LASF872 + .uleb128 0x15 + .4byte .LASF873 + .byte 0x5d + .2byte 0x15c + .4byte 0x377c + .uleb128 0xd + .4byte .LASF685 + .byte 0x10 + .byte 0x5e + .byte 0x1c + .4byte 0x37b2 + .uleb128 0xe + .4byte .LASF874 + .byte 0x5e + .byte 0x1d + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF875 + .byte 0x5e + .byte 0x1e + .4byte 0x37b7 + .byte 0x8 + .byte 0 + .uleb128 0x24 + .4byte .LASF876 + .uleb128 0x7 + .byte 0x8 + .4byte 0x37b2 + .uleb128 0xf + .byte 0x8 + .byte 0x5f + .byte 0x62 + .4byte 0x37d2 + .uleb128 0xe + .4byte .LASF366 + .byte 0x5f + .byte 0x62 + .4byte 0x1062 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF877 + .byte 0x5f + .byte 0x62 + .4byte 0x37bd + .uleb128 0x19 + .4byte .LASF878 + .byte 0x5f + .byte 0x63 + .4byte 0x37d2 + .uleb128 0x5 + .4byte 0x37d2 + .4byte 0x37f8 + .uleb128 0x6 + .4byte 0x4f + .byte 0x4 + .byte 0 + .uleb128 0x15 + .4byte .LASF879 + .byte 0x5f + .2byte 0x19a + .4byte 0x37e8 + .uleb128 0xf + .byte 0x8 + .byte 0x60 + .byte 0x5a + .4byte 0x3819 + .uleb128 0x20 + .string "sig" + .byte 0x60 + .byte 0x5b + .4byte 0x1062 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF880 + .byte 0x60 + .byte 0x5c + .4byte 0x3804 + .uleb128 0x36 + .4byte .LASF1059 + .byte 0x8 + .byte 0x61 + .byte 0x8 + .4byte 0x3847 + .uleb128 0x22 + .4byte .LASF881 + .byte 0x61 + .byte 0x9 + .4byte 0xc6 + .uleb128 0x22 + .4byte .LASF882 + .byte 0x61 + .byte 0xa + .4byte 0x458 + .byte 0 + .uleb128 0x8 + .4byte .LASF883 + .byte 0x61 + .byte 0xb + .4byte 0x3824 + .uleb128 0xf + .byte 0x8 + .byte 0x61 + .byte 0x39 + .4byte 0x3873 + .uleb128 0xe + .4byte .LASF884 + .byte 0x61 + .byte 0x3a + .4byte 0x1b0 + .byte 0 + .uleb128 0xe + .4byte .LASF885 + .byte 0x61 + .byte 0x3b + .4byte 0x1bb + .byte 0x4 + .byte 0 + .uleb128 0xf + .byte 0x18 + .byte 0x61 + .byte 0x3f + .4byte 0x38ac + .uleb128 0xe + .4byte .LASF886 + .byte 0x61 + .byte 0x40 + .4byte 0x208 + .byte 0 + .uleb128 0xe + .4byte .LASF887 + .byte 0x61 + .byte 0x41 + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF888 + .byte 0x61 + .byte 0x42 + .4byte 0x3847 + .byte 0x8 + .uleb128 0xe + .4byte .LASF889 + .byte 0x61 + .byte 0x43 + .4byte 0xc6 + .byte 0x10 + .byte 0 + .uleb128 0xf + .byte 0x10 + .byte 0x61 + .byte 0x47 + .4byte 0x38d9 + .uleb128 0xe + .4byte .LASF884 + .byte 0x61 + .byte 0x48 + .4byte 0x1b0 + .byte 0 + .uleb128 0xe + .4byte .LASF885 + .byte 0x61 + .byte 0x49 + .4byte 0x1bb + .byte 0x4 + .uleb128 0xe + .4byte .LASF888 + .byte 0x61 + .byte 0x4a + .4byte 0x3847 + .byte 0x8 + .byte 0 + .uleb128 0xf + .byte 0x20 + .byte 0x61 + .byte 0x4e + .4byte 0x391e + .uleb128 0xe + .4byte .LASF884 + .byte 0x61 + .byte 0x4f + .4byte 0x1b0 + .byte 0 + .uleb128 0xe + .4byte .LASF885 + .byte 0x61 + .byte 0x50 + .4byte 0x1bb + .byte 0x4 + .uleb128 0xe + .4byte .LASF890 + .byte 0x61 + .byte 0x51 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF891 + .byte 0x61 + .byte 0x52 + .4byte 0x1fd + .byte 0x10 + .uleb128 0xe + .4byte .LASF892 + .byte 0x61 + .byte 0x53 + .4byte 0x1fd + .byte 0x18 + .byte 0 + .uleb128 0xf + .byte 0x18 + .byte 0x61 + .byte 0x6b + .4byte 0x394b + .uleb128 0xe + .4byte .LASF893 + .byte 0x61 + .byte 0x6c + .4byte 0x394b + .byte 0 + .uleb128 0xe + .4byte .LASF894 + .byte 0x61 + .byte 0x6d + .4byte 0x458 + .byte 0x8 + .uleb128 0xe + .4byte .LASF895 + .byte 0x61 + .byte 0x6e + .4byte 0x458 + .byte 0x10 + .byte 0 + .uleb128 0x5 + .4byte 0x61 + .4byte 0x395b + .uleb128 0x6 + .4byte 0x4f + .byte 0x7 + .byte 0 + .uleb128 0xf + .byte 0xc + .byte 0x61 + .byte 0x71 + .4byte 0x397c + .uleb128 0xe + .4byte .LASF896 + .byte 0x61 + .byte 0x72 + .4byte 0x394b + .byte 0 + .uleb128 0xe + .4byte .LASF897 + .byte 0x61 + .byte 0x73 + .4byte 0xd2 + .byte 0x8 + .byte 0 + .uleb128 0x21 + .byte 0x18 + .byte 0x61 + .byte 0x64 + .4byte 0x39a6 + .uleb128 0x22 + .4byte .LASF898 + .byte 0x61 + .byte 0x69 + .4byte 0xa2 + .uleb128 0x22 + .4byte .LASF899 + .byte 0x61 + .byte 0x6f + .4byte 0x391e + .uleb128 0x22 + .4byte .LASF900 + .byte 0x61 + .byte 0x74 + .4byte 0x395b + .byte 0 + .uleb128 0xf + .byte 0x20 + .byte 0x61 + .byte 0x57 + .4byte 0x39c1 + .uleb128 0xe + .4byte .LASF901 + .byte 0x61 + .byte 0x58 + .4byte 0x458 + .byte 0 + .uleb128 0x23 + .4byte 0x397c + .byte 0x8 + .byte 0 + .uleb128 0xf + .byte 0x10 + .byte 0x61 + .byte 0x79 + .4byte 0x39e2 + .uleb128 0xe + .4byte .LASF902 + .byte 0x61 + .byte 0x7a + .4byte 0x199 + .byte 0 + .uleb128 0x20 + .string "_fd" + .byte 0x61 + .byte 0x7b + .4byte 0xc6 + .byte 0x8 + .byte 0 + .uleb128 0xf + .byte 0x10 + .byte 0x61 + .byte 0x7f + .4byte 0x3a0f + .uleb128 0xe + .4byte .LASF903 + .byte 0x61 + .byte 0x80 + .4byte 0x458 + .byte 0 + .uleb128 0xe + .4byte .LASF904 + .byte 0x61 + .byte 0x81 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF905 + .byte 0x61 + .byte 0x82 + .4byte 0x6d + .byte 0xc + .byte 0 + .uleb128 0x21 + .byte 0x70 + .byte 0x61 + .byte 0x35 + .4byte 0x3a70 + .uleb128 0x22 + .4byte .LASF906 + .byte 0x61 + .byte 0x36 + .4byte 0x3a70 + .uleb128 0x22 + .4byte .LASF907 + .byte 0x61 + .byte 0x3c + .4byte 0x3852 + .uleb128 0x22 + .4byte .LASF908 + .byte 0x61 + .byte 0x44 + .4byte 0x3873 + .uleb128 0x28 + .string "_rt" + .byte 0x61 + .byte 0x4b + .4byte 0x38ac + .uleb128 0x22 + .4byte .LASF909 + .byte 0x61 + .byte 0x54 + .4byte 0x38d9 + .uleb128 0x22 + .4byte .LASF910 + .byte 0x61 + .byte 0x76 + .4byte 0x39a6 + .uleb128 0x22 + .4byte .LASF911 + .byte 0x61 + .byte 0x7c + .4byte 0x39c1 + .uleb128 0x22 + .4byte .LASF912 + .byte 0x61 + .byte 0x83 + .4byte 0x39e2 + .byte 0 + .uleb128 0x5 + .4byte 0xc6 + .4byte 0x3a80 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1b + .byte 0 + .uleb128 0xd + .4byte .LASF913 + .byte 0x80 + .byte 0x61 + .byte 0x2b + .4byte 0x3abd + .uleb128 0xe + .4byte .LASF914 + .byte 0x61 + .byte 0x2c + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF915 + .byte 0x61 + .byte 0x2e + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF916 + .byte 0x61 + .byte 0x2f + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF917 + .byte 0x61 + .byte 0x84 + .4byte 0x3a0f + .byte 0x10 + .byte 0 + .uleb128 0x8 + .4byte .LASF918 + .byte 0x61 + .byte 0x85 + .4byte 0x3a80 + .uleb128 0xd + .4byte .LASF919 + .byte 0x98 + .byte 0x62 + .byte 0x10 + .4byte 0x3b89 + .uleb128 0xe + .4byte .LASF920 + .byte 0x62 + .byte 0x11 + .4byte 0x32c6 + .byte 0 + .uleb128 0xe + .4byte .LASF921 + .byte 0x62 + .byte 0x12 + .4byte 0x37c + .byte 0x4 + .uleb128 0xe + .4byte .LASF922 + .byte 0x62 + .byte 0x13 + .4byte 0x37c + .byte 0x8 + .uleb128 0xe + .4byte .LASF923 + .byte 0x62 + .byte 0x18 + .4byte 0x558 + .byte 0x10 + .uleb128 0xe + .4byte .LASF924 + .byte 0x62 + .byte 0x1e + .4byte 0x29 + .byte 0x18 + .uleb128 0xe + .4byte .LASF925 + .byte 0x62 + .byte 0x1f + .4byte 0x29 + .byte 0x20 + .uleb128 0xe + .4byte .LASF926 + .byte 0x62 + .byte 0x20 + .4byte 0x558 + .byte 0x28 + .uleb128 0xe + .4byte .LASF927 + .byte 0x62 + .byte 0x23 + .4byte 0x869f + .byte 0x30 + .uleb128 0xe + .4byte .LASF928 + .byte 0x62 + .byte 0x24 + .4byte 0x869f + .byte 0x38 + .uleb128 0xe + .4byte .LASF929 + .byte 0x62 + .byte 0x28 + .4byte 0x3eb + .byte 0x40 + .uleb128 0x20 + .string "uid" + .byte 0x62 + .byte 0x29 + .4byte 0x240a + .byte 0x50 + .uleb128 0xe + .4byte .LASF930 + .byte 0x62 + .byte 0x2d + .4byte 0x558 + .byte 0x58 + .uleb128 0xe + .4byte .LASF931 + .byte 0x62 + .byte 0x31 + .4byte 0x94b3 + .byte 0x60 + .uleb128 0xe + .4byte .LASF130 + .byte 0x62 + .byte 0x33 + .4byte 0x15a + .byte 0x88 + .uleb128 0xe + .4byte .LASF131 + .byte 0x62 + .byte 0x34 + .4byte 0x15a + .byte 0x90 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3ac8 + .uleb128 0xd + .4byte .LASF922 + .byte 0x18 + .byte 0x63 + .byte 0x1a + .4byte 0x3bb4 + .uleb128 0xe + .4byte .LASF932 + .byte 0x63 + .byte 0x1b + .4byte 0x3a7 + .byte 0 + .uleb128 0xe + .4byte .LASF675 + .byte 0x63 + .byte 0x1c + .4byte 0x3819 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF616 + .byte 0x28 + .byte 0x64 + .byte 0x22 + .4byte 0x3bd9 + .uleb128 0xe + .4byte .LASF933 + .byte 0x64 + .byte 0x23 + .4byte 0x15a + .byte 0 + .uleb128 0xe + .4byte .LASF934 + .byte 0x64 + .byte 0x24 + .4byte 0x3bd9 + .byte 0x8 + .byte 0 + .uleb128 0x5 + .4byte 0x3be9 + .4byte 0x3be9 + .uleb128 0x6 + .4byte 0x4f + .byte 0x3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3bef + .uleb128 0x1d + .4byte .LASF935 + .byte 0xd8 + .byte 0x58 + .2byte 0x10e + .4byte 0x3d14 + .uleb128 0x1b + .4byte .LASF936 + .byte 0x58 + .2byte 0x111 + .4byte 0x29 + .byte 0 + .uleb128 0x1b + .4byte .LASF937 + .byte 0x58 + .2byte 0x112 + .4byte 0x29 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF938 + .byte 0x58 + .2byte 0x116 + .4byte 0x3be9 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF939 + .byte 0x58 + .2byte 0x116 + .4byte 0x3be9 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF940 + .byte 0x58 + .2byte 0x118 + .4byte 0x3416 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF941 + .byte 0x58 + .2byte 0x120 + .4byte 0x29 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF942 + .byte 0x58 + .2byte 0x124 + .4byte 0x455d + .byte 0x40 + .uleb128 0x1b + .4byte .LASF943 + .byte 0x58 + .2byte 0x125 + .4byte 0x3367 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF944 + .byte 0x58 + .2byte 0x126 + .4byte 0x29 + .byte 0x50 + .uleb128 0x23 + .4byte 0x54b4 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF945 + .byte 0x58 + .2byte 0x13e + .4byte 0x3a7 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF946 + .byte 0x58 + .2byte 0x140 + .4byte 0x54db + .byte 0x88 + .uleb128 0x1b + .4byte .LASF947 + .byte 0x58 + .2byte 0x143 + .4byte 0x55d1 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF948 + .byte 0x58 + .2byte 0x146 + .4byte 0x29 + .byte 0x98 + .uleb128 0x1b + .4byte .LASF949 + .byte 0x58 + .2byte 0x148 + .4byte 0x5482 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF950 + .byte 0x58 + .2byte 0x149 + .4byte 0x458 + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF951 + .byte 0x58 + .2byte 0x14b + .4byte 0x558 + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF952 + .byte 0x58 + .2byte 0x152 + .4byte 0x5488 + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x58 + .2byte 0x154 + .4byte 0x15a + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x58 + .2byte 0x155 + .4byte 0x15a + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x58 + .2byte 0x156 + .4byte 0x15a + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x58 + .2byte 0x157 + .4byte 0x15a + .byte 0xd0 + .byte 0 + .uleb128 0xd + .4byte .LASF953 + .byte 0x18 + .byte 0x64 + .byte 0x33 + .4byte 0x3d39 + .uleb128 0xe + .4byte .LASF954 + .byte 0x64 + .byte 0x34 + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF383 + .byte 0x64 + .byte 0x35 + .4byte 0x3d39 + .byte 0x4 + .byte 0 + .uleb128 0x5 + .4byte 0xc6 + .4byte 0x3d49 + .uleb128 0x6 + .4byte 0x4f + .byte 0x4 + .byte 0 + .uleb128 0xd + .4byte .LASF955 + .byte 0x28 + .byte 0x64 + .byte 0x39 + .4byte 0x3d62 + .uleb128 0xe + .4byte .LASF383 + .byte 0x64 + .byte 0x3a + .4byte 0x3d62 + .byte 0 + .byte 0 + .uleb128 0x5 + .4byte 0x558 + .4byte 0x3d72 + .uleb128 0x6 + .4byte 0x4f + .byte 0x4 + .byte 0 + .uleb128 0xd + .4byte .LASF956 + .byte 0x10 + .byte 0x64 + .byte 0x3d + .4byte 0x3da3 + .uleb128 0xe + .4byte .LASF815 + .byte 0x64 + .byte 0x3e + .4byte 0x339d + .byte 0 + .uleb128 0xe + .4byte .LASF854 + .byte 0x64 + .byte 0x40 + .4byte 0xd2 + .byte 0x8 + .uleb128 0xe + .4byte .LASF957 + .byte 0x64 + .byte 0x41 + .4byte 0xd2 + .byte 0xc + .byte 0 + .uleb128 0x37 + .4byte .LASF959 + .byte 0 + .byte 0x64 + .byte 0x49 + .uleb128 0xd + .4byte .LASF960 + .byte 0x40 + .byte 0x65 + .byte 0xc + .4byte 0x3e18 + .uleb128 0xe + .4byte .LASF961 + .byte 0x65 + .byte 0xf + .4byte 0x15a + .byte 0 + .uleb128 0xe + .4byte .LASF962 + .byte 0x65 + .byte 0x11 + .4byte 0x15a + .byte 0x8 + .uleb128 0xe + .4byte .LASF963 + .byte 0x65 + .byte 0x13 + .4byte 0x15a + .byte 0x10 + .uleb128 0xe + .4byte .LASF964 + .byte 0x65 + .byte 0x15 + .4byte 0x15a + .byte 0x18 + .uleb128 0xe + .4byte .LASF965 + .byte 0x65 + .byte 0x17 + .4byte 0x15a + .byte 0x20 + .uleb128 0xe + .4byte .LASF966 + .byte 0x65 + .byte 0x1f + .4byte 0x15a + .byte 0x28 + .uleb128 0xe + .4byte .LASF967 + .byte 0x65 + .byte 0x25 + .4byte 0x15a + .byte 0x30 + .uleb128 0xe + .4byte .LASF968 + .byte 0x65 + .byte 0x2e + .4byte 0x15a + .byte 0x38 + .byte 0 + .uleb128 0x21 + .byte 0x8 + .byte 0x66 + .byte 0x6d + .4byte 0x3e37 + .uleb128 0x22 + .4byte .LASF969 + .byte 0x66 + .byte 0x6e + .4byte 0xf4 + .uleb128 0x28 + .string "ptr" + .byte 0x66 + .byte 0x70 + .4byte 0xf4 + .byte 0 + .uleb128 0xd + .4byte .LASF720 + .byte 0x20 + .byte 0x66 + .byte 0x3e + .4byte 0x3e74 + .uleb128 0xe + .4byte .LASF970 + .byte 0x66 + .byte 0x4b + .4byte 0xd2 + .byte 0 + .uleb128 0xe + .4byte .LASF971 + .byte 0x66 + .byte 0x5a + .4byte 0xd2 + .byte 0x4 + .uleb128 0xe + .4byte .LASF972 + .byte 0x66 + .byte 0x7c + .4byte 0x3e18 + .byte 0x8 + .uleb128 0xe + .4byte .LASF171 + .byte 0x66 + .byte 0x90 + .4byte 0xd2 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF657 + .byte 0x18 + .byte 0x47 + .byte 0xed + .4byte 0x3ea5 + .uleb128 0xe + .4byte .LASF652 + .byte 0x47 + .byte 0xef + .4byte 0x15a + .byte 0 + .uleb128 0xe + .4byte .LASF653 + .byte 0x47 + .byte 0xf0 + .4byte 0x15a + .byte 0x8 + .uleb128 0xe + .4byte .LASF116 + .byte 0x47 + .byte 0xf1 + .4byte 0xe33 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF973 + .byte 0x18 + .byte 0x47 + .byte 0xff + .4byte 0x3ed9 + .uleb128 0x1b + .4byte .LASF652 + .byte 0x47 + .2byte 0x100 + .4byte 0x15a + .byte 0 + .uleb128 0x1b + .4byte .LASF653 + .byte 0x47 + .2byte 0x101 + .4byte 0x15a + .byte 0x8 + .uleb128 0x1b + .4byte .LASF974 + .byte 0x47 + .2byte 0x102 + .4byte 0xff + .byte 0x10 + .byte 0 + .uleb128 0x1d + .4byte .LASF612 + .byte 0x20 + .byte 0x47 + .2byte 0x128 + .4byte 0x3f1b + .uleb128 0x1b + .4byte .LASF975 + .byte 0x47 + .2byte 0x12d + .4byte 0x29 + .byte 0 + .uleb128 0x1b + .4byte .LASF976 + .byte 0x47 + .2byte 0x130 + .4byte 0xff + .byte 0x8 + .uleb128 0x1b + .4byte .LASF977 + .byte 0x47 + .2byte 0x135 + .4byte 0xff + .byte 0x10 + .uleb128 0x1b + .4byte .LASF978 + .byte 0x47 + .2byte 0x138 + .4byte 0xff + .byte 0x18 + .byte 0 + .uleb128 0x1d + .4byte .LASF979 + .byte 0x10 + .byte 0x47 + .2byte 0x14b + .4byte 0x3f43 + .uleb128 0x1b + .4byte .LASF980 + .byte 0x47 + .2byte 0x14c + .4byte 0x29 + .byte 0 + .uleb128 0x1b + .4byte .LASF981 + .byte 0x47 + .2byte 0x14d + .4byte 0x13f + .byte 0x8 + .byte 0 + .uleb128 0x1d + .4byte .LASF982 + .byte 0x8 + .byte 0x47 + .2byte 0x166 + .4byte 0x3f6b + .uleb128 0x1b + .4byte .LASF983 + .byte 0x47 + .2byte 0x167 + .4byte 0x6d + .byte 0 + .uleb128 0x1b + .4byte .LASF984 + .byte 0x47 + .2byte 0x168 + .4byte 0x6d + .byte 0x4 + .byte 0 + .uleb128 0x1d + .4byte .LASF985 + .byte 0x40 + .byte 0x47 + .2byte 0x197 + .4byte 0x3fee + .uleb128 0x1b + .4byte .LASF986 + .byte 0x47 + .2byte 0x198 + .4byte 0x15a + .byte 0 + .uleb128 0x1b + .4byte .LASF987 + .byte 0x47 + .2byte 0x199 + .4byte 0x15a + .byte 0x8 + .uleb128 0x1b + .4byte .LASF988 + .byte 0x47 + .2byte 0x19a + .4byte 0x15a + .byte 0x10 + .uleb128 0x1b + .4byte .LASF989 + .byte 0x47 + .2byte 0x19b + .4byte 0x13f + .byte 0x18 + .uleb128 0x1b + .4byte .LASF990 + .byte 0x47 + .2byte 0x19c + .4byte 0x13f + .byte 0x1c + .uleb128 0x1b + .4byte .LASF991 + .byte 0x47 + .2byte 0x19d + .4byte 0x29 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF992 + .byte 0x47 + .2byte 0x19e + .4byte 0x29 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF993 + .byte 0x47 + .2byte 0x19f + .4byte 0x29 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF982 + .byte 0x47 + .2byte 0x1a0 + .4byte 0x3f43 + .byte 0x38 + .byte 0 + .uleb128 0x1d + .4byte .LASF994 + .byte 0xd8 + .byte 0x47 + .2byte 0x1a3 + .4byte 0x415b + .uleb128 0x1b + .4byte .LASF995 + .byte 0x47 + .2byte 0x1a5 + .4byte 0x15a + .byte 0 + .uleb128 0x1b + .4byte .LASF996 + .byte 0x47 + .2byte 0x1a6 + .4byte 0x15a + .byte 0x8 + .uleb128 0x1b + .4byte .LASF997 + .byte 0x47 + .2byte 0x1a7 + .4byte 0x15a + .byte 0x10 + .uleb128 0x1b + .4byte .LASF998 + .byte 0x47 + .2byte 0x1a8 + .4byte 0x15a + .byte 0x18 + .uleb128 0x1b + .4byte .LASF999 + .byte 0x47 + .2byte 0x1a9 + .4byte 0x15a + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1000 + .byte 0x47 + .2byte 0x1aa + .4byte 0x15a + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1001 + .byte 0x47 + .2byte 0x1ac + .4byte 0x15a + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1002 + .byte 0x47 + .2byte 0x1ad + .4byte 0x15a + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1003 + .byte 0x47 + .2byte 0x1ae + .4byte 0x14f + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1004 + .byte 0x47 + .2byte 0x1b0 + .4byte 0x15a + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1005 + .byte 0x47 + .2byte 0x1b1 + .4byte 0x15a + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1006 + .byte 0x47 + .2byte 0x1b2 + .4byte 0x15a + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1007 + .byte 0x47 + .2byte 0x1b3 + .4byte 0x15a + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1008 + .byte 0x47 + .2byte 0x1b5 + .4byte 0x15a + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1009 + .byte 0x47 + .2byte 0x1b6 + .4byte 0x15a + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1010 + .byte 0x47 + .2byte 0x1b7 + .4byte 0x15a + .byte 0x78 + .uleb128 0x1b + .4byte .LASF1011 + .byte 0x47 + .2byte 0x1b8 + .4byte 0x15a + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1012 + .byte 0x47 + .2byte 0x1b9 + .4byte 0x15a + .byte 0x88 + .uleb128 0x1b + .4byte .LASF1013 + .byte 0x47 + .2byte 0x1bb + .4byte 0x15a + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1014 + .byte 0x47 + .2byte 0x1bc + .4byte 0x15a + .byte 0x98 + .uleb128 0x1b + .4byte .LASF1015 + .byte 0x47 + .2byte 0x1bd + .4byte 0x15a + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF1016 + .byte 0x47 + .2byte 0x1be + .4byte 0x15a + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF1017 + .byte 0x47 + .2byte 0x1bf + .4byte 0x15a + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF1018 + .byte 0x47 + .2byte 0x1c0 + .4byte 0x15a + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF1019 + .byte 0x47 + .2byte 0x1c1 + .4byte 0x15a + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF1020 + .byte 0x47 + .2byte 0x1c2 + .4byte 0x15a + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF1021 + .byte 0x47 + .2byte 0x1c3 + .4byte 0x15a + .byte 0xd0 + .byte 0 + .uleb128 0x1a + .4byte .LASF1022 + .2byte 0x200 + .byte 0x47 + .2byte 0x1c7 + .4byte 0x4277 + .uleb128 0x1b + .4byte .LASF1023 + .byte 0x47 + .2byte 0x1c9 + .4byte 0x3f1b + .byte 0 + .uleb128 0x1b + .4byte .LASF1024 + .byte 0x47 + .2byte 0x1ca + .4byte 0x29 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1025 + .byte 0x47 + .2byte 0x1cb + .4byte 0x3416 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1026 + .byte 0x47 + .2byte 0x1cc + .4byte 0x3a7 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF588 + .byte 0x47 + .2byte 0x1cd + .4byte 0x6d + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1027 + .byte 0x47 + .2byte 0x1cf + .4byte 0x15a + .byte 0x48 + .uleb128 0x1b + .4byte .LASF974 + .byte 0x47 + .2byte 0x1d0 + .4byte 0x15a + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1028 + .byte 0x47 + .2byte 0x1d1 + .4byte 0x15a + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1029 + .byte 0x47 + .2byte 0x1d2 + .4byte 0x15a + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1030 + .byte 0x47 + .2byte 0x1d4 + .4byte 0x15a + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1031 + .byte 0x47 + .2byte 0x1d6 + .4byte 0x3fee + .byte 0x70 + .uleb128 0x1c + .4byte .LASF1032 + .byte 0x47 + .2byte 0x1d9 + .4byte 0xc6 + .2byte 0x148 + .uleb128 0x1c + .4byte .LASF639 + .byte 0x47 + .2byte 0x1da + .4byte 0x4277 + .2byte 0x150 + .uleb128 0x1c + .4byte .LASF1033 + .byte 0x47 + .2byte 0x1dc + .4byte 0x4282 + .2byte 0x158 + .uleb128 0x1c + .4byte .LASF1034 + .byte 0x47 + .2byte 0x1de + .4byte 0x4282 + .2byte 0x160 + .uleb128 0x30 + .string "avg" + .byte 0x47 + .2byte 0x1e8 + .4byte 0x3f6b + .2byte 0x180 + .uleb128 0x1c + .4byte .LASF130 + .byte 0x47 + .2byte 0x1eb + .4byte 0x15a + .2byte 0x1c0 + .uleb128 0x1c + .4byte .LASF131 + .byte 0x47 + .2byte 0x1ec + .4byte 0x15a + .2byte 0x1c8 + .uleb128 0x1c + .4byte .LASF132 + .byte 0x47 + .2byte 0x1ed + .4byte 0x15a + .2byte 0x1d0 + .uleb128 0x1c + .4byte .LASF133 + .byte 0x47 + .2byte 0x1ee + .4byte 0x15a + .2byte 0x1d8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x415b + .uleb128 0x24 + .4byte .LASF1033 + .uleb128 0x7 + .byte 0x8 + .4byte 0x427d + .uleb128 0x1d + .4byte .LASF1035 + .byte 0x50 + .byte 0x47 + .2byte 0x1f1 + .4byte 0x4325 + .uleb128 0x1b + .4byte .LASF1036 + .byte 0x47 + .2byte 0x1f2 + .4byte 0x3a7 + .byte 0 + .uleb128 0x1b + .4byte .LASF1037 + .byte 0x47 + .2byte 0x1f3 + .4byte 0x29 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1038 + .byte 0x47 + .2byte 0x1f4 + .4byte 0x29 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1039 + .byte 0x47 + .2byte 0x1f5 + .4byte 0x6d + .byte 0x20 + .uleb128 0x1b + .4byte .LASF588 + .byte 0x47 + .2byte 0x1f6 + .4byte 0xb4 + .byte 0x24 + .uleb128 0x1b + .4byte .LASF1040 + .byte 0x47 + .2byte 0x1f7 + .4byte 0xb4 + .byte 0x26 + .uleb128 0x1b + .4byte .LASF1041 + .byte 0x47 + .2byte 0x1f9 + .4byte 0x4325 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x47 + .2byte 0x202 + .4byte 0x15a + .byte 0x30 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x47 + .2byte 0x203 + .4byte 0x15a + .byte 0x38 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x47 + .2byte 0x204 + .4byte 0x15a + .byte 0x40 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x47 + .2byte 0x205 + .4byte 0x15a + .byte 0x48 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4288 + .uleb128 0x1d + .4byte .LASF1042 + .byte 0xe8 + .byte 0x47 + .2byte 0x208 + .4byte 0x4418 + .uleb128 0x1b + .4byte .LASF821 + .byte 0x47 + .2byte 0x209 + .4byte 0x3416 + .byte 0 + .uleb128 0x1b + .4byte .LASF1043 + .byte 0x47 + .2byte 0x210 + .4byte 0x15a + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1044 + .byte 0x47 + .2byte 0x211 + .4byte 0x15a + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1045 + .byte 0x47 + .2byte 0x212 + .4byte 0x15a + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1046 + .byte 0x47 + .2byte 0x213 + .4byte 0x15a + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1047 + .byte 0x47 + .2byte 0x214 + .4byte 0x15a + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1048 + .byte 0x47 + .2byte 0x21b + .4byte 0x14f + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1049 + .byte 0x47 + .2byte 0x21c + .4byte 0x15a + .byte 0x48 + .uleb128 0x1b + .4byte .LASF171 + .byte 0x47 + .2byte 0x21d + .4byte 0x6d + .byte 0x50 + .uleb128 0x38 + .4byte .LASF1050 + .byte 0x47 + .2byte 0x237 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1f + .byte 0x54 + .uleb128 0x38 + .4byte .LASF1051 + .byte 0x47 + .2byte 0x238 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1e + .byte 0x54 + .uleb128 0x38 + .4byte .LASF1052 + .byte 0x47 + .2byte 0x239 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1d + .byte 0x54 + .uleb128 0x38 + .4byte .LASF1053 + .byte 0x47 + .2byte 0x23a + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1c + .byte 0x54 + .uleb128 0x38 + .4byte .LASF1054 + .byte 0x47 + .2byte 0x23b + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1b + .byte 0x54 + .uleb128 0x1b + .4byte .LASF1055 + .byte 0x47 + .2byte 0x241 + .4byte 0x356e + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1056 + .byte 0x47 + .2byte 0x24a + .4byte 0x356e + .byte 0xa0 + .byte 0 + .uleb128 0x2e + .byte 0x4 + .byte 0x47 + .2byte 0x271 + .4byte 0x4456 + .uleb128 0x1b + .4byte .LASF677 + .byte 0x47 + .2byte 0x272 + .4byte 0x110 + .byte 0 + .uleb128 0x1b + .4byte .LASF1057 + .byte 0x47 + .2byte 0x273 + .4byte 0x110 + .byte 0x1 + .uleb128 0x1b + .4byte .LASF1058 + .byte 0x47 + .2byte 0x274 + .4byte 0x110 + .byte 0x2 + .uleb128 0x2b + .string "pad" + .byte 0x47 + .2byte 0x277 + .4byte 0x110 + .byte 0x3 + .byte 0 + .uleb128 0x39 + .4byte .LASF1060 + .byte 0x4 + .byte 0x47 + .2byte 0x270 + .4byte 0x4478 + .uleb128 0x3a + .string "b" + .byte 0x47 + .2byte 0x278 + .4byte 0x4418 + .uleb128 0x3a + .string "s" + .byte 0x47 + .2byte 0x279 + .4byte 0x13f + .byte 0 + .uleb128 0x1d + .4byte .LASF1061 + .byte 0x8 + .byte 0x47 + .2byte 0x283 + .4byte 0x4493 + .uleb128 0x1b + .4byte .LASF64 + .byte 0x47 + .2byte 0x284 + .4byte 0x4493 + .byte 0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4478 + .uleb128 0x2e + .byte 0x8 + .byte 0x47 + .2byte 0x510 + .4byte 0x44b0 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x47 + .2byte 0x510 + .4byte 0x15a + .byte 0 + .byte 0 + .uleb128 0x3b + .byte 0 + .byte 0x47 + .2byte 0x510 + .uleb128 0x3c + .byte 0x8 + .byte 0x47 + .2byte 0x510 + .4byte 0x44d8 + .uleb128 0x3d + .4byte .LASF1211 + .byte 0x47 + .2byte 0x510 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1f + .uleb128 0x29 + .4byte 0x4499 + .uleb128 0x29 + .4byte 0x44b0 + .byte 0 + .uleb128 0x2e + .byte 0x8 + .byte 0x47 + .2byte 0x513 + .4byte 0x44ef + .uleb128 0x1b + .4byte .LASF131 + .byte 0x47 + .2byte 0x513 + .4byte 0x15a + .byte 0 + .byte 0 + .uleb128 0x3b + .byte 0 + .byte 0x47 + .2byte 0x513 + .uleb128 0x3c + .byte 0x8 + .byte 0x47 + .2byte 0x513 + .4byte 0x4514 + .uleb128 0x3e + .4byte .LASF1062 + .byte 0x47 + .2byte 0x513 + .4byte 0x6d + .uleb128 0x29 + .4byte 0x44d8 + .uleb128 0x29 + .4byte 0x44ef + .byte 0 + .uleb128 0x24 + .4byte .LASF593 + .uleb128 0x3 + .4byte 0x4514 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4519 + .uleb128 0x24 + .4byte .LASF1063 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4524 + .uleb128 0x24 + .4byte .LASF1064 + .uleb128 0x7 + .byte 0x8 + .4byte 0x452f + .uleb128 0x1a + .4byte .LASF1065 + .2byte 0x378 + .byte 0x58 + .2byte 0x166 + .4byte 0x455d + .uleb128 0x23 + .4byte 0x563a + .byte 0 + .uleb128 0x1c + .4byte .LASF1066 + .byte 0x58 + .2byte 0x206 + .4byte 0x5962 + .2byte 0x378 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x453a + .uleb128 0x7 + .byte 0x8 + .4byte 0x2323 + .uleb128 0x5 + .4byte 0x3eb + .4byte 0x4579 + .uleb128 0x6 + .4byte 0x4f + .byte 0x3 + .byte 0 + .uleb128 0xd + .4byte .LASF1067 + .byte 0x20 + .byte 0x67 + .byte 0x1a + .4byte 0x459e + .uleb128 0xe + .4byte .LASF1068 + .byte 0x67 + .byte 0x1b + .4byte 0x6d + .byte 0 + .uleb128 0xe + .4byte .LASF1069 + .byte 0x67 + .byte 0x1c + .4byte 0x15bf + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4579 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc6 + .uleb128 0x7 + .byte 0x8 + .4byte 0x15a + .uleb128 0x5 + .4byte 0x3a7 + .4byte 0x45c0 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0xd + .4byte .LASF668 + .byte 0xa8 + .byte 0x68 + .byte 0x74 + .4byte 0x46f3 + .uleb128 0xe + .4byte .LASF579 + .byte 0x68 + .byte 0x75 + .4byte 0x37c + .byte 0 + .uleb128 0x20 + .string "uid" + .byte 0x68 + .byte 0x7d + .4byte 0x240a + .byte 0x4 + .uleb128 0x20 + .string "gid" + .byte 0x68 + .byte 0x7e + .4byte 0x242a + .byte 0x8 + .uleb128 0xe + .4byte .LASF1070 + .byte 0x68 + .byte 0x7f + .4byte 0x240a + .byte 0xc + .uleb128 0xe + .4byte .LASF1071 + .byte 0x68 + .byte 0x80 + .4byte 0x242a + .byte 0x10 + .uleb128 0xe + .4byte .LASF1072 + .byte 0x68 + .byte 0x81 + .4byte 0x240a + .byte 0x14 + .uleb128 0xe + .4byte .LASF1073 + .byte 0x68 + .byte 0x82 + .4byte 0x242a + .byte 0x18 + .uleb128 0xe + .4byte .LASF1074 + .byte 0x68 + .byte 0x83 + .4byte 0x240a + .byte 0x1c + .uleb128 0xe + .4byte .LASF1075 + .byte 0x68 + .byte 0x84 + .4byte 0x242a + .byte 0x20 + .uleb128 0xe + .4byte .LASF1076 + .byte 0x68 + .byte 0x85 + .4byte 0x6d + .byte 0x24 + .uleb128 0xe + .4byte .LASF1077 + .byte 0x68 + .byte 0x86 + .4byte 0x5a71 + .byte 0x28 + .uleb128 0xe + .4byte .LASF1078 + .byte 0x68 + .byte 0x87 + .4byte 0x5a71 + .byte 0x30 + .uleb128 0xe + .4byte .LASF1079 + .byte 0x68 + .byte 0x88 + .4byte 0x5a71 + .byte 0x38 + .uleb128 0xe + .4byte .LASF1080 + .byte 0x68 + .byte 0x89 + .4byte 0x5a71 + .byte 0x40 + .uleb128 0xe + .4byte .LASF1081 + .byte 0x68 + .byte 0x8a + .4byte 0x5a71 + .byte 0x48 + .uleb128 0xe + .4byte .LASF1082 + .byte 0x68 + .byte 0x8c + .4byte 0x96 + .byte 0x50 + .uleb128 0xe + .4byte .LASF928 + .byte 0x68 + .byte 0x8e + .4byte 0x869f + .byte 0x58 + .uleb128 0xe + .4byte .LASF1083 + .byte 0x68 + .byte 0x8f + .4byte 0x869f + .byte 0x60 + .uleb128 0xe + .4byte .LASF1084 + .byte 0x68 + .byte 0x90 + .4byte 0x869f + .byte 0x68 + .uleb128 0xe + .4byte .LASF1085 + .byte 0x68 + .byte 0x91 + .4byte 0x869f + .byte 0x70 + .uleb128 0xe + .4byte .LASF746 + .byte 0x68 + .byte 0x94 + .4byte 0x458 + .byte 0x78 + .uleb128 0xe + .4byte .LASF1086 + .byte 0x68 + .byte 0x96 + .4byte 0x3b89 + .byte 0x80 + .uleb128 0xe + .4byte .LASF1087 + .byte 0x68 + .byte 0x97 + .4byte 0x595c + .byte 0x88 + .uleb128 0xe + .4byte .LASF1088 + .byte 0x68 + .byte 0x98 + .4byte 0x9594 + .byte 0x90 + .uleb128 0x23 + .4byte 0x9575 + .byte 0x98 + .byte 0 + .uleb128 0x3 + .4byte 0x45c0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x46f3 + .uleb128 0x5 + .4byte 0x61 + .4byte 0x470e + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x24 + .4byte .LASF670 + .uleb128 0x7 + .byte 0x8 + .4byte 0x470e + .uleb128 0x24 + .4byte .LASF1089 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4719 + .uleb128 0x24 + .4byte .LASF1090 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4724 + .uleb128 0x24 + .4byte .LASF674 + .uleb128 0x7 + .byte 0x8 + .4byte 0x472f + .uleb128 0x24 + .4byte .LASF1091 + .uleb128 0x7 + .byte 0x8 + .4byte 0x473a + .uleb128 0x24 + .4byte .LASF1092 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4745 + .uleb128 0x24 + .4byte .LASF684 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4750 + .uleb128 0x24 + .4byte .LASF1093 + .uleb128 0x7 + .byte 0x8 + .4byte 0x475b + .uleb128 0x24 + .4byte .LASF695 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4766 + .uleb128 0x24 + .4byte .LASF1094 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4771 + .uleb128 0x24 + .4byte .LASF697 + .uleb128 0x7 + .byte 0x8 + .4byte 0x477c + .uleb128 0x24 + .4byte .LASF698 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4787 + .uleb128 0xd + .4byte .LASF699 + .byte 0x78 + .byte 0x69 + .byte 0x63 + .4byte 0x4823 + .uleb128 0xe + .4byte .LASF1095 + .byte 0x69 + .byte 0x64 + .4byte 0x558 + .byte 0 + .uleb128 0xe + .4byte .LASF1096 + .byte 0x69 + .byte 0x65 + .4byte 0x37c + .byte 0x8 + .uleb128 0xe + .4byte .LASF1097 + .byte 0x69 + .byte 0x66 + .4byte 0x37c + .byte 0xc + .uleb128 0xe + .4byte .LASF116 + .byte 0x69 + .byte 0x69 + .4byte 0xe65 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1098 + .byte 0x69 + .byte 0x6b + .4byte 0xb4 + .byte 0x14 + .uleb128 0xe + .4byte .LASF1099 + .byte 0x69 + .byte 0x70 + .4byte 0xc6 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1100 + .byte 0x69 + .byte 0x71 + .4byte 0x29 + .byte 0x20 + .uleb128 0xe + .4byte .LASF1101 + .byte 0x69 + .byte 0x73 + .4byte 0x4cff + .byte 0x28 + .uleb128 0xe + .4byte .LASF1102 + .byte 0x69 + .byte 0x74 + .4byte 0x5d6f + .byte 0x38 + .uleb128 0xe + .4byte .LASF1103 + .byte 0x69 + .byte 0x75 + .4byte 0x3d2 + .byte 0x40 + .uleb128 0xe + .4byte .LASF1104 + .byte 0x69 + .byte 0x77 + .4byte 0x3205 + .byte 0x48 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4792 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3abd + .uleb128 0x24 + .4byte .LASF1105 + .uleb128 0x7 + .byte 0x8 + .4byte 0x482f + .uleb128 0x24 + .4byte .LASF1106 + .uleb128 0x7 + .byte 0x8 + .4byte 0x483a + .uleb128 0x24 + .4byte .LASF1107 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4845 + .uleb128 0x24 + .4byte .LASF1108 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4850 + .uleb128 0x5 + .4byte 0x486b + .4byte 0x486b + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4871 + .uleb128 0x24 + .4byte .LASF1109 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3e37 + .uleb128 0x24 + .4byte .LASF1110 + .uleb128 0x7 + .byte 0x8 + .4byte 0x487c + .uleb128 0x24 + .4byte .LASF1111 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4887 + .uleb128 0x24 + .4byte .LASF817 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4892 + .uleb128 0x24 + .4byte .LASF1112 + .uleb128 0x7 + .byte 0x8 + .4byte 0x489d + .uleb128 0xd + .4byte .LASF1113 + .byte 0x40 + .byte 0x6a + .byte 0x4a + .4byte 0x48f7 + .uleb128 0xe + .4byte .LASF577 + .byte 0x6a + .byte 0x4b + .4byte 0x4db9 + .byte 0 + .uleb128 0x23 + .4byte 0x4e24 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1114 + .byte 0x6a + .byte 0x59 + .4byte 0x4e3c + .byte 0x20 + .uleb128 0xe + .4byte .LASF1115 + .byte 0x6a + .byte 0x5a + .4byte 0x29 + .byte 0x28 + .uleb128 0xe + .4byte .LASF1116 + .byte 0x6a + .byte 0x5c + .4byte 0x4e97 + .byte 0x30 + .uleb128 0xe + .4byte .LASF1032 + .byte 0x6a + .byte 0x5d + .4byte 0x6d + .byte 0x38 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x48a8 + .uleb128 0xd + .4byte .LASF1117 + .byte 0x40 + .byte 0x6b + .byte 0x22 + .4byte 0x496a + .uleb128 0xe + .4byte .LASF64 + .byte 0x6b + .byte 0x23 + .4byte 0x496a + .byte 0 + .uleb128 0xe + .4byte .LASF1118 + .byte 0x6b + .byte 0x24 + .4byte 0x458 + .byte 0x8 + .uleb128 0xe + .4byte .LASF957 + .byte 0x6b + .byte 0x25 + .4byte 0x29 + .byte 0x10 + .uleb128 0xe + .4byte .LASF171 + .byte 0x6b + .byte 0x26 + .4byte 0x29 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1119 + .byte 0x6b + .byte 0x27 + .4byte 0x597d + .byte 0x20 + .uleb128 0xe + .4byte .LASF1120 + .byte 0x6b + .byte 0x28 + .4byte 0x6d + .byte 0x28 + .uleb128 0xe + .4byte .LASF1121 + .byte 0x6b + .byte 0x29 + .4byte 0x346 + .byte 0x30 + .uleb128 0xe + .4byte .LASF1122 + .byte 0x6b + .byte 0x2a + .4byte 0x30b6 + .byte 0x38 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x48fd + .uleb128 0x15 + .4byte .LASF1123 + .byte 0x47 + .2byte 0x5d0 + .4byte 0x4563 + .uleb128 0x3f + .4byte .LASF1124 + .2byte 0x4000 + .byte 0x47 + .2byte 0x68a + .4byte 0x49a3 + .uleb128 0x3e + .4byte .LASF758 + .byte 0x47 + .2byte 0x68c + .4byte 0x24a1 + .uleb128 0x3e + .4byte .LASF578 + .byte 0x47 + .2byte 0x691 + .4byte 0x49a3 + .byte 0 + .uleb128 0x5 + .4byte 0x29 + .4byte 0x49b4 + .uleb128 0x40 + .4byte 0x4f + .2byte 0x7ff + .byte 0 + .uleb128 0x15 + .4byte .LASF1125 + .byte 0x47 + .2byte 0x698 + .4byte 0x49a3 + .uleb128 0xd + .4byte .LASF1126 + .byte 0x88 + .byte 0x6c + .byte 0x18 + .4byte 0x4a99 + .uleb128 0xe + .4byte .LASF1127 + .byte 0x6c + .byte 0x19 + .4byte 0x13f + .byte 0 + .uleb128 0xe + .4byte .LASF874 + .byte 0x6c + .byte 0x1a + .4byte 0x28f + .byte 0x4 + .uleb128 0xe + .4byte .LASF1128 + .byte 0x6c + .byte 0x1b + .4byte 0x6d + .byte 0x8 + .uleb128 0xe + .4byte .LASF1129 + .byte 0x6c + .byte 0x1c + .4byte 0x304 + .byte 0xc + .uleb128 0xe + .4byte .LASF1130 + .byte 0x6c + .byte 0x1d + .4byte 0x15a + .byte 0x10 + .uleb128 0xe + .4byte .LASF1131 + .byte 0x6c + .byte 0x1e + .4byte 0x15a + .byte 0x18 + .uleb128 0x20 + .string "ino" + .byte 0x6c + .byte 0x27 + .4byte 0x15a + .byte 0x20 + .uleb128 0x20 + .string "dev" + .byte 0x6c + .byte 0x28 + .4byte 0x284 + .byte 0x28 + .uleb128 0xe + .4byte .LASF1132 + .byte 0x6c + .byte 0x29 + .4byte 0x284 + .byte 0x2c + .uleb128 0x20 + .string "uid" + .byte 0x6c + .byte 0x2a + .4byte 0x240a + .byte 0x30 + .uleb128 0x20 + .string "gid" + .byte 0x6c + .byte 0x2b + .4byte 0x242a + .byte 0x34 + .uleb128 0xe + .4byte .LASF957 + .byte 0x6c + .byte 0x2c + .4byte 0x2d8 + .byte 0x38 + .uleb128 0xe + .4byte .LASF1133 + .byte 0x6c + .byte 0x2d + .4byte 0xa27 + .byte 0x40 + .uleb128 0xe + .4byte .LASF1134 + .byte 0x6c + .byte 0x2e + .4byte 0xa27 + .byte 0x50 + .uleb128 0xe + .4byte .LASF1135 + .byte 0x6c + .byte 0x2f + .4byte 0xa27 + .byte 0x60 + .uleb128 0xe + .4byte .LASF1136 + .byte 0x6c + .byte 0x30 + .4byte 0xa27 + .byte 0x70 + .uleb128 0xe + .4byte .LASF1137 + .byte 0x6c + .byte 0x31 + .4byte 0x15a + .byte 0x80 + .byte 0 + .uleb128 0xd + .4byte .LASF1138 + .byte 0x20 + .byte 0x6d + .byte 0xc + .4byte 0x4ae2 + .uleb128 0xe + .4byte .LASF1139 + .byte 0x6d + .byte 0xd + .4byte 0x330 + .byte 0 + .uleb128 0x20 + .string "nid" + .byte 0x6d + .byte 0x10 + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF1140 + .byte 0x6d + .byte 0x17 + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1141 + .byte 0x6d + .byte 0x1e + .4byte 0x29 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1142 + .byte 0x6d + .byte 0x21 + .4byte 0x4897 + .byte 0x18 + .byte 0 + .uleb128 0xd + .4byte .LASF1143 + .byte 0x40 + .byte 0x6d + .byte 0x3c + .4byte 0x4b4e + .uleb128 0xe + .4byte .LASF1144 + .byte 0x6d + .byte 0x3d + .4byte 0x4b6e + .byte 0 + .uleb128 0xe + .4byte .LASF1145 + .byte 0x6d + .byte 0x3f + .4byte 0x4b6e + .byte 0x8 + .uleb128 0xe + .4byte .LASF1146 + .byte 0x6d + .byte 0x42 + .4byte 0x199 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1147 + .byte 0x6d + .byte 0x43 + .4byte 0xc6 + .byte 0x18 + .uleb128 0xe + .4byte .LASF171 + .byte 0x6d + .byte 0x44 + .4byte 0x6d + .byte 0x1c + .uleb128 0xe + .4byte .LASF932 + .byte 0x6d + .byte 0x47 + .4byte 0x3a7 + .byte 0x20 + .uleb128 0x20 + .string "id" + .byte 0x6d + .byte 0x4a + .4byte 0xc6 + .byte 0x30 + .uleb128 0xe + .4byte .LASF1148 + .byte 0x6d + .byte 0x4d + .4byte 0x4b74 + .byte 0x38 + .byte 0 + .uleb128 0x14 + .4byte 0x29 + .4byte 0x4b62 + .uleb128 0x11 + .4byte 0x4b62 + .uleb128 0x11 + .4byte 0x4b68 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4ae2 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4a99 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4b4e + .uleb128 0x7 + .byte 0x8 + .4byte 0x558 + .uleb128 0xd + .4byte .LASF1149 + .byte 0x18 + .byte 0x6e + .byte 0x1c + .4byte 0x4b9f + .uleb128 0xe + .4byte .LASF932 + .byte 0x6e + .byte 0x1d + .4byte 0x3a7 + .byte 0 + .uleb128 0xe + .4byte .LASF1150 + .byte 0x6e + .byte 0x1f + .4byte 0x199 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF1151 + .byte 0x10 + .byte 0x6e + .byte 0x22 + .4byte 0x4bc4 + .uleb128 0x20 + .string "rcu" + .byte 0x6e + .byte 0x23 + .4byte 0x41c + .byte 0 + .uleb128 0x20 + .string "lru" + .byte 0x6e + .byte 0x25 + .4byte 0x4bc4 + .byte 0x10 + .byte 0 + .uleb128 0x5 + .4byte 0x4bd3 + .4byte 0x4bd3 + .uleb128 0x41 + .4byte 0x4f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4b7a + .uleb128 0xd + .4byte .LASF1152 + .byte 0x40 + .byte 0x6e + .byte 0x28 + .4byte 0x4c16 + .uleb128 0xe + .4byte .LASF116 + .byte 0x6e + .byte 0x2a + .4byte 0xe65 + .byte 0 + .uleb128 0x20 + .string "lru" + .byte 0x6e + .byte 0x2c + .4byte 0x4b7a + .byte 0x8 + .uleb128 0xe + .4byte .LASF1153 + .byte 0x6e + .byte 0x2f + .4byte 0x4c16 + .byte 0x20 + .uleb128 0xe + .4byte .LASF1150 + .byte 0x6e + .byte 0x31 + .4byte 0x199 + .byte 0x28 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4b9f + .uleb128 0xd + .4byte .LASF1154 + .byte 0x20 + .byte 0x6e + .byte 0x34 + .4byte 0x4c59 + .uleb128 0xe + .4byte .LASF838 + .byte 0x6e + .byte 0x35 + .4byte 0x4c59 + .byte 0 + .uleb128 0xe + .4byte .LASF932 + .byte 0x6e + .byte 0x37 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1155 + .byte 0x6e + .byte 0x38 + .4byte 0xc6 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1156 + .byte 0x6e + .byte 0x39 + .4byte 0x2b0 + .byte 0x1c + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4bd9 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe65 + .uleb128 0x21 + .byte 0x10 + .byte 0x6f + .byte 0x63 + .4byte 0x4c84 + .uleb128 0x22 + .4byte .LASF1157 + .byte 0x6f + .byte 0x64 + .4byte 0x3a7 + .uleb128 0x22 + .4byte .LASF70 + .byte 0x6f + .byte 0x65 + .4byte 0x41c + .byte 0 + .uleb128 0x26 + .4byte .LASF1158 + .2byte 0x240 + .byte 0x6f + .byte 0x5c + .4byte 0x4cf9 + .uleb128 0xe + .4byte .LASF261 + .byte 0x6f + .byte 0x5d + .4byte 0x96 + .byte 0 + .uleb128 0xe + .4byte .LASF854 + .byte 0x6f + .byte 0x5e + .4byte 0x96 + .byte 0x1 + .uleb128 0xe + .4byte .LASF383 + .byte 0x6f + .byte 0x5f + .4byte 0x96 + .byte 0x2 + .uleb128 0xe + .4byte .LASF1159 + .byte 0x6f + .byte 0x60 + .4byte 0x96 + .byte 0x3 + .uleb128 0xe + .4byte .LASF639 + .byte 0x6f + .byte 0x61 + .4byte 0x4cf9 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1160 + .byte 0x6f + .byte 0x62 + .4byte 0x4d30 + .byte 0x10 + .uleb128 0x23 + .4byte 0x4c65 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1161 + .byte 0x6f + .byte 0x67 + .4byte 0x4d36 + .byte 0x28 + .uleb128 0x27 + .4byte .LASF1162 + .byte 0x6f + .byte 0x68 + .4byte 0x4d46 + .2byte 0x228 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4c84 + .uleb128 0xd + .4byte .LASF1163 + .byte 0x10 + .byte 0x6f + .byte 0x70 + .4byte 0x4d30 + .uleb128 0xe + .4byte .LASF1164 + .byte 0x6f + .byte 0x71 + .4byte 0xe65 + .byte 0 + .uleb128 0xe + .4byte .LASF1139 + .byte 0x6f + .byte 0x72 + .4byte 0x330 + .byte 0x4 + .uleb128 0xe + .4byte .LASF1165 + .byte 0x6f + .byte 0x73 + .4byte 0x4cf9 + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4cff + .uleb128 0x5 + .4byte 0x458 + .4byte 0x4d46 + .uleb128 0x6 + .4byte 0x4f + .byte 0x3f + .byte 0 + .uleb128 0x5 + .4byte 0x29 + .4byte 0x4d5c + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .uleb128 0x6 + .4byte 0x4f + .byte 0 + .byte 0 + .uleb128 0xd + .4byte .LASF1166 + .byte 0x30 + .byte 0x70 + .byte 0x1e + .4byte 0x4db1 + .uleb128 0xe + .4byte .LASF383 + .byte 0x70 + .byte 0x1f + .4byte 0x558 + .byte 0 + .uleb128 0xe + .4byte .LASF575 + .byte 0x70 + .byte 0x20 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0xe + .4byte .LASF228 + .byte 0x70 + .byte 0x21 + .4byte 0xe33 + .byte 0x18 + .uleb128 0x20 + .string "osq" + .byte 0x70 + .byte 0x23 + .4byte 0x2435 + .byte 0x1c + .uleb128 0xe + .4byte .LASF98 + .byte 0x70 + .byte 0x28 + .4byte 0x2eff + .byte 0x20 + .uleb128 0xe + .4byte .LASF1167 + .byte 0x70 + .byte 0x31 + .4byte 0x199 + .byte 0x28 + .byte 0 + .uleb128 0x37 + .4byte .LASF1168 + .byte 0 + .byte 0x71 + .byte 0x18 + .uleb128 0x1f + .4byte .LASF1169 + .byte 0x4 + .4byte 0x6d + .byte 0x6a + .byte 0x40 + .4byte 0x4de2 + .uleb128 0xc + .4byte .LASF1170 + .byte 0 + .uleb128 0xc + .4byte .LASF1171 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1172 + .byte 0x2 + .uleb128 0xc + .4byte .LASF1173 + .byte 0x3 + .byte 0 + .uleb128 0xf + .byte 0x8 + .byte 0x6a + .byte 0x4e + .4byte 0x4e03 + .uleb128 0xe + .4byte .LASF1174 + .byte 0x6a + .byte 0x4f + .4byte 0x4db1 + .byte 0 + .uleb128 0xe + .4byte .LASF1175 + .byte 0x6a + .byte 0x50 + .4byte 0x29 + .byte 0 + .byte 0 + .uleb128 0xf + .byte 0x18 + .byte 0x6a + .byte 0x53 + .4byte 0x4e24 + .uleb128 0xe + .4byte .LASF1176 + .byte 0x6a + .byte 0x54 + .4byte 0x41c + .byte 0 + .uleb128 0xe + .4byte .LASF1177 + .byte 0x6a + .byte 0x55 + .4byte 0x29 + .byte 0x10 + .byte 0 + .uleb128 0x21 + .byte 0x18 + .byte 0x6a + .byte 0x4d + .4byte 0x4e37 + .uleb128 0x29 + .4byte 0x4de2 + .uleb128 0x29 + .4byte 0x4e03 + .byte 0 + .uleb128 0x24 + .4byte .LASF1178 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4e37 + .uleb128 0xd + .4byte .LASF1179 + .byte 0x30 + .byte 0x6a + .byte 0x60 + .4byte 0x4e97 + .uleb128 0xe + .4byte .LASF1178 + .byte 0x6a + .byte 0x61 + .4byte 0x4e3c + .byte 0 + .uleb128 0xe + .4byte .LASF71 + .byte 0x6a + .byte 0x62 + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF578 + .byte 0x6a + .byte 0x63 + .4byte 0x29 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1180 + .byte 0x6a + .byte 0x64 + .4byte 0x29 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1181 + .byte 0x6a + .byte 0x65 + .4byte 0x2b0 + .byte 0x20 + .uleb128 0xe + .4byte .LASF64 + .byte 0x6a + .byte 0x67 + .4byte 0x4e97 + .byte 0x28 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4e42 + .uleb128 0xd + .4byte .LASF1182 + .byte 0x8 + .byte 0x6a + .byte 0x72 + .4byte 0x4eb6 + .uleb128 0xe + .4byte .LASF1183 + .byte 0x6a + .byte 0x73 + .4byte 0x4ebb + .byte 0 + .byte 0 + .uleb128 0x24 + .4byte .LASF1183 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4eb6 + .uleb128 0xf + .byte 0x18 + .byte 0x72 + .byte 0x1c + .4byte 0x4eed + .uleb128 0x20 + .string "id" + .byte 0x72 + .byte 0x1d + .4byte 0x39c + .byte 0 + .uleb128 0xe + .4byte .LASF1184 + .byte 0x72 + .byte 0x1e + .4byte 0x458 + .byte 0x8 + .uleb128 0xe + .4byte .LASF171 + .byte 0x72 + .byte 0x1f + .4byte 0x29 + .byte 0x10 + .byte 0 + .uleb128 0x8 + .4byte .LASF1185 + .byte 0x72 + .byte 0x20 + .4byte 0x4ec1 + .uleb128 0x8 + .4byte .LASF1186 + .byte 0x72 + .byte 0x2f + .4byte 0x4b7 + .uleb128 0xd + .4byte .LASF1187 + .byte 0x10 + .byte 0x72 + .byte 0x31 + .4byte 0x4f27 + .uleb128 0xe + .4byte .LASF1188 + .byte 0x72 + .byte 0x32 + .4byte 0xc6 + .byte 0 + .uleb128 0x20 + .string "fn" + .byte 0x72 + .byte 0x33 + .4byte 0x4ef8 + .byte 0x8 + .byte 0 + .uleb128 0x19 + .4byte .LASF1189 + .byte 0x72 + .byte 0x38 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF1190 + .byte 0x72 + .byte 0x38 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF1191 + .byte 0x72 + .byte 0x39 + .4byte 0x37c + .uleb128 0x19 + .4byte .LASF1187 + .byte 0x72 + .byte 0x3d + .4byte 0x4f03 + .uleb128 0x8 + .4byte .LASF1192 + .byte 0x58 + .byte 0x1a + .4byte 0xc6 + .uleb128 0xf + .byte 0x28 + .byte 0x58 + .byte 0x51 + .4byte 0x4f97 + .uleb128 0x20 + .string "lru" + .byte 0x58 + .byte 0x57 + .4byte 0x3a7 + .byte 0 + .uleb128 0xe + .4byte .LASF1193 + .byte 0x58 + .byte 0x59 + .4byte 0x509c + .byte 0x10 + .uleb128 0xe + .4byte .LASF850 + .byte 0x58 + .byte 0x5a + .4byte 0x29 + .byte 0x18 + .uleb128 0xe + .4byte .LASF360 + .byte 0x58 + .byte 0x61 + .4byte 0x29 + .byte 0x20 + .byte 0 + .uleb128 0x1d + .4byte .LASF1194 + .byte 0xd0 + .byte 0x1e + .2byte 0x1a7 + .4byte 0x509c + .uleb128 0x1b + .4byte .LASF1195 + .byte 0x1e + .2byte 0x1a8 + .4byte 0x1c7f + .byte 0 + .uleb128 0x1b + .4byte .LASF1196 + .byte 0x1e + .2byte 0x1a9 + .4byte 0x4cff + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1197 + .byte 0x1e + .2byte 0x1aa + .4byte 0x37c + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1198 + .byte 0x1e + .2byte 0x1ab + .4byte 0x3466 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1199 + .byte 0x1e + .2byte 0x1ac + .4byte 0x4d5c + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1200 + .byte 0x1e + .2byte 0x1ae + .4byte 0x29 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1201 + .byte 0x1e + .2byte 0x1b0 + .4byte 0x29 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1202 + .byte 0x1e + .2byte 0x1b1 + .4byte 0x29 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1203 + .byte 0x1e + .2byte 0x1b2 + .4byte 0x7939 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF171 + .byte 0x1e + .2byte 0x1b3 + .4byte 0x29 + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1204 + .byte 0x1e + .2byte 0x1b4 + .4byte 0xe65 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF1139 + .byte 0x1e + .2byte 0x1b5 + .4byte 0x330 + .byte 0x8c + .uleb128 0x1b + .4byte .LASF1157 + .byte 0x1e + .2byte 0x1b6 + .4byte 0x3a7 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1205 + .byte 0x1e + .2byte 0x1b7 + .4byte 0x458 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF1206 + .byte 0x1e + .2byte 0x1b8 + .4byte 0x5ceb + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x1ba + .4byte 0x15a + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x1bb + .4byte 0x15a + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x1e + .2byte 0x1bc + .4byte 0x15a + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x1e + .2byte 0x1bd + .4byte 0x15a + .byte 0xc8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x4f97 + .uleb128 0xf + .byte 0x10 + .byte 0x58 + .byte 0x66 + .4byte 0x50cf + .uleb128 0xe + .4byte .LASF64 + .byte 0x58 + .byte 0x67 + .4byte 0x339d + .byte 0 + .uleb128 0xe + .4byte .LASF1119 + .byte 0x58 + .byte 0x69 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1207 + .byte 0x58 + .byte 0x6a + .4byte 0xc6 + .byte 0xc + .byte 0 + .uleb128 0x21 + .byte 0x10 + .byte 0x58 + .byte 0x64 + .4byte 0x50e8 + .uleb128 0x22 + .4byte .LASF1208 + .byte 0x58 + .byte 0x65 + .4byte 0x3a7 + .uleb128 0x29 + .4byte 0x50a2 + .byte 0 + .uleb128 0xf + .byte 0x4 + .byte 0x58 + .byte 0x77 + .4byte 0x511e + .uleb128 0x35 + .4byte .LASF1209 + .byte 0x58 + .byte 0x78 + .4byte 0x6d + .byte 0x4 + .byte 0x10 + .byte 0x10 + .byte 0 + .uleb128 0x35 + .4byte .LASF1210 + .byte 0x58 + .byte 0x79 + .4byte 0x6d + .byte 0x4 + .byte 0xf + .byte 0x1 + .byte 0 + .uleb128 0x35 + .4byte .LASF1211 + .byte 0x58 + .byte 0x7a + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x21 + .byte 0x8 + .byte 0x58 + .byte 0x74 + .4byte 0x5142 + .uleb128 0x22 + .4byte .LASF1212 + .byte 0x58 + .byte 0x75 + .4byte 0x458 + .uleb128 0x22 + .4byte .LASF1213 + .byte 0x58 + .byte 0x76 + .4byte 0x29 + .uleb128 0x29 + .4byte 0x50e8 + .byte 0 + .uleb128 0xf + .byte 0x28 + .byte 0x58 + .byte 0x63 + .4byte 0x516f + .uleb128 0x23 + .4byte 0x50cf + .byte 0 + .uleb128 0xe + .4byte .LASF1214 + .byte 0x58 + .byte 0x71 + .4byte 0x5174 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1215 + .byte 0x58 + .byte 0x73 + .4byte 0x458 + .byte 0x18 + .uleb128 0x23 + .4byte 0x511e + .byte 0x20 + .byte 0 + .uleb128 0x24 + .4byte .LASF1216 + .uleb128 0x7 + .byte 0x8 + .4byte 0x516f + .uleb128 0xf + .byte 0x10 + .byte 0x58 + .byte 0x7e + .4byte 0x51b3 + .uleb128 0xe + .4byte .LASF1217 + .byte 0x58 + .byte 0x7f + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF1218 + .byte 0x58 + .byte 0x82 + .4byte 0x96 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1219 + .byte 0x58 + .byte 0x83 + .4byte 0x96 + .byte 0x9 + .uleb128 0xe + .4byte .LASF1220 + .byte 0x58 + .byte 0x84 + .4byte 0x37c + .byte 0xc + .byte 0 + .uleb128 0xf + .byte 0x20 + .byte 0x58 + .byte 0x86 + .4byte 0x51e0 + .uleb128 0xe + .4byte .LASF1221 + .byte 0x58 + .byte 0x87 + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF1222 + .byte 0x58 + .byte 0x88 + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1223 + .byte 0x58 + .byte 0x89 + .4byte 0x3a7 + .byte 0x10 + .byte 0 + .uleb128 0x21 + .byte 0x8 + .byte 0x58 + .byte 0x8f + .4byte 0x51ff + .uleb128 0x22 + .4byte .LASF1224 + .byte 0x58 + .byte 0x90 + .4byte 0x455d + .uleb128 0x22 + .4byte .LASF1225 + .byte 0x58 + .byte 0x91 + .4byte 0x37c + .byte 0 + .uleb128 0xf + .byte 0x28 + .byte 0x58 + .byte 0x8b + .4byte 0x523e + .uleb128 0xe + .4byte .LASF1226 + .byte 0x58 + .byte 0x8c + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF1227 + .byte 0x58 + .byte 0x8d + .4byte 0x3392 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1228 + .byte 0x58 + .byte 0x8e + .4byte 0x29 + .byte 0x10 + .uleb128 0x23 + .4byte 0x51e0 + .byte 0x18 + .uleb128 0x20 + .string "ptl" + .byte 0x58 + .byte 0x96 + .4byte 0xe65 + .byte 0x20 + .byte 0 + .uleb128 0xf + .byte 0x18 + .byte 0x58 + .byte 0x99 + .4byte 0x526b + .uleb128 0xe + .4byte .LASF1229 + .byte 0x58 + .byte 0x9b + .4byte 0x52f0 + .byte 0 + .uleb128 0xe + .4byte .LASF1230 + .byte 0x58 + .byte 0x9c + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1231 + .byte 0x58 + .byte 0x9d + .4byte 0x29 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF1232 + .byte 0xc8 + .byte 0x73 + .byte 0x72 + .4byte 0x52f0 + .uleb128 0xe + .4byte .LASF1233 + .byte 0x73 + .byte 0x73 + .4byte 0xc7aa + .byte 0 + .uleb128 0xe + .4byte .LASF1234 + .byte 0x73 + .byte 0x74 + .4byte 0xc7ea + .byte 0x8 + .uleb128 0xe + .4byte .LASF1235 + .byte 0x73 + .byte 0x75 + .4byte 0xc73e + .byte 0x10 + .uleb128 0xe + .4byte .LASF1236 + .byte 0x73 + .byte 0x76 + .4byte 0x2b0 + .byte 0x38 + .uleb128 0x20 + .string "res" + .byte 0x73 + .byte 0x77 + .4byte 0x9672 + .byte 0x40 + .uleb128 0x20 + .string "ref" + .byte 0x73 + .byte 0x78 + .4byte 0xc5c5 + .byte 0xa0 + .uleb128 0xe + .4byte .LASF1237 + .byte 0x73 + .byte 0x79 + .4byte 0xc80b + .byte 0xa8 + .uleb128 0x20 + .string "dev" + .byte 0x73 + .byte 0x7a + .4byte 0xa496 + .byte 0xb0 + .uleb128 0xe + .4byte .LASF793 + .byte 0x73 + .byte 0x7b + .4byte 0x458 + .byte 0xb8 + .uleb128 0xe + .4byte .LASF193 + .byte 0x73 + .byte 0x7c + .4byte 0xc787 + .byte 0xc0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x526b + .uleb128 0x21 + .byte 0x28 + .byte 0x58 + .byte 0x50 + .4byte 0x5328 + .uleb128 0x29 + .4byte 0x4f5e + .uleb128 0x29 + .4byte 0x5142 + .uleb128 0x29 + .4byte 0x517a + .uleb128 0x29 + .4byte 0x51b3 + .uleb128 0x29 + .4byte 0x51ff + .uleb128 0x29 + .4byte 0x523e + .uleb128 0x22 + .4byte .LASF70 + .byte 0x58 + .byte 0xa1 + .4byte 0x41c + .byte 0 + .uleb128 0x21 + .byte 0x4 + .byte 0x58 + .byte 0xa4 + .4byte 0x535d + .uleb128 0x22 + .4byte .LASF1238 + .byte 0x58 + .byte 0xa9 + .4byte 0x37c + .uleb128 0x22 + .4byte .LASF1239 + .byte 0x58 + .byte 0xb1 + .4byte 0x6d + .uleb128 0x22 + .4byte .LASF852 + .byte 0x58 + .byte 0xb3 + .4byte 0x6d + .uleb128 0x22 + .4byte .LASF1240 + .byte 0x58 + .byte 0xb4 + .4byte 0xc6 + .byte 0 + .uleb128 0x1a + .4byte .LASF1241 + .2byte 0x100 + .byte 0x1e + .2byte 0x395 + .4byte 0x547d + .uleb128 0x2b + .string "f_u" + .byte 0x1e + .2byte 0x399 + .4byte 0x7e13 + .byte 0 + .uleb128 0x1b + .4byte .LASF1242 + .byte 0x1e + .2byte 0x39a + .4byte 0x2118 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1243 + .byte 0x1e + .2byte 0x39b + .4byte 0x1c7f + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1244 + .byte 0x1e + .2byte 0x39c + .4byte 0x7cec + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1245 + .byte 0x1e + .2byte 0x3a2 + .4byte 0xe65 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1246 + .byte 0x1e + .2byte 0x3a3 + .4byte 0x7528 + .byte 0x34 + .uleb128 0x1b + .4byte .LASF1247 + .byte 0x1e + .2byte 0x3a4 + .4byte 0x558 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1248 + .byte 0x1e + .2byte 0x3a5 + .4byte 0x6d + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1249 + .byte 0x1e + .2byte 0x3a6 + .4byte 0x33b + .byte 0x44 + .uleb128 0x1b + .4byte .LASF1250 + .byte 0x1e + .2byte 0x3a7 + .4byte 0x2464 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1251 + .byte 0x1e + .2byte 0x3a8 + .4byte 0x2d8 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1252 + .byte 0x1e + .2byte 0x3a9 + .4byte 0x7d5b + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1253 + .byte 0x1e + .2byte 0x3aa + .4byte 0x46f8 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1254 + .byte 0x1e + .2byte 0x3ab + .4byte 0x7db7 + .byte 0x98 + .uleb128 0x1b + .4byte .LASF1255 + .byte 0x1e + .2byte 0x3ad + .4byte 0x15a + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF1256 + .byte 0x1e + .2byte 0x3af + .4byte 0x458 + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF1205 + .byte 0x1e + .2byte 0x3b2 + .4byte 0x458 + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF1257 + .byte 0x1e + .2byte 0x3b6 + .4byte 0x3a7 + .byte 0xd0 + .uleb128 0x1b + .4byte .LASF1258 + .byte 0x1e + .2byte 0x3b7 + .4byte 0x3a7 + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF1259 + .byte 0x1e + .2byte 0x3b9 + .4byte 0x509c + .byte 0xf0 + .uleb128 0x1b + .4byte .LASF1260 + .byte 0x1e + .2byte 0x3ba + .4byte 0x5ceb + .byte 0xf8 + .byte 0 + .uleb128 0x3 + .4byte 0x535d + .uleb128 0x7 + .byte 0x8 + .4byte 0x535d + .uleb128 0x2a + .4byte .LASF952 + .byte 0 + .byte 0x58 + .2byte 0x105 + .uleb128 0x2e + .byte 0x20 + .byte 0x58 + .2byte 0x131 + .4byte 0x54b4 + .uleb128 0x2b + .string "rb" + .byte 0x58 + .2byte 0x132 + .4byte 0x3416 + .byte 0 + .uleb128 0x1b + .4byte .LASF1261 + .byte 0x58 + .2byte 0x133 + .4byte 0x29 + .byte 0x18 + .byte 0 + .uleb128 0x3c + .byte 0x20 + .byte 0x58 + .2byte 0x130 + .4byte 0x54d6 + .uleb128 0x3e + .4byte .LASF1262 + .byte 0x58 + .2byte 0x134 + .4byte 0x5491 + .uleb128 0x3e + .4byte .LASF1263 + .byte 0x58 + .2byte 0x135 + .4byte 0x56 + .byte 0 + .uleb128 0x24 + .4byte .LASF946 + .uleb128 0x7 + .byte 0x8 + .4byte 0x54d6 + .uleb128 0x1d + .4byte .LASF1264 + .byte 0x88 + .byte 0x74 + .2byte 0x195 + .4byte 0x55cc + .uleb128 0x1b + .4byte .LASF111 + .byte 0x74 + .2byte 0x196 + .4byte 0xc923 + .byte 0 + .uleb128 0x1b + .4byte .LASF1265 + .byte 0x74 + .2byte 0x197 + .4byte 0xc923 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1266 + .byte 0x74 + .2byte 0x198 + .4byte 0xc93d + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1267 + .byte 0x74 + .2byte 0x199 + .4byte 0xc952 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1268 + .byte 0x74 + .2byte 0x19a + .4byte 0xc967 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1269 + .byte 0x74 + .2byte 0x19b + .4byte 0xc981 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1270 + .byte 0x74 + .2byte 0x19d + .4byte 0xc99c + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1271 + .byte 0x74 + .2byte 0x19f + .4byte 0xc9b1 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1272 + .byte 0x74 + .2byte 0x1a3 + .4byte 0xc967 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1273 + .byte 0x74 + .2byte 0x1a6 + .4byte 0xc967 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1274 + .byte 0x74 + .2byte 0x1ab + .4byte 0xc9da + .byte 0x50 + .uleb128 0x1b + .4byte .LASF265 + .byte 0x74 + .2byte 0x1b1 + .4byte 0xc9ef + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1275 + .byte 0x74 + .2byte 0x1cf + .4byte 0xca09 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x74 + .2byte 0x1d2 + .4byte 0x15a + .byte 0x68 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x74 + .2byte 0x1d3 + .4byte 0x15a + .byte 0x70 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x74 + .2byte 0x1d4 + .4byte 0x15a + .byte 0x78 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x74 + .2byte 0x1d5 + .4byte 0x15a + .byte 0x80 + .byte 0 + .uleb128 0x3 + .4byte 0x54e1 + .uleb128 0x7 + .byte 0x8 + .4byte 0x55cc + .uleb128 0x1d + .4byte .LASF1276 + .byte 0x10 + .byte 0x58 + .2byte 0x15a + .4byte 0x55ff + .uleb128 0x1b + .4byte .LASF758 + .byte 0x58 + .2byte 0x15b + .4byte 0x2eff + .byte 0 + .uleb128 0x1b + .4byte .LASF64 + .byte 0x58 + .2byte 0x15c + .4byte 0x55ff + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x55d7 + .uleb128 0x1d + .4byte .LASF1277 + .byte 0x38 + .byte 0x58 + .2byte 0x15f + .4byte 0x563a + .uleb128 0x1b + .4byte .LASF1278 + .byte 0x58 + .2byte 0x160 + .4byte 0x37c + .byte 0 + .uleb128 0x1b + .4byte .LASF1279 + .byte 0x58 + .2byte 0x161 + .4byte 0x55d7 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1280 + .byte 0x58 + .2byte 0x162 + .4byte 0x4579 + .byte 0x18 + .byte 0 + .uleb128 0x42 + .2byte 0x378 + .byte 0x58 + .2byte 0x167 + .4byte 0x5901 + .uleb128 0x1b + .4byte .LASF109 + .byte 0x58 + .2byte 0x168 + .4byte 0x3be9 + .byte 0 + .uleb128 0x1b + .4byte .LASF1281 + .byte 0x58 + .2byte 0x169 + .4byte 0x344d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1282 + .byte 0x58 + .2byte 0x16a + .4byte 0x15a + .byte 0x10 + .uleb128 0x1b + .4byte .LASF118 + .byte 0x58 + .2byte 0x16c + .4byte 0x5924 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1283 + .byte 0x58 + .2byte 0x170 + .4byte 0x29 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1284 + .byte 0x58 + .2byte 0x171 + .4byte 0x29 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1285 + .byte 0x58 + .2byte 0x177 + .4byte 0x29 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1286 + .byte 0x58 + .2byte 0x178 + .4byte 0x29 + .byte 0x38 + .uleb128 0x2b + .string "pgd" + .byte 0x58 + .2byte 0x179 + .4byte 0x592a + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1287 + .byte 0x58 + .2byte 0x184 + .4byte 0x37c + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1288 + .byte 0x58 + .2byte 0x18d + .4byte 0x37c + .byte 0x4c + .uleb128 0x1b + .4byte .LASF1289 + .byte 0x58 + .2byte 0x190 + .4byte 0x558 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1290 + .byte 0x58 + .2byte 0x192 + .4byte 0xc6 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1291 + .byte 0x58 + .2byte 0x194 + .4byte 0xe65 + .byte 0x5c + .uleb128 0x1b + .4byte .LASF1292 + .byte 0x58 + .2byte 0x197 + .4byte 0x4d5c + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1293 + .byte 0x58 + .2byte 0x199 + .4byte 0x3a7 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1294 + .byte 0x58 + .2byte 0x1a0 + .4byte 0x29 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF1295 + .byte 0x58 + .2byte 0x1a1 + .4byte 0x29 + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF1296 + .byte 0x58 + .2byte 0x1a3 + .4byte 0x29 + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF930 + .byte 0x58 + .2byte 0x1a4 + .4byte 0x29 + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF1297 + .byte 0x58 + .2byte 0x1a5 + .4byte 0x29 + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF1298 + .byte 0x58 + .2byte 0x1a6 + .4byte 0x29 + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF1299 + .byte 0x58 + .2byte 0x1a7 + .4byte 0x29 + .byte 0xd0 + .uleb128 0x1b + .4byte .LASF1300 + .byte 0x58 + .2byte 0x1a8 + .4byte 0x29 + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF1301 + .byte 0x58 + .2byte 0x1a9 + .4byte 0x29 + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF1302 + .byte 0x58 + .2byte 0x1ab + .4byte 0xe65 + .byte 0xe8 + .uleb128 0x1b + .4byte .LASF1303 + .byte 0x58 + .2byte 0x1ac + .4byte 0x29 + .byte 0xf0 + .uleb128 0x1b + .4byte .LASF1304 + .byte 0x58 + .2byte 0x1ac + .4byte 0x29 + .byte 0xf8 + .uleb128 0x1c + .4byte .LASF1305 + .byte 0x58 + .2byte 0x1ac + .4byte 0x29 + .2byte 0x100 + .uleb128 0x1c + .4byte .LASF1306 + .byte 0x58 + .2byte 0x1ac + .4byte 0x29 + .2byte 0x108 + .uleb128 0x1c + .4byte .LASF1307 + .byte 0x58 + .2byte 0x1ad + .4byte 0x29 + .2byte 0x110 + .uleb128 0x30 + .string "brk" + .byte 0x58 + .2byte 0x1ad + .4byte 0x29 + .2byte 0x118 + .uleb128 0x1c + .4byte .LASF1308 + .byte 0x58 + .2byte 0x1ad + .4byte 0x29 + .2byte 0x120 + .uleb128 0x1c + .4byte .LASF1309 + .byte 0x58 + .2byte 0x1ae + .4byte 0x29 + .2byte 0x128 + .uleb128 0x1c + .4byte .LASF1310 + .byte 0x58 + .2byte 0x1ae + .4byte 0x29 + .2byte 0x130 + .uleb128 0x1c + .4byte .LASF1311 + .byte 0x58 + .2byte 0x1ae + .4byte 0x29 + .2byte 0x138 + .uleb128 0x1c + .4byte .LASF1312 + .byte 0x58 + .2byte 0x1ae + .4byte 0x29 + .2byte 0x140 + .uleb128 0x1c + .4byte .LASF1313 + .byte 0x58 + .2byte 0x1b0 + .4byte 0x5930 + .2byte 0x148 + .uleb128 0x1c + .4byte .LASF617 + .byte 0x58 + .2byte 0x1b6 + .4byte 0x3d49 + .2byte 0x2b8 + .uleb128 0x1c + .4byte .LASF1314 + .byte 0x58 + .2byte 0x1b8 + .4byte 0x5945 + .2byte 0x2e0 + .uleb128 0x1c + .4byte .LASF1315 + .byte 0x58 + .2byte 0x1bb + .4byte 0x4eed + .2byte 0x2e8 + .uleb128 0x1c + .4byte .LASF171 + .byte 0x58 + .2byte 0x1bd + .4byte 0x29 + .2byte 0x300 + .uleb128 0x1c + .4byte .LASF1277 + .byte 0x58 + .2byte 0x1bf + .4byte 0x594b + .2byte 0x308 + .uleb128 0x1c + .4byte .LASF1316 + .byte 0x58 + .2byte 0x1c1 + .4byte 0x37c + .2byte 0x310 + .uleb128 0x1c + .4byte .LASF1317 + .byte 0x58 + .2byte 0x1c4 + .4byte 0xe65 + .2byte 0x314 + .uleb128 0x1c + .4byte .LASF1318 + .byte 0x58 + .2byte 0x1c5 + .4byte 0x5956 + .2byte 0x318 + .uleb128 0x1c + .4byte .LASF98 + .byte 0x58 + .2byte 0x1d2 + .4byte 0x2eff + .2byte 0x320 + .uleb128 0x1c + .4byte .LASF1087 + .byte 0x58 + .2byte 0x1d4 + .4byte 0x595c + .2byte 0x328 + .uleb128 0x1c + .4byte .LASF1319 + .byte 0x58 + .2byte 0x1d7 + .4byte 0x5482 + .2byte 0x330 + .uleb128 0x1c + .4byte .LASF1320 + .byte 0x58 + .2byte 0x1f1 + .4byte 0x37c + .2byte 0x338 + .uleb128 0x1c + .4byte .LASF1182 + .byte 0x58 + .2byte 0x1f6 + .4byte 0x4e9d + .2byte 0x340 + .uleb128 0x1c + .4byte .LASF1321 + .byte 0x58 + .2byte 0x1fa + .4byte 0x3205 + .2byte 0x348 + .byte 0 + .uleb128 0x14 + .4byte 0x29 + .4byte 0x5924 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5901 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3347 + .uleb128 0x5 + .4byte 0x29 + .4byte 0x5940 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2d + .byte 0 + .uleb128 0x24 + .4byte .LASF1322 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5940 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5605 + .uleb128 0x24 + .4byte .LASF1323 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5951 + .uleb128 0x7 + .byte 0x8 + .4byte 0x23e5 + .uleb128 0x5 + .4byte 0x29 + .4byte 0x5971 + .uleb128 0x41 + .4byte 0x4f + .byte 0 + .uleb128 0x15 + .4byte .LASF1324 + .byte 0x58 + .2byte 0x209 + .4byte 0x453a + .uleb128 0x7 + .byte 0x8 + .4byte 0x339d + .uleb128 0x7 + .byte 0x8 + .4byte 0x5989 + .uleb128 0x1d + .4byte .LASF1325 + .byte 0x68 + .byte 0x74 + .2byte 0x163 + .4byte 0x5a4d + .uleb128 0x2b + .string "vma" + .byte 0x74 + .2byte 0x164 + .4byte 0x3be9 + .byte 0 + .uleb128 0x1b + .4byte .LASF171 + .byte 0x74 + .2byte 0x165 + .4byte 0x6d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1139 + .byte 0x74 + .2byte 0x166 + .4byte 0x330 + .byte 0xc + .uleb128 0x1b + .4byte .LASF1326 + .byte 0x74 + .2byte 0x167 + .4byte 0x29 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1327 + .byte 0x74 + .2byte 0x168 + .4byte 0x29 + .byte 0x18 + .uleb128 0x2b + .string "pmd" + .byte 0x74 + .2byte 0x169 + .4byte 0xc7e4 + .byte 0x20 + .uleb128 0x2b + .string "pud" + .byte 0x74 + .2byte 0x16b + .4byte 0xc8e8 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1328 + .byte 0x74 + .2byte 0x16e + .4byte 0x3307 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1329 + .byte 0x74 + .2byte 0x170 + .4byte 0x339d + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1142 + .byte 0x74 + .2byte 0x171 + .4byte 0x4897 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF815 + .byte 0x74 + .2byte 0x172 + .4byte 0x339d + .byte 0x48 + .uleb128 0x2b + .string "pte" + .byte 0x74 + .2byte 0x178 + .4byte 0xc8ee + .byte 0x50 + .uleb128 0x2b + .string "ptl" + .byte 0x74 + .2byte 0x17c + .4byte 0x4c5f + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1330 + .byte 0x74 + .2byte 0x180 + .4byte 0x3392 + .byte 0x60 + .byte 0 + .uleb128 0x19 + .4byte .LASF1331 + .byte 0x75 + .byte 0x16 + .4byte 0xc6 + .uleb128 0xd + .4byte .LASF1332 + .byte 0x8 + .byte 0x75 + .byte 0x18 + .4byte 0x5a71 + .uleb128 0x20 + .string "cap" + .byte 0x75 + .byte 0x19 + .4byte 0xcf9 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF1333 + .byte 0x75 + .byte 0x1a + .4byte 0x5a58 + .uleb128 0x3 + .4byte 0x5a71 + .uleb128 0x19 + .4byte .LASF1334 + .byte 0x75 + .byte 0x2d + .4byte 0x5a7c + .uleb128 0x19 + .4byte .LASF1335 + .byte 0x75 + .byte 0x2e + .4byte 0x5a7c + .uleb128 0xd + .4byte .LASF1336 + .byte 0x18 + .byte 0x76 + .byte 0x10 + .4byte 0x5ac8 + .uleb128 0xe + .4byte .LASF116 + .byte 0x76 + .byte 0x11 + .4byte 0xe33 + .byte 0 + .uleb128 0xe + .4byte .LASF383 + .byte 0x76 + .byte 0x12 + .4byte 0x6d + .byte 0x4 + .uleb128 0xe + .4byte .LASF575 + .byte 0x76 + .byte 0x13 + .4byte 0x3a7 + .byte 0x8 + .byte 0 + .uleb128 0xd + .4byte .LASF1337 + .byte 0x38 + .byte 0x77 + .byte 0x11 + .4byte 0x5b1d + .uleb128 0xe + .4byte .LASF1338 + .byte 0x77 + .byte 0x12 + .4byte 0xf4 + .byte 0 + .uleb128 0xe + .4byte .LASF1339 + .byte 0x77 + .byte 0x14 + .4byte 0xf4 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1340 + .byte 0x77 + .byte 0x16 + .4byte 0xf4 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1341 + .byte 0x77 + .byte 0x17 + .4byte 0x5b1d + .byte 0x18 + .uleb128 0xe + .4byte .LASF1342 + .byte 0x77 + .byte 0x18 + .4byte 0xd2 + .byte 0x28 + .uleb128 0xe + .4byte .LASF1343 + .byte 0x77 + .byte 0x19 + .4byte 0xca8 + .byte 0x2c + .byte 0 + .uleb128 0x5 + .4byte 0xf4 + .4byte 0x5b2d + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x1f + .4byte .LASF1344 + .byte 0x4 + .4byte 0x6d + .byte 0x78 + .byte 0xf + .4byte 0x5b56 + .uleb128 0xc + .4byte .LASF1345 + .byte 0 + .uleb128 0xc + .4byte .LASF1346 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1347 + .byte 0x2 + .uleb128 0xc + .4byte .LASF1348 + .byte 0x3 + .byte 0 + .uleb128 0xd + .4byte .LASF1349 + .byte 0x8 + .byte 0x79 + .byte 0x14 + .4byte 0x5b6f + .uleb128 0xe + .4byte .LASF758 + .byte 0x79 + .byte 0x15 + .4byte 0x2eff + .byte 0 + .byte 0 + .uleb128 0x1f + .4byte .LASF1350 + .byte 0x4 + .4byte 0x6d + .byte 0x7a + .byte 0x1d + .4byte 0x5b92 + .uleb128 0xc + .4byte .LASF1351 + .byte 0 + .uleb128 0xc + .4byte .LASF1352 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1353 + .byte 0x2 + .byte 0 + .uleb128 0xd + .4byte .LASF1354 + .byte 0x40 + .byte 0x7a + .byte 0x20 + .4byte 0x5be7 + .uleb128 0xe + .4byte .LASF1355 + .byte 0x7a + .byte 0x21 + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF1356 + .byte 0x7a + .byte 0x22 + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF1357 + .byte 0x7a + .byte 0x23 + .4byte 0x15bf + .byte 0x8 + .uleb128 0xe + .4byte .LASF1358 + .byte 0x7a + .byte 0x25 + .4byte 0xc6 + .byte 0x20 + .uleb128 0xe + .4byte .LASF1359 + .byte 0x7a + .byte 0x26 + .4byte 0x41c + .byte 0x28 + .uleb128 0xe + .4byte .LASF1360 + .byte 0x7a + .byte 0x28 + .4byte 0x5b6f + .byte 0x38 + .byte 0 + .uleb128 0xd + .4byte .LASF1361 + .byte 0x88 + .byte 0x7b + .byte 0xc + .4byte 0x5c30 + .uleb128 0x20 + .string "rss" + .byte 0x7b + .byte 0xd + .4byte 0x5b92 + .byte 0 + .uleb128 0xe + .4byte .LASF1362 + .byte 0x7b + .byte 0xe + .4byte 0x34a7 + .byte 0x40 + .uleb128 0xe + .4byte .LASF1363 + .byte 0x7b + .byte 0xf + .4byte 0x4d5c + .byte 0x48 + .uleb128 0xe + .4byte .LASF1364 + .byte 0x7b + .byte 0x10 + .4byte 0x5b56 + .byte 0x78 + .uleb128 0xe + .4byte .LASF1365 + .byte 0x7b + .byte 0x11 + .4byte 0xc6 + .byte 0x80 + .byte 0 + .uleb128 0xd + .4byte .LASF1366 + .byte 0x10 + .byte 0x7c + .byte 0xa + .4byte 0x5c54 + .uleb128 0x20 + .string "fn" + .byte 0x7c + .byte 0xb + .4byte 0x2f2f + .byte 0 + .uleb128 0x20 + .string "arg" + .byte 0x7c + .byte 0xc + .4byte 0x458 + .byte 0x8 + .byte 0 + .uleb128 0xf + .byte 0x10 + .byte 0x7d + .byte 0x17 + .4byte 0x5c67 + .uleb128 0x20 + .string "b" + .byte 0x7d + .byte 0x18 + .4byte 0x5c67 + .byte 0 + .byte 0 + .uleb128 0x5 + .4byte 0x8b + .4byte 0x5c77 + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x8 + .4byte .LASF1367 + .byte 0x7d + .byte 0x19 + .4byte 0x5c54 + .uleb128 0x3 + .4byte 0x5c77 + .uleb128 0xf + .byte 0x10 + .byte 0x7e + .byte 0x18 + .4byte 0x5c9a + .uleb128 0x20 + .string "b" + .byte 0x7e + .byte 0x19 + .4byte 0x5c67 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF1368 + .byte 0x7e + .byte 0x1a + .4byte 0x5c87 + .uleb128 0x3 + .4byte 0x5c9a + .uleb128 0x19 + .4byte .LASF1369 + .byte 0x7e + .byte 0x29 + .4byte 0x5c82 + .uleb128 0x19 + .4byte .LASF1370 + .byte 0x7e + .byte 0x2a + .4byte 0x5ca5 + .uleb128 0x5 + .4byte 0x11a + .4byte 0x5cd0 + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x3 + .4byte 0x5cc0 + .uleb128 0x19 + .4byte .LASF1371 + .byte 0x7e + .byte 0x51 + .4byte 0x5cd0 + .uleb128 0x19 + .4byte .LASF1372 + .byte 0x7e + .byte 0x52 + .4byte 0x5cd0 + .uleb128 0x8 + .4byte .LASF1373 + .byte 0x7f + .byte 0x8 + .4byte 0x13f + .uleb128 0x21 + .byte 0x10 + .byte 0x69 + .byte 0x53 + .4byte 0x5d15 + .uleb128 0x22 + .4byte .LASF1374 + .byte 0x69 + .byte 0x54 + .4byte 0x3a7 + .uleb128 0x22 + .4byte .LASF1375 + .byte 0x69 + .byte 0x55 + .4byte 0x5174 + .byte 0 + .uleb128 0x21 + .byte 0x10 + .byte 0x69 + .byte 0x57 + .4byte 0x5d34 + .uleb128 0x22 + .4byte .LASF1376 + .byte 0x69 + .byte 0x58 + .4byte 0x3eb + .uleb128 0x22 + .4byte .LASF1377 + .byte 0x69 + .byte 0x59 + .4byte 0x41c + .byte 0 + .uleb128 0xd + .4byte .LASF1378 + .byte 0x38 + .byte 0x69 + .byte 0x49 + .4byte 0x5d6f + .uleb128 0x20 + .string "q" + .byte 0x69 + .byte 0x4a + .4byte 0x48a2 + .byte 0 + .uleb128 0x20 + .string "ioc" + .byte 0x69 + .byte 0x4b + .4byte 0x4823 + .byte 0x8 + .uleb128 0x23 + .4byte 0x5cf6 + .byte 0x10 + .uleb128 0x23 + .4byte 0x5d15 + .byte 0x20 + .uleb128 0xe + .4byte .LASF171 + .byte 0x69 + .byte 0x5c + .4byte 0x6d + .byte 0x30 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5d34 + .uleb128 0x19 + .4byte .LASF1379 + .byte 0x80 + .byte 0xb + .4byte 0x6d + .uleb128 0xd + .4byte .LASF1380 + .byte 0x18 + .byte 0x81 + .byte 0x5c + .4byte 0x5db1 + .uleb128 0xe + .4byte .LASF1381 + .byte 0x81 + .byte 0x5d + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF1382 + .byte 0x81 + .byte 0x5e + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1383 + .byte 0x81 + .byte 0x5f + .4byte 0x29 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF1384 + .byte 0x38 + .byte 0x81 + .byte 0x62 + .4byte 0x5de2 + .uleb128 0xe + .4byte .LASF1385 + .byte 0x81 + .byte 0x63 + .4byte 0x199 + .byte 0 + .uleb128 0xe + .4byte .LASF393 + .byte 0x81 + .byte 0x64 + .4byte 0x199 + .byte 0x8 + .uleb128 0xe + .4byte .LASF396 + .byte 0x81 + .byte 0x65 + .4byte 0x5de2 + .byte 0x10 + .byte 0 + .uleb128 0x5 + .4byte 0x199 + .4byte 0x5df2 + .uleb128 0x6 + .4byte 0x4f + .byte 0x4 + .byte 0 + .uleb128 0x19 + .4byte .LASF1386 + .byte 0x1e + .byte 0x49 + .4byte 0x5d80 + .uleb128 0x19 + .4byte .LASF1387 + .byte 0x1e + .byte 0x4b + .4byte 0x6d + .uleb128 0x19 + .4byte .LASF1388 + .byte 0x1e + .byte 0x4c + .4byte 0x5db1 + .uleb128 0x19 + .4byte .LASF1389 + .byte 0x1e + .byte 0x4d + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF1390 + .byte 0x1e + .byte 0x4d + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF1391 + .byte 0x1e + .byte 0x4e + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF1392 + .byte 0x1e + .byte 0x4f + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF1393 + .byte 0x1e + .byte 0x50 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF1394 + .byte 0x1e + .byte 0x51 + .4byte 0xc6 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5e5b + .uleb128 0x1d + .4byte .LASF1395 + .byte 0x28 + .byte 0x1e + .2byte 0x137 + .4byte 0x5ec4 + .uleb128 0x1b + .4byte .LASF1396 + .byte 0x1e + .2byte 0x138 + .4byte 0x5482 + .byte 0 + .uleb128 0x1b + .4byte .LASF1397 + .byte 0x1e + .2byte 0x13d + .4byte 0x2d8 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1398 + .byte 0x1e + .2byte 0x13e + .4byte 0x7573 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF360 + .byte 0x1e + .2byte 0x13f + .4byte 0x458 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1399 + .byte 0x1e + .2byte 0x140 + .4byte 0xc6 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1400 + .byte 0x1e + .2byte 0x141 + .4byte 0x11f + .byte 0x24 + .uleb128 0x1b + .4byte .LASF1401 + .byte 0x1e + .2byte 0x142 + .4byte 0x11f + .byte 0x26 + .byte 0 + .uleb128 0xd + .4byte .LASF1402 + .byte 0x50 + .byte 0x1e + .byte 0xd9 + .4byte 0x5f3d + .uleb128 0xe + .4byte .LASF1403 + .byte 0x1e + .byte 0xda + .4byte 0x6d + .byte 0 + .uleb128 0xe + .4byte .LASF1404 + .byte 0x1e + .byte 0xdb + .4byte 0x28f + .byte 0x4 + .uleb128 0xe + .4byte .LASF1405 + .byte 0x1e + .byte 0xdc + .4byte 0x240a + .byte 0x8 + .uleb128 0xe + .4byte .LASF1406 + .byte 0x1e + .byte 0xdd + .4byte 0x242a + .byte 0xc + .uleb128 0xe + .4byte .LASF1407 + .byte 0x1e + .byte 0xde + .4byte 0x2d8 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1408 + .byte 0x1e + .byte 0xdf + .4byte 0xa27 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1409 + .byte 0x1e + .byte 0xe0 + .4byte 0xa27 + .byte 0x28 + .uleb128 0xe + .4byte .LASF1410 + .byte 0x1e + .byte 0xe1 + .4byte 0xa27 + .byte 0x38 + .uleb128 0xe + .4byte .LASF1411 + .byte 0x1e + .byte 0xe8 + .4byte 0x5482 + .byte 0x48 + .byte 0 + .uleb128 0x5 + .4byte 0x224 + .4byte 0x5f4d + .uleb128 0x6 + .4byte 0x4f + .byte 0x5 + .byte 0 + .uleb128 0x3 + .4byte 0x5f3d + .uleb128 0x19 + .4byte .LASF1412 + .byte 0x82 + .byte 0x45 + .4byte 0x5f4d + .uleb128 0x19 + .4byte .LASF1413 + .byte 0x82 + .byte 0x5a + .4byte 0xc6 + .uleb128 0xd + .4byte .LASF1414 + .byte 0x68 + .byte 0x82 + .byte 0x63 + .4byte 0x5f8d + .uleb128 0xe + .4byte .LASF1415 + .byte 0x82 + .byte 0x64 + .4byte 0x5f8d + .byte 0 + .uleb128 0xe + .4byte .LASF1416 + .byte 0x82 + .byte 0x65 + .4byte 0x29 + .byte 0x60 + .byte 0 + .uleb128 0x5 + .4byte 0x3a7 + .4byte 0x5f9d + .uleb128 0x6 + .4byte 0x4f + .byte 0x5 + .byte 0 + .uleb128 0xd + .4byte .LASF1417 + .byte 0 + .byte 0x82 + .byte 0x71 + .4byte 0x5fb4 + .uleb128 0x20 + .string "x" + .byte 0x82 + .byte 0x72 + .4byte 0x5fb4 + .byte 0 + .byte 0 + .uleb128 0x5 + .4byte 0x61 + .4byte 0x5fc3 + .uleb128 0x41 + .4byte 0x4f + .byte 0 + .uleb128 0x1f + .4byte .LASF1418 + .byte 0x4 + .4byte 0x6d + .byte 0x82 + .byte 0x87 + .4byte 0x602e + .uleb128 0xc + .4byte .LASF1419 + .byte 0 + .uleb128 0xc + .4byte .LASF1420 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1421 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1422 + .byte 0x2 + .uleb128 0xc + .4byte .LASF1423 + .byte 0x3 + .uleb128 0xc + .4byte .LASF1424 + .byte 0x4 + .uleb128 0xc + .4byte .LASF1425 + .byte 0x5 + .uleb128 0xc + .4byte .LASF1426 + .byte 0x6 + .uleb128 0xc + .4byte .LASF1427 + .byte 0x7 + .uleb128 0xc + .4byte .LASF1428 + .byte 0x8 + .uleb128 0xc + .4byte .LASF1429 + .byte 0x9 + .uleb128 0xc + .4byte .LASF1430 + .byte 0xa + .uleb128 0xc + .4byte .LASF1431 + .byte 0xb + .uleb128 0xc + .4byte .LASF1432 + .byte 0xc + .uleb128 0xc + .4byte .LASF1433 + .byte 0xd + .byte 0 + .uleb128 0x1f + .4byte .LASF1434 + .byte 0x4 + .4byte 0x6d + .byte 0x82 + .byte 0x9f + .4byte 0x6111 + .uleb128 0xc + .4byte .LASF1435 + .byte 0 + .uleb128 0xc + .4byte .LASF1436 + .byte 0 + .uleb128 0xc + .4byte .LASF1437 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1438 + .byte 0x2 + .uleb128 0xc + .4byte .LASF1439 + .byte 0x3 + .uleb128 0xc + .4byte .LASF1440 + .byte 0x4 + .uleb128 0xc + .4byte .LASF1441 + .byte 0x5 + .uleb128 0xc + .4byte .LASF1442 + .byte 0x6 + .uleb128 0xc + .4byte .LASF1443 + .byte 0x7 + .uleb128 0xc + .4byte .LASF1444 + .byte 0x8 + .uleb128 0xc + .4byte .LASF1445 + .byte 0x9 + .uleb128 0xc + .4byte .LASF1446 + .byte 0xa + .uleb128 0xc + .4byte .LASF1447 + .byte 0xb + .uleb128 0xc + .4byte .LASF1448 + .byte 0xc + .uleb128 0xc + .4byte .LASF1449 + .byte 0xd + .uleb128 0xc + .4byte .LASF1450 + .byte 0xe + .uleb128 0xc + .4byte .LASF1451 + .byte 0xf + .uleb128 0xc + .4byte .LASF1452 + .byte 0x10 + .uleb128 0xc + .4byte .LASF1453 + .byte 0x11 + .uleb128 0xc + .4byte .LASF1454 + .byte 0x12 + .uleb128 0xc + .4byte .LASF1455 + .byte 0x13 + .uleb128 0xc + .4byte .LASF1456 + .byte 0x14 + .uleb128 0xc + .4byte .LASF1457 + .byte 0x15 + .uleb128 0xc + .4byte .LASF1458 + .byte 0x16 + .uleb128 0xc + .4byte .LASF1459 + .byte 0x17 + .uleb128 0xc + .4byte .LASF1460 + .byte 0x18 + .uleb128 0xc + .4byte .LASF1461 + .byte 0x19 + .uleb128 0xc + .4byte .LASF1462 + .byte 0x1a + .uleb128 0xc + .4byte .LASF1463 + .byte 0x1b + .uleb128 0xc + .4byte .LASF1464 + .byte 0x1c + .uleb128 0xc + .4byte .LASF1465 + .byte 0x1d + .uleb128 0xc + .4byte .LASF1466 + .byte 0x1e + .uleb128 0xc + .4byte .LASF1467 + .byte 0x1f + .uleb128 0xc + .4byte .LASF1468 + .byte 0x20 + .uleb128 0xc + .4byte .LASF1469 + .byte 0x21 + .byte 0 + .uleb128 0xd + .4byte .LASF1470 + .byte 0x20 + .byte 0x82 + .byte 0xea + .4byte 0x6136 + .uleb128 0xe + .4byte .LASF1471 + .byte 0x82 + .byte 0xf3 + .4byte 0x3f + .byte 0 + .uleb128 0xe + .4byte .LASF1472 + .byte 0x82 + .byte 0xf4 + .4byte 0x3f + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF1473 + .byte 0x88 + .byte 0x82 + .byte 0xf7 + .4byte 0x617f + .uleb128 0xe + .4byte .LASF1474 + .byte 0x82 + .byte 0xf8 + .4byte 0x617f + .byte 0 + .uleb128 0xe + .4byte .LASF1475 + .byte 0x82 + .byte 0xf9 + .4byte 0x6111 + .byte 0x50 + .uleb128 0xe + .4byte .LASF1476 + .byte 0x82 + .byte 0xfb + .4byte 0x558 + .byte 0x70 + .uleb128 0xe + .4byte .LASF1477 + .byte 0x82 + .byte 0xfd + .4byte 0x29 + .byte 0x78 + .uleb128 0xe + .4byte .LASF1478 + .byte 0x82 + .byte 0xff + .4byte 0x62fb + .byte 0x80 + .byte 0 + .uleb128 0x5 + .4byte 0x3a7 + .4byte 0x618f + .uleb128 0x6 + .4byte 0x4f + .byte 0x4 + .byte 0 + .uleb128 0x1a + .4byte .LASF1479 + .2byte 0x1680 + .byte 0x82 + .2byte 0x284 + .4byte 0x62fb + .uleb128 0x1b + .4byte .LASF1480 + .byte 0x82 + .2byte 0x285 + .4byte 0x668e + .byte 0 + .uleb128 0x1c + .4byte .LASF1481 + .byte 0x82 + .2byte 0x286 + .4byte 0x669e + .2byte 0x1380 + .uleb128 0x1c + .4byte .LASF1482 + .byte 0x82 + .2byte 0x287 + .4byte 0xc6 + .2byte 0x13c0 + .uleb128 0x1c + .4byte .LASF1483 + .byte 0x82 + .2byte 0x2a0 + .4byte 0x29 + .2byte 0x13c8 + .uleb128 0x1c + .4byte .LASF1484 + .byte 0x82 + .2byte 0x2a1 + .4byte 0x29 + .2byte 0x13d0 + .uleb128 0x1c + .4byte .LASF1485 + .byte 0x82 + .2byte 0x2a2 + .4byte 0x29 + .2byte 0x13d8 + .uleb128 0x1c + .4byte .LASF1486 + .byte 0x82 + .2byte 0x2a4 + .4byte 0xc6 + .2byte 0x13e0 + .uleb128 0x1c + .4byte .LASF1487 + .byte 0x82 + .2byte 0x2a5 + .4byte 0x15bf + .2byte 0x13e8 + .uleb128 0x1c + .4byte .LASF1488 + .byte 0x82 + .2byte 0x2a6 + .4byte 0x15bf + .2byte 0x1400 + .uleb128 0x1c + .4byte .LASF1489 + .byte 0x82 + .2byte 0x2a7 + .4byte 0x2eff + .2byte 0x1418 + .uleb128 0x1c + .4byte .LASF1490 + .byte 0x82 + .2byte 0x2a9 + .4byte 0xc6 + .2byte 0x1420 + .uleb128 0x1c + .4byte .LASF1491 + .byte 0x82 + .2byte 0x2aa + .4byte 0x63dc + .2byte 0x1424 + .uleb128 0x1c + .4byte .LASF1492 + .byte 0x82 + .2byte 0x2ac + .4byte 0xc6 + .2byte 0x1428 + .uleb128 0x1c + .4byte .LASF1493 + .byte 0x82 + .2byte 0x2af + .4byte 0xc6 + .2byte 0x142c + .uleb128 0x1c + .4byte .LASF1494 + .byte 0x82 + .2byte 0x2b0 + .4byte 0x63dc + .2byte 0x1430 + .uleb128 0x1c + .4byte .LASF1495 + .byte 0x82 + .2byte 0x2b1 + .4byte 0x15bf + .2byte 0x1438 + .uleb128 0x1c + .4byte .LASF1496 + .byte 0x82 + .2byte 0x2b2 + .4byte 0x2eff + .2byte 0x1450 + .uleb128 0x1c + .4byte .LASF1497 + .byte 0x82 + .2byte 0x2b8 + .4byte 0x29 + .2byte 0x1458 + .uleb128 0x1c + .4byte .LASF1498 + .byte 0x82 + .2byte 0x2c3 + .4byte 0x5f9d + .2byte 0x1480 + .uleb128 0x1c + .4byte .LASF1499 + .byte 0x82 + .2byte 0x2c4 + .4byte 0xe65 + .2byte 0x1480 + .uleb128 0x1c + .4byte .LASF1473 + .byte 0x82 + .2byte 0x2d7 + .4byte 0x6136 + .2byte 0x1488 + .uleb128 0x1c + .4byte .LASF171 + .byte 0x82 + .2byte 0x2d9 + .4byte 0x29 + .2byte 0x1510 + .uleb128 0x1c + .4byte .LASF1500 + .byte 0x82 + .2byte 0x2db + .4byte 0x5f9d + .2byte 0x1540 + .uleb128 0x1c + .4byte .LASF1501 + .byte 0x82 + .2byte 0x2de + .4byte 0x66ae + .2byte 0x1540 + .uleb128 0x1c + .4byte .LASF1502 + .byte 0x82 + .2byte 0x2df + .4byte 0x66b4 + .2byte 0x1548 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x618f + .uleb128 0x13 + .4byte .LASF1503 + .byte 0x82 + .2byte 0x110 + .4byte 0x6d + .uleb128 0x1d + .4byte .LASF1504 + .byte 0x50 + .byte 0x82 + .2byte 0x11d + .4byte 0x634f + .uleb128 0x1b + .4byte .LASF383 + .byte 0x82 + .2byte 0x11e + .4byte 0xc6 + .byte 0 + .uleb128 0x1b + .4byte .LASF1505 + .byte 0x82 + .2byte 0x11f + .4byte 0xc6 + .byte 0x4 + .uleb128 0x1b + .4byte .LASF1146 + .byte 0x82 + .2byte 0x120 + .4byte 0xc6 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1474 + .byte 0x82 + .2byte 0x123 + .4byte 0x634f + .byte 0x10 + .byte 0 + .uleb128 0x5 + .4byte 0x3a7 + .4byte 0x635f + .uleb128 0x6 + .4byte 0x4f + .byte 0x3 + .byte 0 + .uleb128 0x1d + .4byte .LASF1506 + .byte 0x60 + .byte 0x82 + .2byte 0x126 + .4byte 0x6394 + .uleb128 0x2b + .string "pcp" + .byte 0x82 + .2byte 0x127 + .4byte 0x630d + .byte 0 + .uleb128 0x1b + .4byte .LASF1507 + .byte 0x82 + .2byte 0x12d + .4byte 0x106 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1508 + .byte 0x82 + .2byte 0x12e + .4byte 0x6394 + .byte 0x51 + .byte 0 + .uleb128 0x5 + .4byte 0x106 + .4byte 0x63a4 + .uleb128 0x6 + .4byte 0x4f + .byte 0xc + .byte 0 + .uleb128 0x1d + .4byte .LASF1509 + .byte 0x22 + .byte 0x82 + .2byte 0x132 + .4byte 0x63cc + .uleb128 0x1b + .4byte .LASF1507 + .byte 0x82 + .2byte 0x133 + .4byte 0x106 + .byte 0 + .uleb128 0x1b + .4byte .LASF1510 + .byte 0x82 + .2byte 0x134 + .4byte 0x63cc + .byte 0x1 + .byte 0 + .uleb128 0x5 + .4byte 0x106 + .4byte 0x63dc + .uleb128 0x6 + .4byte 0x4f + .byte 0x20 + .byte 0 + .uleb128 0x1e + .4byte .LASF1511 + .byte 0x4 + .4byte 0x6d + .byte 0x82 + .2byte 0x139 + .4byte 0x6406 + .uleb128 0xc + .4byte .LASF1512 + .byte 0 + .uleb128 0xc + .4byte .LASF1513 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1514 + .byte 0x2 + .uleb128 0xc + .4byte .LASF1515 + .byte 0x3 + .byte 0 + .uleb128 0x1a + .4byte .LASF1516 + .2byte 0x680 + .byte 0x82 + .2byte 0x172 + .4byte 0x65d4 + .uleb128 0x1b + .4byte .LASF1517 + .byte 0x82 + .2byte 0x176 + .4byte 0x65d4 + .byte 0 + .uleb128 0x1b + .4byte .LASF1518 + .byte 0x82 + .2byte 0x178 + .4byte 0x29 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1519 + .byte 0x82 + .2byte 0x183 + .4byte 0x65e4 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1520 + .byte 0x82 + .2byte 0x188 + .4byte 0x62fb + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1521 + .byte 0x82 + .2byte 0x189 + .4byte 0x65f4 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1522 + .byte 0x82 + .2byte 0x18c + .4byte 0x2b0 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1523 + .byte 0x82 + .2byte 0x198 + .4byte 0x29 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1524 + .byte 0x82 + .2byte 0x1c3 + .4byte 0x29 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1525 + .byte 0x82 + .2byte 0x1c4 + .4byte 0x29 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1526 + .byte 0x82 + .2byte 0x1c5 + .4byte 0x29 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF265 + .byte 0x82 + .2byte 0x1c7 + .4byte 0x56 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1527 + .byte 0x82 + .2byte 0x1cf + .4byte 0x29 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF1528 + .byte 0x82 + .2byte 0x1d7 + .4byte 0xc6 + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1498 + .byte 0x82 + .2byte 0x1da + .4byte 0x5f9d + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF1414 + .byte 0x82 + .2byte 0x1dd + .4byte 0x65fa + .byte 0xc0 + .uleb128 0x1c + .4byte .LASF171 + .byte 0x82 + .2byte 0x1e0 + .4byte 0x29 + .2byte 0x538 + .uleb128 0x1c + .4byte .LASF116 + .byte 0x82 + .2byte 0x1e3 + .4byte 0xe65 + .2byte 0x540 + .uleb128 0x1c + .4byte .LASF1500 + .byte 0x82 + .2byte 0x1e6 + .4byte 0x5f9d + .2byte 0x580 + .uleb128 0x1c + .4byte .LASF1529 + .byte 0x82 + .2byte 0x1ed + .4byte 0x29 + .2byte 0x580 + .uleb128 0x1c + .4byte .LASF1530 + .byte 0x82 + .2byte 0x1f1 + .4byte 0x29 + .2byte 0x588 + .uleb128 0x1c + .4byte .LASF1531 + .byte 0x82 + .2byte 0x1f3 + .4byte 0x3f + .2byte 0x590 + .uleb128 0x1c + .4byte .LASF1532 + .byte 0x82 + .2byte 0x1fc + .4byte 0x6d + .2byte 0x5a0 + .uleb128 0x1c + .4byte .LASF1533 + .byte 0x82 + .2byte 0x1fd + .4byte 0x6d + .2byte 0x5a4 + .uleb128 0x1c + .4byte .LASF1534 + .byte 0x82 + .2byte 0x1fe + .4byte 0xc6 + .2byte 0x5a8 + .uleb128 0x1c + .4byte .LASF1535 + .byte 0x82 + .2byte 0x203 + .4byte 0x2b0 + .2byte 0x5ac + .uleb128 0x1c + .4byte .LASF1536 + .byte 0x82 + .2byte 0x206 + .4byte 0x2b0 + .2byte 0x5ad + .uleb128 0x1c + .4byte .LASF1537 + .byte 0x82 + .2byte 0x208 + .4byte 0x5f9d + .2byte 0x5c0 + .uleb128 0x1c + .4byte .LASF1502 + .byte 0x82 + .2byte 0x20a + .4byte 0x660a + .2byte 0x5c0 + .uleb128 0x1c + .4byte .LASF1538 + .byte 0x82 + .2byte 0x20b + .4byte 0x661a + .2byte 0x628 + .uleb128 0x1c + .4byte .LASF130 + .byte 0x82 + .2byte 0x20d + .4byte 0x15a + .2byte 0x628 + .uleb128 0x1c + .4byte .LASF131 + .byte 0x82 + .2byte 0x20e + .4byte 0x15a + .2byte 0x630 + .uleb128 0x1c + .4byte .LASF132 + .byte 0x82 + .2byte 0x20f + .4byte 0x15a + .2byte 0x638 + .uleb128 0x1c + .4byte .LASF133 + .byte 0x82 + .2byte 0x210 + .4byte 0x15a + .2byte 0x640 + .byte 0 + .uleb128 0x5 + .4byte 0x29 + .4byte 0x65e4 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x5 + .4byte 0x199 + .4byte 0x65f4 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x635f + .uleb128 0x5 + .4byte 0x5f68 + .4byte 0x660a + .uleb128 0x6 + .4byte 0x4f + .byte 0xa + .byte 0 + .uleb128 0x5 + .4byte 0x558 + .4byte 0x661a + .uleb128 0x6 + .4byte 0x4f + .byte 0xc + .byte 0 + .uleb128 0x5 + .4byte 0x558 + .4byte 0x6629 + .uleb128 0x41 + .4byte 0x4f + .byte 0 + .uleb128 0x1d + .4byte .LASF1539 + .byte 0x10 + .byte 0x82 + .2byte 0x25f + .4byte 0x6651 + .uleb128 0x1b + .4byte .LASF1516 + .byte 0x82 + .2byte 0x260 + .4byte 0x6651 + .byte 0 + .uleb128 0x1b + .4byte .LASF1540 + .byte 0x82 + .2byte 0x261 + .4byte 0xc6 + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6406 + .uleb128 0x1d + .4byte .LASF1541 + .byte 0x40 + .byte 0x82 + .2byte 0x272 + .4byte 0x6672 + .uleb128 0x1b + .4byte .LASF1542 + .byte 0x82 + .2byte 0x273 + .4byte 0x6672 + .byte 0 + .byte 0 + .uleb128 0x5 + .4byte 0x6629 + .4byte 0x6682 + .uleb128 0x6 + .4byte 0x4f + .byte 0x3 + .byte 0 + .uleb128 0x15 + .4byte .LASF1543 + .byte 0x82 + .2byte 0x278 + .4byte 0x339d + .uleb128 0x5 + .4byte 0x6406 + .4byte 0x669e + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x5 + .4byte 0x6657 + .4byte 0x66ae + .uleb128 0x6 + .4byte 0x4f + .byte 0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x63a4 + .uleb128 0x5 + .4byte 0x558 + .4byte 0x66c4 + .uleb128 0x6 + .4byte 0x4f + .byte 0x20 + .byte 0 + .uleb128 0x8 + .4byte .LASF1544 + .byte 0x20 + .byte 0x33 + .4byte 0x66cf + .uleb128 0x7 + .byte 0x8 + .4byte 0x66d5 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x66ee + .uleb128 0x11 + .4byte 0x66ee + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x66f4 + .uleb128 0xd + .4byte .LASF1545 + .byte 0x18 + .byte 0x20 + .byte 0x36 + .4byte 0x6725 + .uleb128 0xe + .4byte .LASF1546 + .byte 0x20 + .byte 0x37 + .4byte 0x66c4 + .byte 0 + .uleb128 0xe + .4byte .LASF64 + .byte 0x20 + .byte 0x38 + .4byte 0x66ee + .byte 0x8 + .uleb128 0xe + .4byte .LASF1547 + .byte 0x20 + .byte 0x39 + .4byte 0xc6 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF1548 + .byte 0x38 + .byte 0x20 + .byte 0x41 + .4byte 0x674a + .uleb128 0xe + .4byte .LASF1549 + .byte 0x20 + .byte 0x42 + .4byte 0x4d5c + .byte 0 + .uleb128 0xe + .4byte .LASF136 + .byte 0x20 + .byte 0x43 + .4byte 0x66ee + .byte 0x30 + .byte 0 + .uleb128 0x19 + .4byte .LASF1550 + .byte 0x20 + .byte 0xee + .4byte 0x6725 + .uleb128 0x15 + .4byte .LASF1551 + .byte 0x82 + .2byte 0x368 + .4byte 0xc6 + .uleb128 0x5 + .4byte 0xc6 + .4byte 0x6771 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x15 + .4byte .LASF1552 + .byte 0x82 + .2byte 0x394 + .4byte 0x6761 + .uleb128 0x15 + .4byte .LASF1553 + .byte 0x82 + .2byte 0x3a0 + .4byte 0x500 + .uleb128 0x15 + .4byte .LASF1554 + .byte 0x82 + .2byte 0x3a5 + .4byte 0x618f + .uleb128 0x1d + .4byte .LASF1555 + .byte 0x10 + .byte 0x82 + .2byte 0x469 + .4byte 0x67bd + .uleb128 0x1b + .4byte .LASF1556 + .byte 0x82 + .2byte 0x476 + .4byte 0x29 + .byte 0 + .uleb128 0x1b + .4byte .LASF1557 + .byte 0x82 + .2byte 0x479 + .4byte 0x67bd + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x29 + .uleb128 0x15 + .4byte .LASF1555 + .byte 0x82 + .2byte 0x493 + .4byte 0x67cf + .uleb128 0x7 + .byte 0x8 + .4byte 0x67d5 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6795 + .uleb128 0x15 + .4byte .LASF1558 + .byte 0x82 + .2byte 0x4ea + .4byte 0xc6 + .uleb128 0xd + .4byte .LASF1559 + .byte 0x28 + .byte 0x83 + .byte 0x7 + .4byte 0x6848 + .uleb128 0xe + .4byte .LASF1560 + .byte 0x83 + .byte 0x8 + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF1561 + .byte 0x83 + .byte 0x9 + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF1562 + .byte 0x83 + .byte 0xa + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1563 + .byte 0x83 + .byte 0xb + .4byte 0xc6 + .byte 0xc + .uleb128 0xe + .4byte .LASF1564 + .byte 0x83 + .byte 0xc + .4byte 0x15e8 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1565 + .byte 0x83 + .byte 0xd + .4byte 0x15e8 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1566 + .byte 0x83 + .byte 0xe + .4byte 0x15e8 + .byte 0x20 + .byte 0 + .uleb128 0x5 + .4byte 0x67e7 + .4byte 0x6858 + .uleb128 0x6 + .4byte 0x4f + .byte 0x7 + .byte 0 + .uleb128 0x19 + .4byte .LASF1559 + .byte 0x83 + .byte 0x11 + .4byte 0x6848 + .uleb128 0x19 + .4byte .LASF1567 + .byte 0x84 + .byte 0x11 + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF1568 + .byte 0x84 + .byte 0x1c + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF1569 + .byte 0x84 + .byte 0x24 + .4byte 0x29 + .uleb128 0x15 + .4byte .LASF1570 + .byte 0x85 + .2byte 0x259 + .4byte 0x330 + .uleb128 0xd + .4byte .LASF1571 + .byte 0x28 + .byte 0x86 + .byte 0x14 + .4byte 0x68cd + .uleb128 0xe + .4byte .LASF116 + .byte 0x86 + .byte 0x15 + .4byte 0xe33 + .byte 0 + .uleb128 0xe + .4byte .LASF383 + .byte 0x86 + .byte 0x16 + .4byte 0x14f + .byte 0x8 + .uleb128 0xe + .4byte .LASF932 + .byte 0x86 + .byte 0x18 + .4byte 0x3a7 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1213 + .byte 0x86 + .byte 0x1a + .4byte 0x68cd + .byte 0x20 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x12f + .uleb128 0x19 + .4byte .LASF1572 + .byte 0x86 + .byte 0x1d + .4byte 0xc6 + .uleb128 0x7 + .byte 0x8 + .4byte 0x68e4 + .uleb128 0x1d + .4byte .LASF1573 + .byte 0xd0 + .byte 0x87 + .2byte 0x126 + .4byte 0x698e + .uleb128 0x1b + .4byte .LASF1574 + .byte 0x87 + .2byte 0x127 + .4byte 0x3eb + .byte 0 + .uleb128 0x1b + .4byte .LASF1575 + .byte 0x87 + .2byte 0x128 + .4byte 0x3a7 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1576 + .byte 0x87 + .2byte 0x129 + .4byte 0x3a7 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1577 + .byte 0x87 + .2byte 0x12a + .4byte 0x3a7 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1578 + .byte 0x87 + .2byte 0x12b + .4byte 0x2464 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1579 + .byte 0x87 + .2byte 0x12c + .4byte 0xe65 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1580 + .byte 0x87 + .2byte 0x12d + .4byte 0x37c + .byte 0x64 + .uleb128 0x1b + .4byte .LASF1581 + .byte 0x87 + .2byte 0x12e + .4byte 0x20e7 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1582 + .byte 0x87 + .2byte 0x12f + .4byte 0x6a11 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1583 + .byte 0x87 + .2byte 0x130 + .4byte 0x2d8 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF1584 + .byte 0x87 + .2byte 0x131 + .4byte 0x29 + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1585 + .byte 0x87 + .2byte 0x132 + .4byte 0x6a3b + .byte 0x88 + .byte 0 + .uleb128 0x8 + .4byte .LASF1586 + .byte 0x88 + .byte 0x14 + .4byte 0x1bb + .uleb128 0xf + .byte 0x4 + .byte 0x88 + .byte 0x16 + .4byte 0x69ae + .uleb128 0x20 + .string "val" + .byte 0x88 + .byte 0x17 + .4byte 0x698e + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF1587 + .byte 0x88 + .byte 0x18 + .4byte 0x6999 + .uleb128 0x1f + .4byte .LASF1588 + .byte 0x4 + .4byte 0x6d + .byte 0x87 + .byte 0x36 + .4byte 0x69dc + .uleb128 0xc + .4byte .LASF1589 + .byte 0 + .uleb128 0xc + .4byte .LASF1590 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1591 + .byte 0x2 + .byte 0 + .uleb128 0x8 + .4byte .LASF1592 + .byte 0x87 + .byte 0x42 + .4byte 0xed + .uleb128 0x21 + .byte 0x4 + .byte 0x87 + .byte 0x45 + .4byte 0x6a11 + .uleb128 0x28 + .string "uid" + .byte 0x87 + .byte 0x46 + .4byte 0x240a + .uleb128 0x28 + .string "gid" + .byte 0x87 + .byte 0x47 + .4byte 0x242a + .uleb128 0x22 + .4byte .LASF1593 + .byte 0x87 + .byte 0x48 + .4byte 0x69ae + .byte 0 + .uleb128 0xd + .4byte .LASF1594 + .byte 0x8 + .byte 0x87 + .byte 0x44 + .4byte 0x6a30 + .uleb128 0x23 + .4byte 0x69e7 + .byte 0 + .uleb128 0xe + .4byte .LASF193 + .byte 0x87 + .byte 0x4a + .4byte 0x69b9 + .byte 0x4 + .byte 0 + .uleb128 0x19 + .4byte .LASF1595 + .byte 0x87 + .byte 0xc1 + .4byte 0xe65 + .uleb128 0xd + .4byte .LASF1596 + .byte 0x48 + .byte 0x87 + .byte 0xcd + .4byte 0x6ab4 + .uleb128 0xe + .4byte .LASF1597 + .byte 0x87 + .byte 0xce + .4byte 0x69dc + .byte 0 + .uleb128 0xe + .4byte .LASF1598 + .byte 0x87 + .byte 0xcf + .4byte 0x69dc + .byte 0x8 + .uleb128 0xe + .4byte .LASF1599 + .byte 0x87 + .byte 0xd0 + .4byte 0x69dc + .byte 0x10 + .uleb128 0xe + .4byte .LASF1600 + .byte 0x87 + .byte 0xd1 + .4byte 0x69dc + .byte 0x18 + .uleb128 0xe + .4byte .LASF1601 + .byte 0x87 + .byte 0xd2 + .4byte 0x69dc + .byte 0x20 + .uleb128 0xe + .4byte .LASF1602 + .byte 0x87 + .byte 0xd3 + .4byte 0x69dc + .byte 0x28 + .uleb128 0xe + .4byte .LASF1603 + .byte 0x87 + .byte 0xd4 + .4byte 0x69dc + .byte 0x30 + .uleb128 0xe + .4byte .LASF1604 + .byte 0x87 + .byte 0xd5 + .4byte 0x9d2 + .byte 0x38 + .uleb128 0xe + .4byte .LASF1605 + .byte 0x87 + .byte 0xd6 + .4byte 0x9d2 + .byte 0x40 + .byte 0 + .uleb128 0xd + .4byte .LASF1606 + .byte 0x48 + .byte 0x87 + .byte 0xde + .4byte 0x6b2d + .uleb128 0xe + .4byte .LASF1607 + .byte 0x87 + .byte 0xdf + .4byte 0x6b6f + .byte 0 + .uleb128 0xe + .4byte .LASF1608 + .byte 0x87 + .byte 0xe0 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1609 + .byte 0x87 + .byte 0xe2 + .4byte 0x3a7 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1610 + .byte 0x87 + .byte 0xe3 + .4byte 0x29 + .byte 0x20 + .uleb128 0xe + .4byte .LASF1611 + .byte 0x87 + .byte 0xe4 + .4byte 0x6d + .byte 0x28 + .uleb128 0xe + .4byte .LASF1612 + .byte 0x87 + .byte 0xe5 + .4byte 0x6d + .byte 0x2c + .uleb128 0xe + .4byte .LASF1613 + .byte 0x87 + .byte 0xe6 + .4byte 0x69dc + .byte 0x30 + .uleb128 0xe + .4byte .LASF1614 + .byte 0x87 + .byte 0xe7 + .4byte 0x69dc + .byte 0x38 + .uleb128 0xe + .4byte .LASF1615 + .byte 0x87 + .byte 0xe8 + .4byte 0x458 + .byte 0x40 + .byte 0 + .uleb128 0x1d + .4byte .LASF1616 + .byte 0x20 + .byte 0x87 + .2byte 0x1c4 + .4byte 0x6b6f + .uleb128 0x1b + .4byte .LASF1617 + .byte 0x87 + .2byte 0x1c5 + .4byte 0xc6 + .byte 0 + .uleb128 0x1b + .4byte .LASF1618 + .byte 0x87 + .2byte 0x1c6 + .4byte 0x7179 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1619 + .byte 0x87 + .2byte 0x1c7 + .4byte 0x74a1 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1620 + .byte 0x87 + .2byte 0x1c8 + .4byte 0x6b6f + .byte 0x18 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6b2d + .uleb128 0x1a + .4byte .LASF1621 + .2byte 0x180 + .byte 0x87 + .2byte 0x109 + .4byte 0x6b9e + .uleb128 0x1b + .4byte .LASF1622 + .byte 0x87 + .2byte 0x10a + .4byte 0x2f4b + .byte 0 + .uleb128 0x1b + .4byte .LASF59 + .byte 0x87 + .2byte 0x10b + .4byte 0x6b9e + .byte 0x40 + .byte 0 + .uleb128 0x5 + .4byte 0x6890 + .4byte 0x6bae + .uleb128 0x6 + .4byte 0x4f + .byte 0x7 + .byte 0 + .uleb128 0x15 + .4byte .LASF1621 + .byte 0x87 + .2byte 0x10e + .4byte 0x6b75 + .uleb128 0x1d + .4byte .LASF1623 + .byte 0x50 + .byte 0x87 + .2byte 0x136 + .4byte 0x6c4a + .uleb128 0x1b + .4byte .LASF1624 + .byte 0x87 + .2byte 0x137 + .4byte 0x6c63 + .byte 0 + .uleb128 0x1b + .4byte .LASF1625 + .byte 0x87 + .2byte 0x138 + .4byte 0x6c63 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1626 + .byte 0x87 + .2byte 0x139 + .4byte 0x6c63 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1627 + .byte 0x87 + .2byte 0x13a + .4byte 0x6c63 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1628 + .byte 0x87 + .2byte 0x13b + .4byte 0x6c78 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1629 + .byte 0x87 + .2byte 0x13c + .4byte 0x6c78 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1630 + .byte 0x87 + .2byte 0x13d + .4byte 0x6c78 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1631 + .byte 0x87 + .2byte 0x13e + .4byte 0x6c98 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x87 + .2byte 0x140 + .4byte 0x15a + .byte 0x40 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x87 + .2byte 0x141 + .4byte 0x15a + .byte 0x48 + .byte 0 + .uleb128 0x3 + .4byte 0x6bba + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x6c63 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6c4f + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x6c78 + .uleb128 0x11 + .4byte 0x68de + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6c69 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x6c92 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x6c92 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6a11 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6c7e + .uleb128 0x1d + .4byte .LASF1632 + .byte 0x68 + .byte 0x87 + .2byte 0x145 + .4byte 0x6d55 + .uleb128 0x1b + .4byte .LASF1633 + .byte 0x87 + .2byte 0x146 + .4byte 0x6c78 + .byte 0 + .uleb128 0x1b + .4byte .LASF1634 + .byte 0x87 + .2byte 0x147 + .4byte 0x6d6e + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1635 + .byte 0x87 + .2byte 0x148 + .4byte 0x6d7f + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1636 + .byte 0x87 + .2byte 0x149 + .4byte 0x6c78 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1637 + .byte 0x87 + .2byte 0x14a + .4byte 0x6c78 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1638 + .byte 0x87 + .2byte 0x14b + .4byte 0x6c78 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1639 + .byte 0x87 + .2byte 0x14c + .4byte 0x6c63 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1640 + .byte 0x87 + .2byte 0x14f + .4byte 0x6d9a + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1641 + .byte 0x87 + .2byte 0x150 + .4byte 0x6dba + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1642 + .byte 0x87 + .2byte 0x152 + .4byte 0x6dd4 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1631 + .byte 0x87 + .2byte 0x154 + .4byte 0x6c98 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x87 + .2byte 0x156 + .4byte 0x15a + .byte 0x58 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x87 + .2byte 0x157 + .4byte 0x15a + .byte 0x60 + .byte 0 + .uleb128 0x3 + .4byte 0x6c9e + .uleb128 0x14 + .4byte 0x68de + .4byte 0x6d6e + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6d5a + .uleb128 0x10 + .4byte 0x6d7f + .uleb128 0x11 + .4byte 0x68de + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6d74 + .uleb128 0x14 + .4byte 0x6d94 + .4byte 0x6d94 + .uleb128 0x11 + .4byte 0x1c7f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x69dc + .uleb128 0x7 + .byte 0x8 + .4byte 0x6d85 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x6db4 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x6db4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x69ae + .uleb128 0x7 + .byte 0x8 + .4byte 0x6da0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x6dd4 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x6d94 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6dc0 + .uleb128 0x1d + .4byte .LASF1643 + .byte 0x78 + .byte 0x87 + .2byte 0x15d + .4byte 0x6eb8 + .uleb128 0x1b + .4byte .LASF1644 + .byte 0x87 + .2byte 0x15e + .4byte 0xc6 + .byte 0 + .uleb128 0x1b + .4byte .LASF1645 + .byte 0x87 + .2byte 0x15f + .4byte 0x15a + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1646 + .byte 0x87 + .2byte 0x160 + .4byte 0x15a + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1647 + .byte 0x87 + .2byte 0x161 + .4byte 0x15a + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1648 + .byte 0x87 + .2byte 0x162 + .4byte 0x15a + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1649 + .byte 0x87 + .2byte 0x163 + .4byte 0x15a + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1650 + .byte 0x87 + .2byte 0x164 + .4byte 0x15a + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1651 + .byte 0x87 + .2byte 0x165 + .4byte 0x14f + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1652 + .byte 0x87 + .2byte 0x167 + .4byte 0x14f + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1653 + .byte 0x87 + .2byte 0x168 + .4byte 0xc6 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1654 + .byte 0x87 + .2byte 0x169 + .4byte 0xc6 + .byte 0x4c + .uleb128 0x1b + .4byte .LASF1655 + .byte 0x87 + .2byte 0x16a + .4byte 0x15a + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1656 + .byte 0x87 + .2byte 0x16b + .4byte 0x15a + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1657 + .byte 0x87 + .2byte 0x16c + .4byte 0x15a + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1658 + .byte 0x87 + .2byte 0x16d + .4byte 0x14f + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1659 + .byte 0x87 + .2byte 0x16e + .4byte 0xc6 + .byte 0x70 + .byte 0 + .uleb128 0x1d + .4byte .LASF1660 + .byte 0x38 + .byte 0x87 + .2byte 0x191 + .4byte 0x6f48 + .uleb128 0x1b + .4byte .LASF171 + .byte 0x87 + .2byte 0x192 + .4byte 0x6d + .byte 0 + .uleb128 0x1b + .4byte .LASF1661 + .byte 0x87 + .2byte 0x193 + .4byte 0x6d + .byte 0x4 + .uleb128 0x1b + .4byte .LASF1662 + .byte 0x87 + .2byte 0x195 + .4byte 0x6d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1663 + .byte 0x87 + .2byte 0x196 + .4byte 0x6d + .byte 0xc + .uleb128 0x1b + .4byte .LASF1664 + .byte 0x87 + .2byte 0x197 + .4byte 0x6d + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1665 + .byte 0x87 + .2byte 0x198 + .4byte 0x6d + .byte 0x14 + .uleb128 0x1b + .4byte .LASF1666 + .byte 0x87 + .2byte 0x199 + .4byte 0x6d + .byte 0x18 + .uleb128 0x2b + .string "ino" + .byte 0x87 + .2byte 0x19a + .4byte 0xff + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1137 + .byte 0x87 + .2byte 0x19b + .4byte 0x31a + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1667 + .byte 0x87 + .2byte 0x19c + .4byte 0x31a + .byte 0x30 + .byte 0 + .uleb128 0x1d + .4byte .LASF1668 + .byte 0xb0 + .byte 0x87 + .2byte 0x19f + .4byte 0x6f70 + .uleb128 0x1b + .4byte .LASF1669 + .byte 0x87 + .2byte 0x1a0 + .4byte 0x6d + .byte 0 + .uleb128 0x1b + .4byte .LASF1670 + .byte 0x87 + .2byte 0x1a1 + .4byte 0x6f70 + .byte 0x8 + .byte 0 + .uleb128 0x5 + .4byte 0x6eb8 + .4byte 0x6f80 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x1d + .4byte .LASF1671 + .byte 0x20 + .byte 0x87 + .2byte 0x1a5 + .4byte 0x6ff6 + .uleb128 0x1b + .4byte .LASF1672 + .byte 0x87 + .2byte 0x1a6 + .4byte 0xc6 + .byte 0 + .uleb128 0x1b + .4byte .LASF423 + .byte 0x87 + .2byte 0x1a7 + .4byte 0x6d + .byte 0x4 + .uleb128 0x1b + .4byte .LASF1673 + .byte 0x87 + .2byte 0x1a8 + .4byte 0x6d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1674 + .byte 0x87 + .2byte 0x1aa + .4byte 0x6d + .byte 0xc + .uleb128 0x1b + .4byte .LASF1675 + .byte 0x87 + .2byte 0x1ab + .4byte 0x6d + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1676 + .byte 0x87 + .2byte 0x1ac + .4byte 0x6d + .byte 0x14 + .uleb128 0x1b + .4byte .LASF1677 + .byte 0x87 + .2byte 0x1ad + .4byte 0x6d + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1678 + .byte 0x87 + .2byte 0x1ae + .4byte 0x6d + .byte 0x1c + .byte 0 + .uleb128 0x1d + .4byte .LASF1679 + .byte 0x68 + .byte 0x87 + .2byte 0x1b2 + .4byte 0x70ad + .uleb128 0x1b + .4byte .LASF1680 + .byte 0x87 + .2byte 0x1b3 + .4byte 0x70d0 + .byte 0 + .uleb128 0x1b + .4byte .LASF1681 + .byte 0x87 + .2byte 0x1b4 + .4byte 0x6c63 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1682 + .byte 0x87 + .2byte 0x1b5 + .4byte 0x70ea + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1683 + .byte 0x87 + .2byte 0x1b6 + .4byte 0x70ea + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1684 + .byte 0x87 + .2byte 0x1b7 + .4byte 0x6c63 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1685 + .byte 0x87 + .2byte 0x1b8 + .4byte 0x710f + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1686 + .byte 0x87 + .2byte 0x1b9 + .4byte 0x7134 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1687 + .byte 0x87 + .2byte 0x1ba + .4byte 0x7153 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1688 + .byte 0x87 + .2byte 0x1bc + .4byte 0x7134 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1689 + .byte 0x87 + .2byte 0x1bd + .4byte 0x7173 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1690 + .byte 0x87 + .2byte 0x1be + .4byte 0x70ea + .byte 0x50 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x87 + .2byte 0x1c0 + .4byte 0x15a + .byte 0x58 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x87 + .2byte 0x1c1 + .4byte 0x15a + .byte 0x60 + .byte 0 + .uleb128 0x3 + .4byte 0x6ff6 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x70d0 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x2112 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x70b2 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x70ea + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x70d6 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x7109 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x7109 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6f80 + .uleb128 0x7 + .byte 0x8 + .4byte 0x70f0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x712e + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x6a11 + .uleb128 0x11 + .4byte 0x712e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6dda + .uleb128 0x7 + .byte 0x8 + .4byte 0x7115 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x7153 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x6c92 + .uleb128 0x11 + .4byte 0x712e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x713a + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x716d + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x716d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6f48 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7159 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6c4a + .uleb128 0x1a + .4byte .LASF163 + .2byte 0x380 + .byte 0x89 + .2byte 0x14c + .4byte 0x74a1 + .uleb128 0x1b + .4byte .LASF577 + .byte 0x89 + .2byte 0x14d + .4byte 0xd321 + .byte 0 + .uleb128 0x1b + .4byte .LASF932 + .byte 0x89 + .2byte 0x150 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF265 + .byte 0x89 + .2byte 0x153 + .4byte 0xd1c7 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1691 + .byte 0x89 + .2byte 0x156 + .4byte 0xd1d7 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1692 + .byte 0x89 + .2byte 0x157 + .4byte 0xd298 + .byte 0xd0 + .uleb128 0x1b + .4byte .LASF1693 + .byte 0x89 + .2byte 0x158 + .4byte 0x56 + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF1694 + .byte 0x89 + .2byte 0x159 + .4byte 0x56 + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF1695 + .byte 0x89 + .2byte 0x15a + .4byte 0x9114 + .byte 0xe8 + .uleb128 0x1b + .4byte .LASF1696 + .byte 0x89 + .2byte 0x15d + .4byte 0xd40a + .byte 0xf0 + .uleb128 0x1b + .4byte .LASF1697 + .byte 0x89 + .2byte 0x15e + .4byte 0xd410 + .byte 0xf8 + .uleb128 0x1c + .4byte .LASF1698 + .byte 0x89 + .2byte 0x15f + .4byte 0x6d + .2byte 0x100 + .uleb128 0x1c + .4byte .LASF1699 + .byte 0x89 + .2byte 0x167 + .4byte 0x2464 + .2byte 0x108 + .uleb128 0x30 + .string "kp" + .byte 0x89 + .2byte 0x169 + .4byte 0xd416 + .2byte 0x128 + .uleb128 0x1c + .4byte .LASF1700 + .byte 0x89 + .2byte 0x16a + .4byte 0x6d + .2byte 0x130 + .uleb128 0x1c + .4byte .LASF1701 + .byte 0x89 + .2byte 0x16d + .4byte 0x6d + .2byte 0x134 + .uleb128 0x1c + .4byte .LASF1702 + .byte 0x89 + .2byte 0x16e + .4byte 0xd40a + .2byte 0x138 + .uleb128 0x1c + .4byte .LASF1703 + .byte 0x89 + .2byte 0x16f + .4byte 0xd410 + .2byte 0x140 + .uleb128 0x1c + .4byte .LASF1704 + .byte 0x89 + .2byte 0x182 + .4byte 0x2b0 + .2byte 0x148 + .uleb128 0x1c + .4byte .LASF1705 + .byte 0x89 + .2byte 0x184 + .4byte 0x2b0 + .2byte 0x149 + .uleb128 0x1c + .4byte .LASF1706 + .byte 0x89 + .2byte 0x187 + .4byte 0xd40a + .2byte 0x150 + .uleb128 0x1c + .4byte .LASF1707 + .byte 0x89 + .2byte 0x188 + .4byte 0xd410 + .2byte 0x158 + .uleb128 0x1c + .4byte .LASF1708 + .byte 0x89 + .2byte 0x189 + .4byte 0x6d + .2byte 0x160 + .uleb128 0x1c + .4byte .LASF1709 + .byte 0x89 + .2byte 0x18c + .4byte 0x6d + .2byte 0x164 + .uleb128 0x1c + .4byte .LASF1710 + .byte 0x89 + .2byte 0x18d + .4byte 0xd441 + .2byte 0x168 + .uleb128 0x1c + .4byte .LASF1711 + .byte 0x89 + .2byte 0x190 + .4byte 0x4a1 + .2byte 0x170 + .uleb128 0x1c + .4byte .LASF1712 + .byte 0x89 + .2byte 0x193 + .4byte 0xd373 + .2byte 0x180 + .uleb128 0x1c + .4byte .LASF1713 + .byte 0x89 + .2byte 0x194 + .4byte 0xd373 + .2byte 0x1d0 + .uleb128 0x1c + .4byte .LASF1714 + .byte 0x89 + .2byte 0x197 + .4byte 0xd149 + .2byte 0x220 + .uleb128 0x1c + .4byte .LASF1715 + .byte 0x89 + .2byte 0x199 + .4byte 0x29 + .2byte 0x248 + .uleb128 0x1c + .4byte .LASF1716 + .byte 0x89 + .2byte 0x19d + .4byte 0x6d + .2byte 0x250 + .uleb128 0x1c + .4byte .LASF1717 + .byte 0x89 + .2byte 0x19e + .4byte 0x3a7 + .2byte 0x258 + .uleb128 0x1c + .4byte .LASF1718 + .byte 0x89 + .2byte 0x19f + .4byte 0xd447 + .2byte 0x268 + .uleb128 0x1c + .4byte .LASF1719 + .byte 0x89 + .2byte 0x1a4 + .4byte 0xd44d + .2byte 0x270 + .uleb128 0x1c + .4byte .LASF1720 + .byte 0x89 + .2byte 0x1a5 + .4byte 0xd3cf + .2byte 0x278 + .uleb128 0x1c + .4byte .LASF1721 + .byte 0x89 + .2byte 0x1a8 + .4byte 0xd458 + .2byte 0x290 + .uleb128 0x1c + .4byte .LASF1722 + .byte 0x89 + .2byte 0x1ab + .4byte 0xd463 + .2byte 0x298 + .uleb128 0x1c + .4byte .LASF1723 + .byte 0x89 + .2byte 0x1b0 + .4byte 0x21e + .2byte 0x2a0 + .uleb128 0x1c + .4byte .LASF1724 + .byte 0x89 + .2byte 0x1b4 + .4byte 0x458 + .2byte 0x2a8 + .uleb128 0x1c + .4byte .LASF1725 + .byte 0x89 + .2byte 0x1b5 + .4byte 0x6d + .2byte 0x2b0 + .uleb128 0x1c + .4byte .LASF1726 + .byte 0x89 + .2byte 0x1b9 + .4byte 0x6d + .2byte 0x2b4 + .uleb128 0x1c + .4byte .LASF1727 + .byte 0x89 + .2byte 0x1ba + .4byte 0xd469 + .2byte 0x2b8 + .uleb128 0x1c + .4byte .LASF1728 + .byte 0x89 + .2byte 0x1bd + .4byte 0xef6 + .2byte 0x2c0 + .uleb128 0x1c + .4byte .LASF1729 + .byte 0x89 + .2byte 0x1be + .4byte 0x6d + .2byte 0x2c8 + .uleb128 0x1c + .4byte .LASF1730 + .byte 0x89 + .2byte 0x1c1 + .4byte 0x6d + .2byte 0x2cc + .uleb128 0x1c + .4byte .LASF1731 + .byte 0x89 + .2byte 0x1c2 + .4byte 0xbabd + .2byte 0x2d0 + .uleb128 0x1c + .4byte .LASF1732 + .byte 0x89 + .2byte 0x1c5 + .4byte 0xd474 + .2byte 0x2d8 + .uleb128 0x1c + .4byte .LASF1733 + .byte 0x89 + .2byte 0x1c6 + .4byte 0x6d + .2byte 0x2e0 + .uleb128 0x1c + .4byte .LASF1734 + .byte 0x89 + .2byte 0x1c7 + .4byte 0xd485 + .2byte 0x2e8 + .uleb128 0x1c + .4byte .LASF1735 + .byte 0x89 + .2byte 0x1c8 + .4byte 0x6d + .2byte 0x2f0 + .uleb128 0x1c + .4byte .LASF1736 + .byte 0x89 + .2byte 0x1d9 + .4byte 0x3a7 + .2byte 0x2f8 + .uleb128 0x1c + .4byte .LASF1737 + .byte 0x89 + .2byte 0x1db + .4byte 0x3a7 + .2byte 0x308 + .uleb128 0x1c + .4byte .LASF1738 + .byte 0x89 + .2byte 0x1de + .4byte 0x4b7 + .2byte 0x318 + .uleb128 0x1c + .4byte .LASF1739 + .byte 0x89 + .2byte 0x1e0 + .4byte 0x37c + .2byte 0x320 + .uleb128 0x1c + .4byte .LASF130 + .byte 0x89 + .2byte 0x1ed + .4byte 0x15a + .2byte 0x328 + .uleb128 0x1c + .4byte .LASF131 + .byte 0x89 + .2byte 0x1ee + .4byte 0x15a + .2byte 0x330 + .uleb128 0x1c + .4byte .LASF132 + .byte 0x89 + .2byte 0x1ef + .4byte 0x15a + .2byte 0x338 + .uleb128 0x1c + .4byte .LASF133 + .byte 0x89 + .2byte 0x1f0 + .4byte 0x15a + .2byte 0x340 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x717f + .uleb128 0x1a + .4byte .LASF1740 + .2byte 0x140 + .byte 0x87 + .2byte 0x20f + .4byte 0x74f8 + .uleb128 0x1b + .4byte .LASF171 + .byte 0x87 + .2byte 0x210 + .4byte 0x6d + .byte 0 + .uleb128 0x1b + .4byte .LASF1741 + .byte 0x87 + .2byte 0x211 + .4byte 0x4d5c + .byte 0x8 + .uleb128 0x1b + .4byte .LASF673 + .byte 0x87 + .2byte 0x212 + .4byte 0x74f8 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1742 + .byte 0x87 + .2byte 0x213 + .4byte 0x7508 + .byte 0x50 + .uleb128 0x30 + .string "ops" + .byte 0x87 + .2byte 0x214 + .4byte 0x7518 + .2byte 0x128 + .byte 0 + .uleb128 0x5 + .4byte 0x1c7f + .4byte 0x7508 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x5 + .4byte 0x6ab4 + .4byte 0x7518 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x5 + .4byte 0x7179 + .4byte 0x7528 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x1e + .4byte .LASF1743 + .byte 0x4 + .4byte 0x6d + .byte 0x1e + .2byte 0x125 + .4byte 0x755e + .uleb128 0xc + .4byte .LASF1744 + .byte 0 + .uleb128 0xc + .4byte .LASF1745 + .byte 0x1 + .uleb128 0xc + .4byte .LASF1746 + .byte 0x2 + .uleb128 0xc + .4byte .LASF1747 + .byte 0x3 + .uleb128 0xc + .4byte .LASF1748 + .byte 0x4 + .uleb128 0xc + .4byte .LASF1749 + .byte 0x5 + .byte 0 + .uleb128 0x10 + .4byte 0x7573 + .uleb128 0x11 + .4byte 0x5e55 + .uleb128 0x11 + .4byte 0x199 + .uleb128 0x11 + .4byte 0x199 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x755e + .uleb128 0x1d + .4byte .LASF1750 + .byte 0xc8 + .byte 0x1e + .2byte 0x162 + .4byte 0x76cc + .uleb128 0x1b + .4byte .LASF1751 + .byte 0x1e + .2byte 0x163 + .4byte 0x76f0 + .byte 0 + .uleb128 0x1b + .4byte .LASF1752 + .byte 0x1e + .2byte 0x164 + .4byte 0x770a + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1753 + .byte 0x1e + .2byte 0x167 + .4byte 0x7724 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1754 + .byte 0x1e + .2byte 0x16a + .4byte 0x7739 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1755 + .byte 0x1e + .2byte 0x170 + .4byte 0x775d + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1756 + .byte 0x1e + .2byte 0x173 + .4byte 0x7796 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1757 + .byte 0x1e + .2byte 0x176 + .4byte 0x77c9 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1758 + .byte 0x1e + .2byte 0x17b + .4byte 0x77e3 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1759 + .byte 0x1e + .2byte 0x17c + .4byte 0x77fe + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1760 + .byte 0x1e + .2byte 0x17d + .4byte 0x7818 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1761 + .byte 0x1e + .2byte 0x17e + .4byte 0x7829 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1762 + .byte 0x1e + .2byte 0x17f + .4byte 0x784e + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1763 + .byte 0x1e + .2byte 0x184 + .4byte 0x7872 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1764 + .byte 0x1e + .2byte 0x186 + .4byte 0x788c + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1765 + .byte 0x1e + .2byte 0x187 + .4byte 0x7829 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1766 + .byte 0x1e + .2byte 0x188 + .4byte 0x7739 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF1767 + .byte 0x1e + .2byte 0x189 + .4byte 0x78ab + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1768 + .byte 0x1e + .2byte 0x18b + .4byte 0x78cc + .byte 0x88 + .uleb128 0x1b + .4byte .LASF1769 + .byte 0x1e + .2byte 0x18c + .4byte 0x78e6 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1770 + .byte 0x1e + .2byte 0x18f + .4byte 0x7916 + .byte 0x98 + .uleb128 0x1b + .4byte .LASF1771 + .byte 0x1e + .2byte 0x191 + .4byte 0x7927 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x193 + .4byte 0x15a + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x194 + .4byte 0x15a + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x1e + .2byte 0x195 + .4byte 0x15a + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x1e + .2byte 0x196 + .4byte 0x15a + .byte 0xc0 + .byte 0 + .uleb128 0x3 + .4byte 0x7579 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x76e5 + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x76e5 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x76eb + .uleb128 0x24 + .4byte .LASF1772 + .uleb128 0x7 + .byte 0x8 + .4byte 0x76d1 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x770a + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x339d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x76f6 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x7724 + .uleb128 0x11 + .4byte 0x509c + .uleb128 0x11 + .4byte 0x76e5 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7710 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x7739 + .uleb128 0x11 + .4byte 0x339d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x772a + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x775d + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x509c + .uleb128 0x11 + .4byte 0x3cc + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x773f + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x7790 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x509c + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x597d + .uleb128 0x11 + .4byte 0x7790 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x458 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7763 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x77c9 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x509c + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x779c + .uleb128 0x14 + .4byte 0x30f + .4byte 0x77e3 + .uleb128 0x11 + .4byte 0x509c + .uleb128 0x11 + .4byte 0x30f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x77cf + .uleb128 0x10 + .4byte 0x77fe + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x77e9 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x7818 + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x330 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7804 + .uleb128 0x10 + .4byte 0x7829 + .uleb128 0x11 + .4byte 0x339d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x781e + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x7843 + .uleb128 0x11 + .4byte 0x5e55 + .uleb128 0x11 + .4byte 0x7843 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7849 + .uleb128 0x24 + .4byte .LASF1773 + .uleb128 0x7 + .byte 0x8 + .4byte 0x782f + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x7872 + .uleb128 0x11 + .4byte 0x509c + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x5b2d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7854 + .uleb128 0x14 + .4byte 0x2b0 + .4byte 0x788c + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x6301 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7878 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x78ab + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7892 + .uleb128 0x10 + .4byte 0x78c6 + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x78c6 + .uleb128 0x11 + .4byte 0x78c6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2b0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x78b1 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x78e6 + .uleb128 0x11 + .4byte 0x509c + .uleb128 0x11 + .4byte 0x339d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x78d2 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x7905 + .uleb128 0x11 + .4byte 0x7905 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x7910 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x790b + .uleb128 0x24 + .4byte .LASF1774 + .uleb128 0x7 + .byte 0x8 + .4byte 0x30f + .uleb128 0x7 + .byte 0x8 + .4byte 0x78ec + .uleb128 0x10 + .4byte 0x7927 + .uleb128 0x11 + .4byte 0x5482 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x791c + .uleb128 0x15 + .4byte .LASF1775 + .byte 0x1e + .2byte 0x199 + .4byte 0x76cc + .uleb128 0x7 + .byte 0x8 + .4byte 0x76cc + .uleb128 0x1d + .4byte .LASF1776 + .byte 0xf8 + .byte 0x1e + .2byte 0x1c6 + .4byte 0x7aac + .uleb128 0x1b + .4byte .LASF1777 + .byte 0x1e + .2byte 0x1c7 + .4byte 0x284 + .byte 0 + .uleb128 0x1b + .4byte .LASF1778 + .byte 0x1e + .2byte 0x1c8 + .4byte 0xc6 + .byte 0x4 + .uleb128 0x1b + .4byte .LASF1779 + .byte 0x1e + .2byte 0x1c9 + .4byte 0x1c7f + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1780 + .byte 0x1e + .2byte 0x1ca + .4byte 0x20e7 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1781 + .byte 0x1e + .2byte 0x1cb + .4byte 0x2464 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1782 + .byte 0x1e + .2byte 0x1cc + .4byte 0x458 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1783 + .byte 0x1e + .2byte 0x1cd + .4byte 0x458 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1784 + .byte 0x1e + .2byte 0x1ce + .4byte 0xc6 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1785 + .byte 0x1e + .2byte 0x1cf + .4byte 0x2b0 + .byte 0x4c + .uleb128 0x1b + .4byte .LASF1786 + .byte 0x1e + .2byte 0x1d1 + .4byte 0x3a7 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1787 + .byte 0x1e + .2byte 0x1d3 + .4byte 0x7aac + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1788 + .byte 0x1e + .2byte 0x1d4 + .4byte 0x6d + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1789 + .byte 0x1e + .2byte 0x1d5 + .4byte 0x110 + .byte 0x6c + .uleb128 0x1b + .4byte .LASF1790 + .byte 0x1e + .2byte 0x1d6 + .4byte 0x7ab7 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1791 + .byte 0x1e + .2byte 0x1d8 + .4byte 0x6d + .byte 0x78 + .uleb128 0x1b + .4byte .LASF1792 + .byte 0x1e + .2byte 0x1d9 + .4byte 0xc6 + .byte 0x7c + .uleb128 0x1b + .4byte .LASF1793 + .byte 0x1e + .2byte 0x1da + .4byte 0x7ac2 + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1794 + .byte 0x1e + .2byte 0x1db + .4byte 0x48a2 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF1795 + .byte 0x1e + .2byte 0x1dc + .4byte 0x478c + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1796 + .byte 0x1e + .2byte 0x1dd + .4byte 0x3a7 + .byte 0x98 + .uleb128 0x1b + .4byte .LASF1797 + .byte 0x1e + .2byte 0x1e4 + .4byte 0x29 + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF1798 + .byte 0x1e + .2byte 0x1e7 + .4byte 0xc6 + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF1799 + .byte 0x1e + .2byte 0x1e9 + .4byte 0x2464 + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x1eb + .4byte 0x15a + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x1ec + .4byte 0x15a + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x1e + .2byte 0x1ed + .4byte 0x15a + .byte 0xe8 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x1e + .2byte 0x1ee + .4byte 0x15a + .byte 0xf0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x793f + .uleb128 0x24 + .4byte .LASF1800 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7ab2 + .uleb128 0x24 + .4byte .LASF1801 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7abd + .uleb128 0x3c + .byte 0x4 + .byte 0x1e + .2byte 0x280 + .4byte 0x7aea + .uleb128 0x3e + .4byte .LASF1802 + .byte 0x1e + .2byte 0x281 + .4byte 0x74 + .uleb128 0x3e + .4byte .LASF1803 + .byte 0x1e + .2byte 0x282 + .4byte 0x6d + .byte 0 + .uleb128 0x3c + .byte 0x10 + .byte 0x1e + .2byte 0x2a7 + .4byte 0x7b0c + .uleb128 0x3e + .4byte .LASF1804 + .byte 0x1e + .2byte 0x2a8 + .4byte 0x3d2 + .uleb128 0x3e + .4byte .LASF1805 + .byte 0x1e + .2byte 0x2a9 + .4byte 0x41c + .byte 0 + .uleb128 0x3c + .byte 0x8 + .byte 0x1e + .2byte 0x2b7 + .4byte 0x7b52 + .uleb128 0x3e + .4byte .LASF1806 + .byte 0x1e + .2byte 0x2b8 + .4byte 0x4881 + .uleb128 0x3e + .4byte .LASF1807 + .byte 0x1e + .2byte 0x2b9 + .4byte 0x7aac + .uleb128 0x3e + .4byte .LASF1808 + .byte 0x1e + .2byte 0x2ba + .4byte 0x7b57 + .uleb128 0x3e + .4byte .LASF1809 + .byte 0x1e + .2byte 0x2bb + .4byte 0x21e + .uleb128 0x3e + .4byte .LASF1810 + .byte 0x1e + .2byte 0x2bc + .4byte 0x6d + .byte 0 + .uleb128 0x24 + .4byte .LASF1811 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7b52 + .uleb128 0x24 + .4byte .LASF1812 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7b5d + .uleb128 0x1a + .4byte .LASF1813 + .2byte 0x100 + .byte 0x1e + .2byte 0x73e + .4byte 0x7cd6 + .uleb128 0x1b + .4byte .LASF1814 + .byte 0x1e + .2byte 0x73f + .4byte 0x8b1d + .byte 0 + .uleb128 0x1b + .4byte .LASF1815 + .byte 0x1e + .2byte 0x740 + .4byte 0x8b42 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1816 + .byte 0x1e + .2byte 0x741 + .4byte 0x8b5c + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1817 + .byte 0x1e + .2byte 0x742 + .4byte 0x8b7b + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1818 + .byte 0x1e + .2byte 0x743 + .4byte 0x8b95 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1819 + .byte 0x1e + .2byte 0x745 + .4byte 0x8bb4 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1820 + .byte 0x1e + .2byte 0x747 + .4byte 0x8bd8 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1821 + .byte 0x1e + .2byte 0x748 + .4byte 0x8bf7 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1822 + .byte 0x1e + .2byte 0x749 + .4byte 0x8c11 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1823 + .byte 0x1e + .2byte 0x74a + .4byte 0x8c30 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1824 + .byte 0x1e + .2byte 0x74b + .4byte 0x8c4f + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1825 + .byte 0x1e + .2byte 0x74c + .4byte 0x8c11 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1826 + .byte 0x1e + .2byte 0x74d + .4byte 0x8c73 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1827 + .byte 0x1e + .2byte 0x74e + .4byte 0x8c9c + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1828 + .byte 0x1e + .2byte 0x750 + .4byte 0x8cbc + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1829 + .byte 0x1e + .2byte 0x751 + .4byte 0x8cdb + .byte 0x78 + .uleb128 0x1b + .4byte .LASF1830 + .byte 0x1e + .2byte 0x752 + .4byte 0x8d05 + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1831 + .byte 0x1e + .2byte 0x753 + .4byte 0x8d24 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF1832 + .byte 0x1e + .2byte 0x754 + .4byte 0x8d4e + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1833 + .byte 0x1e + .2byte 0x756 + .4byte 0x8d73 + .byte 0x98 + .uleb128 0x1b + .4byte .LASF1834 + .byte 0x1e + .2byte 0x757 + .4byte 0x8d9c + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF1835 + .byte 0x1e + .2byte 0x75a + .4byte 0x8c4f + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF1836 + .byte 0x1e + .2byte 0x75b + .4byte 0x8dbb + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x75d + .4byte 0x15a + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x75e + .4byte 0x15a + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x1e + .2byte 0x75f + .4byte 0x15a + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x1e + .2byte 0x760 + .4byte 0x15a + .byte 0xd0 + .byte 0 + .uleb128 0x3 + .4byte 0x7b68 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7cd6 + .uleb128 0x24 + .4byte .LASF1837 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7ce1 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7c9 + .uleb128 0x1d + .4byte .LASF1838 + .byte 0x38 + .byte 0x1e + .2byte 0x452 + .4byte 0x7d34 + .uleb128 0x1b + .4byte .LASF1839 + .byte 0x1e + .2byte 0x453 + .4byte 0xe65 + .byte 0 + .uleb128 0x1b + .4byte .LASF1840 + .byte 0x1e + .2byte 0x454 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1841 + .byte 0x1e + .2byte 0x455 + .4byte 0x3a7 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1842 + .byte 0x1e + .2byte 0x456 + .4byte 0x3a7 + .byte 0x28 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7cf2 + .uleb128 0x24 + .4byte .LASF1843 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7d3a + .uleb128 0x24 + .4byte .LASF1844 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7d45 + .uleb128 0x24 + .4byte .LASF1845 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7d50 + .uleb128 0x1d + .4byte .LASF1846 + .byte 0x20 + .byte 0x1e + .2byte 0x376 + .4byte 0x7db7 + .uleb128 0x1b + .4byte .LASF116 + .byte 0x1e + .2byte 0x377 + .4byte 0xe85 + .byte 0 + .uleb128 0x2b + .string "pid" + .byte 0x1e + .2byte 0x378 + .4byte 0x4563 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF548 + .byte 0x1e + .2byte 0x379 + .4byte 0x22c6 + .byte 0x10 + .uleb128 0x2b + .string "uid" + .byte 0x1e + .2byte 0x37a + .4byte 0x240a + .byte 0x14 + .uleb128 0x1b + .4byte .LASF1072 + .byte 0x1e + .2byte 0x37a + .4byte 0x240a + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1847 + .byte 0x1e + .2byte 0x37b + .4byte 0xc6 + .byte 0x1c + .byte 0 + .uleb128 0x1d + .4byte .LASF1848 + .byte 0x20 + .byte 0x1e + .2byte 0x381 + .4byte 0x7e13 + .uleb128 0x1b + .4byte .LASF1849 + .byte 0x1e + .2byte 0x382 + .4byte 0x29 + .byte 0 + .uleb128 0x1b + .4byte .LASF957 + .byte 0x1e + .2byte 0x383 + .4byte 0x6d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1850 + .byte 0x1e + .2byte 0x384 + .4byte 0x6d + .byte 0xc + .uleb128 0x1b + .4byte .LASF1851 + .byte 0x1e + .2byte 0x387 + .4byte 0x6d + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1852 + .byte 0x1e + .2byte 0x388 + .4byte 0x6d + .byte 0x14 + .uleb128 0x1b + .4byte .LASF1853 + .byte 0x1e + .2byte 0x389 + .4byte 0x2d8 + .byte 0x18 + .byte 0 + .uleb128 0x3c + .byte 0x10 + .byte 0x1e + .2byte 0x396 + .4byte 0x7e35 + .uleb128 0x3e + .4byte .LASF1854 + .byte 0x1e + .2byte 0x397 + .4byte 0x2f10 + .uleb128 0x3e + .4byte .LASF1855 + .byte 0x1e + .2byte 0x398 + .4byte 0x41c + .byte 0 + .uleb128 0x13 + .4byte .LASF1856 + .byte 0x1e + .2byte 0x3f0 + .4byte 0x458 + .uleb128 0x1d + .4byte .LASF1857 + .byte 0x20 + .byte 0x1e + .2byte 0x3f4 + .4byte 0x7e83 + .uleb128 0x1b + .4byte .LASF1858 + .byte 0x1e + .2byte 0x3f5 + .4byte 0x7fca + .byte 0 + .uleb128 0x1b + .4byte .LASF1859 + .byte 0x1e + .2byte 0x3f6 + .4byte 0x7fdb + .byte 0x8 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x3f8 + .4byte 0x15a + .byte 0x10 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x3f9 + .4byte 0x15a + .byte 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0x7e41 + .uleb128 0x10 + .4byte 0x7e98 + .uleb128 0x11 + .4byte 0x7e98 + .uleb128 0x11 + .4byte 0x7e98 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7e9e + .uleb128 0x1d + .4byte .LASF1860 + .byte 0xe8 + .byte 0x1e + .2byte 0x42e + .4byte 0x7fca + .uleb128 0x1b + .4byte .LASF1861 + .byte 0x1e + .2byte 0x42f + .4byte 0x7e98 + .byte 0 + .uleb128 0x1b + .4byte .LASF1862 + .byte 0x1e + .2byte 0x430 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1863 + .byte 0x1e + .2byte 0x431 + .4byte 0x3eb + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1864 + .byte 0x1e + .2byte 0x432 + .4byte 0x3a7 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1865 + .byte 0x1e + .2byte 0x433 + .4byte 0x7e35 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1866 + .byte 0x1e + .2byte 0x434 + .4byte 0x6d + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1867 + .byte 0x1e + .2byte 0x435 + .4byte 0x96 + .byte 0x44 + .uleb128 0x1b + .4byte .LASF1868 + .byte 0x1e + .2byte 0x436 + .4byte 0x6d + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1869 + .byte 0x1e + .2byte 0x437 + .4byte 0xc6 + .byte 0x4c + .uleb128 0x1b + .4byte .LASF1870 + .byte 0x1e + .2byte 0x438 + .4byte 0x15bf + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1871 + .byte 0x1e + .2byte 0x439 + .4byte 0x5482 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1872 + .byte 0x1e + .2byte 0x43a + .4byte 0x2d8 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1873 + .byte 0x1e + .2byte 0x43b + .4byte 0x2d8 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF1874 + .byte 0x1e + .2byte 0x43d + .4byte 0x824a + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1875 + .byte 0x1e + .2byte 0x43f + .4byte 0x29 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF1876 + .byte 0x1e + .2byte 0x440 + .4byte 0x29 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1877 + .byte 0x1e + .2byte 0x442 + .4byte 0x8250 + .byte 0x98 + .uleb128 0x1b + .4byte .LASF1878 + .byte 0x1e + .2byte 0x443 + .4byte 0x8256 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF1879 + .byte 0x1e + .2byte 0x44b + .4byte 0x81c0 + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF1880 + .byte 0x1e + .2byte 0x44d + .4byte 0x3a7 + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x44e + .4byte 0x15a + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x44f + .4byte 0x15a + .byte 0xe0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7e88 + .uleb128 0x10 + .4byte 0x7fdb + .uleb128 0x11 + .4byte 0x7e98 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7fd0 + .uleb128 0x1d + .4byte .LASF1881 + .byte 0x58 + .byte 0x1e + .2byte 0x3fc + .4byte 0x807e + .uleb128 0x1b + .4byte .LASF1882 + .byte 0x1e + .2byte 0x3fd + .4byte 0x8097 + .byte 0 + .uleb128 0x1b + .4byte .LASF1883 + .byte 0x1e + .2byte 0x3fe + .4byte 0x80ac + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1884 + .byte 0x1e + .2byte 0x3ff + .4byte 0x80c1 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1885 + .byte 0x1e + .2byte 0x400 + .4byte 0x80d2 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1886 + .byte 0x1e + .2byte 0x401 + .4byte 0x7fdb + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1887 + .byte 0x1e + .2byte 0x402 + .4byte 0x80ec + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1888 + .byte 0x1e + .2byte 0x403 + .4byte 0x8101 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1889 + .byte 0x1e + .2byte 0x404 + .4byte 0x8120 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1890 + .byte 0x1e + .2byte 0x405 + .4byte 0x8136 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x407 + .4byte 0x15a + .byte 0x48 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x408 + .4byte 0x15a + .byte 0x50 + .byte 0 + .uleb128 0x3 + .4byte 0x7fe1 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8097 + .uleb128 0x11 + .4byte 0x7e98 + .uleb128 0x11 + .4byte 0x7e98 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8083 + .uleb128 0x14 + .4byte 0x29 + .4byte 0x80ac + .uleb128 0x11 + .4byte 0x7e98 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x809d + .uleb128 0x14 + .4byte 0x7e35 + .4byte 0x80c1 + .uleb128 0x11 + .4byte 0x7e35 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x80b2 + .uleb128 0x10 + .4byte 0x80d2 + .uleb128 0x11 + .4byte 0x7e35 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x80c7 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x80ec + .uleb128 0x11 + .4byte 0x7e98 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x80d8 + .uleb128 0x14 + .4byte 0x2b0 + .4byte 0x8101 + .uleb128 0x11 + .4byte 0x7e98 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x80f2 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8120 + .uleb128 0x11 + .4byte 0x7e98 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x3cc + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8107 + .uleb128 0x10 + .4byte 0x8136 + .uleb128 0x11 + .4byte 0x7e98 + .uleb128 0x11 + .4byte 0x7790 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8126 + .uleb128 0xd + .4byte .LASF1891 + .byte 0x20 + .byte 0x8a + .byte 0xa + .4byte 0x816d + .uleb128 0xe + .4byte .LASF577 + .byte 0x8a + .byte 0xb + .4byte 0x13f + .byte 0 + .uleb128 0xe + .4byte .LASF98 + .byte 0x8a + .byte 0xc + .4byte 0x8172 + .byte 0x8 + .uleb128 0xe + .4byte .LASF932 + .byte 0x8a + .byte 0xd + .4byte 0x3a7 + .byte 0x10 + .byte 0 + .uleb128 0x24 + .4byte .LASF1892 + .uleb128 0x7 + .byte 0x8 + .4byte 0x816d + .uleb128 0xd + .4byte .LASF1893 + .byte 0x8 + .byte 0x8a + .byte 0x11 + .4byte 0x8191 + .uleb128 0xe + .4byte .LASF98 + .byte 0x8a + .byte 0x12 + .4byte 0x8196 + .byte 0 + .byte 0 + .uleb128 0x24 + .4byte .LASF1894 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8191 + .uleb128 0x2e + .byte 0x18 + .byte 0x1e + .2byte 0x447 + .4byte 0x81c0 + .uleb128 0x1b + .4byte .LASF1821 + .byte 0x1e + .2byte 0x448 + .4byte 0x3a7 + .byte 0 + .uleb128 0x1b + .4byte .LASF577 + .byte 0x1e + .2byte 0x449 + .4byte 0xc6 + .byte 0x10 + .byte 0 + .uleb128 0x3c + .byte 0x20 + .byte 0x1e + .2byte 0x444 + .4byte 0x81ee + .uleb128 0x3e + .4byte .LASF1895 + .byte 0x1e + .2byte 0x445 + .4byte 0x813c + .uleb128 0x3e + .4byte .LASF1896 + .byte 0x1e + .2byte 0x446 + .4byte 0x8178 + .uleb128 0x3a + .string "afs" + .byte 0x1e + .2byte 0x44a + .4byte 0x819c + .byte 0 + .uleb128 0x1d + .4byte .LASF1897 + .byte 0x30 + .byte 0x1e + .2byte 0x523 + .4byte 0x824a + .uleb128 0x1b + .4byte .LASF1898 + .byte 0x1e + .2byte 0x524 + .4byte 0xe85 + .byte 0 + .uleb128 0x1b + .4byte .LASF1899 + .byte 0x1e + .2byte 0x525 + .4byte 0xc6 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1900 + .byte 0x1e + .2byte 0x526 + .4byte 0xc6 + .byte 0xc + .uleb128 0x1b + .4byte .LASF1901 + .byte 0x1e + .2byte 0x527 + .4byte 0x824a + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1902 + .byte 0x1e + .2byte 0x528 + .4byte 0x5482 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1903 + .byte 0x1e + .2byte 0x529 + .4byte 0x41c + .byte 0x20 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x81ee + .uleb128 0x7 + .byte 0x8 + .4byte 0x7e83 + .uleb128 0x7 + .byte 0x8 + .4byte 0x807e + .uleb128 0x1a + .4byte .LASF1904 + .2byte 0x1b8 + .byte 0x1e + .2byte 0x57f + .4byte 0x8292 + .uleb128 0x1b + .4byte .LASF1211 + .byte 0x1e + .2byte 0x580 + .4byte 0xc6 + .byte 0 + .uleb128 0x1b + .4byte .LASF1905 + .byte 0x1e + .2byte 0x581 + .4byte 0x15bf + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1363 + .byte 0x1e + .2byte 0x582 + .4byte 0x8292 + .byte 0x20 + .byte 0 + .uleb128 0x5 + .4byte 0x5be7 + .4byte 0x82a2 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x1d + .4byte .LASF1906 + .byte 0x68 + .byte 0x1e + .2byte 0x8ae + .4byte 0x83b4 + .uleb128 0x1b + .4byte .LASF265 + .byte 0x1e + .2byte 0x8af + .4byte 0x56 + .byte 0 + .uleb128 0x1b + .4byte .LASF1907 + .byte 0x1e + .2byte 0x8b0 + .4byte 0xc6 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1908 + .byte 0x1e + .2byte 0x8b6 + .4byte 0x8fe3 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1909 + .byte 0x1e + .2byte 0x8b8 + .4byte 0x900c + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1910 + .byte 0x1e + .2byte 0x8ba + .4byte 0x9017 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1911 + .byte 0x1e + .2byte 0x8bb + .4byte 0x8e37 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF98 + .byte 0x1e + .2byte 0x8bc + .4byte 0x74a1 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF64 + .byte 0x1e + .2byte 0x8bd + .4byte 0x83b4 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1912 + .byte 0x1e + .2byte 0x8be + .4byte 0x3d2 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1913 + .byte 0x1e + .2byte 0x8c0 + .4byte 0xe11 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1914 + .byte 0x1e + .2byte 0x8c1 + .4byte 0xe11 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1915 + .byte 0x1e + .2byte 0x8c2 + .4byte 0xe11 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1916 + .byte 0x1e + .2byte 0x8c3 + .4byte 0x901d + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1917 + .byte 0x1e + .2byte 0x8c5 + .4byte 0xe11 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1918 + .byte 0x1e + .2byte 0x8c6 + .4byte 0xe11 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1919 + .byte 0x1e + .2byte 0x8c7 + .4byte 0xe11 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x8c9 + .4byte 0x15a + .byte 0x48 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x8ca + .4byte 0x15a + .byte 0x50 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x1e + .2byte 0x8cb + .4byte 0x15a + .byte 0x58 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x1e + .2byte 0x8cc + .4byte 0x15a + .byte 0x60 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x82a2 + .uleb128 0x1a + .4byte .LASF1920 + .2byte 0x110 + .byte 0x1e + .2byte 0x791 + .4byte 0x8585 + .uleb128 0x1b + .4byte .LASF1921 + .byte 0x1e + .2byte 0x792 + .4byte 0x8dd0 + .byte 0 + .uleb128 0x1b + .4byte .LASF1922 + .byte 0x1e + .2byte 0x793 + .4byte 0x8de1 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1923 + .byte 0x1e + .2byte 0x795 + .4byte 0x8df7 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1924 + .byte 0x1e + .2byte 0x796 + .4byte 0x8e11 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF1925 + .byte 0x1e + .2byte 0x797 + .4byte 0x8e26 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF1926 + .byte 0x1e + .2byte 0x798 + .4byte 0x8de1 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF1927 + .byte 0x1e + .2byte 0x799 + .4byte 0x8e37 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF1928 + .byte 0x1e + .2byte 0x79a + .4byte 0x6c63 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF1929 + .byte 0x1e + .2byte 0x79b + .4byte 0x8e4c + .byte 0x40 + .uleb128 0x1b + .4byte .LASF1930 + .byte 0x1e + .2byte 0x79c + .4byte 0x8e4c + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1931 + .byte 0x1e + .2byte 0x79d + .4byte 0x8e4c + .byte 0x50 + .uleb128 0x1b + .4byte .LASF1932 + .byte 0x1e + .2byte 0x79e + .4byte 0x8e4c + .byte 0x58 + .uleb128 0x1b + .4byte .LASF1933 + .byte 0x1e + .2byte 0x79f + .4byte 0x8e71 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF1934 + .byte 0x1e + .2byte 0x7a0 + .4byte 0x8e90 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF1935 + .byte 0x1e + .2byte 0x7a1 + .4byte 0x8eb4 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF1936 + .byte 0x1e + .2byte 0x7a2 + .4byte 0x3166 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF1937 + .byte 0x1e + .2byte 0x7a3 + .4byte 0x8eca + .byte 0x80 + .uleb128 0x1b + .4byte .LASF1938 + .byte 0x1e + .2byte 0x7a4 + .4byte 0x8e37 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF1939 + .byte 0x1e + .2byte 0x7a5 + .4byte 0x8ee0 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF1940 + .byte 0x1e + .2byte 0x7a7 + .4byte 0x8efa + .byte 0x98 + .uleb128 0x1b + .4byte .LASF1941 + .byte 0x1e + .2byte 0x7a8 + .4byte 0x8f19 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF1942 + .byte 0x1e + .2byte 0x7a9 + .4byte 0x8efa + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF1943 + .byte 0x1e + .2byte 0x7aa + .4byte 0x8efa + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF1944 + .byte 0x1e + .2byte 0x7ab + .4byte 0x8efa + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF1945 + .byte 0x1e + .2byte 0x7ad + .4byte 0x8f42 + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF1946 + .byte 0x1e + .2byte 0x7ae + .4byte 0x8f6b + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF1947 + .byte 0x1e + .2byte 0x7af + .4byte 0x8f86 + .byte 0xd0 + .uleb128 0x1b + .4byte .LASF1948 + .byte 0x1e + .2byte 0x7b1 + .4byte 0x8fa5 + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF1949 + .byte 0x1e + .2byte 0x7b2 + .4byte 0x8fbf + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF1950 + .byte 0x1e + .2byte 0x7b4 + .4byte 0x8fbf + .byte 0xe8 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x1e + .2byte 0x7b7 + .4byte 0x15a + .byte 0xf0 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x1e + .2byte 0x7b8 + .4byte 0x15a + .byte 0xf8 + .uleb128 0x1c + .4byte .LASF132 + .byte 0x1e + .2byte 0x7b9 + .4byte 0x15a + .2byte 0x100 + .uleb128 0x1c + .4byte .LASF133 + .byte 0x1e + .2byte 0x7ba + .4byte 0x15a + .2byte 0x108 + .byte 0 + .uleb128 0x3 + .4byte 0x83ba + .uleb128 0x7 + .byte 0x8 + .4byte 0x8585 + .uleb128 0x7 + .byte 0x8 + .4byte 0x6d55 + .uleb128 0x7 + .byte 0x8 + .4byte 0x70ad + .uleb128 0x24 + .4byte .LASF1951 + .uleb128 0x3 + .4byte 0x859c + .uleb128 0x7 + .byte 0x8 + .4byte 0x85a1 + .uleb128 0x24 + .4byte .LASF1952 + .uleb128 0x3 + .4byte 0x85ac + .uleb128 0x7 + .byte 0x8 + .4byte 0x85bc + .uleb128 0x7 + .byte 0x8 + .4byte 0x85b1 + .uleb128 0x24 + .4byte .LASF1953 + .uleb128 0x3 + .4byte 0x85c2 + .uleb128 0x7 + .byte 0x8 + .4byte 0x85c7 + .uleb128 0x32 + .string "key" + .byte 0xd0 + .byte 0x8b + .byte 0x9b + .4byte 0x869f + .uleb128 0xe + .4byte .LASF579 + .byte 0x8b + .byte 0x9c + .4byte 0x32c6 + .byte 0 + .uleb128 0xe + .4byte .LASF1954 + .byte 0x8b + .byte 0x9d + .4byte 0x92e9 + .byte 0x4 + .uleb128 0x23 + .4byte 0x93e4 + .byte 0x8 + .uleb128 0x20 + .string "sem" + .byte 0x8b + .byte 0xa2 + .4byte 0x4d5c + .byte 0x20 + .uleb128 0xe + .4byte .LASF1086 + .byte 0x8b + .byte 0xa3 + .4byte 0x949b + .byte 0x50 + .uleb128 0xe + .4byte .LASF746 + .byte 0x8b + .byte 0xa4 + .4byte 0x458 + .byte 0x58 + .uleb128 0x23 + .4byte 0x9403 + .byte 0x60 + .uleb128 0xe + .4byte .LASF1955 + .byte 0x8b + .byte 0xa9 + .4byte 0x9d2 + .byte 0x68 + .uleb128 0x20 + .string "uid" + .byte 0x8b + .byte 0xaa + .4byte 0x240a + .byte 0x70 + .uleb128 0x20 + .string "gid" + .byte 0x8b + .byte 0xab + .4byte 0x242a + .byte 0x74 + .uleb128 0xe + .4byte .LASF1956 + .byte 0x8b + .byte 0xac + .4byte 0x92f4 + .byte 0x78 + .uleb128 0xe + .4byte .LASF1957 + .byte 0x8b + .byte 0xad + .4byte 0xb4 + .byte 0x7c + .uleb128 0xe + .4byte .LASF1958 + .byte 0x8b + .byte 0xae + .4byte 0xb4 + .byte 0x7e + .uleb128 0xe + .4byte .LASF577 + .byte 0x8b + .byte 0xb2 + .4byte 0xa2 + .byte 0x80 + .uleb128 0xe + .4byte .LASF171 + .byte 0x8b + .byte 0xb9 + .4byte 0x29 + .byte 0x88 + .uleb128 0x23 + .4byte 0x9443 + .byte 0x90 + .uleb128 0x23 + .4byte 0x947d + .byte 0xa8 + .uleb128 0xe + .4byte .LASF1959 + .byte 0x8b + .byte 0xea + .4byte 0x94a1 + .byte 0xc8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x85d2 + .uleb128 0x24 + .4byte .LASF1960 + .uleb128 0x3 + .4byte 0x86a5 + .uleb128 0x7 + .byte 0x8 + .4byte 0x86aa + .uleb128 0x24 + .4byte .LASF1961 + .uleb128 0x7 + .byte 0x8 + .4byte 0x86b5 + .uleb128 0x24 + .4byte .LASF1962 + .uleb128 0x7 + .byte 0x8 + .4byte 0x86c0 + .uleb128 0x5 + .4byte 0x61 + .4byte 0x86db + .uleb128 0x6 + .4byte 0x4f + .byte 0x1f + .byte 0 + .uleb128 0x1d + .4byte .LASF1963 + .byte 0x18 + .byte 0x1e + .2byte 0x6c7 + .4byte 0x871d + .uleb128 0x1b + .4byte .LASF1964 + .byte 0x1e + .2byte 0x6c8 + .4byte 0x6d + .byte 0 + .uleb128 0x1b + .4byte .LASF1965 + .byte 0x1e + .2byte 0x6c9 + .4byte 0x6d + .byte 0x4 + .uleb128 0x1b + .4byte .LASF1966 + .byte 0x1e + .2byte 0x6ca + .4byte 0x6d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF1967 + .byte 0x1e + .2byte 0x6cb + .4byte 0x871d + .byte 0x10 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5ac8 + .uleb128 0x13 + .4byte .LASF1968 + .byte 0x1e + .2byte 0x6e9 + .4byte 0x872f + .uleb128 0x7 + .byte 0x8 + .4byte 0x8735 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x875d + .uleb128 0x11 + .4byte 0x875d + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x15a + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8763 + .uleb128 0x1d + .4byte .LASF1969 + .byte 0x10 + .byte 0x1e + .2byte 0x6ec + .4byte 0x878b + .uleb128 0x1b + .4byte .LASF1970 + .byte 0x1e + .2byte 0x6ed + .4byte 0x8723 + .byte 0 + .uleb128 0x2b + .string "pos" + .byte 0x1e + .2byte 0x6ee + .4byte 0x2d8 + .byte 0x8 + .byte 0 + .uleb128 0x14 + .4byte 0x2d8 + .4byte 0x87a4 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x878b + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x87c8 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x21e + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x87c8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2d8 + .uleb128 0x7 + .byte 0x8 + .4byte 0x87aa + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x87f2 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x87c8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x87d4 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x880c + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x875d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x87f8 + .uleb128 0x14 + .4byte 0x244 + .4byte 0x8826 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x8826 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x882c + .uleb128 0x24 + .4byte .LASF1971 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8812 + .uleb128 0x14 + .4byte 0x199 + .4byte 0x8850 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8837 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x886a + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x3be9 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8856 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8884 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x5482 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8870 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x889e + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x7e35 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x888a + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x88c2 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x88a4 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x88e1 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x88c8 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8900 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x7e98 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x88e7 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x892e + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x87c8 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8906 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8943 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8934 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x896c + .uleb128 0x11 + .4byte 0x4881 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x87c8 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8949 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x8995 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x87c8 + .uleb128 0x11 + .4byte 0x4881 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8972 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x89b9 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x199 + .uleb128 0x11 + .4byte 0x89b9 + .uleb128 0x11 + .4byte 0x7790 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x7e98 + .uleb128 0x7 + .byte 0x8 + .4byte 0x899b + .uleb128 0x14 + .4byte 0x199 + .4byte 0x89e3 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x2d8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x89c5 + .uleb128 0x10 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x5482 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x89ff + .uleb128 0xd + .4byte .LASF1972 + .byte 0x80 + .byte 0x8c + .byte 0x10 + .4byte 0x8aa7 + .uleb128 0x20 + .string "buf" + .byte 0x8c + .byte 0x11 + .4byte 0x21e + .byte 0 + .uleb128 0xe + .4byte .LASF957 + .byte 0x8c + .byte 0x12 + .4byte 0x2e3 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1973 + .byte 0x8c + .byte 0x13 + .4byte 0x2e3 + .byte 0x10 + .uleb128 0xe + .4byte .LASF383 + .byte 0x8c + .byte 0x14 + .4byte 0x2e3 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1974 + .byte 0x8c + .byte 0x15 + .4byte 0x2e3 + .byte 0x20 + .uleb128 0xe + .4byte .LASF850 + .byte 0x8c + .byte 0x16 + .4byte 0x2d8 + .byte 0x28 + .uleb128 0xe + .4byte .LASF1975 + .byte 0x8c + .byte 0x17 + .4byte 0x2d8 + .byte 0x30 + .uleb128 0xe + .4byte .LASF1693 + .byte 0x8c + .byte 0x18 + .4byte 0x15a + .byte 0x38 + .uleb128 0xe + .4byte .LASF116 + .byte 0x8c + .byte 0x19 + .4byte 0x2464 + .byte 0x40 + .uleb128 0x20 + .string "op" + .byte 0x8c + .byte 0x1a + .4byte 0x95dc + .byte 0x60 + .uleb128 0xe + .4byte .LASF1976 + .byte 0x8c + .byte 0x1b + .4byte 0xc6 + .byte 0x68 + .uleb128 0xe + .4byte .LASF1241 + .byte 0x8c + .byte 0x1c + .4byte 0x95e2 + .byte 0x70 + .uleb128 0xe + .4byte .LASF360 + .byte 0x8c + .byte 0x1d + .4byte 0x458 + .byte 0x78 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x89e9 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x8ad5 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8aad + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8afe + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x15a + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8adb + .uleb128 0x14 + .4byte 0x1995 + .4byte 0x8b1d + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8b04 + .uleb128 0x14 + .4byte 0x56 + .4byte 0x8b3c + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x8b3c + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5c30 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8b23 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8b5c + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8b48 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8b7b + .uleb128 0x11 + .4byte 0x225e + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8b62 + .uleb128 0x14 + .4byte 0x7b62 + .4byte 0x8b95 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8b81 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8bb4 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x21e + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8b9b + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8bd8 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x28f + .uleb128 0x11 + .4byte 0x2b0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8bba + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8bf7 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8bde + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8c11 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8bfd + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8c30 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x56 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8c17 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8c4f + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x28f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8c36 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8c73 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x28f + .uleb128 0x11 + .4byte 0x284 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8c55 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8c9c + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8c79 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8cb6 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x8cb6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x5ec4 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8ca2 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8cdb + .uleb128 0x11 + .4byte 0x225e + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x8cb6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8cc2 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8cff + .uleb128 0x11 + .4byte 0x2112 + .uleb128 0x11 + .4byte 0x8cff + .uleb128 0x11 + .4byte 0x13f + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x49c0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8ce1 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x8d24 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x21e + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8d0b + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8d48 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x8d48 + .uleb128 0x11 + .4byte 0x15a + .uleb128 0x11 + .4byte 0x15a + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x86db + .uleb128 0x7 + .byte 0x8 + .4byte 0x8d2a + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8d6d + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x8d6d + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa27 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8d54 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8d9c + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x28f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8d79 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8dbb + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x7b62 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8da2 + .uleb128 0x14 + .4byte 0x1c7f + .4byte 0x8dd0 + .uleb128 0x11 + .4byte 0x20e7 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8dc1 + .uleb128 0x10 + .4byte 0x8de1 + .uleb128 0x11 + .4byte 0x1c7f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8dd6 + .uleb128 0x10 + .4byte 0x8df7 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8de7 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8e11 + .uleb128 0x11 + .4byte 0x1c7f + .uleb128 0x11 + .4byte 0x76e5 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8dfd + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8e26 + .uleb128 0x11 + .4byte 0x1c7f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8e17 + .uleb128 0x10 + .4byte 0x8e37 + .uleb128 0x11 + .4byte 0x20e7 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8e2c + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8e4c + .uleb128 0x11 + .4byte 0x20e7 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8e3d + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8e66 + .uleb128 0x11 + .4byte 0x1995 + .uleb128 0x11 + .4byte 0x8e66 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8e6c + .uleb128 0x24 + .4byte .LASF1977 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8e52 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8e90 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x45a4 + .uleb128 0x11 + .4byte 0x21e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8e77 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8eb4 + .uleb128 0x11 + .4byte 0x225e + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x45a4 + .uleb128 0x11 + .4byte 0x21e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8e96 + .uleb128 0x10 + .4byte 0x8eca + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8eba + .uleb128 0x10 + .4byte 0x8ee0 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8ed0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8efa + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x1995 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8ee6 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8f19 + .uleb128 0x11 + .4byte 0x225e + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x1995 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8f00 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x8f42 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x21e + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x2d8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8f1f + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x8f6b + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x2d8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8f48 + .uleb128 0x14 + .4byte 0x8f80 + .4byte 0x8f80 + .uleb128 0x11 + .4byte 0x1c7f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x68de + .uleb128 0x7 + .byte 0x8 + .4byte 0x8f71 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x8fa5 + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x330 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8f8c + .uleb128 0x14 + .4byte 0x199 + .4byte 0x8fbf + .uleb128 0x11 + .4byte 0x20e7 + .uleb128 0x11 + .4byte 0x4b68 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8fab + .uleb128 0x14 + .4byte 0x1995 + .4byte 0x8fe3 + .uleb128 0x11 + .4byte 0x83b4 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8fc5 + .uleb128 0x14 + .4byte 0x1995 + .4byte 0x900c + .uleb128 0x11 + .4byte 0x225e + .uleb128 0x11 + .4byte 0x83b4 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8fe9 + .uleb128 0x16 + .4byte 0x458 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9012 + .uleb128 0x5 + .4byte 0xe11 + .4byte 0x902d + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0xd + .4byte .LASF1978 + .byte 0x60 + .byte 0x8d + .byte 0x42 + .4byte 0x9108 + .uleb128 0xe + .4byte .LASF265 + .byte 0x8d + .byte 0x43 + .4byte 0x56 + .byte 0 + .uleb128 0xe + .4byte .LASF361 + .byte 0x8d + .byte 0x44 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0xe + .4byte .LASF639 + .byte 0x8d + .byte 0x45 + .4byte 0x9114 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1979 + .byte 0x8d + .byte 0x46 + .4byte 0xa002 + .byte 0x20 + .uleb128 0xe + .4byte .LASF1980 + .byte 0x8d + .byte 0x47 + .4byte 0xa08d + .byte 0x28 + .uleb128 0x20 + .string "sd" + .byte 0x8d + .byte 0x48 + .4byte 0x98e7 + .byte 0x30 + .uleb128 0xe + .4byte .LASF1981 + .byte 0x8d + .byte 0x49 + .4byte 0x9f66 + .byte 0x38 + .uleb128 0x35 + .4byte .LASF1982 + .byte 0x8d + .byte 0x4d + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1f + .byte 0x3c + .uleb128 0x35 + .4byte .LASF1983 + .byte 0x8d + .byte 0x4e + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1e + .byte 0x3c + .uleb128 0x35 + .4byte .LASF1984 + .byte 0x8d + .byte 0x4f + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1d + .byte 0x3c + .uleb128 0x35 + .4byte .LASF1985 + .byte 0x8d + .byte 0x50 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1c + .byte 0x3c + .uleb128 0x35 + .4byte .LASF1986 + .byte 0x8d + .byte 0x51 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1b + .byte 0x3c + .uleb128 0xe + .4byte .LASF130 + .byte 0x8d + .byte 0x53 + .4byte 0x15a + .byte 0x40 + .uleb128 0xe + .4byte .LASF131 + .byte 0x8d + .byte 0x54 + .4byte 0x15a + .byte 0x48 + .uleb128 0xe + .4byte .LASF132 + .byte 0x8d + .byte 0x55 + .4byte 0x15a + .byte 0x50 + .uleb128 0xe + .4byte .LASF133 + .byte 0x8d + .byte 0x56 + .4byte 0x15a + .byte 0x58 + .byte 0 + .uleb128 0x15 + .4byte .LASF1987 + .byte 0x1e + .2byte 0x93d + .4byte 0x9114 + .uleb128 0x7 + .byte 0x8 + .4byte 0x902d + .uleb128 0x15 + .4byte .LASF1988 + .byte 0x1e + .2byte 0xa20 + .4byte 0x5174 + .uleb128 0x15 + .4byte .LASF1989 + .byte 0x1e + .2byte 0xa38 + .4byte 0x20e7 + .uleb128 0x15 + .4byte .LASF1990 + .byte 0x1e + .2byte 0xa5d + .4byte 0x7c9 + .uleb128 0x15 + .4byte .LASF1991 + .byte 0x1e + .2byte 0xa5e + .4byte 0x7c9 + .uleb128 0x5 + .4byte 0x5c + .4byte 0x915a + .uleb128 0x6 + .4byte 0x4f + .byte 0x8 + .byte 0 + .uleb128 0x3 + .4byte 0x914a + .uleb128 0x43 + .4byte .LASF3022 + .byte 0x1e + .2byte 0xba4 + .4byte 0x915a + .uleb128 0x15 + .4byte .LASF1992 + .byte 0x1e + .2byte 0xc7f + .4byte 0x7c9 + .uleb128 0x15 + .4byte .LASF1993 + .byte 0x1e + .2byte 0xc8b + .4byte 0x7cd6 + .uleb128 0x15 + .4byte .LASF1994 + .byte 0x1e + .2byte 0xc9c + .4byte 0x7cd6 + .uleb128 0x15 + .4byte .LASF1995 + .byte 0x1e + .2byte 0xcee + .4byte 0x1d68 + .uleb128 0x15 + .4byte .LASF1996 + .byte 0x1e + .2byte 0xcf2 + .4byte 0x7c9 + .uleb128 0x15 + .4byte .LASF1997 + .byte 0x1e + .2byte 0xcf3 + .4byte 0x7cd6 + .uleb128 0x7 + .byte 0x8 + .4byte 0x2e3 + .uleb128 0x8 + .4byte .LASF1998 + .byte 0x8e + .byte 0x28 + .4byte 0x91c4 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x91e7 + .uleb128 0x11 + .4byte 0x91e7 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x91b3 + .uleb128 0x11 + .4byte 0x87c8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x91ed + .uleb128 0xd + .4byte .LASF1999 + .byte 0x40 + .byte 0x8e + .byte 0x71 + .4byte 0x9266 + .uleb128 0xe + .4byte .LASF2000 + .byte 0x8e + .byte 0x73 + .4byte 0x56 + .byte 0 + .uleb128 0xe + .4byte .LASF793 + .byte 0x8e + .byte 0x74 + .4byte 0x458 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2001 + .byte 0x8e + .byte 0x75 + .4byte 0xc6 + .byte 0x10 + .uleb128 0xe + .4byte .LASF874 + .byte 0x8e + .byte 0x76 + .4byte 0x28f + .byte 0x14 + .uleb128 0xe + .4byte .LASF2002 + .byte 0x8e + .byte 0x77 + .4byte 0x91e7 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1998 + .byte 0x8e + .byte 0x78 + .4byte 0x928b + .byte 0x20 + .uleb128 0xe + .4byte .LASF106 + .byte 0x8e + .byte 0x79 + .4byte 0x9291 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2003 + .byte 0x8e + .byte 0x7a + .4byte 0x458 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2004 + .byte 0x8e + .byte 0x7b + .4byte 0x458 + .byte 0x38 + .byte 0 + .uleb128 0xd + .4byte .LASF2005 + .byte 0x20 + .byte 0x8e + .byte 0x5f + .4byte 0x928b + .uleb128 0xe + .4byte .LASF2006 + .byte 0x8e + .byte 0x60 + .4byte 0x37c + .byte 0 + .uleb128 0xe + .4byte .LASF1069 + .byte 0x8e + .byte 0x61 + .4byte 0x15bf + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x91b9 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9266 + .uleb128 0x7 + .byte 0x8 + .4byte 0x240a + .uleb128 0x7 + .byte 0x8 + .4byte 0x242a + .uleb128 0x5 + .4byte 0x91ed + .4byte 0x92ae + .uleb128 0x18 + .byte 0 + .uleb128 0x19 + .4byte .LASF2007 + .byte 0x8e + .byte 0xca + .4byte 0x92a3 + .uleb128 0xd + .4byte .LASF2008 + .byte 0x10 + .byte 0x8f + .byte 0x1a + .4byte 0x92de + .uleb128 0xe + .4byte .LASF1160 + .byte 0x8f + .byte 0x1b + .4byte 0x92e3 + .byte 0 + .uleb128 0xe + .4byte .LASF2009 + .byte 0x8f + .byte 0x1c + .4byte 0x29 + .byte 0x8 + .byte 0 + .uleb128 0x24 + .4byte .LASF2010 + .uleb128 0x7 + .byte 0x8 + .4byte 0x92de + .uleb128 0x8 + .4byte .LASF2011 + .byte 0x8b + .byte 0x21 + .4byte 0x2f9 + .uleb128 0x8 + .4byte .LASF2012 + .byte 0x8b + .byte 0x24 + .4byte 0x304 + .uleb128 0xd + .4byte .LASF2013 + .byte 0x18 + .byte 0x8b + .byte 0x58 + .4byte 0x9330 + .uleb128 0xe + .4byte .LASF193 + .byte 0x8b + .byte 0x59 + .4byte 0x933a + .byte 0 + .uleb128 0xe + .4byte .LASF2014 + .byte 0x8b + .byte 0x5a + .4byte 0x56 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2015 + .byte 0x8b + .byte 0x5b + .4byte 0x2e3 + .byte 0x10 + .byte 0 + .uleb128 0x24 + .4byte .LASF2016 + .uleb128 0x3 + .4byte 0x9330 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9330 + .uleb128 0x36 + .4byte .LASF2017 + .byte 0x20 + .byte 0x8b + .byte 0x5e + .4byte 0x9363 + .uleb128 0x22 + .4byte .LASF2018 + .byte 0x8b + .byte 0x5f + .4byte 0x458 + .uleb128 0x22 + .4byte .LASF793 + .byte 0x8b + .byte 0x60 + .4byte 0x9368 + .byte 0 + .uleb128 0x3 + .4byte 0x9340 + .uleb128 0x5 + .4byte 0x458 + .4byte 0x9378 + .uleb128 0x6 + .4byte 0x4f + .byte 0x3 + .byte 0 + .uleb128 0x8 + .4byte .LASF2019 + .byte 0x8b + .byte 0x83 + .4byte 0x9383 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9389 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x93a7 + .uleb128 0x11 + .4byte 0x869f + .uleb128 0x11 + .4byte 0x93a7 + .uleb128 0x11 + .4byte 0x93ad + .uleb128 0x11 + .4byte 0x869f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9335 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9363 + .uleb128 0xd + .4byte .LASF2020 + .byte 0x18 + .byte 0x8b + .byte 0x88 + .4byte 0x93e4 + .uleb128 0xe + .4byte .LASF2021 + .byte 0x8b + .byte 0x89 + .4byte 0x9378 + .byte 0 + .uleb128 0x20 + .string "key" + .byte 0x8b + .byte 0x8a + .4byte 0x869f + .byte 0x8 + .uleb128 0xe + .4byte .LASF2022 + .byte 0x8b + .byte 0x8b + .4byte 0x933a + .byte 0x10 + .byte 0 + .uleb128 0x21 + .byte 0x18 + .byte 0x8b + .byte 0x9e + .4byte 0x9403 + .uleb128 0x22 + .4byte .LASF2023 + .byte 0x8b + .byte 0x9f + .4byte 0x3a7 + .uleb128 0x22 + .4byte .LASF2024 + .byte 0x8b + .byte 0xa0 + .4byte 0x3416 + .byte 0 + .uleb128 0x21 + .byte 0x8 + .byte 0x8b + .byte 0xa5 + .4byte 0x9422 + .uleb128 0x22 + .4byte .LASF2025 + .byte 0x8b + .byte 0xa6 + .4byte 0x9d2 + .uleb128 0x22 + .4byte .LASF2026 + .byte 0x8b + .byte 0xa7 + .4byte 0x9d2 + .byte 0 + .uleb128 0xf + .byte 0x10 + .byte 0x8b + .byte 0xcc + .4byte 0x9443 + .uleb128 0xe + .4byte .LASF193 + .byte 0x8b + .byte 0xcd + .4byte 0x933a + .byte 0 + .uleb128 0xe + .4byte .LASF2014 + .byte 0x8b + .byte 0xce + .4byte 0x21e + .byte 0x8 + .byte 0 + .uleb128 0x21 + .byte 0x18 + .byte 0x8b + .byte 0xca + .4byte 0x945c + .uleb128 0x22 + .4byte .LASF2027 + .byte 0x8b + .byte 0xcb + .4byte 0x92ff + .uleb128 0x29 + .4byte 0x9422 + .byte 0 + .uleb128 0xf + .byte 0x20 + .byte 0x8b + .byte 0xd8 + .4byte 0x947d + .uleb128 0xe + .4byte .LASF2028 + .byte 0x8b + .byte 0xda + .4byte 0x3a7 + .byte 0 + .uleb128 0xe + .4byte .LASF2029 + .byte 0x8b + .byte 0xdb + .4byte 0x92b9 + .byte 0x10 + .byte 0 + .uleb128 0x21 + .byte 0x20 + .byte 0x8b + .byte 0xd6 + .4byte 0x9496 + .uleb128 0x22 + .4byte .LASF2030 + .byte 0x8b + .byte 0xd7 + .4byte 0x9340 + .uleb128 0x29 + .4byte 0x945c + .byte 0 + .uleb128 0x24 + .4byte .LASF2031 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9496 + .uleb128 0x7 + .byte 0x8 + .4byte 0x93b3 + .uleb128 0x15 + .4byte .LASF2032 + .byte 0x8b + .2byte 0x190 + .4byte 0x92a3 + .uleb128 0xd + .4byte .LASF2033 + .byte 0x28 + .byte 0x90 + .byte 0xf + .4byte 0x9514 + .uleb128 0xe + .4byte .LASF116 + .byte 0x90 + .byte 0x10 + .4byte 0xe33 + .byte 0 + .uleb128 0xe + .4byte .LASF2034 + .byte 0x90 + .byte 0x12 + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF2035 + .byte 0x90 + .byte 0x13 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2036 + .byte 0x90 + .byte 0x14 + .4byte 0xc6 + .byte 0xc + .uleb128 0xe + .4byte .LASF2037 + .byte 0x90 + .byte 0x15 + .4byte 0xc6 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2038 + .byte 0x90 + .byte 0x16 + .4byte 0x29 + .byte 0x18 + .uleb128 0xe + .4byte .LASF171 + .byte 0x90 + .byte 0x17 + .4byte 0x29 + .byte 0x20 + .byte 0 + .uleb128 0x19 + .4byte .LASF2039 + .byte 0x90 + .byte 0x4a + .4byte 0x94b3 + .uleb128 0x19 + .4byte .LASF2040 + .byte 0x62 + .byte 0x3b + .4byte 0x3ac8 + .uleb128 0xd + .4byte .LASF1088 + .byte 0x8 + .byte 0x68 + .byte 0x1e + .4byte 0x955b + .uleb128 0xe + .4byte .LASF579 + .byte 0x68 + .byte 0x1f + .4byte 0x37c + .byte 0 + .uleb128 0xe + .4byte .LASF2041 + .byte 0x68 + .byte 0x20 + .4byte 0xc6 + .byte 0x4 + .uleb128 0x20 + .string "gid" + .byte 0x68 + .byte 0x21 + .4byte 0x955b + .byte 0x8 + .byte 0 + .uleb128 0x5 + .4byte 0x242a + .4byte 0x956a + .uleb128 0x41 + .4byte 0x4f + .byte 0 + .uleb128 0x19 + .4byte .LASF2042 + .byte 0x68 + .byte 0x3d + .4byte 0x952a + .uleb128 0x21 + .byte 0x10 + .byte 0x68 + .byte 0x9a + .4byte 0x9594 + .uleb128 0x22 + .4byte .LASF2043 + .byte 0x68 + .byte 0x9b + .4byte 0xc6 + .uleb128 0x28 + .string "rcu" + .byte 0x68 + .byte 0x9c + .4byte 0x41c + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x952a + .uleb128 0xd + .4byte .LASF2044 + .byte 0x20 + .byte 0x8c + .byte 0x20 + .4byte 0x95d7 + .uleb128 0xe + .4byte .LASF1849 + .byte 0x8c + .byte 0x21 + .4byte 0x95fc + .byte 0 + .uleb128 0xe + .4byte .LASF2045 + .byte 0x8c + .byte 0x22 + .4byte 0x9612 + .byte 0x8 + .uleb128 0xe + .4byte .LASF64 + .byte 0x8c + .byte 0x23 + .4byte 0x9631 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2046 + .byte 0x8c + .byte 0x24 + .4byte 0x964b + .byte 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0x959a + .uleb128 0x7 + .byte 0x8 + .4byte 0x95d7 + .uleb128 0x7 + .byte 0x8 + .4byte 0x547d + .uleb128 0x14 + .4byte 0x458 + .4byte 0x95fc + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x87c8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x95e8 + .uleb128 0x10 + .4byte 0x9612 + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9602 + .uleb128 0x14 + .4byte 0x458 + .4byte 0x9631 + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x87c8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9618 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x964b + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9637 + .uleb128 0x19 + .4byte .LASF2047 + .byte 0x91 + .byte 0x28 + .4byte 0x1995 + .uleb128 0x19 + .4byte .LASF2048 + .byte 0x92 + .byte 0x18 + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF2049 + .byte 0x92 + .byte 0x38 + .4byte 0x29 + .uleb128 0xd + .4byte .LASF2050 + .byte 0x60 + .byte 0xe + .byte 0x14 + .4byte 0x970f + .uleb128 0xe + .4byte .LASF1849 + .byte 0xe + .byte 0x15 + .4byte 0x351 + .byte 0 + .uleb128 0x20 + .string "end" + .byte 0xe + .byte 0x16 + .4byte 0x351 + .byte 0x8 + .uleb128 0xe + .4byte .LASF265 + .byte 0xe + .byte 0x17 + .4byte 0x56 + .byte 0x10 + .uleb128 0xe + .4byte .LASF171 + .byte 0xe + .byte 0x18 + .4byte 0x29 + .byte 0x18 + .uleb128 0xe + .4byte .LASF771 + .byte 0xe + .byte 0x19 + .4byte 0x29 + .byte 0x20 + .uleb128 0xe + .4byte .LASF639 + .byte 0xe + .byte 0x1a + .4byte 0x9714 + .byte 0x28 + .uleb128 0xe + .4byte .LASF641 + .byte 0xe + .byte 0x1a + .4byte 0x9714 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2002 + .byte 0xe + .byte 0x1a + .4byte 0x9714 + .byte 0x38 + .uleb128 0xe + .4byte .LASF130 + .byte 0xe + .byte 0x1c + .4byte 0x15a + .byte 0x40 + .uleb128 0xe + .4byte .LASF131 + .byte 0xe + .byte 0x1d + .4byte 0x15a + .byte 0x48 + .uleb128 0xe + .4byte .LASF132 + .byte 0xe + .byte 0x1e + .4byte 0x15a + .byte 0x50 + .uleb128 0xe + .4byte .LASF133 + .byte 0xe + .byte 0x1f + .4byte 0x15a + .byte 0x58 + .byte 0 + .uleb128 0x3 + .4byte 0x9672 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9672 + .uleb128 0x19 + .4byte .LASF2051 + .byte 0xe + .byte 0xaf + .4byte 0x9672 + .uleb128 0x19 + .4byte .LASF2052 + .byte 0xe + .byte 0xb0 + .4byte 0x9672 + .uleb128 0x32 + .string "idr" + .byte 0x18 + .byte 0x93 + .byte 0x13 + .4byte 0x9761 + .uleb128 0xe + .4byte .LASF2053 + .byte 0x93 + .byte 0x14 + .4byte 0x4cff + .byte 0 + .uleb128 0xe + .4byte .LASF2054 + .byte 0x93 + .byte 0x15 + .4byte 0x6d + .byte 0x10 + .uleb128 0xe + .4byte .LASF2055 + .byte 0x93 + .byte 0x16 + .4byte 0x6d + .byte 0x14 + .byte 0 + .uleb128 0xd + .4byte .LASF2056 + .byte 0x80 + .byte 0x93 + .byte 0xe0 + .4byte 0x977a + .uleb128 0xe + .4byte .LASF2057 + .byte 0x93 + .byte 0xe1 + .4byte 0x17e + .byte 0 + .byte 0 + .uleb128 0x19 + .4byte .LASF2056 + .byte 0x93 + .byte 0xe4 + .4byte 0x9785 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9761 + .uleb128 0xd + .4byte .LASF2058 + .byte 0x18 + .byte 0x94 + .byte 0x54 + .4byte 0x97bc + .uleb128 0xe + .4byte .LASF2059 + .byte 0x94 + .byte 0x55 + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF640 + .byte 0x94 + .byte 0x57 + .4byte 0x344d + .byte 0x8 + .uleb128 0xe + .4byte .LASF1160 + .byte 0x94 + .byte 0x5d + .4byte 0x9828 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF2060 + .byte 0x60 + .byte 0x94 + .byte 0xbd + .4byte 0x9828 + .uleb128 0x20 + .string "kn" + .byte 0x94 + .byte 0xbf + .4byte 0x98e7 + .byte 0 + .uleb128 0xe + .4byte .LASF171 + .byte 0x94 + .byte 0xc0 + .4byte 0x6d + .byte 0x8 + .uleb128 0xe + .4byte .LASF2061 + .byte 0x94 + .byte 0xc3 + .4byte 0x9730 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2062 + .byte 0x94 + .byte 0xc4 + .4byte 0x13f + .byte 0x28 + .uleb128 0xe + .4byte .LASF2063 + .byte 0x94 + .byte 0xc5 + .4byte 0x13f + .byte 0x2c + .uleb128 0xe + .4byte .LASF2064 + .byte 0x94 + .byte 0xc6 + .4byte 0x9b9e + .byte 0x30 + .uleb128 0xe + .4byte .LASF2065 + .byte 0x94 + .byte 0xc9 + .4byte 0x3a7 + .byte 0x38 + .uleb128 0xe + .4byte .LASF2066 + .byte 0x94 + .byte 0xcb + .4byte 0x15bf + .byte 0x48 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x97bc + .uleb128 0xd + .4byte .LASF2067 + .byte 0x8 + .byte 0x94 + .byte 0x60 + .4byte 0x9847 + .uleb128 0xe + .4byte .LASF2068 + .byte 0x94 + .byte 0x61 + .4byte 0x98e7 + .byte 0 + .byte 0 + .uleb128 0xd + .4byte .LASF2069 + .byte 0x80 + .byte 0x94 + .byte 0x83 + .4byte 0x98e7 + .uleb128 0xe + .4byte .LASF383 + .byte 0x94 + .byte 0x84 + .4byte 0x37c + .byte 0 + .uleb128 0xe + .4byte .LASF852 + .byte 0x94 + .byte 0x85 + .4byte 0x37c + .byte 0x4 + .uleb128 0xe + .4byte .LASF639 + .byte 0x94 + .byte 0x8f + .4byte 0x98e7 + .byte 0x8 + .uleb128 0xe + .4byte .LASF265 + .byte 0x94 + .byte 0x90 + .4byte 0x56 + .byte 0x10 + .uleb128 0x20 + .string "rb" + .byte 0x94 + .byte 0x92 + .4byte 0x3416 + .byte 0x18 + .uleb128 0x20 + .string "ns" + .byte 0x94 + .byte 0x94 + .4byte 0x30b6 + .byte 0x30 + .uleb128 0xe + .4byte .LASF386 + .byte 0x94 + .byte 0x95 + .4byte 0x6d + .byte 0x38 + .uleb128 0x23 + .4byte 0x9a39 + .byte 0x40 + .uleb128 0xe + .4byte .LASF2070 + .byte 0x94 + .byte 0x9c + .4byte 0x458 + .byte 0x60 + .uleb128 0x20 + .string "id" + .byte 0x94 + .byte 0x9e + .4byte 0x9a1d + .byte 0x68 + .uleb128 0xe + .4byte .LASF171 + .byte 0x94 + .byte 0x9f + .4byte 0xb4 + .byte 0x70 + .uleb128 0xe + .4byte .LASF874 + .byte 0x94 + .byte 0xa0 + .4byte 0x28f + .byte 0x72 + .uleb128 0xe + .4byte .LASF1402 + .byte 0x94 + .byte 0xa1 + .4byte 0x9a68 + .byte 0x78 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9847 + .uleb128 0xd + .4byte .LASF2071 + .byte 0x20 + .byte 0x94 + .byte 0x64 + .4byte 0x992a + .uleb128 0x20 + .string "ops" + .byte 0x94 + .byte 0x65 + .4byte 0x99eb + .byte 0 + .uleb128 0xe + .4byte .LASF111 + .byte 0x94 + .byte 0x66 + .4byte 0x99f6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF957 + .byte 0x94 + .byte 0x67 + .4byte 0x2d8 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2072 + .byte 0x94 + .byte 0x68 + .4byte 0x98e7 + .byte 0x18 + .byte 0 + .uleb128 0xd + .4byte .LASF2073 + .byte 0x70 + .byte 0x94 + .byte 0xe2 + .4byte 0x99e6 + .uleb128 0xe + .4byte .LASF111 + .byte 0x94 + .byte 0xe7 + .4byte 0x9c67 + .byte 0 + .uleb128 0xe + .4byte .LASF113 + .byte 0x94 + .byte 0xe8 + .4byte 0x9c78 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2074 + .byte 0x94 + .byte 0xf5 + .4byte 0x964b + .byte 0x10 + .uleb128 0xe + .4byte .LASF2075 + .byte 0x94 + .byte 0xf7 + .4byte 0x95fc + .byte 0x18 + .uleb128 0xe + .4byte .LASF2076 + .byte 0x94 + .byte 0xf8 + .4byte 0x9631 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2077 + .byte 0x94 + .byte 0xf9 + .4byte 0x9612 + .byte 0x28 + .uleb128 0xe + .4byte .LASF100 + .byte 0x94 + .byte 0xfb + .4byte 0x9c9c + .byte 0x30 + .uleb128 0x1b + .4byte .LASF2078 + .byte 0x94 + .2byte 0x105 + .4byte 0x2e3 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF2079 + .byte 0x94 + .2byte 0x10c + .4byte 0x2b0 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF101 + .byte 0x94 + .2byte 0x10d + .4byte 0x9c9c + .byte 0x48 + .uleb128 0x1b + .4byte .LASF106 + .byte 0x94 + .2byte 0x110 + .4byte 0x9cb6 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF109 + .byte 0x94 + .2byte 0x113 + .4byte 0x9cd0 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x94 + .2byte 0x119 + .4byte 0x15a + .byte 0x60 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x94 + .2byte 0x11a + .4byte 0x15a + .byte 0x68 + .byte 0 + .uleb128 0x3 + .4byte 0x992a + .uleb128 0x7 + .byte 0x8 + .4byte 0x99e6 + .uleb128 0x24 + .4byte .LASF2080 + .uleb128 0x7 + .byte 0x8 + .4byte 0x99f1 + .uleb128 0xf + .byte 0x8 + .byte 0x94 + .byte 0x6d + .4byte 0x9a1d + .uleb128 0x20 + .string "ino" + .byte 0x94 + .byte 0x74 + .4byte 0x13f + .byte 0 + .uleb128 0xe + .4byte .LASF2081 + .byte 0x94 + .byte 0x75 + .4byte 0x13f + .byte 0x4 + .byte 0 + .uleb128 0x36 + .4byte .LASF2082 + .byte 0x8 + .byte 0x94 + .byte 0x6c + .4byte 0x9a39 + .uleb128 0x29 + .4byte 0x99fc + .uleb128 0x28 + .string "id" + .byte 0x94 + .byte 0x77 + .4byte 0x15a + .byte 0 + .uleb128 0x21 + .byte 0x20 + .byte 0x94 + .byte 0x96 + .4byte 0x9a63 + .uleb128 0x28 + .string "dir" + .byte 0x94 + .byte 0x97 + .4byte 0x978b + .uleb128 0x22 + .4byte .LASF1823 + .byte 0x94 + .byte 0x98 + .4byte 0x982e + .uleb128 0x22 + .4byte .LASF2083 + .byte 0x94 + .byte 0x99 + .4byte 0x98ed + .byte 0 + .uleb128 0x24 + .4byte .LASF2084 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9a63 + .uleb128 0xd + .4byte .LASF2085 + .byte 0x50 + .byte 0x94 + .byte 0xab + .4byte 0x9af3 + .uleb128 0xe + .4byte .LASF1934 + .byte 0x94 + .byte 0xac + .4byte 0x9b0c + .byte 0 + .uleb128 0xe + .4byte .LASF1940 + .byte 0x94 + .byte 0xad + .4byte 0x9b26 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1824 + .byte 0x94 + .byte 0xaf + .4byte 0x9b45 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1825 + .byte 0x94 + .byte 0xb1 + .4byte 0x9b5a + .byte 0x18 + .uleb128 0xe + .4byte .LASF1827 + .byte 0x94 + .byte 0xb2 + .4byte 0x9b79 + .byte 0x20 + .uleb128 0xe + .4byte .LASF1943 + .byte 0x94 + .byte 0xb4 + .4byte 0x9b98 + .byte 0x28 + .uleb128 0xe + .4byte .LASF130 + .byte 0x94 + .byte 0xb7 + .4byte 0x15a + .byte 0x30 + .uleb128 0xe + .4byte .LASF131 + .byte 0x94 + .byte 0xb8 + .4byte 0x15a + .byte 0x38 + .uleb128 0xe + .4byte .LASF132 + .byte 0x94 + .byte 0xb9 + .4byte 0x15a + .byte 0x40 + .uleb128 0xe + .4byte .LASF133 + .byte 0x94 + .byte 0xba + .4byte 0x15a + .byte 0x48 + .byte 0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9b0c + .uleb128 0x11 + .4byte 0x9828 + .uleb128 0x11 + .4byte 0x45a4 + .uleb128 0x11 + .4byte 0x21e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9af3 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9b26 + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x9828 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9b12 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9b45 + .uleb128 0x11 + .4byte 0x98e7 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x28f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9b2c + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9b5a + .uleb128 0x11 + .4byte 0x98e7 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9b4b + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9b79 + .uleb128 0x11 + .4byte 0x98e7 + .uleb128 0x11 + .4byte 0x98e7 + .uleb128 0x11 + .4byte 0x56 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9b60 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9b98 + .uleb128 0x11 + .4byte 0x89f9 + .uleb128 0x11 + .4byte 0x98e7 + .uleb128 0x11 + .4byte 0x9828 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9b7f + .uleb128 0x7 + .byte 0x8 + .4byte 0x9a6e + .uleb128 0xd + .4byte .LASF2086 + .byte 0x98 + .byte 0x94 + .byte 0xce + .4byte 0x9c52 + .uleb128 0x20 + .string "kn" + .byte 0x94 + .byte 0xd0 + .4byte 0x98e7 + .byte 0 + .uleb128 0xe + .4byte .LASF1241 + .byte 0x94 + .byte 0xd1 + .4byte 0x5482 + .byte 0x8 + .uleb128 0xe + .4byte .LASF1972 + .byte 0x94 + .byte 0xd2 + .4byte 0x89f9 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2070 + .byte 0x94 + .byte 0xd3 + .4byte 0x458 + .byte 0x18 + .uleb128 0xe + .4byte .LASF574 + .byte 0x94 + .byte 0xd6 + .4byte 0x2464 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2087 + .byte 0x94 + .byte 0xd7 + .4byte 0x2464 + .byte 0x40 + .uleb128 0xe + .4byte .LASF2006 + .byte 0x94 + .byte 0xd8 + .4byte 0xc6 + .byte 0x60 + .uleb128 0xe + .4byte .LASF932 + .byte 0x94 + .byte 0xd9 + .4byte 0x3a7 + .byte 0x68 + .uleb128 0xe + .4byte .LASF2088 + .byte 0x94 + .byte 0xda + .4byte 0x21e + .byte 0x78 + .uleb128 0xe + .4byte .LASF2078 + .byte 0x94 + .byte 0xdc + .4byte 0x2e3 + .byte 0x80 + .uleb128 0x35 + .4byte .LASF2089 + .byte 0x94 + .byte 0xdd + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x7 + .byte 0x88 + .uleb128 0x35 + .4byte .LASF2090 + .byte 0x94 + .byte 0xde + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x6 + .byte 0x88 + .uleb128 0xe + .4byte .LASF947 + .byte 0x94 + .byte 0xdf + .4byte 0x55d1 + .byte 0x90 + .byte 0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9c61 + .uleb128 0x11 + .4byte 0x9c61 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9ba4 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9c52 + .uleb128 0x10 + .4byte 0x9c78 + .uleb128 0x11 + .4byte 0x9c61 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9c6d + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x9c9c + .uleb128 0x11 + .4byte 0x9c61 + .uleb128 0x11 + .4byte 0x21e + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x2d8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9c7e + .uleb128 0x14 + .4byte 0x244 + .4byte 0x9cb6 + .uleb128 0x11 + .4byte 0x9c61 + .uleb128 0x11 + .4byte 0x8826 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9ca2 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9cd0 + .uleb128 0x11 + .4byte 0x9c61 + .uleb128 0x11 + .4byte 0x3be9 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9cbc + .uleb128 0x1f + .4byte .LASF2091 + .byte 0x4 + .4byte 0x6d + .byte 0x95 + .byte 0x1a + .4byte 0x9cf9 + .uleb128 0xc + .4byte .LASF2092 + .byte 0 + .uleb128 0xc + .4byte .LASF2093 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2094 + .byte 0x2 + .byte 0 + .uleb128 0xd + .4byte .LASF2095 + .byte 0x30 + .byte 0x95 + .byte 0x27 + .4byte 0x9d4e + .uleb128 0xe + .4byte .LASF193 + .byte 0x95 + .byte 0x28 + .4byte 0x9cd6 + .byte 0 + .uleb128 0xe + .4byte .LASF2096 + .byte 0x95 + .byte 0x29 + .4byte 0x9d58 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2097 + .byte 0x95 + .byte 0x2a + .4byte 0x9017 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2098 + .byte 0x95 + .byte 0x2b + .4byte 0x9d78 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2099 + .byte 0x95 + .byte 0x2c + .4byte 0x9d83 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2100 + .byte 0x95 + .byte 0x2d + .4byte 0x2f2f + .byte 0x28 + .byte 0 + .uleb128 0x3 + .4byte 0x9cf9 + .uleb128 0x16 + .4byte 0x2b0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9d53 + .uleb128 0x14 + .4byte 0x30b6 + .4byte 0x9d6d + .uleb128 0x11 + .4byte 0x9d6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9d73 + .uleb128 0x24 + .4byte .LASF2101 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9d5e + .uleb128 0x16 + .4byte 0x30b6 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9d7e + .uleb128 0xd + .4byte .LASF2102 + .byte 0x10 + .byte 0x96 + .byte 0x1e + .4byte 0x9dae + .uleb128 0xe + .4byte .LASF265 + .byte 0x96 + .byte 0x1f + .4byte 0x56 + .byte 0 + .uleb128 0xe + .4byte .LASF874 + .byte 0x96 + .byte 0x20 + .4byte 0x28f + .byte 0x8 + .byte 0 + .uleb128 0xd + .4byte .LASF2103 + .byte 0x28 + .byte 0x96 + .byte 0x54 + .4byte 0x9df7 + .uleb128 0xe + .4byte .LASF265 + .byte 0x96 + .byte 0x55 + .4byte 0x56 + .byte 0 + .uleb128 0xe + .4byte .LASF2104 + .byte 0x96 + .byte 0x56 + .4byte 0x9e1b + .byte 0x8 + .uleb128 0xe + .4byte .LASF2105 + .byte 0x96 + .byte 0x58 + .4byte 0x9e95 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2106 + .byte 0x96 + .byte 0x5a + .4byte 0x9e9b + .byte 0x18 + .uleb128 0xe + .4byte .LASF2107 + .byte 0x96 + .byte 0x5b + .4byte 0x9ea1 + .byte 0x20 + .byte 0 + .uleb128 0x3 + .4byte 0x9dae + .uleb128 0x14 + .4byte 0x28f + .4byte 0x9e15 + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0x9e15 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9d89 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9dfc + .uleb128 0x14 + .4byte 0x28f + .4byte 0x9e3a + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0x9e3a + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9e40 + .uleb128 0xd + .4byte .LASF2108 + .byte 0x38 + .byte 0x96 + .byte 0xa1 + .4byte 0x9e95 + .uleb128 0xe + .4byte .LASF2083 + .byte 0x96 + .byte 0xa2 + .4byte 0x9d89 + .byte 0 + .uleb128 0xe + .4byte .LASF957 + .byte 0x96 + .byte 0xa3 + .4byte 0x2e3 + .byte 0x10 + .uleb128 0xe + .4byte .LASF360 + .byte 0x96 + .byte 0xa4 + .4byte 0x458 + .byte 0x18 + .uleb128 0xe + .4byte .LASF100 + .byte 0x96 + .byte 0xa5 + .4byte 0x9ecf + .byte 0x20 + .uleb128 0xe + .4byte .LASF101 + .byte 0x96 + .byte 0xa7 + .4byte 0x9ecf + .byte 0x28 + .uleb128 0xe + .4byte .LASF109 + .byte 0x96 + .byte 0xa9 + .4byte 0x9ef3 + .byte 0x30 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9e21 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9e15 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9e3a + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x9ecf + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0x9e3a + .uleb128 0x11 + .4byte 0x21e + .uleb128 0x11 + .4byte 0x2d8 + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9ea7 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0x9ef3 + .uleb128 0x11 + .4byte 0x5482 + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0x9e3a + .uleb128 0x11 + .4byte 0x3be9 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9ed5 + .uleb128 0xd + .4byte .LASF2109 + .byte 0x10 + .byte 0x96 + .byte 0xd6 + .4byte 0x9f1e + .uleb128 0xe + .4byte .LASF2046 + .byte 0x96 + .byte 0xd7 + .4byte 0x9f3c + .byte 0 + .uleb128 0xe + .4byte .LASF2110 + .byte 0x96 + .byte 0xd8 + .4byte 0x9f60 + .byte 0x8 + .byte 0 + .uleb128 0x3 + .4byte 0x9ef9 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x9f3c + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0x9e15 + .uleb128 0x11 + .4byte 0x21e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9f23 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0x9f60 + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0x9e15 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9f42 + .uleb128 0xd + .4byte .LASF1981 + .byte 0x4 + .byte 0x97 + .byte 0x15 + .4byte 0x9f7f + .uleb128 0xe + .4byte .LASF1095 + .byte 0x97 + .byte 0x16 + .4byte 0x32c6 + .byte 0 + .byte 0 + .uleb128 0x19 + .4byte .LASF2111 + .byte 0x8d + .byte 0x26 + .4byte 0x500 + .uleb128 0x19 + .4byte .LASF2112 + .byte 0x8d + .byte 0x2a + .4byte 0x15a + .uleb128 0xd + .4byte .LASF1979 + .byte 0xa0 + .byte 0x8d + .byte 0xcb + .4byte 0xa002 + .uleb128 0xe + .4byte .LASF932 + .byte 0x8d + .byte 0xcc + .4byte 0x3a7 + .byte 0 + .uleb128 0xe + .4byte .LASF2113 + .byte 0x8d + .byte 0xcd + .4byte 0xe65 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2114 + .byte 0x8d + .byte 0xce + .4byte 0x902d + .byte 0x18 + .uleb128 0xe + .4byte .LASF2115 + .byte 0x8d + .byte 0xcf + .4byte 0xa296 + .byte 0x78 + .uleb128 0xe + .4byte .LASF130 + .byte 0x8d + .byte 0xd1 + .4byte 0x15a + .byte 0x80 + .uleb128 0xe + .4byte .LASF131 + .byte 0x8d + .byte 0xd2 + .4byte 0x15a + .byte 0x88 + .uleb128 0xe + .4byte .LASF132 + .byte 0x8d + .byte 0xd3 + .4byte 0x15a + .byte 0x90 + .uleb128 0xe + .4byte .LASF133 + .byte 0x8d + .byte 0xd4 + .4byte 0x15a + .byte 0x98 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9f95 + .uleb128 0xd + .4byte .LASF2116 + .byte 0x50 + .byte 0x8d + .byte 0x91 + .4byte 0xa08d + .uleb128 0xe + .4byte .LASF113 + .byte 0x8d + .byte 0x92 + .4byte 0xa09e + .byte 0 + .uleb128 0xe + .4byte .LASF2109 + .byte 0x8d + .byte 0x93 + .4byte 0xa0a4 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2117 + .byte 0x8d + .byte 0x94 + .4byte 0x9e9b + .byte 0x10 + .uleb128 0xe + .4byte .LASF2118 + .byte 0x8d + .byte 0x95 + .4byte 0xa0bf + .byte 0x18 + .uleb128 0xe + .4byte .LASF2119 + .byte 0x8d + .byte 0x96 + .4byte 0xa0d4 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2120 + .byte 0x8d + .byte 0x97 + .4byte 0xa0ef + .byte 0x28 + .uleb128 0xe + .4byte .LASF130 + .byte 0x8d + .byte 0x99 + .4byte 0x15a + .byte 0x30 + .uleb128 0xe + .4byte .LASF131 + .byte 0x8d + .byte 0x9a + .4byte 0x15a + .byte 0x38 + .uleb128 0xe + .4byte .LASF132 + .byte 0x8d + .byte 0x9b + .4byte 0x15a + .byte 0x40 + .uleb128 0xe + .4byte .LASF133 + .byte 0x8d + .byte 0x9c + .4byte 0x15a + .byte 0x48 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa008 + .uleb128 0x10 + .4byte 0xa09e + .uleb128 0x11 + .4byte 0x9114 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa093 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9f1e + .uleb128 0x14 + .4byte 0xa0b9 + .4byte 0xa0b9 + .uleb128 0x11 + .4byte 0x9114 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9d4e + .uleb128 0x7 + .byte 0x8 + .4byte 0xa0aa + .uleb128 0x14 + .4byte 0x30b6 + .4byte 0xa0d4 + .uleb128 0x11 + .4byte 0x9114 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa0c5 + .uleb128 0x10 + .4byte 0xa0ef + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0x9297 + .uleb128 0x11 + .4byte 0x929d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa0da + .uleb128 0x26 + .4byte .LASF2121 + .2byte 0x1220 + .byte 0x8d + .byte 0x9f + .4byte 0xa142 + .uleb128 0xe + .4byte .LASF2122 + .byte 0x8d + .byte 0xa0 + .4byte 0xa142 + .byte 0 + .uleb128 0xe + .4byte .LASF2123 + .byte 0x8d + .byte 0xa1 + .4byte 0xa152 + .byte 0x18 + .uleb128 0x27 + .4byte .LASF2124 + .byte 0x8d + .byte 0xa2 + .4byte 0xc6 + .2byte 0x218 + .uleb128 0x44 + .string "buf" + .byte 0x8d + .byte 0xa3 + .4byte 0xa162 + .2byte 0x21c + .uleb128 0x27 + .4byte .LASF2125 + .byte 0x8d + .byte 0xa4 + .4byte 0xc6 + .2byte 0x121c + .byte 0 + .uleb128 0x5 + .4byte 0x21e + .4byte 0xa152 + .uleb128 0x6 + .4byte 0x4f + .byte 0x2 + .byte 0 + .uleb128 0x5 + .4byte 0x21e + .4byte 0xa162 + .uleb128 0x6 + .4byte 0x4f + .byte 0x3f + .byte 0 + .uleb128 0x5 + .4byte 0x61 + .4byte 0xa173 + .uleb128 0x40 + .4byte 0x4f + .2byte 0xfff + .byte 0 + .uleb128 0xd + .4byte .LASF2126 + .byte 0x18 + .byte 0x8d + .byte 0xa7 + .4byte 0xa1a4 + .uleb128 0xe + .4byte .LASF875 + .byte 0x8d + .byte 0xa8 + .4byte 0xa1c3 + .byte 0 + .uleb128 0xe + .4byte .LASF265 + .byte 0x8d + .byte 0xa9 + .4byte 0xa1e2 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2127 + .byte 0x8d + .byte 0xaa + .4byte 0xa20c + .byte 0x10 + .byte 0 + .uleb128 0x3 + .4byte 0xa173 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xa1bd + .uleb128 0x11 + .4byte 0xa002 + .uleb128 0x11 + .4byte 0x9114 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa1a9 + .uleb128 0x3 + .4byte 0xa1bd + .uleb128 0x14 + .4byte 0x56 + .4byte 0xa1dc + .uleb128 0x11 + .4byte 0xa002 + .uleb128 0x11 + .4byte 0x9114 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa1c8 + .uleb128 0x3 + .4byte 0xa1dc + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xa200 + .uleb128 0x11 + .4byte 0xa002 + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0xa200 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa0f5 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa1e7 + .uleb128 0x3 + .4byte 0xa206 + .uleb128 0xd + .4byte .LASF2128 + .byte 0x20 + .byte 0x8d + .byte 0xae + .4byte 0xa242 + .uleb128 0xe + .4byte .LASF2083 + .byte 0x8d + .byte 0xaf + .4byte 0x9d89 + .byte 0 + .uleb128 0xe + .4byte .LASF2046 + .byte 0x8d + .byte 0xb0 + .4byte 0xa261 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2110 + .byte 0x8d + .byte 0xb2 + .4byte 0xa285 + .byte 0x18 + .byte 0 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0xa25b + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0xa25b + .uleb128 0x11 + .4byte 0x21e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa211 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa242 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0xa285 + .uleb128 0x11 + .4byte 0x9114 + .uleb128 0x11 + .4byte 0xa25b + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa267 + .uleb128 0x19 + .4byte .LASF2129 + .byte 0x8d + .byte 0xb6 + .4byte 0x9f1e + .uleb128 0x7 + .byte 0x8 + .4byte 0xa1a4 + .uleb128 0x19 + .4byte .LASF2130 + .byte 0x8d + .byte 0xf5 + .4byte 0x9114 + .uleb128 0x19 + .4byte .LASF2131 + .byte 0x8d + .byte 0xf7 + .4byte 0x9114 + .uleb128 0x19 + .4byte .LASF2132 + .byte 0x8d + .byte 0xf9 + .4byte 0x9114 + .uleb128 0x19 + .4byte .LASF2133 + .byte 0x8d + .byte 0xfb + .4byte 0x9114 + .uleb128 0x19 + .4byte .LASF2134 + .byte 0x8d + .byte 0xfd + .4byte 0x9114 + .uleb128 0xd + .4byte .LASF2135 + .byte 0x20 + .byte 0x98 + .byte 0x27 + .4byte 0xa304 + .uleb128 0xe + .4byte .LASF2136 + .byte 0x98 + .byte 0x28 + .4byte 0x458 + .byte 0 + .uleb128 0xe + .4byte .LASF2137 + .byte 0x98 + .byte 0x29 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2138 + .byte 0x98 + .byte 0x2a + .4byte 0x9f66 + .byte 0x18 + .byte 0 + .uleb128 0x19 + .4byte .LASF2139 + .byte 0x99 + .byte 0x22 + .4byte 0x4b7 + .uleb128 0x19 + .4byte .LASF2140 + .byte 0x99 + .byte 0x23 + .4byte 0x4b7 + .uleb128 0x19 + .4byte .LASF2141 + .byte 0x99 + .byte 0x39 + .4byte 0x579 + .uleb128 0xd + .4byte .LASF2142 + .byte 0x4 + .byte 0x99 + .byte 0x3e + .4byte 0xa33e + .uleb128 0xe + .4byte .LASF2006 + .byte 0x99 + .byte 0x3f + .4byte 0xc6 + .byte 0 + .byte 0 + .uleb128 0x8 + .4byte .LASF2143 + .byte 0x99 + .byte 0x40 + .4byte 0xa325 + .uleb128 0x1d + .4byte .LASF2144 + .byte 0xb8 + .byte 0x99 + .2byte 0x122 + .4byte 0xa482 + .uleb128 0x1b + .4byte .LASF2145 + .byte 0x99 + .2byte 0x123 + .4byte 0xa778 + .byte 0 + .uleb128 0x1b + .4byte .LASF2146 + .byte 0x99 + .2byte 0x124 + .4byte 0xa789 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2147 + .byte 0x99 + .2byte 0x125 + .4byte 0xa778 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2148 + .byte 0x99 + .2byte 0x126 + .4byte 0xa778 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF2149 + .byte 0x99 + .2byte 0x127 + .4byte 0xa778 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF2150 + .byte 0x99 + .2byte 0x128 + .4byte 0xa778 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF2151 + .byte 0x99 + .2byte 0x129 + .4byte 0xa778 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF2152 + .byte 0x99 + .2byte 0x12a + .4byte 0xa778 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF2153 + .byte 0x99 + .2byte 0x12b + .4byte 0xa778 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF2154 + .byte 0x99 + .2byte 0x12c + .4byte 0xa778 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF2155 + .byte 0x99 + .2byte 0x12d + .4byte 0xa778 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF2156 + .byte 0x99 + .2byte 0x12e + .4byte 0xa778 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF2157 + .byte 0x99 + .2byte 0x12f + .4byte 0xa778 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF2158 + .byte 0x99 + .2byte 0x130 + .4byte 0xa778 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF2159 + .byte 0x99 + .2byte 0x131 + .4byte 0xa778 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF2160 + .byte 0x99 + .2byte 0x132 + .4byte 0xa778 + .byte 0x78 + .uleb128 0x1b + .4byte .LASF2161 + .byte 0x99 + .2byte 0x133 + .4byte 0xa778 + .byte 0x80 + .uleb128 0x1b + .4byte .LASF2162 + .byte 0x99 + .2byte 0x134 + .4byte 0xa778 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF2163 + .byte 0x99 + .2byte 0x135 + .4byte 0xa778 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF2164 + .byte 0x99 + .2byte 0x136 + .4byte 0xa778 + .byte 0x98 + .uleb128 0x1b + .4byte .LASF2165 + .byte 0x99 + .2byte 0x137 + .4byte 0xa778 + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF2166 + .byte 0x99 + .2byte 0x138 + .4byte 0xa778 + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF2167 + .byte 0x99 + .2byte 0x139 + .4byte 0xa778 + .byte 0xb0 + .byte 0 + .uleb128 0x3 + .4byte 0xa349 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xa496 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa49c + .uleb128 0x1a + .4byte .LASF2168 + .2byte 0x3b0 + .byte 0x2 + .2byte 0x407 + .4byte 0xa773 + .uleb128 0x1b + .4byte .LASF639 + .byte 0x2 + .2byte 0x408 + .4byte 0xa496 + .byte 0 + .uleb128 0x2b + .string "p" + .byte 0x2 + .2byte 0x40a + .4byte 0xb494 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2114 + .byte 0x2 + .2byte 0x40c + .4byte 0x902d + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2169 + .byte 0x2 + .2byte 0x40d + .4byte 0x56 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF193 + .byte 0x2 + .2byte 0x40e + .4byte 0xb05b + .byte 0x78 + .uleb128 0x1b + .4byte .LASF574 + .byte 0x2 + .2byte 0x410 + .4byte 0x2464 + .byte 0x80 + .uleb128 0x2b + .string "bus" + .byte 0x2 + .2byte 0x414 + .4byte 0xacfd + .byte 0xa0 + .uleb128 0x1b + .4byte .LASF2170 + .byte 0x2 + .2byte 0x415 + .4byte 0xae71 + .byte 0xa8 + .uleb128 0x1b + .4byte .LASF2171 + .byte 0x2 + .2byte 0x417 + .4byte 0x458 + .byte 0xb0 + .uleb128 0x1b + .4byte .LASF2172 + .byte 0x2 + .2byte 0x419 + .4byte 0x458 + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF2173 + .byte 0x2 + .2byte 0x41b + .4byte 0xb3ff + .byte 0xc0 + .uleb128 0x1c + .4byte .LASF2174 + .byte 0x2 + .2byte 0x41c + .4byte 0xa836 + .2byte 0x128 + .uleb128 0x1c + .4byte .LASF2175 + .byte 0x2 + .2byte 0x41d + .4byte 0xb49a + .2byte 0x260 + .uleb128 0x1c + .4byte .LASF2176 + .byte 0x2 + .2byte 0x420 + .4byte 0xb59c + .2byte 0x268 + .uleb128 0x1c + .4byte .LASF2177 + .byte 0x2 + .2byte 0x423 + .4byte 0xb5a7 + .2byte 0x270 + .uleb128 0x1c + .4byte .LASF2178 + .byte 0x2 + .2byte 0x426 + .4byte 0x3a7 + .2byte 0x278 + .uleb128 0x1c + .4byte .LASF2179 + .byte 0x2 + .2byte 0x42c + .4byte 0xb6df + .2byte 0x288 + .uleb128 0x1c + .4byte .LASF2180 + .byte 0x2 + .2byte 0x42d + .4byte 0x45aa + .2byte 0x290 + .uleb128 0x1c + .4byte .LASF2181 + .byte 0x2 + .2byte 0x42e + .4byte 0x15a + .2byte 0x298 + .uleb128 0x1c + .4byte .LASF2182 + .byte 0x2 + .2byte 0x433 + .4byte 0x15a + .2byte 0x2a0 + .uleb128 0x1c + .4byte .LASF2183 + .byte 0x2 + .2byte 0x434 + .4byte 0x29 + .2byte 0x2a8 + .uleb128 0x1c + .4byte .LASF2184 + .byte 0x2 + .2byte 0x436 + .4byte 0xb6e5 + .2byte 0x2b0 + .uleb128 0x1c + .4byte .LASF2185 + .byte 0x2 + .2byte 0x438 + .4byte 0x3a7 + .2byte 0x2b8 + .uleb128 0x1c + .4byte .LASF2186 + .byte 0x2 + .2byte 0x43a + .4byte 0xb6f0 + .2byte 0x2c8 + .uleb128 0x1c + .4byte .LASF2187 + .byte 0x2 + .2byte 0x43d + .4byte 0xb6fb + .2byte 0x2d0 + .uleb128 0x1c + .4byte .LASF2188 + .byte 0x2 + .2byte 0x440 + .4byte 0xb706 + .2byte 0x2d8 + .uleb128 0x1c + .4byte .LASF2189 + .byte 0x2 + .2byte 0x442 + .4byte 0xacd0 + .2byte 0x2e0 + .uleb128 0x1c + .4byte .LASF2190 + .byte 0x2 + .2byte 0x444 + .4byte 0xb7ba + .2byte 0x2f0 + .uleb128 0x1c + .4byte .LASF2191 + .byte 0x2 + .2byte 0x445 + .4byte 0xb3cf + .2byte 0x2f8 + .uleb128 0x1c + .4byte .LASF2192 + .byte 0x2 + .2byte 0x447 + .4byte 0x284 + .2byte 0x300 + .uleb128 0x30 + .string "id" + .byte 0x2 + .2byte 0x448 + .4byte 0x13f + .2byte 0x304 + .uleb128 0x1c + .4byte .LASF2193 + .byte 0x2 + .2byte 0x44a + .4byte 0xe65 + .2byte 0x308 + .uleb128 0x1c + .4byte .LASF2194 + .byte 0x2 + .2byte 0x44b + .4byte 0x3a7 + .2byte 0x310 + .uleb128 0x1c + .4byte .LASF2195 + .byte 0x2 + .2byte 0x44d + .4byte 0xa2d3 + .2byte 0x320 + .uleb128 0x1c + .4byte .LASF2196 + .byte 0x2 + .2byte 0x44e + .4byte 0xb24b + .2byte 0x340 + .uleb128 0x1c + .4byte .LASF2197 + .byte 0x2 + .2byte 0x44f + .4byte 0xae51 + .2byte 0x348 + .uleb128 0x1c + .4byte .LASF113 + .byte 0x2 + .2byte 0x451 + .4byte 0xa789 + .2byte 0x350 + .uleb128 0x1c + .4byte .LASF2198 + .byte 0x2 + .2byte 0x452 + .4byte 0xb7c5 + .2byte 0x358 + .uleb128 0x1c + .4byte .LASF2199 + .byte 0x2 + .2byte 0x453 + .4byte 0xb7d0 + .2byte 0x360 + .uleb128 0x33 + .4byte .LASF2200 + .byte 0x2 + .2byte 0x455 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x7 + .2byte 0x368 + .uleb128 0x33 + .4byte .LASF2201 + .byte 0x2 + .2byte 0x456 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x6 + .2byte 0x368 + .uleb128 0x33 + .4byte .LASF2202 + .byte 0x2 + .2byte 0x457 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x5 + .2byte 0x368 + .uleb128 0x33 + .4byte .LASF2203 + .byte 0x2 + .2byte 0x458 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x4 + .2byte 0x368 + .uleb128 0x1c + .4byte .LASF130 + .byte 0x2 + .2byte 0x45a + .4byte 0x15a + .2byte 0x370 + .uleb128 0x1c + .4byte .LASF131 + .byte 0x2 + .2byte 0x45b + .4byte 0x15a + .2byte 0x378 + .uleb128 0x1c + .4byte .LASF132 + .byte 0x2 + .2byte 0x45c + .4byte 0x15a + .2byte 0x380 + .uleb128 0x1c + .4byte .LASF133 + .byte 0x2 + .2byte 0x45d + .4byte 0x15a + .2byte 0x388 + .uleb128 0x1c + .4byte .LASF2204 + .byte 0x2 + .2byte 0x45e + .4byte 0x15a + .2byte 0x390 + .uleb128 0x1c + .4byte .LASF2205 + .byte 0x2 + .2byte 0x45f + .4byte 0x15a + .2byte 0x398 + .uleb128 0x1c + .4byte .LASF748 + .byte 0x2 + .2byte 0x460 + .4byte 0x15a + .2byte 0x3a0 + .uleb128 0x1c + .4byte .LASF749 + .byte 0x2 + .2byte 0x461 + .4byte 0x15a + .2byte 0x3a8 + .byte 0 + .uleb128 0x3 + .4byte 0xa49c + .uleb128 0x7 + .byte 0x8 + .4byte 0xa487 + .uleb128 0x10 + .4byte 0xa789 + .uleb128 0x11 + .4byte 0xa496 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa77e + .uleb128 0x1e + .4byte .LASF2206 + .byte 0x4 + .4byte 0x6d + .byte 0x99 + .2byte 0x1fc + .4byte 0xa7b9 + .uleb128 0xc + .4byte .LASF2207 + .byte 0 + .uleb128 0xc + .4byte .LASF2208 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2209 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2210 + .byte 0x3 + .byte 0 + .uleb128 0x1e + .4byte .LASF2211 + .byte 0x4 + .4byte 0x6d + .byte 0x99 + .2byte 0x212 + .4byte 0xa7e9 + .uleb128 0xc + .4byte .LASF2212 + .byte 0 + .uleb128 0xc + .4byte .LASF2213 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2214 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2215 + .byte 0x3 + .uleb128 0xc + .4byte .LASF2216 + .byte 0x4 + .byte 0 + .uleb128 0x1d + .4byte .LASF2217 + .byte 0x20 + .byte 0x99 + .2byte 0x21e + .4byte 0xa82b + .uleb128 0x1b + .4byte .LASF116 + .byte 0x99 + .2byte 0x21f + .4byte 0xe65 + .byte 0 + .uleb128 0x1b + .4byte .LASF1095 + .byte 0x99 + .2byte 0x220 + .4byte 0x6d + .byte 0x4 + .uleb128 0x1b + .4byte .LASF2218 + .byte 0x99 + .2byte 0x222 + .4byte 0x3a7 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2219 + .byte 0x99 + .2byte 0x225 + .4byte 0xa830 + .byte 0x18 + .byte 0 + .uleb128 0x24 + .4byte .LASF2220 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa82b + .uleb128 0x1a + .4byte .LASF2221 + .2byte 0x138 + .byte 0x99 + .2byte 0x249 + .4byte 0xab31 + .uleb128 0x1b + .4byte .LASF2222 + .byte 0x99 + .2byte 0x24a + .4byte 0xa33e + .byte 0 + .uleb128 0x38 + .4byte .LASF2223 + .byte 0x99 + .2byte 0x24b + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1f + .byte 0x4 + .uleb128 0x38 + .4byte .LASF2224 + .byte 0x99 + .2byte 0x24c + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1e + .byte 0x4 + .uleb128 0x38 + .4byte .LASF2225 + .byte 0x99 + .2byte 0x24d + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x5 + .byte 0x4 + .uleb128 0x38 + .4byte .LASF2226 + .byte 0x99 + .2byte 0x24e + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x4 + .byte 0x4 + .uleb128 0x38 + .4byte .LASF2227 + .byte 0x99 + .2byte 0x24f + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x3 + .byte 0x4 + .uleb128 0x38 + .4byte .LASF2228 + .byte 0x99 + .2byte 0x250 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x2 + .byte 0x4 + .uleb128 0x38 + .4byte .LASF2229 + .byte 0x99 + .2byte 0x251 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x1 + .byte 0x4 + .uleb128 0x38 + .4byte .LASF2230 + .byte 0x99 + .2byte 0x252 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0 + .byte 0x4 + .uleb128 0x38 + .4byte .LASF2231 + .byte 0x99 + .2byte 0x253 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x7 + .byte 0x5 + .uleb128 0x38 + .4byte .LASF2232 + .byte 0x99 + .2byte 0x254 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x6 + .byte 0x5 + .uleb128 0x1b + .4byte .LASF2233 + .byte 0x99 + .2byte 0x255 + .4byte 0x13f + .byte 0x8 + .uleb128 0x1b + .4byte .LASF116 + .byte 0x99 + .2byte 0x256 + .4byte 0xe65 + .byte 0xc + .uleb128 0x1b + .4byte .LASF361 + .byte 0x99 + .2byte 0x258 + .4byte 0x3a7 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF1067 + .byte 0x99 + .2byte 0x259 + .4byte 0x4579 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF2234 + .byte 0x99 + .2byte 0x25a + .4byte 0xac33 + .byte 0x40 + .uleb128 0x38 + .4byte .LASF2235 + .byte 0x99 + .2byte 0x25b + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x7 + .byte 0x48 + .uleb128 0x38 + .4byte .LASF2236 + .byte 0x99 + .2byte 0x25c + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x6 + .byte 0x48 + .uleb128 0x38 + .4byte .LASF2237 + .byte 0x99 + .2byte 0x25d + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x5 + .byte 0x48 + .uleb128 0x38 + .4byte .LASF2238 + .byte 0x99 + .2byte 0x25e + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1c + .byte 0x48 + .uleb128 0x38 + .4byte .LASF2239 + .byte 0x99 + .2byte 0x25f + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1b + .byte 0x48 + .uleb128 0x1b + .4byte .LASF2240 + .byte 0x99 + .2byte 0x264 + .4byte 0x316c + .byte 0x50 + .uleb128 0x1b + .4byte .LASF2241 + .byte 0x99 + .2byte 0x265 + .4byte 0x29 + .byte 0x88 + .uleb128 0x1b + .4byte .LASF2242 + .byte 0x99 + .2byte 0x266 + .4byte 0x3205 + .byte 0x90 + .uleb128 0x1b + .4byte .LASF2243 + .byte 0x99 + .2byte 0x267 + .4byte 0x15bf + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF2244 + .byte 0x99 + .2byte 0x268 + .4byte 0xac3e + .byte 0xd8 + .uleb128 0x1b + .4byte .LASF2245 + .byte 0x99 + .2byte 0x269 + .4byte 0x37c + .byte 0xe0 + .uleb128 0x1b + .4byte .LASF2246 + .byte 0x99 + .2byte 0x26a + .4byte 0x37c + .byte 0xe4 + .uleb128 0x38 + .4byte .LASF2247 + .byte 0x99 + .2byte 0x26b + .4byte 0x6d + .byte 0x4 + .byte 0x3 + .byte 0x1d + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2248 + .byte 0x99 + .2byte 0x26c + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1c + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2249 + .byte 0x99 + .2byte 0x26d + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1b + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2250 + .byte 0x99 + .2byte 0x26e + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x1a + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2251 + .byte 0x99 + .2byte 0x26f + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x19 + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2252 + .byte 0x99 + .2byte 0x270 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0 + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2253 + .byte 0x99 + .2byte 0x271 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x17 + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2254 + .byte 0x99 + .2byte 0x272 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x16 + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2255 + .byte 0x99 + .2byte 0x273 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x15 + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2256 + .byte 0x99 + .2byte 0x274 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x14 + .byte 0xe8 + .uleb128 0x38 + .4byte .LASF2257 + .byte 0x99 + .2byte 0x275 + .4byte 0x6d + .byte 0x4 + .byte 0x1 + .byte 0x13 + .byte 0xe8 + .uleb128 0x1b + .4byte .LASF2258 + .byte 0x99 + .2byte 0x276 + .4byte 0x6d + .byte 0xec + .uleb128 0x1b + .4byte .LASF2259 + .byte 0x99 + .2byte 0x277 + .4byte 0xa7b9 + .byte 0xf0 + .uleb128 0x1b + .4byte .LASF2260 + .byte 0x99 + .2byte 0x278 + .4byte 0xa78f + .byte 0xf4 + .uleb128 0x1b + .4byte .LASF2261 + .byte 0x99 + .2byte 0x279 + .4byte 0xc6 + .byte 0xf8 + .uleb128 0x1b + .4byte .LASF2262 + .byte 0x99 + .2byte 0x27a + .4byte 0xc6 + .byte 0xfc + .uleb128 0x1c + .4byte .LASF2263 + .byte 0x99 + .2byte 0x27b + .4byte 0x29 + .2byte 0x100 + .uleb128 0x1c + .4byte .LASF2264 + .byte 0x99 + .2byte 0x27c + .4byte 0x29 + .2byte 0x108 + .uleb128 0x1c + .4byte .LASF2265 + .byte 0x99 + .2byte 0x27d + .4byte 0x29 + .2byte 0x110 + .uleb128 0x1c + .4byte .LASF2266 + .byte 0x99 + .2byte 0x27e + .4byte 0x29 + .2byte 0x118 + .uleb128 0x1c + .4byte .LASF2267 + .byte 0x99 + .2byte 0x280 + .4byte 0xac44 + .2byte 0x120 + .uleb128 0x1c + .4byte .LASF2268 + .byte 0x99 + .2byte 0x281 + .4byte 0xac5a + .2byte 0x128 + .uleb128 0x30 + .string "qos" + .byte 0x99 + .2byte 0x282 + .4byte 0xac65 + .2byte 0x130 + .byte 0 + .uleb128 0xd + .4byte .LASF2269 + .byte 0xd0 + .byte 0x9a + .byte 0x38 + .4byte 0xac33 + .uleb128 0xe + .4byte .LASF265 + .byte 0x9a + .byte 0x39 + .4byte 0x56 + .byte 0 + .uleb128 0x20 + .string "id" + .byte 0x9a + .byte 0x3a + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF361 + .byte 0x9a + .byte 0x3b + .4byte 0x3a7 + .byte 0x10 + .uleb128 0xe + .4byte .LASF116 + .byte 0x9a + .byte 0x3c + .4byte 0xe65 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2244 + .byte 0x9a + .byte 0x3d + .4byte 0xac3e + .byte 0x28 + .uleb128 0xe + .4byte .LASF2270 + .byte 0x9a + .byte 0x3e + .4byte 0x316c + .byte 0x30 + .uleb128 0xe + .4byte .LASF2241 + .byte 0x9a + .byte 0x3f + .4byte 0x29 + .byte 0x68 + .uleb128 0xe + .4byte .LASF2271 + .byte 0x9a + .byte 0x40 + .4byte 0x3135 + .byte 0x70 + .uleb128 0xe + .4byte .LASF2272 + .byte 0x9a + .byte 0x41 + .4byte 0x3135 + .byte 0x78 + .uleb128 0xe + .4byte .LASF2273 + .byte 0x9a + .byte 0x42 + .4byte 0x3135 + .byte 0x80 + .uleb128 0xe + .4byte .LASF2274 + .byte 0x9a + .byte 0x43 + .4byte 0x3135 + .byte 0x88 + .uleb128 0xe + .4byte .LASF2275 + .byte 0x9a + .byte 0x44 + .4byte 0x3135 + .byte 0x90 + .uleb128 0xe + .4byte .LASF2276 + .byte 0x9a + .byte 0x45 + .4byte 0x29 + .byte 0x98 + .uleb128 0xe + .4byte .LASF2277 + .byte 0x9a + .byte 0x46 + .4byte 0x29 + .byte 0xa0 + .uleb128 0xe + .4byte .LASF2278 + .byte 0x9a + .byte 0x47 + .4byte 0x29 + .byte 0xa8 + .uleb128 0xe + .4byte .LASF2279 + .byte 0x9a + .byte 0x48 + .4byte 0x29 + .byte 0xb0 + .uleb128 0xe + .4byte .LASF2280 + .byte 0x9a + .byte 0x49 + .4byte 0x29 + .byte 0xb8 + .uleb128 0x20 + .string "dev" + .byte 0x9a + .byte 0x4a + .4byte 0xa496 + .byte 0xc0 + .uleb128 0x35 + .4byte .LASF852 + .byte 0x9a + .byte 0x4b + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x7 + .byte 0xc8 + .uleb128 0x35 + .4byte .LASF2281 + .byte 0x9a + .byte 0x4c + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x6 + .byte 0xc8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xab31 + .uleb128 0x24 + .4byte .LASF2282 + .uleb128 0x7 + .byte 0x8 + .4byte 0xac39 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa7e9 + .uleb128 0x10 + .4byte 0xac5a + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x12f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xac4a + .uleb128 0x24 + .4byte .LASF2283 + .uleb128 0x7 + .byte 0x8 + .4byte 0xac60 + .uleb128 0x1d + .4byte .LASF2284 + .byte 0xd8 + .byte 0x99 + .2byte 0x296 + .4byte 0xacba + .uleb128 0x2b + .string "ops" + .byte 0x99 + .2byte 0x297 + .4byte 0xa349 + .byte 0 + .uleb128 0x1b + .4byte .LASF2285 + .byte 0x99 + .2byte 0x298 + .4byte 0xacca + .byte 0xb8 + .uleb128 0x1b + .4byte .LASF2286 + .byte 0x99 + .2byte 0x299 + .4byte 0xa778 + .byte 0xc0 + .uleb128 0x1b + .4byte .LASF2287 + .byte 0x99 + .2byte 0x29a + .4byte 0xa789 + .byte 0xc8 + .uleb128 0x1b + .4byte .LASF2288 + .byte 0x99 + .2byte 0x29b + .4byte 0xa789 + .byte 0xd0 + .byte 0 + .uleb128 0x10 + .4byte 0xacca + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x2b0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xacba + .uleb128 0xd + .4byte .LASF2289 + .byte 0x10 + .byte 0x9b + .byte 0x13 + .4byte 0xacf5 + .uleb128 0xe + .4byte .LASF2290 + .byte 0x9b + .byte 0x15 + .4byte 0x458 + .byte 0 + .uleb128 0xe + .4byte .LASF2291 + .byte 0x9b + .byte 0x1a + .4byte 0x2b0 + .byte 0x8 + .byte 0 + .uleb128 0x37 + .4byte .LASF2292 + .byte 0 + .byte 0x9b + .byte 0x20 + .uleb128 0x7 + .byte 0x8 + .4byte 0xad03 + .uleb128 0xd + .4byte .LASF2293 + .byte 0xd0 + .byte 0x2 + .byte 0x7a + .4byte 0xae51 + .uleb128 0xe + .4byte .LASF265 + .byte 0x2 + .byte 0x7b + .4byte 0x56 + .byte 0 + .uleb128 0xe + .4byte .LASF2294 + .byte 0x2 + .byte 0x7c + .4byte 0x56 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2295 + .byte 0x2 + .byte 0x7d + .4byte 0xa496 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2296 + .byte 0x2 + .byte 0x7e + .4byte 0xae51 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2297 + .byte 0x2 + .byte 0x7f + .4byte 0xae51 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2298 + .byte 0x2 + .byte 0x80 + .4byte 0xae51 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2299 + .byte 0x2 + .byte 0x82 + .4byte 0xafa0 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2127 + .byte 0x2 + .byte 0x83 + .4byte 0xafba + .byte 0x38 + .uleb128 0xe + .4byte .LASF2300 + .byte 0x2 + .byte 0x84 + .4byte 0xa778 + .byte 0x40 + .uleb128 0xe + .4byte .LASF2301 + .byte 0x2 + .byte 0x85 + .4byte 0xa789 + .byte 0x48 + .uleb128 0xe + .4byte .LASF2302 + .byte 0x2 + .byte 0x86 + .4byte 0xa778 + .byte 0x50 + .uleb128 0xe + .4byte .LASF2303 + .byte 0x2 + .byte 0x87 + .4byte 0xa789 + .byte 0x58 + .uleb128 0xe + .4byte .LASF2304 + .byte 0x2 + .byte 0x89 + .4byte 0xa778 + .byte 0x60 + .uleb128 0xe + .4byte .LASF2201 + .byte 0x2 + .byte 0x8a + .4byte 0xa778 + .byte 0x68 + .uleb128 0xe + .4byte .LASF2147 + .byte 0x2 + .byte 0x8c + .4byte 0xafd4 + .byte 0x70 + .uleb128 0xe + .4byte .LASF2148 + .byte 0x2 + .byte 0x8d + .4byte 0xa778 + .byte 0x78 + .uleb128 0xe + .4byte .LASF2305 + .byte 0x2 + .byte 0x8f + .4byte 0xa778 + .byte 0x80 + .uleb128 0xe + .4byte .LASF2306 + .byte 0x2 + .byte 0x91 + .4byte 0xa778 + .byte 0x88 + .uleb128 0x20 + .string "pm" + .byte 0x2 + .byte 0x93 + .4byte 0xafda + .byte 0x90 + .uleb128 0xe + .4byte .LASF2307 + .byte 0x2 + .byte 0x95 + .4byte 0xafea + .byte 0x98 + .uleb128 0x20 + .string "p" + .byte 0x2 + .byte 0x97 + .4byte 0xaff5 + .byte 0xa0 + .uleb128 0xe + .4byte .LASF2308 + .byte 0x2 + .byte 0x98 + .4byte 0xe11 + .byte 0xa8 + .uleb128 0xe + .4byte .LASF2309 + .byte 0x2 + .byte 0x9a + .4byte 0x2b0 + .byte 0xa8 + .uleb128 0xe + .4byte .LASF130 + .byte 0x2 + .byte 0x9c + .4byte 0x15a + .byte 0xb0 + .uleb128 0xe + .4byte .LASF131 + .byte 0x2 + .byte 0x9d + .4byte 0x15a + .byte 0xb8 + .uleb128 0xe + .4byte .LASF132 + .byte 0x2 + .byte 0x9e + .4byte 0x15a + .byte 0xc0 + .uleb128 0xe + .4byte .LASF133 + .byte 0x2 + .byte 0x9f + .4byte 0x15a + .byte 0xc8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xae57 + .uleb128 0x7 + .byte 0x8 + .4byte 0x9df7 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xae71 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xae71 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xae77 + .uleb128 0x1d + .4byte .LASF2310 + .byte 0xa8 + .byte 0x2 + .2byte 0x12a + .4byte 0xafa0 + .uleb128 0x1b + .4byte .LASF265 + .byte 0x2 + .2byte 0x12b + .4byte 0x56 + .byte 0 + .uleb128 0x2b + .string "bus" + .byte 0x2 + .2byte 0x12c + .4byte 0xacfd + .byte 0x8 + .uleb128 0x1b + .4byte .LASF98 + .byte 0x2 + .2byte 0x12e + .4byte 0x74a1 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2311 + .byte 0x2 + .2byte 0x12f + .4byte 0x56 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF2312 + .byte 0x2 + .2byte 0x131 + .4byte 0x2b0 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF2313 + .byte 0x2 + .2byte 0x132 + .4byte 0xb061 + .byte 0x24 + .uleb128 0x1b + .4byte .LASF2314 + .byte 0x2 + .2byte 0x134 + .4byte 0xb0c6 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF2315 + .byte 0x2 + .2byte 0x135 + .4byte 0xb10d + .byte 0x30 + .uleb128 0x1b + .4byte .LASF2300 + .byte 0x2 + .2byte 0x137 + .4byte 0xa778 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF2301 + .byte 0x2 + .2byte 0x138 + .4byte 0xa789 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF2302 + .byte 0x2 + .2byte 0x139 + .4byte 0xa778 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF2303 + .byte 0x2 + .2byte 0x13a + .4byte 0xa789 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF2147 + .byte 0x2 + .2byte 0x13b + .4byte 0xafd4 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF2148 + .byte 0x2 + .2byte 0x13c + .4byte 0xa778 + .byte 0x60 + .uleb128 0x1b + .4byte .LASF2197 + .byte 0x2 + .2byte 0x13d + .4byte 0xae51 + .byte 0x68 + .uleb128 0x2b + .string "pm" + .byte 0x2 + .2byte 0x13f + .4byte 0xafda + .byte 0x70 + .uleb128 0x1b + .4byte .LASF2316 + .byte 0x2 + .2byte 0x140 + .4byte 0xa789 + .byte 0x78 + .uleb128 0x2b + .string "p" + .byte 0x2 + .2byte 0x142 + .4byte 0xb118 + .byte 0x80 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x2 + .2byte 0x144 + .4byte 0x15a + .byte 0x88 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x2 + .2byte 0x145 + .4byte 0x15a + .byte 0x90 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x2 + .2byte 0x146 + .4byte 0x15a + .byte 0x98 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x2 + .2byte 0x147 + .4byte 0x15a + .byte 0xa0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xae5d + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xafba + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xa200 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xafa6 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xafd4 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xa33e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xafc0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa482 + .uleb128 0x24 + .4byte .LASF2307 + .uleb128 0x3 + .4byte 0xafe0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xafe5 + .uleb128 0x24 + .4byte .LASF2317 + .uleb128 0x7 + .byte 0x8 + .4byte 0xaff0 + .uleb128 0x1d + .4byte .LASF2318 + .byte 0x30 + .byte 0x2 + .2byte 0x249 + .4byte 0xb056 + .uleb128 0x1b + .4byte .LASF265 + .byte 0x2 + .2byte 0x24a + .4byte 0x56 + .byte 0 + .uleb128 0x1b + .4byte .LASF2197 + .byte 0x2 + .2byte 0x24b + .4byte 0xae51 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2127 + .byte 0x2 + .2byte 0x24c + .4byte 0xafba + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2319 + .byte 0x2 + .2byte 0x24d + .4byte 0xb2bd + .byte 0x18 + .uleb128 0x1b + .4byte .LASF113 + .byte 0x2 + .2byte 0x24f + .4byte 0xa789 + .byte 0x20 + .uleb128 0x2b + .string "pm" + .byte 0x2 + .2byte 0x251 + .4byte 0xafda + .byte 0x28 + .byte 0 + .uleb128 0x3 + .4byte 0xaffb + .uleb128 0x7 + .byte 0x8 + .4byte 0xb056 + .uleb128 0x1f + .4byte .LASF2313 + .byte 0x4 + .4byte 0x6d + .byte 0x2 + .byte 0xf9 + .4byte 0xb084 + .uleb128 0xc + .4byte .LASF2320 + .byte 0 + .uleb128 0xc + .4byte .LASF2321 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2322 + .byte 0x2 + .byte 0 + .uleb128 0xd + .4byte .LASF2323 + .byte 0xc8 + .byte 0x9c + .byte 0xf1 + .4byte 0xb0c1 + .uleb128 0xe + .4byte .LASF265 + .byte 0x9c + .byte 0xf2 + .4byte 0x86cb + .byte 0 + .uleb128 0xe + .4byte .LASF193 + .byte 0x9c + .byte 0xf3 + .4byte 0x86cb + .byte 0x20 + .uleb128 0xe + .4byte .LASF2324 + .byte 0x9c + .byte 0xf4 + .4byte 0xb809 + .byte 0x40 + .uleb128 0xe + .4byte .LASF793 + .byte 0x9c + .byte 0xf5 + .4byte 0x30b6 + .byte 0xc0 + .byte 0 + .uleb128 0x3 + .4byte 0xb084 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb0c1 + .uleb128 0xd + .4byte .LASF2325 + .byte 0x20 + .byte 0x9c + .byte 0xbf + .4byte 0xb108 + .uleb128 0x20 + .string "id" + .byte 0x9c + .byte 0xc0 + .4byte 0xb7f9 + .byte 0 + .uleb128 0xe + .4byte .LASF2172 + .byte 0x9c + .byte 0xc1 + .4byte 0xb7ee + .byte 0x10 + .uleb128 0x20 + .string "cls" + .byte 0x9c + .byte 0xc2 + .4byte 0xd2 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2326 + .byte 0x9c + .byte 0xc3 + .4byte 0xd2 + .byte 0x1c + .byte 0 + .uleb128 0x3 + .4byte 0xb0cc + .uleb128 0x7 + .byte 0x8 + .4byte 0xb108 + .uleb128 0x24 + .4byte .LASF2327 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb113 + .uleb128 0x1d + .4byte .LASF2196 + .byte 0x98 + .byte 0x2 + .2byte 0x1ae + .4byte 0xb220 + .uleb128 0x1b + .4byte .LASF265 + .byte 0x2 + .2byte 0x1af + .4byte 0x56 + .byte 0 + .uleb128 0x1b + .4byte .LASF98 + .byte 0x2 + .2byte 0x1b0 + .4byte 0x74a1 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2328 + .byte 0x2 + .2byte 0x1b2 + .4byte 0xae51 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2297 + .byte 0x2 + .2byte 0x1b3 + .4byte 0xae51 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF2329 + .byte 0x2 + .2byte 0x1b4 + .4byte 0x9114 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF2330 + .byte 0x2 + .2byte 0x1b6 + .4byte 0xafba + .byte 0x28 + .uleb128 0x1b + .4byte .LASF2319 + .byte 0x2 + .2byte 0x1b7 + .4byte 0xb23a + .byte 0x30 + .uleb128 0x1b + .4byte .LASF2331 + .byte 0x2 + .2byte 0x1b9 + .4byte 0xb251 + .byte 0x38 + .uleb128 0x1b + .4byte .LASF2332 + .byte 0x2 + .2byte 0x1ba + .4byte 0xa789 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF2333 + .byte 0x2 + .2byte 0x1bc + .4byte 0xa778 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF2334 + .byte 0x2 + .2byte 0x1be + .4byte 0xa0b9 + .byte 0x50 + .uleb128 0x1b + .4byte .LASF2119 + .byte 0x2 + .2byte 0x1bf + .4byte 0xb266 + .byte 0x58 + .uleb128 0x1b + .4byte .LASF2120 + .byte 0x2 + .2byte 0x1c1 + .4byte 0xb281 + .byte 0x60 + .uleb128 0x2b + .string "pm" + .byte 0x2 + .2byte 0x1c3 + .4byte 0xafda + .byte 0x68 + .uleb128 0x2b + .string "p" + .byte 0x2 + .2byte 0x1c5 + .4byte 0xaff5 + .byte 0x70 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x2 + .2byte 0x1c7 + .4byte 0x15a + .byte 0x78 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x2 + .2byte 0x1c8 + .4byte 0x15a + .byte 0x80 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x2 + .2byte 0x1c9 + .4byte 0x15a + .byte 0x88 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x2 + .2byte 0x1ca + .4byte 0x15a + .byte 0x90 + .byte 0 + .uleb128 0x14 + .4byte 0x21e + .4byte 0xb234 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xb234 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x28f + .uleb128 0x7 + .byte 0x8 + .4byte 0xb220 + .uleb128 0x10 + .4byte 0xb24b + .uleb128 0x11 + .4byte 0xb24b + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb11e + .uleb128 0x7 + .byte 0x8 + .4byte 0xb240 + .uleb128 0x14 + .4byte 0x30b6 + .4byte 0xb266 + .uleb128 0x11 + .4byte 0xa496 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb257 + .uleb128 0x10 + .4byte 0xb281 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x9297 + .uleb128 0x11 + .4byte 0x929d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb26c + .uleb128 0x15 + .4byte .LASF2335 + .byte 0x2 + .2byte 0x1d2 + .4byte 0x9114 + .uleb128 0x15 + .4byte .LASF2336 + .byte 0x2 + .2byte 0x1d3 + .4byte 0x9114 + .uleb128 0x14 + .4byte 0x21e + .4byte 0xb2bd + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xb234 + .uleb128 0x11 + .4byte 0x9297 + .uleb128 0x11 + .4byte 0x929d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb29f + .uleb128 0x1d + .4byte .LASF2337 + .byte 0x20 + .byte 0x2 + .2byte 0x255 + .4byte 0xb2f8 + .uleb128 0x1b + .4byte .LASF2083 + .byte 0x2 + .2byte 0x256 + .4byte 0x9d89 + .byte 0 + .uleb128 0x1b + .4byte .LASF2046 + .byte 0x2 + .2byte 0x257 + .4byte 0xb317 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2110 + .byte 0x2 + .2byte 0x259 + .4byte 0xb33b + .byte 0x18 + .byte 0 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0xb311 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xb311 + .uleb128 0x11 + .4byte 0x21e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb2c3 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb2f8 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0xb33b + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xb311 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb31d + .uleb128 0x1d + .4byte .LASF2338 + .byte 0x10 + .byte 0x2 + .2byte 0x30b + .4byte 0xb369 + .uleb128 0x1b + .4byte .LASF2339 + .byte 0x2 + .2byte 0x310 + .4byte 0x6d + .byte 0 + .uleb128 0x1b + .4byte .LASF2340 + .byte 0x2 + .2byte 0x311 + .4byte 0x29 + .byte 0x8 + .byte 0 + .uleb128 0xd + .4byte .LASF2341 + .byte 0x38 + .byte 0x9d + .byte 0x15 + .4byte 0xb3ca + .uleb128 0xe + .4byte .LASF2342 + .byte 0x9d + .byte 0x16 + .4byte 0xb3cf + .byte 0 + .uleb128 0x20 + .string "ops" + .byte 0x9d + .byte 0x17 + .4byte 0xb984 + .byte 0x8 + .uleb128 0x20 + .string "dev" + .byte 0x9d + .byte 0x18 + .4byte 0xa496 + .byte 0x10 + .uleb128 0xe + .4byte .LASF130 + .byte 0x9d + .byte 0x1a + .4byte 0x15a + .byte 0x18 + .uleb128 0xe + .4byte .LASF131 + .byte 0x9d + .byte 0x1b + .4byte 0x15a + .byte 0x20 + .uleb128 0xe + .4byte .LASF132 + .byte 0x9d + .byte 0x1c + .4byte 0x15a + .byte 0x28 + .uleb128 0xe + .4byte .LASF133 + .byte 0x9d + .byte 0x1d + .4byte 0x15a + .byte 0x30 + .byte 0 + .uleb128 0x3 + .4byte 0xb369 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb369 + .uleb128 0x1e + .4byte .LASF2343 + .byte 0x4 + .4byte 0x6d + .byte 0x2 + .2byte 0x396 + .4byte 0xb3ff + .uleb128 0xc + .4byte .LASF2344 + .byte 0 + .uleb128 0xc + .4byte .LASF2345 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2346 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2347 + .byte 0x3 + .byte 0 + .uleb128 0x1d + .4byte .LASF2348 + .byte 0x68 + .byte 0x2 + .2byte 0x3a8 + .4byte 0xb48f + .uleb128 0x1b + .4byte .LASF2349 + .byte 0x2 + .2byte 0x3a9 + .4byte 0x3a7 + .byte 0 + .uleb128 0x1b + .4byte .LASF2350 + .byte 0x2 + .2byte 0x3aa + .4byte 0x3a7 + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2351 + .byte 0x2 + .2byte 0x3ab + .4byte 0x3a7 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF2352 + .byte 0x2 + .2byte 0x3ac + .4byte 0x3a7 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF2353 + .byte 0x2 + .2byte 0x3ad + .4byte 0x2b0 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF759 + .byte 0x2 + .2byte 0x3ae + .4byte 0xb3d5 + .byte 0x44 + .uleb128 0x1b + .4byte .LASF130 + .byte 0x2 + .2byte 0x3b0 + .4byte 0x15a + .byte 0x48 + .uleb128 0x1b + .4byte .LASF131 + .byte 0x2 + .2byte 0x3b1 + .4byte 0x15a + .byte 0x50 + .uleb128 0x1b + .4byte .LASF132 + .byte 0x2 + .2byte 0x3b2 + .4byte 0x15a + .byte 0x58 + .uleb128 0x1b + .4byte .LASF133 + .byte 0x2 + .2byte 0x3b3 + .4byte 0x15a + .byte 0x60 + .byte 0 + .uleb128 0x24 + .4byte .LASF2354 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb48f + .uleb128 0x7 + .byte 0x8 + .4byte 0xac6b + .uleb128 0xd + .4byte .LASF2355 + .byte 0xb0 + .byte 0x9e + .byte 0x9f + .4byte 0xb59c + .uleb128 0xe + .4byte .LASF1821 + .byte 0x9e + .byte 0xa0 + .4byte 0x3a7 + .byte 0 + .uleb128 0xe + .4byte .LASF265 + .byte 0x9e + .byte 0xa1 + .4byte 0x56 + .byte 0x10 + .uleb128 0x20 + .string "ops" + .byte 0x9e + .byte 0xa2 + .4byte 0xbe8f + .byte 0x18 + .uleb128 0xe + .4byte .LASF2356 + .byte 0x9e + .byte 0xa3 + .4byte 0x458 + .byte 0x20 + .uleb128 0xe + .4byte .LASF171 + .byte 0x9e + .byte 0xa4 + .4byte 0x6d + .byte 0x28 + .uleb128 0xe + .4byte .LASF2357 + .byte 0x9e + .byte 0xa5 + .4byte 0x6d + .byte 0x2c + .uleb128 0xe + .4byte .LASF2191 + .byte 0x9e + .byte 0xa8 + .4byte 0xb3cf + .byte 0x30 + .uleb128 0xe + .4byte .LASF2358 + .byte 0x9e + .byte 0xa9 + .4byte 0xbc7a + .byte 0x38 + .uleb128 0x20 + .string "gc" + .byte 0x9e + .byte 0xaa + .4byte 0xbe9a + .byte 0x40 + .uleb128 0xe + .4byte .LASF639 + .byte 0x9e + .byte 0xac + .4byte 0xb59c + .byte 0x48 + .uleb128 0xe + .4byte .LASF130 + .byte 0x9e + .byte 0xb2 + .4byte 0x15a + .byte 0x50 + .uleb128 0xe + .4byte .LASF131 + .byte 0x9e + .byte 0xb3 + .4byte 0x15a + .byte 0x58 + .uleb128 0xe + .4byte .LASF132 + .byte 0x9e + .byte 0xb4 + .4byte 0x15a + .byte 0x60 + .uleb128 0xe + .4byte .LASF133 + .byte 0x9e + .byte 0xb5 + .4byte 0x15a + .byte 0x68 + .uleb128 0xe + .4byte .LASF2359 + .byte 0x9e + .byte 0xb8 + .4byte 0x35c + .byte 0x70 + .uleb128 0xe + .4byte .LASF2360 + .byte 0x9e + .byte 0xb9 + .4byte 0x6d + .byte 0x78 + .uleb128 0xe + .4byte .LASF2361 + .byte 0x9e + .byte 0xba + .4byte 0x6d + .byte 0x7c + .uleb128 0xe + .4byte .LASF2362 + .byte 0x9e + .byte 0xbb + .4byte 0x4cff + .byte 0x80 + .uleb128 0xe + .4byte .LASF2363 + .byte 0x9e + .byte 0xbc + .4byte 0x2464 + .byte 0x90 + .uleb128 0xe + .4byte .LASF2364 + .byte 0x9e + .byte 0xbd + .4byte 0xbea0 + .byte 0xb0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb4a0 + .uleb128 0x24 + .4byte .LASF2365 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb5a2 + .uleb128 0xd + .4byte .LASF2366 + .byte 0xc0 + .byte 0x9 + .byte 0x84 + .4byte 0xb6da + .uleb128 0xe + .4byte .LASF2367 + .byte 0x9 + .byte 0x85 + .4byte 0xdbc4 + .byte 0 + .uleb128 0xe + .4byte .LASF2368 + .byte 0x9 + .byte 0x88 + .4byte 0xdbe9 + .byte 0x8 + .uleb128 0xe + .4byte .LASF109 + .byte 0x9 + .byte 0x8b + .4byte 0xdc17 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2369 + .byte 0x9 + .byte 0x8f + .4byte 0xdc4b + .byte 0x18 + .uleb128 0xe + .4byte .LASF2370 + .byte 0x9 + .byte 0x92 + .4byte 0xdc79 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2371 + .byte 0x9 + .byte 0x96 + .4byte 0xdc9e + .byte 0x28 + .uleb128 0xe + .4byte .LASF2372 + .byte 0x9 + .byte 0x9d + .4byte 0xdcc7 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2373 + .byte 0x9 + .byte 0xa0 + .4byte 0xdcec + .byte 0x38 + .uleb128 0xe + .4byte .LASF2374 + .byte 0x9 + .byte 0xa4 + .4byte 0xdd15 + .byte 0x40 + .uleb128 0xe + .4byte .LASF2375 + .byte 0x9 + .byte 0xa7 + .4byte 0xdc9e + .byte 0x48 + .uleb128 0xe + .4byte .LASF2376 + .byte 0x9 + .byte 0xaa + .4byte 0xdd35 + .byte 0x50 + .uleb128 0xe + .4byte .LASF2377 + .byte 0x9 + .byte 0xad + .4byte 0xdd35 + .byte 0x58 + .uleb128 0xe + .4byte .LASF2378 + .byte 0x9 + .byte 0xb0 + .4byte 0xdd55 + .byte 0x60 + .uleb128 0xe + .4byte .LASF2379 + .byte 0x9 + .byte 0xb3 + .4byte 0xdd55 + .byte 0x68 + .uleb128 0xe + .4byte .LASF2380 + .byte 0x9 + .byte 0xb6 + .4byte 0xdd75 + .byte 0x70 + .uleb128 0xe + .4byte .LASF2381 + .byte 0x9 + .byte 0xb8 + .4byte 0xdd8f + .byte 0x78 + .uleb128 0xe + .4byte .LASF2382 + .byte 0x9 + .byte 0xb9 + .4byte 0xdda9 + .byte 0x80 + .uleb128 0xe + .4byte .LASF2383 + .byte 0x9 + .byte 0xba + .4byte 0xdda9 + .byte 0x88 + .uleb128 0xe + .4byte .LASF2384 + .byte 0x9 + .byte 0xbb + .4byte 0xddd2 + .byte 0x90 + .uleb128 0xe + .4byte .LASF2385 + .byte 0x9 + .byte 0xbd + .4byte 0xdded + .byte 0x98 + .uleb128 0xe + .4byte .LASF130 + .byte 0x9 + .byte 0xc3 + .4byte 0x15a + .byte 0xa0 + .uleb128 0xe + .4byte .LASF131 + .byte 0x9 + .byte 0xc4 + .4byte 0x15a + .byte 0xa8 + .uleb128 0xe + .4byte .LASF132 + .byte 0x9 + .byte 0xc5 + .4byte 0x15a + .byte 0xb0 + .uleb128 0xe + .4byte .LASF133 + .byte 0x9 + .byte 0xc6 + .4byte 0x15a + .byte 0xb8 + .byte 0 + .uleb128 0x3 + .4byte 0xb5ad + .uleb128 0x7 + .byte 0x8 + .4byte 0xb6da + .uleb128 0x7 + .byte 0x8 + .4byte 0xb341 + .uleb128 0x24 + .4byte .LASF2386 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb6eb + .uleb128 0x45 + .string "cma" + .uleb128 0x7 + .byte 0x8 + .4byte 0xb6f6 + .uleb128 0x24 + .4byte .LASF2387 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb701 + .uleb128 0xd + .4byte .LASF2388 + .byte 0xf0 + .byte 0xd + .byte 0x33 + .4byte 0xb7b5 + .uleb128 0xe + .4byte .LASF265 + .byte 0xd + .byte 0x34 + .4byte 0x56 + .byte 0 + .uleb128 0xe + .4byte .LASF193 + .byte 0xd + .byte 0x35 + .4byte 0x56 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2389 + .byte 0xd + .byte 0x36 + .4byte 0xbb86 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2390 + .byte 0xd + .byte 0x37 + .4byte 0x56 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2191 + .byte 0xd + .byte 0x38 + .4byte 0xb369 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2391 + .byte 0xd + .byte 0x3a + .4byte 0xbbda + .byte 0x58 + .uleb128 0xe + .4byte .LASF2392 + .byte 0xd + .byte 0x3b + .4byte 0xbbda + .byte 0x60 + .uleb128 0xe + .4byte .LASF639 + .byte 0xd + .byte 0x3c + .4byte 0xb7ba + .byte 0x68 + .uleb128 0xe + .4byte .LASF2002 + .byte 0xd + .byte 0x3d + .4byte 0xb7ba + .byte 0x70 + .uleb128 0xe + .4byte .LASF641 + .byte 0xd + .byte 0x3e + .4byte 0xb7ba + .byte 0x78 + .uleb128 0xe + .4byte .LASF2114 + .byte 0xd + .byte 0x40 + .4byte 0x902d + .byte 0x80 + .uleb128 0xe + .4byte .LASF2393 + .byte 0xd + .byte 0x42 + .4byte 0x29 + .byte 0xe0 + .uleb128 0xe + .4byte .LASF793 + .byte 0xd + .byte 0x43 + .4byte 0x458 + .byte 0xe8 + .byte 0 + .uleb128 0x3 + .4byte 0xb70c + .uleb128 0x7 + .byte 0x8 + .4byte 0xb70c + .uleb128 0x24 + .4byte .LASF2198 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb7c0 + .uleb128 0x24 + .4byte .LASF2199 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb7cb + .uleb128 0x15 + .4byte .LASF2394 + .byte 0x2 + .2byte 0x590 + .4byte 0xa778 + .uleb128 0x15 + .4byte .LASF2395 + .byte 0x2 + .2byte 0x592 + .4byte 0xa778 + .uleb128 0x8 + .4byte .LASF2396 + .byte 0x9c + .byte 0xe + .4byte 0x29 + .uleb128 0x5 + .4byte 0x8b + .4byte 0xb809 + .uleb128 0x6 + .4byte 0x4f + .byte 0x8 + .byte 0 + .uleb128 0x5 + .4byte 0x61 + .4byte 0xb819 + .uleb128 0x6 + .4byte 0x4f + .byte 0x7f + .byte 0 + .uleb128 0x5 + .4byte 0x61 + .4byte 0xb829 + .uleb128 0x6 + .4byte 0x4f + .byte 0x13 + .byte 0 + .uleb128 0x1d + .4byte .LASF2397 + .byte 0x20 + .byte 0x9c + .2byte 0x222 + .4byte 0xb851 + .uleb128 0x1b + .4byte .LASF265 + .byte 0x9c + .2byte 0x223 + .4byte 0xb819 + .byte 0 + .uleb128 0x1b + .4byte .LASF2172 + .byte 0x9c + .2byte 0x224 + .4byte 0xb7ee + .byte 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0xb829 + .uleb128 0x5 + .4byte 0x68 + .4byte 0xb866 + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x3 + .4byte 0xb856 + .uleb128 0x19 + .4byte .LASF2398 + .byte 0x9f + .byte 0x14 + .4byte 0xc6 + .uleb128 0xd + .4byte .LASF2399 + .byte 0x20 + .byte 0x9f + .byte 0x1e + .4byte 0xb8a7 + .uleb128 0xe + .4byte .LASF228 + .byte 0x9f + .byte 0x1f + .4byte 0xe33 + .byte 0 + .uleb128 0xe + .4byte .LASF2400 + .byte 0x9f + .byte 0x20 + .4byte 0x3466 + .byte 0x8 + .uleb128 0xe + .4byte .LASF98 + .byte 0x9f + .byte 0x21 + .4byte 0x2eff + .byte 0x18 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb8ad + .uleb128 0x24 + .4byte .LASF2401 + .uleb128 0xd + .4byte .LASF2402 + .byte 0x80 + .byte 0x9d + .byte 0x75 + .4byte 0xb97f + .uleb128 0x20 + .string "get" + .byte 0x9d + .byte 0x76 + .4byte 0xba10 + .byte 0 + .uleb128 0x20 + .string "put" + .byte 0x9d + .byte 0x77 + .4byte 0xba21 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2403 + .byte 0x9d + .byte 0x78 + .4byte 0xba36 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2404 + .byte 0x9d + .byte 0x79 + .4byte 0xba56 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2405 + .byte 0x9d + .byte 0x7b + .4byte 0xba70 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2406 + .byte 0x9d + .byte 0x7d + .4byte 0xba99 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2407 + .byte 0x9d + .byte 0x82 + .4byte 0xbac3 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2408 + .byte 0x9d + .byte 0x85 + .4byte 0xbad8 + .byte 0x38 + .uleb128 0xe + .4byte .LASF2409 + .byte 0x9d + .byte 0x87 + .4byte 0xbaf2 + .byte 0x40 + .uleb128 0xe + .4byte .LASF2410 + .byte 0x9d + .byte 0x8a + .4byte 0xbb0c + .byte 0x48 + .uleb128 0xe + .4byte .LASF2411 + .byte 0x9d + .byte 0x8c + .4byte 0xbb40 + .byte 0x50 + .uleb128 0xe + .4byte .LASF2412 + .byte 0x9d + .byte 0x91 + .4byte 0xbaf2 + .byte 0x58 + .uleb128 0xe + .4byte .LASF2413 + .byte 0x9d + .byte 0x94 + .4byte 0xbad8 + .byte 0x60 + .uleb128 0xe + .4byte .LASF2414 + .byte 0x9d + .byte 0x96 + .4byte 0xba10 + .byte 0x68 + .uleb128 0xe + .4byte .LASF2415 + .byte 0x9d + .byte 0x97 + .4byte 0xbb60 + .byte 0x70 + .uleb128 0xe + .4byte .LASF2416 + .byte 0x9d + .byte 0x99 + .4byte 0xbb7a + .byte 0x78 + .byte 0 + .uleb128 0x3 + .4byte 0xb8b2 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb97f + .uleb128 0xd + .4byte .LASF2417 + .byte 0x10 + .byte 0x9d + .byte 0x26 + .4byte 0xb9ba + .uleb128 0xe + .4byte .LASF2418 + .byte 0x9d + .byte 0x27 + .4byte 0x6d + .byte 0 + .uleb128 0x20 + .string "id" + .byte 0x9d + .byte 0x28 + .4byte 0x6d + .byte 0x4 + .uleb128 0xe + .4byte .LASF2419 + .byte 0x9d + .byte 0x29 + .4byte 0xb9ba + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb3ca + .uleb128 0xd + .4byte .LASF2420 + .byte 0x50 + .byte 0x9d + .byte 0x34 + .4byte 0xb9f1 + .uleb128 0xe + .4byte .LASF2191 + .byte 0x9d + .byte 0x35 + .4byte 0xb3cf + .byte 0 + .uleb128 0xe + .4byte .LASF2421 + .byte 0x9d + .byte 0x36 + .4byte 0x6d + .byte 0x8 + .uleb128 0xe + .4byte .LASF1723 + .byte 0x9d + .byte 0x37 + .4byte 0xb9f1 + .byte 0x10 + .byte 0 + .uleb128 0x5 + .4byte 0x15a + .4byte 0xba01 + .uleb128 0x6 + .4byte 0x4f + .byte 0x7 + .byte 0 + .uleb128 0x14 + .4byte 0xb3cf + .4byte 0xba10 + .uleb128 0x11 + .4byte 0xb3cf + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xba01 + .uleb128 0x10 + .4byte 0xba21 + .uleb128 0x11 + .4byte 0xb3cf + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xba16 + .uleb128 0x14 + .4byte 0x2b0 + .4byte 0xba36 + .uleb128 0x11 + .4byte 0xb9ba + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xba27 + .uleb128 0x14 + .4byte 0x30b6 + .4byte 0xba50 + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0xba50 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xa773 + .uleb128 0x7 + .byte 0x8 + .4byte 0xba3c + .uleb128 0x14 + .4byte 0x2b0 + .4byte 0xba70 + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0x56 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xba5c + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xba99 + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xba76 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbabd + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0xbabd + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x56 + .uleb128 0x7 + .byte 0x8 + .4byte 0xba9f + .uleb128 0x14 + .4byte 0xb3cf + .4byte 0xbad8 + .uleb128 0x11 + .4byte 0xb9ba + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbac9 + .uleb128 0x14 + .4byte 0xb3cf + .4byte 0xbaf2 + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0xb3cf + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbade + .uleb128 0x14 + .4byte 0xb3cf + .4byte 0xbb0c + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0x56 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbaf8 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbb3a + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0xbb3a + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb9c0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbb12 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbb5a + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0xbb5a + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb98a + .uleb128 0x7 + .byte 0x8 + .4byte 0xbb46 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbb7a + .uleb128 0x11 + .4byte 0xb9ba + .uleb128 0x11 + .4byte 0xa496 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbb66 + .uleb128 0x7 + .byte 0x8 + .4byte 0x14a + .uleb128 0x8 + .4byte .LASF2389 + .byte 0xd + .byte 0x1c + .4byte 0x13f + .uleb128 0xd + .4byte .LASF2422 + .byte 0x58 + .byte 0xd + .byte 0x1f + .4byte 0xbbda + .uleb128 0xe + .4byte .LASF265 + .byte 0xd + .byte 0x20 + .4byte 0x21e + .byte 0 + .uleb128 0xe + .4byte .LASF2423 + .byte 0xd + .byte 0x21 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2424 + .byte 0xd + .byte 0x22 + .4byte 0x458 + .byte 0x10 + .uleb128 0xe + .4byte .LASF64 + .byte 0xd + .byte 0x23 + .4byte 0xbbda + .byte 0x18 + .uleb128 0xe + .4byte .LASF2083 + .byte 0xd + .byte 0x2b + .4byte 0x9e40 + .byte 0x20 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbb91 + .uleb128 0x7 + .byte 0x8 + .4byte 0xb7b5 + .uleb128 0x7 + .byte 0x8 + .4byte 0x23f + .uleb128 0x19 + .4byte .LASF2425 + .byte 0xd + .byte 0x6a + .4byte 0xa008 + .uleb128 0x19 + .4byte .LASF2426 + .byte 0xd + .byte 0x6b + .4byte 0xb97f + .uleb128 0x19 + .4byte .LASF2427 + .byte 0xd + .byte 0x87 + .4byte 0xb7ba + .uleb128 0x19 + .4byte .LASF2428 + .byte 0xd + .byte 0x88 + .4byte 0xb7ba + .uleb128 0x19 + .4byte .LASF2429 + .byte 0xd + .byte 0x89 + .4byte 0xb7ba + .uleb128 0x19 + .4byte .LASF2430 + .byte 0xd + .byte 0x8a + .4byte 0xb7ba + .uleb128 0x19 + .4byte .LASF2431 + .byte 0xd + .byte 0x8b + .4byte 0xe33 + .uleb128 0xd + .4byte .LASF2432 + .byte 0x50 + .byte 0x9e + .byte 0x3f + .4byte 0xbc6a + .uleb128 0xe + .4byte .LASF2191 + .byte 0x9e + .byte 0x40 + .4byte 0xb3cf + .byte 0 + .uleb128 0xe + .4byte .LASF2433 + .byte 0x9e + .byte 0x41 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2434 + .byte 0x9e + .byte 0x42 + .4byte 0xbc6a + .byte 0xc + .byte 0 + .uleb128 0x5 + .4byte 0x13f + .4byte 0xbc7a + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x1f + .4byte .LASF2435 + .byte 0x4 + .4byte 0x6d + .byte 0x9e + .byte 0x4c + .4byte 0xbcbb + .uleb128 0xc + .4byte .LASF2436 + .byte 0 + .uleb128 0xc + .4byte .LASF2437 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2438 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2439 + .byte 0x3 + .uleb128 0xc + .4byte .LASF2440 + .byte 0x4 + .uleb128 0xc + .4byte .LASF2441 + .byte 0x5 + .uleb128 0xc + .4byte .LASF2442 + .byte 0x6 + .uleb128 0xc + .4byte .LASF2443 + .byte 0x7 + .byte 0 + .uleb128 0xd + .4byte .LASF2444 + .byte 0x50 + .byte 0x9e + .byte 0x66 + .4byte 0xbd40 + .uleb128 0xe + .4byte .LASF2299 + .byte 0x9e + .byte 0x67 + .4byte 0xbd5e + .byte 0 + .uleb128 0xe + .4byte .LASF2445 + .byte 0x9e + .byte 0x69 + .4byte 0xbd83 + .byte 0x8 + .uleb128 0x20 + .string "map" + .byte 0x9e + .byte 0x6b + .4byte 0xbda2 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2446 + .byte 0x9e + .byte 0x6c + .4byte 0xbdb8 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2447 + .byte 0x9e + .byte 0x6d + .4byte 0xbde6 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2367 + .byte 0x9e + .byte 0x72 + .4byte 0xbe0a + .byte 0x28 + .uleb128 0xe + .4byte .LASF2368 + .byte 0x9e + .byte 0x74 + .4byte 0xbe25 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2286 + .byte 0x9e + .byte 0x76 + .4byte 0xbe44 + .byte 0x38 + .uleb128 0xe + .4byte .LASF2448 + .byte 0x9e + .byte 0x77 + .4byte 0xbe5a + .byte 0x40 + .uleb128 0xe + .4byte .LASF2449 + .byte 0x9e + .byte 0x78 + .4byte 0xbe7e + .byte 0x48 + .byte 0 + .uleb128 0x3 + .4byte 0xbcbb + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbd5e + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0xb7ba + .uleb128 0x11 + .4byte 0xbc7a + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbd45 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbd7d + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0xbd7d + .uleb128 0x11 + .4byte 0xbc7a + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbc39 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbd64 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbda2 + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x35c + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbd89 + .uleb128 0x10 + .4byte 0xbdb8 + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbda8 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbde6 + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0xb7ba + .uleb128 0x11 + .4byte 0xbb80 + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x67bd + .uleb128 0x11 + .4byte 0x34a7 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbdbe + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbe0a + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbdec + .uleb128 0x10 + .4byte 0xbe25 + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbe10 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbe44 + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0xb8a7 + .uleb128 0x11 + .4byte 0x2b0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbe2b + .uleb128 0x10 + .4byte 0xbe5a + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0xb8a7 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbe4a + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xbe7e + .uleb128 0x11 + .4byte 0xb59c + .uleb128 0x11 + .4byte 0xbd7d + .uleb128 0x11 + .4byte 0x67bd + .uleb128 0x11 + .4byte 0x34a7 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbe60 + .uleb128 0x19 + .4byte .LASF2450 + .byte 0x9e + .byte 0x81 + .4byte 0xbcbb + .uleb128 0x7 + .byte 0x8 + .4byte 0xbd40 + .uleb128 0x24 + .4byte .LASF2451 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbe95 + .uleb128 0x5 + .4byte 0x6d + .4byte 0xbeaf + .uleb128 0x41 + .4byte 0x4f + .byte 0 + .uleb128 0x15 + .4byte .LASF2452 + .byte 0x9e + .2byte 0x121 + .4byte 0xb97f + .uleb128 0x15 + .4byte .LASF2453 + .byte 0x9e + .2byte 0x1a5 + .4byte 0xbd40 + .uleb128 0xd + .4byte .LASF2454 + .byte 0x10 + .byte 0xa0 + .byte 0x45 + .4byte 0xbf04 + .uleb128 0xe + .4byte .LASF1118 + .byte 0xa0 + .byte 0x46 + .4byte 0xa9 + .byte 0 + .uleb128 0xe + .4byte .LASF171 + .byte 0xa0 + .byte 0x47 + .4byte 0xa9 + .byte 0x2 + .uleb128 0x20 + .string "len" + .byte 0xa0 + .byte 0x54 + .4byte 0xa9 + .byte 0x4 + .uleb128 0x20 + .string "buf" + .byte 0xa0 + .byte 0x55 + .4byte 0xbf04 + .byte 0x8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x8b + .uleb128 0x36 + .4byte .LASF2455 + .byte 0x22 + .byte 0xa0 + .byte 0x87 + .4byte 0xbf38 + .uleb128 0x22 + .4byte .LASF2456 + .byte 0xa0 + .byte 0x88 + .4byte 0x8b + .uleb128 0x22 + .4byte .LASF2457 + .byte 0xa0 + .byte 0x89 + .4byte 0xa9 + .uleb128 0x22 + .4byte .LASF2458 + .byte 0xa0 + .byte 0x8a + .4byte 0xbf38 + .byte 0 + .uleb128 0x5 + .4byte 0x8b + .4byte 0xbf48 + .uleb128 0x6 + .4byte 0x4f + .byte 0x21 + .byte 0 + .uleb128 0x19 + .4byte .LASF2459 + .byte 0xa1 + .byte 0x27 + .4byte 0xad03 + .uleb128 0x19 + .4byte .LASF2460 + .byte 0xa1 + .byte 0x28 + .4byte 0xaffb + .uleb128 0x19 + .4byte .LASF2461 + .byte 0xa1 + .byte 0x29 + .4byte 0xaffb + .uleb128 0x7 + .byte 0x8 + .4byte 0xbf6f + .uleb128 0x1a + .4byte .LASF2462 + .2byte 0x3e8 + .byte 0xa1 + .2byte 0x148 + .4byte 0xbfe9 + .uleb128 0x1b + .4byte .LASF171 + .byte 0xa1 + .2byte 0x149 + .4byte 0xb4 + .byte 0 + .uleb128 0x1b + .4byte .LASF1118 + .byte 0xa1 + .2byte 0x14a + .4byte 0xb4 + .byte 0x2 + .uleb128 0x1b + .4byte .LASF265 + .byte 0xa1 + .2byte 0x14d + .4byte 0xb819 + .byte 0x4 + .uleb128 0x1b + .4byte .LASF2463 + .byte 0xa1 + .2byte 0x14e + .4byte 0xc0f4 + .byte 0x18 + .uleb128 0x2b + .string "dev" + .byte 0xa1 + .2byte 0x14f + .4byte 0xa49c + .byte 0x20 + .uleb128 0x1c + .4byte .LASF2464 + .byte 0xa1 + .2byte 0x150 + .4byte 0xc6 + .2byte 0x3d0 + .uleb128 0x30 + .string "irq" + .byte 0xa1 + .2byte 0x151 + .4byte 0xc6 + .2byte 0x3d4 + .uleb128 0x1c + .4byte .LASF2465 + .byte 0xa1 + .2byte 0x152 + .4byte 0x3a7 + .2byte 0x3d8 + .byte 0 + .uleb128 0x3 + .4byte 0xbf6f + .uleb128 0x7 + .byte 0x8 + .4byte 0x110 + .uleb128 0x1a + .4byte .LASF2466 + .2byte 0x4c0 + .byte 0xa1 + .2byte 0x2a0 + .4byte 0xc0f4 + .uleb128 0x1b + .4byte .LASF98 + .byte 0xa1 + .2byte 0x2a1 + .4byte 0x74a1 + .byte 0 + .uleb128 0x1b + .4byte .LASF2196 + .byte 0xa1 + .2byte 0x2a2 + .4byte 0x6d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2467 + .byte 0xa1 + .2byte 0x2a3 + .4byte 0xc34f + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2468 + .byte 0xa1 + .2byte 0x2a4 + .4byte 0x458 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF2469 + .byte 0xa1 + .2byte 0x2a7 + .4byte 0xc355 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF2470 + .byte 0xa1 + .2byte 0x2a8 + .4byte 0xb876 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF2471 + .byte 0xa1 + .2byte 0x2a9 + .4byte 0xb876 + .byte 0x48 + .uleb128 0x1b + .4byte .LASF1037 + .byte 0xa1 + .2byte 0x2ab + .4byte 0xc6 + .byte 0x68 + .uleb128 0x1b + .4byte .LASF2472 + .byte 0xa1 + .2byte 0x2ac + .4byte 0xc6 + .byte 0x6c + .uleb128 0x2b + .string "dev" + .byte 0xa1 + .2byte 0x2ad + .4byte 0xa49c + .byte 0x70 + .uleb128 0x30 + .string "nr" + .byte 0xa1 + .2byte 0x2af + .4byte 0xc6 + .2byte 0x420 + .uleb128 0x1c + .4byte .LASF265 + .byte 0xa1 + .2byte 0x2b0 + .4byte 0xc35b + .2byte 0x424 + .uleb128 0x1c + .4byte .LASF2473 + .byte 0xa1 + .2byte 0x2b1 + .4byte 0x4579 + .2byte 0x458 + .uleb128 0x1c + .4byte .LASF2474 + .byte 0xa1 + .2byte 0x2b3 + .4byte 0x2464 + .2byte 0x478 + .uleb128 0x1c + .4byte .LASF2475 + .byte 0xa1 + .2byte 0x2b4 + .4byte 0x3a7 + .2byte 0x498 + .uleb128 0x1c + .4byte .LASF2476 + .byte 0xa1 + .2byte 0x2b6 + .4byte 0xc36b + .2byte 0x4a8 + .uleb128 0x1c + .4byte .LASF2477 + .byte 0xa1 + .2byte 0x2b7 + .4byte 0xc371 + .2byte 0x4b0 + .uleb128 0x1c + .4byte .LASF2478 + .byte 0xa1 + .2byte 0x2b9 + .4byte 0xb59c + .2byte 0x4b8 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbff4 + .uleb128 0x7 + .byte 0x8 + .4byte 0x970f + .uleb128 0x1d + .4byte .LASF2479 + .byte 0x18 + .byte 0xa1 + .2byte 0x207 + .4byte 0xc135 + .uleb128 0x1b + .4byte .LASF2480 + .byte 0xa1 + .2byte 0x20e + .4byte 0xc159 + .byte 0 + .uleb128 0x1b + .4byte .LASF2481 + .byte 0xa1 + .2byte 0x210 + .4byte 0xc192 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2482 + .byte 0xa1 + .2byte 0x215 + .4byte 0xc1a7 + .byte 0x10 + .byte 0 + .uleb128 0x3 + .4byte 0xc100 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xc153 + .uleb128 0x11 + .4byte 0xc0f4 + .uleb128 0x11 + .4byte 0xc153 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbec7 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc13a + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xc18c + .uleb128 0x11 + .4byte 0xc0f4 + .uleb128 0x11 + .4byte 0x11f + .uleb128 0x11 + .4byte 0xb4 + .uleb128 0x11 + .4byte 0x61 + .uleb128 0x11 + .4byte 0x110 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xc18c + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbf0a + .uleb128 0x7 + .byte 0x8 + .4byte 0xc15f + .uleb128 0x14 + .4byte 0x13f + .4byte 0xc1a7 + .uleb128 0x11 + .4byte 0xc0f4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc198 + .uleb128 0x1d + .4byte .LASF2483 + .byte 0x18 + .byte 0xa1 + .2byte 0x225 + .4byte 0xc1e2 + .uleb128 0x1b + .4byte .LASF2484 + .byte 0xa1 + .2byte 0x226 + .4byte 0xc1f7 + .byte 0 + .uleb128 0x1b + .4byte .LASF2485 + .byte 0xa1 + .2byte 0x227 + .4byte 0xc211 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2486 + .byte 0xa1 + .2byte 0x228 + .4byte 0xc1f7 + .byte 0x10 + .byte 0 + .uleb128 0x3 + .4byte 0xc1ad + .uleb128 0x10 + .4byte 0xc1f7 + .uleb128 0x11 + .4byte 0xc0f4 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc1e7 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xc211 + .uleb128 0x11 + .4byte 0xc0f4 + .uleb128 0x11 + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc1fd + .uleb128 0x1d + .4byte .LASF2487 + .byte 0x50 + .byte 0xa1 + .2byte 0x254 + .4byte 0xc2a7 + .uleb128 0x1b + .4byte .LASF2488 + .byte 0xa1 + .2byte 0x255 + .4byte 0xc2b6 + .byte 0 + .uleb128 0x1b + .4byte .LASF2489 + .byte 0xa1 + .2byte 0x257 + .4byte 0xc2b6 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2490 + .byte 0xa1 + .2byte 0x258 + .4byte 0xc2cc + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2491 + .byte 0xa1 + .2byte 0x259 + .4byte 0xc2b6 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF2492 + .byte 0xa1 + .2byte 0x25a + .4byte 0xc2cc + .byte 0x20 + .uleb128 0x1b + .4byte .LASF2493 + .byte 0xa1 + .2byte 0x25b + .4byte 0xc2b6 + .byte 0x28 + .uleb128 0x1b + .4byte .LASF2494 + .byte 0xa1 + .2byte 0x25d + .4byte 0xc2dd + .byte 0x30 + .uleb128 0x1b + .4byte .LASF2495 + .byte 0xa1 + .2byte 0x25e + .4byte 0xc2dd + .byte 0x38 + .uleb128 0x1b + .4byte .LASF2496 + .byte 0xa1 + .2byte 0x261 + .4byte 0xc2e8 + .byte 0x40 + .uleb128 0x1b + .4byte .LASF2497 + .byte 0xa1 + .2byte 0x262 + .4byte 0xc2e8 + .byte 0x48 + .byte 0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xc2b6 + .uleb128 0x11 + .4byte 0xc0f4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc2a7 + .uleb128 0x10 + .4byte 0xc2cc + .uleb128 0x11 + .4byte 0xc0f4 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc2bc + .uleb128 0x10 + .4byte 0xc2dd + .uleb128 0x11 + .4byte 0xc0f4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc2d2 + .uleb128 0x24 + .4byte .LASF2498 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc2e3 + .uleb128 0x1d + .4byte .LASF2499 + .byte 0x18 + .byte 0xa1 + .2byte 0x27f + .4byte 0xc34a + .uleb128 0x1b + .4byte .LASF171 + .byte 0xa1 + .2byte 0x280 + .4byte 0x15a + .byte 0 + .uleb128 0x1b + .4byte .LASF2500 + .byte 0xa1 + .2byte 0x281 + .4byte 0xc6 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2501 + .byte 0xa1 + .2byte 0x282 + .4byte 0x11f + .byte 0xc + .uleb128 0x1b + .4byte .LASF2502 + .byte 0xa1 + .2byte 0x283 + .4byte 0x11f + .byte 0xe + .uleb128 0x1b + .4byte .LASF2503 + .byte 0xa1 + .2byte 0x284 + .4byte 0x11f + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2504 + .byte 0xa1 + .2byte 0x285 + .4byte 0x11f + .byte 0x12 + .byte 0 + .uleb128 0x3 + .4byte 0xc2ee + .uleb128 0x7 + .byte 0x8 + .4byte 0xc135 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc1e2 + .uleb128 0x5 + .4byte 0x61 + .4byte 0xc36b + .uleb128 0x6 + .4byte 0x4f + .byte 0x2f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc217 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc34a + .uleb128 0x19 + .4byte .LASF2505 + .byte 0xa2 + .byte 0x8 + .4byte 0xc6 + .uleb128 0xf + .byte 0x40 + .byte 0xa3 + .byte 0x1d + .4byte 0xc3a3 + .uleb128 0xe + .4byte .LASF2506 + .byte 0xa3 + .byte 0x1e + .4byte 0x6d + .byte 0 + .uleb128 0xe + .4byte .LASF2507 + .byte 0xa3 + .byte 0x1f + .4byte 0xc3a3 + .byte 0x4 + .byte 0 + .uleb128 0x5 + .4byte 0x6d + .4byte 0xc3b3 + .uleb128 0x6 + .4byte 0x4f + .byte 0x6 + .byte 0 + .uleb128 0x8 + .4byte .LASF2508 + .byte 0xa3 + .byte 0x20 + .4byte 0xc382 + .uleb128 0x19 + .4byte .LASF2509 + .byte 0xa4 + .byte 0x15 + .4byte 0xc3b3 + .uleb128 0xd + .4byte .LASF2510 + .byte 0x8 + .byte 0xa3 + .byte 0x2c + .4byte 0xc3e2 + .uleb128 0x20 + .string "hcr" + .byte 0xa3 + .byte 0x2d + .4byte 0x15a + .byte 0 + .byte 0 + .uleb128 0x19 + .4byte .LASF2511 + .byte 0xa3 + .byte 0x30 + .4byte 0xc3c9 + .uleb128 0x15 + .4byte .LASF2512 + .byte 0xa5 + .2byte 0x102 + .4byte 0x162a + .uleb128 0x15 + .4byte .LASF2513 + .byte 0xa5 + .2byte 0x1ae + .4byte 0x2b0 + .uleb128 0x46 + .byte 0x4 + .4byte 0x6d + .byte 0xa5 + .2byte 0x1d0 + .4byte 0xc455 + .uleb128 0xc + .4byte .LASF2514 + .byte 0 + .uleb128 0xc + .4byte .LASF2515 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2516 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2517 + .byte 0x3 + .uleb128 0xc + .4byte .LASF2518 + .byte 0x4 + .uleb128 0xc + .4byte .LASF2519 + .byte 0x5 + .uleb128 0xc + .4byte .LASF2520 + .byte 0x6 + .uleb128 0xc + .4byte .LASF2521 + .byte 0x7 + .uleb128 0xc + .4byte .LASF2522 + .byte 0x8 + .uleb128 0xc + .4byte .LASF2523 + .byte 0x9 + .uleb128 0xc + .4byte .LASF2524 + .byte 0xa + .byte 0 + .uleb128 0x5 + .4byte 0x5c + .4byte 0xc465 + .uleb128 0x6 + .4byte 0x4f + .byte 0x9 + .byte 0 + .uleb128 0x3 + .4byte 0xc455 + .uleb128 0x15 + .4byte .LASF2525 + .byte 0xa5 + .2byte 0x1e5 + .4byte 0xc465 + .uleb128 0x15 + .4byte .LASF2526 + .byte 0xa5 + .2byte 0x203 + .4byte 0x2eff + .uleb128 0x5 + .4byte 0x29 + .4byte 0xc493 + .uleb128 0x40 + .4byte 0x4f + .2byte 0x1ff + .byte 0 + .uleb128 0x19 + .4byte .LASF2527 + .byte 0xa7 + .byte 0x39 + .4byte 0xc482 + .uleb128 0x5 + .4byte 0x3347 + .4byte 0xc4af + .uleb128 0x40 + .4byte 0x4f + .2byte 0x1ff + .byte 0 + .uleb128 0x15 + .4byte .LASF2528 + .byte 0xa7 + .2byte 0x2c3 + .4byte 0xc49e + .uleb128 0x5 + .4byte 0x3347 + .4byte 0xc4c6 + .uleb128 0x18 + .byte 0 + .uleb128 0x15 + .4byte .LASF2529 + .byte 0xa7 + .2byte 0x2c4 + .4byte 0xc4bb + .uleb128 0x15 + .4byte .LASF2530 + .byte 0xa7 + .2byte 0x2c5 + .4byte 0xc49e + .uleb128 0x15 + .4byte .LASF2531 + .byte 0xa7 + .2byte 0x2c6 + .4byte 0xc49e + .uleb128 0x19 + .4byte .LASF2532 + .byte 0xa8 + .byte 0x1e + .4byte 0x304 + .uleb128 0x19 + .4byte .LASF2533 + .byte 0x6b + .byte 0xb0 + .4byte 0x3a7 + .uleb128 0xb + .byte 0x4 + .4byte 0x6d + .byte 0xa9 + .byte 0x9d + .4byte 0xc52b + .uleb128 0xc + .4byte .LASF2534 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2535 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2536 + .byte 0x4 + .uleb128 0xc + .4byte .LASF2537 + .byte 0x8 + .uleb128 0xc + .4byte .LASF2538 + .byte 0x10 + .byte 0 + .uleb128 0x19 + .4byte .LASF2539 + .byte 0xaa + .byte 0x45 + .4byte 0x2eff + .uleb128 0xd + .4byte .LASF2540 + .byte 0x50 + .byte 0xab + .byte 0x42 + .4byte 0xc5af + .uleb128 0xe + .4byte .LASF2541 + .byte 0xab + .byte 0x43 + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF265 + .byte 0xab + .byte 0x44 + .4byte 0x56 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2542 + .byte 0xab + .byte 0x45 + .4byte 0x7cec + .byte 0x10 + .uleb128 0xe + .4byte .LASF932 + .byte 0xab + .byte 0x46 + .4byte 0x3a7 + .byte 0x18 + .uleb128 0xe + .4byte .LASF639 + .byte 0xab + .byte 0x47 + .4byte 0xa496 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2543 + .byte 0xab + .byte 0x48 + .4byte 0xa496 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2197 + .byte 0xab + .byte 0x49 + .4byte 0xae51 + .byte 0x38 + .uleb128 0xe + .4byte .LASF2544 + .byte 0xab + .byte 0x4a + .4byte 0x56 + .byte 0x40 + .uleb128 0xe + .4byte .LASF874 + .byte 0xab + .byte 0x4b + .4byte 0x28f + .byte 0x48 + .byte 0 + .uleb128 0x8 + .4byte .LASF2545 + .byte 0xac + .byte 0x3c + .4byte 0xc5ba + .uleb128 0x10 + .4byte 0xc5c5 + .uleb128 0x11 + .4byte 0xc5c5 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc5cb + .uleb128 0xd + .4byte .LASF2546 + .byte 0x38 + .byte 0xac + .byte 0x58 + .4byte 0xc623 + .uleb128 0xe + .4byte .LASF383 + .byte 0xac + .byte 0x59 + .4byte 0x558 + .byte 0 + .uleb128 0xe + .4byte .LASF2547 + .byte 0xac + .byte 0x5e + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF113 + .byte 0xac + .byte 0x5f + .4byte 0xc623 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2548 + .byte 0xac + .byte 0x60 + .4byte 0xc623 + .byte 0x18 + .uleb128 0x35 + .4byte .LASF2549 + .byte 0xac + .byte 0x61 + .4byte 0x2b0 + .byte 0x1 + .byte 0x1 + .byte 0x7 + .byte 0x20 + .uleb128 0x20 + .string "rcu" + .byte 0xac + .byte 0x62 + .4byte 0x41c + .byte 0x28 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc5af + .uleb128 0xd + .4byte .LASF2550 + .byte 0x20 + .byte 0xad + .byte 0xa + .4byte 0xc666 + .uleb128 0xe + .4byte .LASF854 + .byte 0xad + .byte 0xb + .4byte 0x2e3 + .byte 0 + .uleb128 0xe + .4byte .LASF957 + .byte 0xad + .byte 0xc + .4byte 0x2e3 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2551 + .byte 0xad + .byte 0xd + .4byte 0x9d58 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1711 + .byte 0xad + .byte 0xe + .4byte 0x4b7 + .byte 0x18 + .byte 0 + .uleb128 0xd + .4byte .LASF2552 + .byte 0x18 + .byte 0xae + .byte 0x18 + .4byte 0xc697 + .uleb128 0xe + .4byte .LASF71 + .byte 0xae + .byte 0x19 + .4byte 0x458 + .byte 0 + .uleb128 0xe + .4byte .LASF793 + .byte 0xae + .byte 0x1a + .4byte 0x458 + .byte 0x8 + .uleb128 0xe + .4byte .LASF589 + .byte 0xae + .byte 0x1b + .4byte 0xc6 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF2553 + .byte 0x30 + .byte 0xae + .byte 0x1e + .4byte 0xc6e0 + .uleb128 0xe + .4byte .LASF265 + .byte 0xae + .byte 0x1f + .4byte 0x56 + .byte 0 + .uleb128 0x20 + .string "key" + .byte 0xae + .byte 0x20 + .4byte 0xf07 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2554 + .byte 0xae + .byte 0x21 + .4byte 0x4a1 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2555 + .byte 0xae + .byte 0x22 + .4byte 0x4b7 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2556 + .byte 0xae + .byte 0x23 + .4byte 0xc6e0 + .byte 0x28 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc666 + .uleb128 0x8 + .4byte .LASF2557 + .byte 0xae + .byte 0x27 + .4byte 0xcd + .uleb128 0x19 + .4byte .LASF2558 + .byte 0xaf + .byte 0xa + .4byte 0xc697 + .uleb128 0x19 + .4byte .LASF2559 + .byte 0xaf + .byte 0xb + .4byte 0xc697 + .uleb128 0x19 + .4byte .LASF2560 + .byte 0xaf + .byte 0xc + .4byte 0xc697 + .uleb128 0x19 + .4byte .LASF2561 + .byte 0xaf + .byte 0xd + .4byte 0xc697 + .uleb128 0x19 + .4byte .LASF2562 + .byte 0xaf + .byte 0xe + .4byte 0xc697 + .uleb128 0x19 + .4byte .LASF2563 + .byte 0xaf + .byte 0xf + .4byte 0xc697 + .uleb128 0x19 + .4byte .LASF2564 + .byte 0xaf + .byte 0x10 + .4byte 0xc697 + .uleb128 0xd + .4byte .LASF2565 + .byte 0x28 + .byte 0x73 + .byte 0x14 + .4byte 0xc787 + .uleb128 0xe + .4byte .LASF2566 + .byte 0x73 + .byte 0x15 + .4byte 0x30 + .byte 0 + .uleb128 0xe + .4byte .LASF2567 + .byte 0x73 + .byte 0x16 + .4byte 0x30 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2368 + .byte 0x73 + .byte 0x17 + .4byte 0x29 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2568 + .byte 0x73 + .byte 0x18 + .4byte 0x29 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2367 + .byte 0x73 + .byte 0x19 + .4byte 0x29 + .byte 0x20 + .byte 0 + .uleb128 0x1f + .4byte .LASF2569 + .byte 0x4 + .4byte 0x6d + .byte 0x73 + .byte 0x39 + .4byte 0xc7aa + .uleb128 0xc + .4byte .LASF2570 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2571 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2572 + .byte 0x3 + .byte 0 + .uleb128 0x8 + .4byte .LASF2573 + .byte 0x73 + .byte 0x5f + .4byte 0xc7b5 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc7bb + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xc7de + .uleb128 0x11 + .4byte 0x3be9 + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0xc7de + .uleb128 0x11 + .4byte 0x6d + .uleb128 0x11 + .4byte 0xc7e4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x33e0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3327 + .uleb128 0x8 + .4byte .LASF2574 + .byte 0x73 + .byte 0x64 + .4byte 0xc7f5 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc7fb + .uleb128 0x10 + .4byte 0xc80b + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x458 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc5ba + .uleb128 0x19 + .4byte .LASF2575 + .byte 0x74 + .byte 0x2a + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF2576 + .byte 0x74 + .byte 0x34 + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF2577 + .byte 0x74 + .byte 0x35 + .4byte 0x458 + .uleb128 0x19 + .4byte .LASF2578 + .byte 0x74 + .byte 0x36 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF2579 + .byte 0x74 + .byte 0x39 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF2580 + .byte 0x74 + .byte 0x3f + .4byte 0xcd + .uleb128 0x19 + .4byte .LASF2581 + .byte 0x74 + .byte 0x40 + .4byte 0xcd + .uleb128 0x19 + .4byte .LASF2582 + .byte 0x74 + .byte 0x41 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF2583 + .byte 0x74 + .byte 0x44 + .4byte 0xcd + .uleb128 0x19 + .4byte .LASF2584 + .byte 0x74 + .byte 0x45 + .4byte 0xcd + .uleb128 0x19 + .4byte .LASF2585 + .byte 0x74 + .byte 0x46 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF2586 + .byte 0x74 + .byte 0x8b + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF2587 + .byte 0x74 + .byte 0x8d + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF2588 + .byte 0x74 + .byte 0x8e + .4byte 0x29 + .uleb128 0x19 + .4byte .LASF2589 + .byte 0x74 + .byte 0x90 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF2590 + .byte 0x74 + .byte 0x91 + .4byte 0xc6 + .uleb128 0x19 + .4byte .LASF2591 + .byte 0x74 + .byte 0x92 + .4byte 0x29 + .uleb128 0x5 + .4byte 0x3367 + .4byte 0xc8dc + .uleb128 0x6 + .4byte 0x4f + .byte 0xf + .byte 0 + .uleb128 0x15 + .4byte .LASF2592 + .byte 0x74 + .2byte 0x142 + .4byte 0xc8cc + .uleb128 0x7 + .byte 0x8 + .4byte 0x3387 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3307 + .uleb128 0x1e + .4byte .LASF2593 + .byte 0x4 + .4byte 0x6d + .byte 0x74 + .2byte 0x18a + .4byte 0xc918 + .uleb128 0xc + .4byte .LASF2594 + .byte 0 + .uleb128 0xc + .4byte .LASF2595 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2596 + .byte 0x2 + .byte 0 + .uleb128 0x10 + .4byte 0xc923 + .uleb128 0x11 + .4byte 0x3be9 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc918 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xc93d + .uleb128 0x11 + .4byte 0x3be9 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc929 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xc952 + .uleb128 0x11 + .4byte 0x3be9 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc943 + .uleb128 0x14 + .4byte 0x4f53 + .4byte 0xc967 + .uleb128 0x11 + .4byte 0x5983 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc958 + .uleb128 0x14 + .4byte 0x4f53 + .4byte 0xc981 + .uleb128 0x11 + .4byte 0x5983 + .uleb128 0x11 + .4byte 0xc8f4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc96d + .uleb128 0x10 + .4byte 0xc99c + .uleb128 0x11 + .4byte 0x5983 + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc987 + .uleb128 0x14 + .4byte 0x29 + .4byte 0xc9b1 + .uleb128 0x11 + .4byte 0x3be9 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc9a2 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xc9da + .uleb128 0x11 + .4byte 0x3be9 + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc9b7 + .uleb128 0x14 + .4byte 0x56 + .4byte 0xc9ef + .uleb128 0x11 + .4byte 0x3be9 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc9e0 + .uleb128 0x14 + .4byte 0x339d + .4byte 0xca09 + .uleb128 0x11 + .4byte 0x3be9 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc9f5 + .uleb128 0x19 + .4byte .LASF2597 + .byte 0xb0 + .byte 0x4c + .4byte 0xa211 + .uleb128 0x13 + .4byte .LASF2598 + .byte 0x74 + .2byte 0x2ba + .4byte 0x781e + .uleb128 0x5 + .4byte 0xca3c + .4byte 0xca31 + .uleb128 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0xca26 + .uleb128 0x7 + .byte 0x8 + .4byte 0xca1a + .uleb128 0x3 + .4byte 0xca36 + .uleb128 0x15 + .4byte .LASF2599 + .byte 0x74 + .2byte 0x2c8 + .4byte 0xca31 + .uleb128 0x1f + .4byte .LASF2600 + .byte 0x4 + .4byte 0x6d + .byte 0xb1 + .byte 0x19 + .4byte 0xcbba + .uleb128 0xc + .4byte .LASF2601 + .byte 0 + .uleb128 0xc + .4byte .LASF2602 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2603 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2604 + .byte 0x3 + .uleb128 0xc + .4byte .LASF2605 + .byte 0x4 + .uleb128 0xc + .4byte .LASF2606 + .byte 0x5 + .uleb128 0xc + .4byte .LASF2607 + .byte 0x6 + .uleb128 0xc + .4byte .LASF2608 + .byte 0x7 + .uleb128 0xc + .4byte .LASF2609 + .byte 0x8 + .uleb128 0xc + .4byte .LASF2610 + .byte 0x9 + .uleb128 0xc + .4byte .LASF2611 + .byte 0xa + .uleb128 0xc + .4byte .LASF2612 + .byte 0xb + .uleb128 0xc + .4byte .LASF2613 + .byte 0xc + .uleb128 0xc + .4byte .LASF2614 + .byte 0xd + .uleb128 0xc + .4byte .LASF2615 + .byte 0xe + .uleb128 0xc + .4byte .LASF2616 + .byte 0xf + .uleb128 0xc + .4byte .LASF2617 + .byte 0x10 + .uleb128 0xc + .4byte .LASF2618 + .byte 0x11 + .uleb128 0xc + .4byte .LASF2619 + .byte 0x12 + .uleb128 0xc + .4byte .LASF2620 + .byte 0x13 + .uleb128 0xc + .4byte .LASF2621 + .byte 0x14 + .uleb128 0xc + .4byte .LASF2622 + .byte 0x15 + .uleb128 0xc + .4byte .LASF2623 + .byte 0x16 + .uleb128 0xc + .4byte .LASF2624 + .byte 0x17 + .uleb128 0xc + .4byte .LASF2625 + .byte 0x18 + .uleb128 0xc + .4byte .LASF2626 + .byte 0x19 + .uleb128 0xc + .4byte .LASF2627 + .byte 0x1a + .uleb128 0xc + .4byte .LASF2628 + .byte 0x1b + .uleb128 0xc + .4byte .LASF2629 + .byte 0x1c + .uleb128 0xc + .4byte .LASF2630 + .byte 0x1d + .uleb128 0xc + .4byte .LASF2631 + .byte 0x1e + .uleb128 0xc + .4byte .LASF2632 + .byte 0x1f + .uleb128 0xc + .4byte .LASF2633 + .byte 0x20 + .uleb128 0xc + .4byte .LASF2634 + .byte 0x21 + .uleb128 0xc + .4byte .LASF2635 + .byte 0x22 + .uleb128 0xc + .4byte .LASF2636 + .byte 0x23 + .uleb128 0xc + .4byte .LASF2637 + .byte 0x24 + .uleb128 0xc + .4byte .LASF2638 + .byte 0x25 + .uleb128 0xc + .4byte .LASF2639 + .byte 0x26 + .uleb128 0xc + .4byte .LASF2640 + .byte 0x27 + .uleb128 0xc + .4byte .LASF2641 + .byte 0x28 + .uleb128 0xc + .4byte .LASF2642 + .byte 0x29 + .uleb128 0xc + .4byte .LASF2643 + .byte 0x2a + .uleb128 0xc + .4byte .LASF2644 + .byte 0x2b + .uleb128 0xc + .4byte .LASF2645 + .byte 0x2c + .uleb128 0xc + .4byte .LASF2646 + .byte 0x2d + .uleb128 0xc + .4byte .LASF2647 + .byte 0x2e + .uleb128 0xc + .4byte .LASF2648 + .byte 0x2f + .uleb128 0xc + .4byte .LASF2649 + .byte 0x30 + .uleb128 0xc + .4byte .LASF2650 + .byte 0x31 + .uleb128 0xc + .4byte .LASF2651 + .byte 0x32 + .uleb128 0xc + .4byte .LASF2652 + .byte 0x33 + .uleb128 0xc + .4byte .LASF2653 + .byte 0x34 + .uleb128 0xc + .4byte .LASF2654 + .byte 0x35 + .uleb128 0xc + .4byte .LASF2655 + .byte 0x36 + .uleb128 0xc + .4byte .LASF2656 + .byte 0x37 + .uleb128 0xc + .4byte .LASF2657 + .byte 0x38 + .uleb128 0xc + .4byte .LASF2658 + .byte 0x39 + .byte 0 + .uleb128 0x19 + .4byte .LASF2659 + .byte 0xb2 + .byte 0xc + .4byte 0xc6 + .uleb128 0x26 + .4byte .LASF2660 + .2byte 0x1c8 + .byte 0xb2 + .byte 0x2d + .4byte 0xcbdf + .uleb128 0xe + .4byte .LASF2006 + .byte 0xb2 + .byte 0x2e + .4byte 0xcbdf + .byte 0 + .byte 0 + .uleb128 0x5 + .4byte 0x29 + .4byte 0xcbef + .uleb128 0x6 + .4byte 0x4f + .byte 0x38 + .byte 0 + .uleb128 0x19 + .4byte .LASF2661 + .byte 0xb2 + .byte 0x31 + .4byte 0xcbc5 + .uleb128 0x19 + .4byte .LASF2662 + .byte 0xb2 + .byte 0x83 + .4byte 0x660a + .uleb128 0x5 + .4byte 0x558 + .4byte 0xcc14 + .uleb128 0x41 + .4byte 0x4f + .byte 0 + .uleb128 0x19 + .4byte .LASF1538 + .byte 0xb2 + .byte 0x84 + .4byte 0xcc05 + .uleb128 0x19 + .4byte .LASF2663 + .byte 0xb2 + .byte 0x85 + .4byte 0x66b4 + .uleb128 0x5 + .4byte 0x5c + .4byte 0xcc35 + .uleb128 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0xcc2a + .uleb128 0x15 + .4byte .LASF2664 + .byte 0xb2 + .2byte 0x183 + .4byte 0xcc35 + .uleb128 0x15 + .4byte .LASF2665 + .byte 0x74 + .2byte 0x8dc + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF2666 + .byte 0x74 + .2byte 0x8dd + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF2667 + .byte 0x74 + .2byte 0x8e0 + .4byte 0x558 + .uleb128 0x15 + .4byte .LASF2668 + .byte 0x74 + .2byte 0x9b0 + .4byte 0x29 + .uleb128 0x15 + .4byte .LASF2669 + .byte 0x74 + .2byte 0xa8e + .4byte 0xf52 + .uleb128 0x15 + .4byte .LASF2670 + .byte 0x74 + .2byte 0xa9b + .4byte 0xf52 + .uleb128 0x15 + .4byte .LASF2671 + .byte 0x74 + .2byte 0xad6 + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF2672 + .byte 0x74 + .2byte 0xae1 + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF2673 + .byte 0x74 + .2byte 0xb0b + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF2674 + .byte 0x74 + .2byte 0xb0c + .4byte 0xc6 + .uleb128 0x15 + .4byte .LASF2675 + .byte 0x74 + .2byte 0xb0e + .4byte 0x558 + .uleb128 0x15 + .4byte .LASF2676 + .byte 0x74 + .2byte 0xb43 + .4byte 0xc629 + .uleb128 0x19 + .4byte .LASF2677 + .byte 0xb3 + .byte 0x38 + .4byte 0x92a3 + .uleb128 0x19 + .4byte .LASF2678 + .byte 0xb4 + .byte 0x21 + .4byte 0x500 + .uleb128 0x8 + .4byte .LASF2679 + .byte 0xb5 + .byte 0x10 + .4byte 0xf4 + .uleb128 0x8 + .4byte .LASF2680 + .byte 0xb5 + .byte 0x11 + .4byte 0xa9 + .uleb128 0x8 + .4byte .LASF2681 + .byte 0xb5 + .byte 0x13 + .4byte 0xf4 + .uleb128 0x8 + .4byte .LASF2682 + .byte 0xb5 + .byte 0x15 + .4byte 0xd2 + .uleb128 0x8 + .4byte .LASF2683 + .byte 0xb5 + .byte 0x16 + .4byte 0xf4 + .uleb128 0x8 + .4byte .LASF2684 + .byte 0xb5 + .byte 0x17 + .4byte 0xe2 + .uleb128 0x21 + .byte 0x8 + .byte 0xb5 + .byte 0x94 + .4byte 0xcd4d + .uleb128 0x22 + .4byte .LASF2685 + .byte 0xb5 + .byte 0x95 + .4byte 0xcd18 + .uleb128 0x22 + .4byte .LASF2686 + .byte 0xb5 + .byte 0x96 + .4byte 0xccec + .byte 0 + .uleb128 0xf + .byte 0x10 + .byte 0xb5 + .byte 0x92 + .4byte 0xcd6e + .uleb128 0xe + .4byte .LASF2687 + .byte 0xb5 + .byte 0x93 + .4byte 0xcd23 + .byte 0 + .uleb128 0xe + .4byte .LASF2688 + .byte 0xb5 + .byte 0x97 + .4byte 0xcd2e + .byte 0x8 + .byte 0 + .uleb128 0x8 + .4byte .LASF2689 + .byte 0xb5 + .byte 0x98 + .4byte 0xcd4d + .uleb128 0xd + .4byte .LASF2690 + .byte 0x18 + .byte 0xb5 + .byte 0xc0 + .4byte 0xcdce + .uleb128 0xe + .4byte .LASF2691 + .byte 0xb5 + .byte 0xc1 + .4byte 0xcd0d + .byte 0 + .uleb128 0xe + .4byte .LASF2692 + .byte 0xb5 + .byte 0xc2 + .4byte 0x96 + .byte 0x4 + .uleb128 0xe + .4byte .LASF2693 + .byte 0xb5 + .byte 0xc3 + .4byte 0x96 + .byte 0x5 + .uleb128 0xe + .4byte .LASF2694 + .byte 0xb5 + .byte 0xc4 + .4byte 0xccf7 + .byte 0x6 + .uleb128 0xe + .4byte .LASF2695 + .byte 0xb5 + .byte 0xc5 + .4byte 0xccec + .byte 0x8 + .uleb128 0xe + .4byte .LASF2696 + .byte 0xb5 + .byte 0xc6 + .4byte 0xcd18 + .byte 0x10 + .byte 0 + .uleb128 0x8 + .4byte .LASF2697 + .byte 0xb5 + .byte 0xc7 + .4byte 0xcd79 + .uleb128 0x1d + .4byte .LASF2698 + .byte 0x40 + .byte 0xb5 + .2byte 0x13c + .4byte 0xce69 + .uleb128 0x1b + .4byte .LASF2699 + .byte 0xb5 + .2byte 0x13d + .4byte 0xcd0d + .byte 0 + .uleb128 0x1b + .4byte .LASF2700 + .byte 0xb5 + .2byte 0x13e + .4byte 0xcd0d + .byte 0x4 + .uleb128 0x1b + .4byte .LASF2701 + .byte 0xb5 + .2byte 0x13f + .4byte 0xcd18 + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2702 + .byte 0xb5 + .2byte 0x140 + .4byte 0xccec + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2703 + .byte 0xb5 + .2byte 0x141 + .4byte 0xcd02 + .byte 0x18 + .uleb128 0x1b + .4byte .LASF2704 + .byte 0xb5 + .2byte 0x142 + .4byte 0xcd18 + .byte 0x20 + .uleb128 0x1b + .4byte .LASF2705 + .byte 0xb5 + .2byte 0x143 + .4byte 0xcd0d + .byte 0x28 + .uleb128 0x1b + .4byte .LASF2706 + .byte 0xb5 + .2byte 0x144 + .4byte 0xcd0d + .byte 0x2c + .uleb128 0x1b + .4byte .LASF2707 + .byte 0xb5 + .2byte 0x145 + .4byte 0xcd18 + .byte 0x30 + .uleb128 0x1b + .4byte .LASF2708 + .byte 0xb5 + .2byte 0x146 + .4byte 0xcd18 + .byte 0x38 + .byte 0 + .uleb128 0x5 + .4byte 0xcd6e + .4byte 0xce74 + .uleb128 0x18 + .byte 0 + .uleb128 0x19 + .4byte .LASF2709 + .byte 0xb6 + .byte 0x25 + .4byte 0xce69 + .uleb128 0xd + .4byte .LASF2710 + .byte 0x20 + .byte 0xb7 + .byte 0x31 + .4byte 0xcebc + .uleb128 0xe + .4byte .LASF171 + .byte 0xb7 + .byte 0x33 + .4byte 0x6d + .byte 0 + .uleb128 0x20 + .string "set" + .byte 0xb7 + .byte 0x35 + .4byte 0xcf3b + .byte 0x8 + .uleb128 0x20 + .string "get" + .byte 0xb7 + .byte 0x37 + .4byte 0xcf55 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2368 + .byte 0xb7 + .byte 0x39 + .4byte 0x2f2f + .byte 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0xce7f + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xced5 + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0xced5 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xcf36 + .uleb128 0xd + .4byte .LASF2711 + .byte 0x28 + .byte 0xb7 + .byte 0x47 + .4byte 0xcf36 + .uleb128 0xe + .4byte .LASF265 + .byte 0xb7 + .byte 0x48 + .4byte 0x56 + .byte 0 + .uleb128 0x20 + .string "mod" + .byte 0xb7 + .byte 0x49 + .4byte 0x74a1 + .byte 0x8 + .uleb128 0x20 + .string "ops" + .byte 0xb7 + .byte 0x4a + .4byte 0xd009 + .byte 0x10 + .uleb128 0xe + .4byte .LASF1956 + .byte 0xb7 + .byte 0x4b + .4byte 0x12a + .byte 0x18 + .uleb128 0xe + .4byte .LASF556 + .byte 0xb7 + .byte 0x4c + .4byte 0x106 + .byte 0x1a + .uleb128 0xe + .4byte .LASF171 + .byte 0xb7 + .byte 0x4d + .4byte 0x110 + .byte 0x1b + .uleb128 0x23 + .4byte 0xcf5b + .byte 0x20 + .byte 0 + .uleb128 0x3 + .4byte 0xcedb + .uleb128 0x7 + .byte 0x8 + .4byte 0xcec1 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xcf55 + .uleb128 0x11 + .4byte 0x21e + .uleb128 0x11 + .4byte 0xced5 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xcf41 + .uleb128 0x21 + .byte 0x8 + .byte 0xb7 + .byte 0x4e + .4byte 0xcf85 + .uleb128 0x28 + .string "arg" + .byte 0xb7 + .byte 0x4f + .4byte 0x458 + .uleb128 0x28 + .string "str" + .byte 0xb7 + .byte 0x50 + .4byte 0xcfaf + .uleb128 0x28 + .string "arr" + .byte 0xb7 + .byte 0x51 + .4byte 0xd003 + .byte 0 + .uleb128 0xd + .4byte .LASF2712 + .byte 0x10 + .byte 0xb7 + .byte 0x58 + .4byte 0xcfaa + .uleb128 0xe + .4byte .LASF2001 + .byte 0xb7 + .byte 0x59 + .4byte 0x6d + .byte 0 + .uleb128 0xe + .4byte .LASF2713 + .byte 0xb7 + .byte 0x5a + .4byte 0x21e + .byte 0x8 + .byte 0 + .uleb128 0x3 + .4byte 0xcf85 + .uleb128 0x7 + .byte 0x8 + .4byte 0xcfaa + .uleb128 0xd + .4byte .LASF2714 + .byte 0x20 + .byte 0xb7 + .byte 0x5e + .4byte 0xcffe + .uleb128 0x20 + .string "max" + .byte 0xb7 + .byte 0x60 + .4byte 0x6d + .byte 0 + .uleb128 0xe + .4byte .LASF2715 + .byte 0xb7 + .byte 0x61 + .4byte 0x6d + .byte 0x4 + .uleb128 0x20 + .string "num" + .byte 0xb7 + .byte 0x62 + .4byte 0x34a7 + .byte 0x8 + .uleb128 0x20 + .string "ops" + .byte 0xb7 + .byte 0x63 + .4byte 0xd009 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2716 + .byte 0xb7 + .byte 0x64 + .4byte 0x458 + .byte 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0xcfb5 + .uleb128 0x7 + .byte 0x8 + .4byte 0xcffe + .uleb128 0x7 + .byte 0x8 + .4byte 0xcebc + .uleb128 0x5 + .4byte 0xcf36 + .4byte 0xd01a + .uleb128 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0xd00f + .uleb128 0x19 + .4byte .LASF2717 + .byte 0xb7 + .byte 0x55 + .4byte 0xd01a + .uleb128 0x19 + .4byte .LASF2718 + .byte 0xb7 + .byte 0x55 + .4byte 0xd01a + .uleb128 0x15 + .4byte .LASF2719 + .byte 0xb7 + .2byte 0x155 + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2720 + .byte 0xb7 + .2byte 0x15a + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2721 + .byte 0xb7 + .2byte 0x15f + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2722 + .byte 0xb7 + .2byte 0x164 + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2723 + .byte 0xb7 + .2byte 0x169 + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2724 + .byte 0xb7 + .2byte 0x16e + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2725 + .byte 0xb7 + .2byte 0x173 + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2726 + .byte 0xb7 + .2byte 0x178 + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2727 + .byte 0xb7 + .2byte 0x17d + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2728 + .byte 0xb7 + .2byte 0x184 + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2729 + .byte 0xb7 + .2byte 0x189 + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2730 + .byte 0xb7 + .2byte 0x18f + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2731 + .byte 0xb7 + .2byte 0x195 + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2732 + .byte 0xb7 + .2byte 0x1fe + .4byte 0xcebc + .uleb128 0x15 + .4byte .LASF2733 + .byte 0xb7 + .2byte 0x200 + .4byte 0xcebc + .uleb128 0xd + .4byte .LASF2734 + .byte 0x30 + .byte 0xb8 + .byte 0x28 + .4byte 0xd102 + .uleb128 0xe + .4byte .LASF838 + .byte 0xb8 + .byte 0x29 + .4byte 0xd102 + .byte 0 + .byte 0 + .uleb128 0x5 + .4byte 0x3416 + .4byte 0xd112 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0xd + .4byte .LASF2735 + .byte 0x10 + .byte 0xb9 + .byte 0x18 + .4byte 0xd143 + .uleb128 0x20 + .string "plt" + .byte 0xb9 + .byte 0x19 + .4byte 0xd143 + .byte 0 + .uleb128 0xe + .4byte .LASF2736 + .byte 0xb9 + .byte 0x1a + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2737 + .byte 0xb9 + .byte 0x1b + .4byte 0xc6 + .byte 0xc + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xcdd9 + .uleb128 0xd + .4byte .LASF2738 + .byte 0x28 + .byte 0xb9 + .byte 0x1e + .4byte 0xd17a + .uleb128 0xe + .4byte .LASF2739 + .byte 0xb9 + .byte 0x1f + .4byte 0xd112 + .byte 0 + .uleb128 0xe + .4byte .LASF1711 + .byte 0xb9 + .byte 0x20 + .4byte 0xd112 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2740 + .byte 0xb9 + .byte 0x23 + .4byte 0xd1b6 + .byte 0x20 + .byte 0 + .uleb128 0xd + .4byte .LASF2741 + .byte 0x10 + .byte 0xb9 + .byte 0x32 + .4byte 0xd1b6 + .uleb128 0xe + .4byte .LASF2742 + .byte 0xb9 + .byte 0x3b + .4byte 0x229 + .byte 0 + .uleb128 0xe + .4byte .LASF2743 + .byte 0xb9 + .byte 0x3c + .4byte 0x229 + .byte 0x4 + .uleb128 0xe + .4byte .LASF2744 + .byte 0xb9 + .byte 0x3d + .4byte 0x229 + .byte 0x8 + .uleb128 0x20 + .string "br" + .byte 0xb9 + .byte 0x3e + .4byte 0x229 + .byte 0xc + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd17a + .uleb128 0x19 + .4byte .LASF2745 + .byte 0xb9 + .byte 0x2d + .4byte 0x15a + .uleb128 0x5 + .4byte 0x61 + .4byte 0xd1d7 + .uleb128 0x6 + .4byte 0x4f + .byte 0x37 + .byte 0 + .uleb128 0xd + .4byte .LASF2746 + .byte 0x80 + .byte 0x89 + .byte 0x2e + .4byte 0xd21f + .uleb128 0xe + .4byte .LASF2114 + .byte 0x89 + .byte 0x2f + .4byte 0x902d + .byte 0 + .uleb128 0x20 + .string "mod" + .byte 0x89 + .byte 0x30 + .4byte 0x74a1 + .byte 0x60 + .uleb128 0xe + .4byte .LASF2747 + .byte 0x89 + .byte 0x31 + .4byte 0x9114 + .byte 0x68 + .uleb128 0x20 + .string "mp" + .byte 0x89 + .byte 0x32 + .4byte 0xd224 + .byte 0x70 + .uleb128 0xe + .4byte .LASF2748 + .byte 0x89 + .byte 0x33 + .4byte 0x459e + .byte 0x78 + .byte 0 + .uleb128 0x24 + .4byte .LASF2749 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd21f + .uleb128 0xd + .4byte .LASF2750 + .byte 0x38 + .byte 0x89 + .byte 0x36 + .4byte 0xd27f + .uleb128 0xe + .4byte .LASF2083 + .byte 0x89 + .byte 0x37 + .4byte 0x9d89 + .byte 0 + .uleb128 0xe + .4byte .LASF2046 + .byte 0x89 + .byte 0x38 + .4byte 0xd2a4 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2110 + .byte 0x89 + .byte 0x3a + .4byte 0xd2c8 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2751 + .byte 0x89 + .byte 0x3c + .4byte 0xd2de + .byte 0x20 + .uleb128 0xe + .4byte .LASF2752 + .byte 0x89 + .byte 0x3d + .4byte 0xd2f3 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2368 + .byte 0x89 + .byte 0x3e + .4byte 0xd304 + .byte 0x30 + .byte 0 + .uleb128 0x14 + .4byte 0x2ee + .4byte 0xd298 + .uleb128 0x11 + .4byte 0xd298 + .uleb128 0x11 + .4byte 0xd29e + .uleb128 0x11 + .4byte 0x21e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd22a + .uleb128 0x7 + .byte 0x8 + .4byte 0xd1d7 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd27f + .uleb128 0x14 + .4byte 0x2ee + .4byte 0xd2c8 + .uleb128 0x11 + .4byte 0xd298 + .uleb128 0x11 + .4byte 0xd29e + .uleb128 0x11 + .4byte 0x56 + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd2aa + .uleb128 0x10 + .4byte 0xd2de + .uleb128 0x11 + .4byte 0x74a1 + .uleb128 0x11 + .4byte 0x56 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd2ce + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xd2f3 + .uleb128 0x11 + .4byte 0x74a1 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd2e4 + .uleb128 0x10 + .4byte 0xd304 + .uleb128 0x11 + .4byte 0x74a1 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd2f9 + .uleb128 0x19 + .4byte .LASF2753 + .byte 0x89 + .byte 0x4a + .4byte 0xd22a + .uleb128 0x15 + .4byte .LASF2754 + .byte 0x89 + .2byte 0x10c + .4byte 0xc6 + .uleb128 0x1e + .4byte .LASF2755 + .byte 0x4 + .4byte 0x6d + .byte 0x89 + .2byte 0x119 + .4byte 0xd34b + .uleb128 0xc + .4byte .LASF2756 + .byte 0 + .uleb128 0xc + .4byte .LASF2757 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2758 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2759 + .byte 0x3 + .byte 0 + .uleb128 0x1d + .4byte .LASF2760 + .byte 0x38 + .byte 0x89 + .2byte 0x120 + .4byte 0xd373 + .uleb128 0x2b + .string "mod" + .byte 0x89 + .2byte 0x121 + .4byte 0x74a1 + .byte 0 + .uleb128 0x1b + .4byte .LASF838 + .byte 0x89 + .2byte 0x122 + .4byte 0xd0e9 + .byte 0x8 + .byte 0 + .uleb128 0x1d + .4byte .LASF2761 + .byte 0x50 + .byte 0x89 + .2byte 0x125 + .4byte 0xd3cf + .uleb128 0x1b + .4byte .LASF845 + .byte 0x89 + .2byte 0x127 + .4byte 0x458 + .byte 0 + .uleb128 0x1b + .4byte .LASF957 + .byte 0x89 + .2byte 0x129 + .4byte 0x6d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2762 + .byte 0x89 + .2byte 0x12b + .4byte 0x6d + .byte 0xc + .uleb128 0x1b + .4byte .LASF2763 + .byte 0x89 + .2byte 0x12d + .4byte 0x6d + .byte 0x10 + .uleb128 0x1b + .4byte .LASF2764 + .byte 0x89 + .2byte 0x12f + .4byte 0x6d + .byte 0x14 + .uleb128 0x2b + .string "mtn" + .byte 0x89 + .2byte 0x132 + .4byte 0xd34b + .byte 0x18 + .byte 0 + .uleb128 0x1d + .4byte .LASF2765 + .byte 0x18 + .byte 0x89 + .2byte 0x13d + .4byte 0xd404 + .uleb128 0x1b + .4byte .LASF2766 + .byte 0x89 + .2byte 0x13e + .4byte 0xd404 + .byte 0 + .uleb128 0x1b + .4byte .LASF2767 + .byte 0x89 + .2byte 0x13f + .4byte 0x6d + .byte 0x8 + .uleb128 0x1b + .4byte .LASF2768 + .byte 0x89 + .2byte 0x140 + .4byte 0x21e + .byte 0x10 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xcdce + .uleb128 0x7 + .byte 0x8 + .4byte 0x274 + .uleb128 0x7 + .byte 0x8 + .4byte 0x13a + .uleb128 0x7 + .byte 0x8 + .4byte 0xcedb + .uleb128 0xd + .4byte .LASF2769 + .byte 0x8 + .byte 0xba + .byte 0x12 + .4byte 0xd441 + .uleb128 0xe + .4byte .LASF2770 + .byte 0xba + .byte 0x14 + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF2771 + .byte 0xba + .byte 0x14 + .4byte 0xc6 + .byte 0x4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd41c + .uleb128 0x7 + .byte 0x8 + .4byte 0x995 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd3cf + .uleb128 0x24 + .4byte .LASF2772 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd453 + .uleb128 0x24 + .4byte .LASF2773 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd45e + .uleb128 0x7 + .byte 0x8 + .4byte 0xc6e6 + .uleb128 0x24 + .4byte .LASF2774 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd47a + .uleb128 0x7 + .byte 0x8 + .4byte 0xd46f + .uleb128 0x24 + .4byte .LASF2775 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd48b + .uleb128 0x7 + .byte 0x8 + .4byte 0xd480 + .uleb128 0x15 + .4byte .LASF2776 + .byte 0x89 + .2byte 0x1f6 + .4byte 0x2464 + .uleb128 0x15 + .4byte .LASF2777 + .byte 0x89 + .2byte 0x317 + .4byte 0xa002 + .uleb128 0x15 + .4byte .LASF2778 + .byte 0x89 + .2byte 0x318 + .4byte 0xa008 + .uleb128 0x15 + .4byte .LASF2779 + .byte 0x89 + .2byte 0x319 + .4byte 0xc6 + .uleb128 0x26 + .4byte .LASF838 + .2byte 0x3b0 + .byte 0xbb + .byte 0x16 + .4byte 0xd4db + .uleb128 0x20 + .string "dev" + .byte 0xbb + .byte 0x17 + .4byte 0xa49c + .byte 0 + .byte 0 + .uleb128 0x5 + .4byte 0xd4e6 + .4byte 0xd4e6 + .uleb128 0x18 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd4c1 + .uleb128 0x19 + .4byte .LASF2780 + .byte 0xbb + .byte 0x1f + .4byte 0xd4db + .uleb128 0x19 + .4byte .LASF2781 + .byte 0xbc + .byte 0x5a + .4byte 0x2b0 + .uleb128 0x19 + .4byte .LASF2782 + .byte 0xbc + .byte 0x6c + .4byte 0xad03 + .uleb128 0x26 + .4byte .LASF2783 + .2byte 0x3e8 + .byte 0xbd + .byte 0x17 + .4byte 0xd598 + .uleb128 0xe + .4byte .LASF265 + .byte 0xbd + .byte 0x18 + .4byte 0x56 + .byte 0 + .uleb128 0x20 + .string "id" + .byte 0xbd + .byte 0x19 + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2784 + .byte 0xbd + .byte 0x1a + .4byte 0x2b0 + .byte 0xc + .uleb128 0x20 + .string "dev" + .byte 0xbd + .byte 0x1b + .4byte 0xa49c + .byte 0x10 + .uleb128 0x27 + .4byte .LASF2785 + .byte 0xbd + .byte 0x1c + .4byte 0x13f + .2byte 0x3c0 + .uleb128 0x27 + .4byte .LASF2050 + .byte 0xbd + .byte 0x1d + .4byte 0x9714 + .2byte 0x3c8 + .uleb128 0x27 + .4byte .LASF2786 + .byte 0xbd + .byte 0x1f + .4byte 0xd59d + .2byte 0x3d0 + .uleb128 0x27 + .4byte .LASF2787 + .byte 0xbd + .byte 0x20 + .4byte 0x21e + .2byte 0x3d8 + .uleb128 0x27 + .4byte .LASF2788 + .byte 0xbd + .byte 0x23 + .4byte 0xd5a8 + .2byte 0x3e0 + .uleb128 0x27 + .4byte .LASF2189 + .byte 0xbd + .byte 0x26 + .4byte 0xacf5 + .2byte 0x3e8 + .byte 0 + .uleb128 0x3 + .4byte 0xd50d + .uleb128 0x7 + .byte 0x8 + .4byte 0xb851 + .uleb128 0x24 + .4byte .LASF2788 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd5a3 + .uleb128 0x19 + .4byte .LASF2789 + .byte 0xbd + .byte 0x30 + .4byte 0xad03 + .uleb128 0x19 + .4byte .LASF2790 + .byte 0xbd + .byte 0x31 + .4byte 0xa49c + .uleb128 0xd + .4byte .LASF2791 + .byte 0xe0 + .byte 0xbd + .byte 0xba + .4byte 0xd631 + .uleb128 0xe + .4byte .LASF2300 + .byte 0xbd + .byte 0xbb + .4byte 0xd646 + .byte 0 + .uleb128 0xe + .4byte .LASF2302 + .byte 0xbd + .byte 0xbc + .4byte 0xd646 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2303 + .byte 0xbd + .byte 0xbd + .4byte 0xd657 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2147 + .byte 0xbd + .byte 0xbe + .4byte 0xd671 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2148 + .byte 0xbd + .byte 0xbf + .4byte 0xd646 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2170 + .byte 0xbd + .byte 0xc0 + .4byte 0xae77 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2792 + .byte 0xbd + .byte 0xc1 + .4byte 0xd59d + .byte 0xd0 + .uleb128 0xe + .4byte .LASF2793 + .byte 0xbd + .byte 0xc2 + .4byte 0x2b0 + .byte 0xd8 + .byte 0 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xd640 + .uleb128 0x11 + .4byte 0xd640 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd50d + .uleb128 0x7 + .byte 0x8 + .4byte 0xd631 + .uleb128 0x10 + .4byte 0xd657 + .uleb128 0x11 + .4byte 0xd640 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd64c + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xd671 + .uleb128 0x11 + .4byte 0xd640 + .uleb128 0x11 + .4byte 0xa33e + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd65d + .uleb128 0x5 + .4byte 0xb0c1 + .4byte 0xd682 + .uleb128 0x18 + .byte 0 + .uleb128 0x3 + .4byte 0xd677 + .uleb128 0x19 + .4byte .LASF2794 + .byte 0xbe + .byte 0x31 + .4byte 0xd682 + .uleb128 0x19 + .4byte .LASF2795 + .byte 0xbf + .byte 0x16 + .4byte 0xe85 + .uleb128 0x19 + .4byte .LASF2796 + .byte 0xbf + .byte 0x17 + .4byte 0xe65 + .uleb128 0x19 + .4byte .LASF2797 + .byte 0xbf + .byte 0x19 + .4byte 0x497c + .uleb128 0x19 + .4byte .LASF2798 + .byte 0xbf + .byte 0x1a + .4byte 0x24a1 + .uleb128 0x19 + .4byte .LASF2799 + .byte 0x10 + .byte 0x8c + .4byte 0x2b0 + .uleb128 0x1e + .4byte .LASF2800 + .byte 0x4 + .4byte 0x6d + .byte 0x10 + .2byte 0x130 + .4byte 0xd6ed + .uleb128 0xc + .4byte .LASF2801 + .byte 0 + .uleb128 0xc + .4byte .LASF2802 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2803 + .byte 0x2 + .byte 0 + .uleb128 0x5 + .4byte 0x5174 + .4byte 0xd703 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .uleb128 0x6 + .4byte 0x4f + .byte 0xd + .byte 0 + .uleb128 0x15 + .4byte .LASF2804 + .byte 0x10 + .2byte 0x13b + .4byte 0xd6ed + .uleb128 0xb + .byte 0x4 + .4byte 0x6d + .byte 0xb + .byte 0x1b + .4byte 0xd728 + .uleb128 0xc + .4byte .LASF2805 + .byte 0 + .uleb128 0xc + .4byte .LASF2806 + .byte 0x1 + .byte 0 + .uleb128 0xd + .4byte .LASF2807 + .byte 0xd0 + .byte 0xb + .byte 0x20 + .4byte 0xd740 + .uleb128 0x20 + .string "ws" + .byte 0xb + .byte 0x21 + .4byte 0xab31 + .byte 0 + .byte 0 + .uleb128 0xd + .4byte .LASF2808 + .byte 0x4 + .byte 0xc0 + .byte 0x7 + .4byte 0xd759 + .uleb128 0xe + .4byte .LASF2809 + .byte 0xc0 + .byte 0x8 + .4byte 0xc6 + .byte 0 + .byte 0 + .uleb128 0x1f + .4byte .LASF2810 + .byte 0x4 + .4byte 0x6d + .byte 0xc1 + .byte 0xf + .4byte 0xd7b8 + .uleb128 0xc + .4byte .LASF2811 + .byte 0 + .uleb128 0xc + .4byte .LASF2812 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2813 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2814 + .byte 0x3 + .uleb128 0xc + .4byte .LASF2815 + .byte 0x4 + .uleb128 0xc + .4byte .LASF2816 + .byte 0x5 + .uleb128 0xc + .4byte .LASF2817 + .byte 0x6 + .uleb128 0xc + .4byte .LASF2818 + .byte 0x7 + .uleb128 0xc + .4byte .LASF2819 + .byte 0x8 + .uleb128 0xc + .4byte .LASF2820 + .byte 0x9 + .uleb128 0xc + .4byte .LASF2821 + .byte 0xa + .uleb128 0xc + .4byte .LASF2822 + .byte 0xb + .uleb128 0xc + .4byte .LASF2823 + .byte 0xc + .byte 0 + .uleb128 0xd + .4byte .LASF2824 + .byte 0x20 + .byte 0xc1 + .byte 0x20 + .4byte 0xd7e9 + .uleb128 0xe + .4byte .LASF2825 + .byte 0xc1 + .byte 0x21 + .4byte 0x6d + .byte 0 + .uleb128 0xe + .4byte .LASF793 + .byte 0xc1 + .byte 0x22 + .4byte 0x34a7 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2826 + .byte 0xc1 + .byte 0x23 + .4byte 0xd7e9 + .byte 0x10 + .byte 0 + .uleb128 0x5 + .4byte 0xbfee + .4byte 0xd7f9 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x1f + .4byte .LASF2827 + .byte 0x4 + .4byte 0x6d + .byte 0xc2 + .byte 0xe + .4byte 0xd828 + .uleb128 0xc + .4byte .LASF2828 + .byte 0 + .uleb128 0xc + .4byte .LASF2829 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2830 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2831 + .byte 0x3 + .uleb128 0xc + .4byte .LASF2832 + .byte 0x4 + .byte 0 + .uleb128 0xd + .4byte .LASF2833 + .byte 0x48 + .byte 0xc2 + .byte 0x16 + .4byte 0xd8b9 + .uleb128 0xe + .4byte .LASF759 + .byte 0xc2 + .byte 0x17 + .4byte 0xd7f9 + .byte 0 + .uleb128 0xe + .4byte .LASF2834 + .byte 0xc2 + .byte 0x18 + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2835 + .byte 0xc2 + .byte 0x19 + .4byte 0x21e + .byte 0x10 + .uleb128 0xe + .4byte .LASF2836 + .byte 0xc2 + .byte 0x1a + .4byte 0x46fe + .byte 0x18 + .uleb128 0xe + .4byte .LASF2837 + .byte 0xc2 + .byte 0x1b + .4byte 0xc6 + .byte 0x28 + .uleb128 0x20 + .string "len" + .byte 0xc2 + .byte 0x1c + .4byte 0xc6 + .byte 0x2c + .uleb128 0xe + .4byte .LASF2838 + .byte 0xc2 + .byte 0x1d + .4byte 0xc6 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2839 + .byte 0xc2 + .byte 0x1e + .4byte 0xc6 + .byte 0x34 + .uleb128 0xe + .4byte .LASF2840 + .byte 0xc2 + .byte 0x1f + .4byte 0xc6 + .byte 0x38 + .uleb128 0xe + .4byte .LASF2841 + .byte 0xc2 + .byte 0x20 + .4byte 0xc6 + .byte 0x3c + .uleb128 0xe + .4byte .LASF2842 + .byte 0xc2 + .byte 0x21 + .4byte 0xc6 + .byte 0x40 + .byte 0 + .uleb128 0x1f + .4byte .LASF2843 + .byte 0x4 + .4byte 0x6d + .byte 0xc3 + .byte 0x4a + .4byte 0xd95a + .uleb128 0xc + .4byte .LASF2844 + .byte 0 + .uleb128 0xc + .4byte .LASF2845 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2846 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2847 + .byte 0x3 + .uleb128 0xc + .4byte .LASF2848 + .byte 0x4 + .uleb128 0xc + .4byte .LASF2849 + .byte 0x5 + .uleb128 0xc + .4byte .LASF2850 + .byte 0x6 + .uleb128 0xc + .4byte .LASF2851 + .byte 0x7 + .uleb128 0xc + .4byte .LASF2852 + .byte 0x8 + .uleb128 0xc + .4byte .LASF2853 + .byte 0x9 + .uleb128 0xc + .4byte .LASF2854 + .byte 0xa + .uleb128 0xc + .4byte .LASF2855 + .byte 0xb + .uleb128 0xc + .4byte .LASF2856 + .byte 0xc + .uleb128 0xc + .4byte .LASF2857 + .byte 0xd + .uleb128 0xc + .4byte .LASF2858 + .byte 0xe + .uleb128 0xc + .4byte .LASF2859 + .byte 0xf + .uleb128 0xc + .4byte .LASF2860 + .byte 0x10 + .uleb128 0xc + .4byte .LASF2861 + .byte 0x11 + .uleb128 0xc + .4byte .LASF2862 + .byte 0x12 + .uleb128 0xc + .4byte .LASF2863 + .byte 0x13 + .uleb128 0xc + .4byte .LASF2864 + .byte 0x14 + .uleb128 0xc + .4byte .LASF2865 + .byte 0x15 + .uleb128 0xc + .4byte .LASF2866 + .byte 0x16 + .uleb128 0xc + .4byte .LASF2867 + .byte 0x17 + .byte 0 + .uleb128 0xd + .4byte .LASF2868 + .byte 0x40 + .byte 0xc3 + .byte 0x68 + .4byte 0xda03 + .uleb128 0xe + .4byte .LASF854 + .byte 0xc3 + .byte 0x69 + .4byte 0xc6 + .byte 0 + .uleb128 0xe + .4byte .LASF2869 + .byte 0xc3 + .byte 0x6a + .4byte 0xc6 + .byte 0x4 + .uleb128 0xe + .4byte .LASF2870 + .byte 0xc3 + .byte 0x6b + .4byte 0xc6 + .byte 0x8 + .uleb128 0xe + .4byte .LASF262 + .byte 0xc3 + .byte 0x6c + .4byte 0xc6 + .byte 0xc + .uleb128 0xe + .4byte .LASF2871 + .byte 0xc3 + .byte 0x6d + .4byte 0xc6 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2838 + .byte 0xc3 + .byte 0x6e + .4byte 0xc6 + .byte 0x14 + .uleb128 0xe + .4byte .LASF2839 + .byte 0xc3 + .byte 0x6f + .4byte 0xc6 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2840 + .byte 0xc3 + .byte 0x70 + .4byte 0xc6 + .byte 0x1c + .uleb128 0xe + .4byte .LASF2841 + .byte 0xc3 + .byte 0x71 + .4byte 0xc6 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2872 + .byte 0xc3 + .byte 0x72 + .4byte 0xc6 + .byte 0x24 + .uleb128 0xe + .4byte .LASF2873 + .byte 0xc3 + .byte 0x73 + .4byte 0xc6 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2842 + .byte 0xc3 + .byte 0x74 + .4byte 0xc6 + .byte 0x2c + .uleb128 0xe + .4byte .LASF2836 + .byte 0xc3 + .byte 0x75 + .4byte 0x46fe + .byte 0x30 + .byte 0 + .uleb128 0xd + .4byte .LASF2874 + .byte 0x50 + .byte 0x3 + .byte 0x10 + .4byte 0xda7c + .uleb128 0x20 + .string "dev" + .byte 0x3 + .byte 0x11 + .4byte 0xa496 + .byte 0 + .uleb128 0xe + .4byte .LASF2875 + .byte 0x3 + .byte 0x12 + .4byte 0x46fe + .byte 0x8 + .uleb128 0xe + .4byte .LASF2876 + .byte 0x3 + .byte 0x13 + .4byte 0x458 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2877 + .byte 0x3 + .byte 0x14 + .4byte 0xda92 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2878 + .byte 0x3 + .byte 0x15 + .4byte 0xdaa3 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2879 + .byte 0x3 + .byte 0x16 + .4byte 0xdaa3 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2880 + .byte 0x3 + .byte 0x17 + .4byte 0xdabd + .byte 0x38 + .uleb128 0xe + .4byte .LASF2881 + .byte 0x3 + .byte 0x18 + .4byte 0xdad2 + .byte 0x40 + .uleb128 0xe + .4byte .LASF2882 + .byte 0x3 + .byte 0x19 + .4byte 0xdaec + .byte 0x48 + .byte 0 + .uleb128 0x10 + .4byte 0xda8c + .uleb128 0x11 + .4byte 0xda8c + .uleb128 0x11 + .4byte 0x2b0 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xda03 + .uleb128 0x7 + .byte 0x8 + .4byte 0xda7c + .uleb128 0x10 + .4byte 0xdaa3 + .uleb128 0x11 + .4byte 0xda8c + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xda98 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xdabd + .uleb128 0x11 + .4byte 0xda8c + .uleb128 0x11 + .4byte 0x45a4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdaa9 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xdad2 + .uleb128 0x11 + .4byte 0xda8c + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdac3 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xdaec + .uleb128 0x11 + .4byte 0xda8c + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdad8 + .uleb128 0x1f + .4byte .LASF2883 + .byte 0x4 + .4byte 0x6d + .byte 0xc4 + .byte 0x5 + .4byte 0xdb1b + .uleb128 0xc + .4byte .LASF2884 + .byte 0 + .uleb128 0xc + .4byte .LASF2885 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2886 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2887 + .byte 0x3 + .byte 0 + .uleb128 0xd + .4byte .LASF2888 + .byte 0x20 + .byte 0xc5 + .byte 0xb + .4byte 0xdb64 + .uleb128 0xe + .4byte .LASF2889 + .byte 0xc5 + .byte 0xc + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF854 + .byte 0xc5 + .byte 0xd + .4byte 0x6d + .byte 0x8 + .uleb128 0xe + .4byte .LASF2423 + .byte 0xc5 + .byte 0xe + .4byte 0x6d + .byte 0xc + .uleb128 0xe + .4byte .LASF2890 + .byte 0xc5 + .byte 0xf + .4byte 0x325 + .byte 0x10 + .uleb128 0xe + .4byte .LASF2891 + .byte 0xc5 + .byte 0x11 + .4byte 0x6d + .byte 0x18 + .byte 0 + .uleb128 0xd + .4byte .LASF2892 + .byte 0x10 + .byte 0xc5 + .byte 0x2a + .4byte 0xdb95 + .uleb128 0x20 + .string "sgl" + .byte 0xc5 + .byte 0x2b + .4byte 0xdb95 + .byte 0 + .uleb128 0xe + .4byte .LASF2893 + .byte 0xc5 + .byte 0x2c + .4byte 0x6d + .byte 0x8 + .uleb128 0xe + .4byte .LASF2894 + .byte 0xc5 + .byte 0x2d + .4byte 0x6d + .byte 0xc + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdb1b + .uleb128 0x14 + .4byte 0x458 + .4byte 0xdbbe + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0xdbbe + .uleb128 0x11 + .4byte 0x330 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x325 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdb9b + .uleb128 0x10 + .4byte 0xdbe9 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x325 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdbca + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xdc17 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x3be9 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x325 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdbef + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xdc45 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xdc45 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x325 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdb64 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdc1d + .uleb128 0x14 + .4byte 0x325 + .4byte 0xdc79 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x339d + .uleb128 0x11 + .4byte 0x29 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0xdaf2 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdc51 + .uleb128 0x10 + .4byte 0xdc9e + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x325 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0xdaf2 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdc7f + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xdcc7 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xdb95 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xdaf2 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdca4 + .uleb128 0x10 + .4byte 0xdcec + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xdb95 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xdaf2 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdccd + .uleb128 0x14 + .4byte 0x325 + .4byte 0xdd15 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x346 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0xdaf2 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdcf2 + .uleb128 0x10 + .4byte 0xdd35 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x325 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0xdaf2 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdd1b + .uleb128 0x10 + .4byte 0xdd55 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0xdb95 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xdaf2 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdd3b + .uleb128 0x10 + .4byte 0xdd75 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0xdaf2 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdd5b + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xdd8f + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x325 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdd7b + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xdda9 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x15a + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdd95 + .uleb128 0x14 + .4byte 0x458 + .4byte 0xddd2 + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x325 + .uleb128 0x11 + .4byte 0x2e3 + .uleb128 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xddaf + .uleb128 0x10 + .4byte 0xdded + .uleb128 0x11 + .4byte 0xa496 + .uleb128 0x11 + .4byte 0x458 + .uleb128 0x11 + .4byte 0x2e3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xddd8 + .uleb128 0x19 + .4byte .LASF2895 + .byte 0x9 + .byte 0xc9 + .4byte 0xb6da + .uleb128 0x19 + .4byte .LASF2896 + .byte 0x9 + .byte 0xca + .4byte 0xb6da + .uleb128 0x19 + .4byte .LASF2897 + .byte 0x9 + .byte 0xcb + .4byte 0xb6da + .uleb128 0x24 + .4byte .LASF2898 + .uleb128 0x19 + .4byte .LASF2899 + .byte 0xc6 + .byte 0x7 + .4byte 0xde24 + .uleb128 0x7 + .byte 0x8 + .4byte 0xde14 + .uleb128 0x24 + .4byte .LASF2900 + .uleb128 0x19 + .4byte .LASF2901 + .byte 0xc6 + .byte 0x8 + .4byte 0xde3a + .uleb128 0x7 + .byte 0x8 + .4byte 0xde2a + .uleb128 0x19 + .4byte .LASF2902 + .byte 0xc6 + .byte 0x16 + .4byte 0xb6df + .uleb128 0x19 + .4byte .LASF2903 + .byte 0xc7 + .byte 0x1b + .4byte 0xb6da + .uleb128 0xd + .4byte .LASF2904 + .byte 0x18 + .byte 0xc8 + .byte 0xf + .4byte 0xde87 + .uleb128 0xe + .4byte .LASF2835 + .byte 0xc8 + .byte 0x10 + .4byte 0x458 + .byte 0 + .uleb128 0xe + .4byte .LASF2834 + .byte 0xc8 + .byte 0x11 + .4byte 0x29 + .byte 0x8 + .uleb128 0xe + .4byte .LASF957 + .byte 0xc8 + .byte 0x12 + .4byte 0x2e3 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF2905 + .byte 0xa8 + .byte 0xc8 + .byte 0x15 + .4byte 0xdfe3 + .uleb128 0x20 + .string "dev" + .byte 0xc8 + .byte 0x16 + .4byte 0xa496 + .byte 0 + .uleb128 0xe + .4byte .LASF2906 + .byte 0xc8 + .byte 0x17 + .4byte 0xe0a4 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2907 + .byte 0xc8 + .byte 0x18 + .4byte 0xda8c + .byte 0x10 + .uleb128 0x20 + .string "fb" + .byte 0xc8 + .byte 0x19 + .4byte 0xe0aa + .byte 0x18 + .uleb128 0xe + .4byte .LASF2908 + .byte 0xc8 + .byte 0x1a + .4byte 0xc6 + .byte 0x48 + .uleb128 0xe + .4byte .LASF262 + .byte 0xc8 + .byte 0x1c + .4byte 0x13f + .byte 0x4c + .uleb128 0xe + .4byte .LASF2870 + .byte 0xc8 + .byte 0x1d + .4byte 0x13f + .byte 0x50 + .uleb128 0xe + .4byte .LASF2909 + .byte 0xc8 + .byte 0x1e + .4byte 0x13f + .byte 0x54 + .uleb128 0xe + .4byte .LASF2910 + .byte 0xc8 + .byte 0x1f + .4byte 0x13f + .byte 0x58 + .uleb128 0xe + .4byte .LASF2872 + .byte 0xc8 + .byte 0x20 + .4byte 0x13f + .byte 0x5c + .uleb128 0xe + .4byte .LASF2873 + .byte 0xc8 + .byte 0x21 + .4byte 0x13f + .byte 0x60 + .uleb128 0xe + .4byte .LASF2911 + .byte 0xc8 + .byte 0x22 + .4byte 0x13f + .byte 0x64 + .uleb128 0xe + .4byte .LASF2912 + .byte 0xc8 + .byte 0x23 + .4byte 0x13f + .byte 0x68 + .uleb128 0x20 + .string "lsl" + .byte 0xc8 + .byte 0x24 + .4byte 0x13f + .byte 0x6c + .uleb128 0x20 + .string "lbl" + .byte 0xc8 + .byte 0x25 + .4byte 0x13f + .byte 0x70 + .uleb128 0x20 + .string "ldl" + .byte 0xc8 + .byte 0x26 + .4byte 0x13f + .byte 0x74 + .uleb128 0x20 + .string "lel" + .byte 0xc8 + .byte 0x27 + .4byte 0x13f + .byte 0x78 + .uleb128 0xe + .4byte .LASF2913 + .byte 0xc8 + .byte 0x28 + .4byte 0x13f + .byte 0x7c + .uleb128 0xe + .4byte .LASF2914 + .byte 0xc8 + .byte 0x29 + .4byte 0x13f + .byte 0x80 + .uleb128 0x20 + .string "fsl" + .byte 0xc8 + .byte 0x2a + .4byte 0x13f + .byte 0x84 + .uleb128 0x20 + .string "fbl" + .byte 0xc8 + .byte 0x2b + .4byte 0x13f + .byte 0x88 + .uleb128 0x20 + .string "fdl" + .byte 0xc8 + .byte 0x2c + .4byte 0x13f + .byte 0x8c + .uleb128 0x20 + .string "fel" + .byte 0xc8 + .byte 0x2d + .4byte 0x13f + .byte 0x90 + .uleb128 0xe + .4byte .LASF2915 + .byte 0xc8 + .byte 0x2e + .4byte 0x13f + .byte 0x94 + .uleb128 0xe + .4byte .LASF2871 + .byte 0xc8 + .byte 0x2f + .4byte 0x13f + .byte 0x98 + .uleb128 0xe + .4byte .LASF2916 + .byte 0xc8 + .byte 0x30 + .4byte 0x13f + .byte 0x9c + .uleb128 0xe + .4byte .LASF2917 + .byte 0xc8 + .byte 0x31 + .4byte 0x13f + .byte 0xa0 + .uleb128 0xe + .4byte .LASF2918 + .byte 0xc8 + .byte 0x32 + .4byte 0x13f + .byte 0xa4 + .byte 0 + .uleb128 0xd + .4byte .LASF2919 + .byte 0x70 + .byte 0xa + .byte 0x17 + .4byte 0xe0a4 + .uleb128 0x20 + .string "dev" + .byte 0xa + .byte 0x18 + .4byte 0xa496 + .byte 0 + .uleb128 0xe + .4byte .LASF2920 + .byte 0xa + .byte 0x19 + .4byte 0x458 + .byte 0x8 + .uleb128 0x20 + .string "len" + .byte 0xa + .byte 0x1a + .4byte 0x6d + .byte 0x10 + .uleb128 0x20 + .string "irq" + .byte 0xa + .byte 0x1b + .4byte 0xc6 + .byte 0x14 + .uleb128 0xe + .4byte .LASF2921 + .byte 0xa + .byte 0x1d + .4byte 0xe0bf + .byte 0x18 + .uleb128 0xe + .4byte .LASF2922 + .byte 0xa + .byte 0x1e + .4byte 0xe0bf + .byte 0x20 + .uleb128 0xe + .4byte .LASF2923 + .byte 0xa + .byte 0x1f + .4byte 0xe0ca + .byte 0x28 + .uleb128 0xe + .4byte .LASF2924 + .byte 0xa + .byte 0x21 + .4byte 0xe0ea + .byte 0x30 + .uleb128 0xe + .4byte .LASF2925 + .byte 0xa + .byte 0x22 + .4byte 0xe0fb + .byte 0x38 + .uleb128 0xe + .4byte .LASF2926 + .byte 0xa + .byte 0x23 + .4byte 0xe120 + .byte 0x40 + .uleb128 0xe + .4byte .LASF2927 + .byte 0xa + .byte 0x24 + .4byte 0xe13b + .byte 0x48 + .uleb128 0xe + .4byte .LASF2928 + .byte 0xa + .byte 0x25 + .4byte 0xe151 + .byte 0x50 + .uleb128 0xe + .4byte .LASF2929 + .byte 0xa + .byte 0x26 + .4byte 0xe175 + .byte 0x58 + .uleb128 0xe + .4byte .LASF2930 + .byte 0xa + .byte 0x27 + .4byte 0xe18b + .byte 0x60 + .uleb128 0xe + .4byte .LASF2931 + .byte 0xa + .byte 0x28 + .4byte 0x4b7 + .byte 0x68 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdfe3 + .uleb128 0x5 + .4byte 0xde56 + .4byte 0xe0ba + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x45 + .string "clk" + .uleb128 0x7 + .byte 0x8 + .4byte 0xe0ba + .uleb128 0x24 + .4byte .LASF2932 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe0c5 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xe0e4 + .uleb128 0x11 + .4byte 0xe0a4 + .uleb128 0x11 + .4byte 0xe0e4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xde87 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe0d0 + .uleb128 0x10 + .4byte 0xe0fb + .uleb128 0x11 + .4byte 0xe0a4 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe0f0 + .uleb128 0x10 + .4byte 0xe120 + .uleb128 0x11 + .4byte 0xe0a4 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe101 + .uleb128 0x10 + .4byte 0xe13b + .uleb128 0x11 + .4byte 0xe0a4 + .uleb128 0x11 + .4byte 0x13f + .uleb128 0x11 + .4byte 0x13f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe126 + .uleb128 0x10 + .4byte 0xe151 + .uleb128 0x11 + .4byte 0xe0a4 + .uleb128 0x11 + .4byte 0x13f + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe141 + .uleb128 0x14 + .4byte 0xc6 + .4byte 0xe175 + .uleb128 0x11 + .4byte 0xe0a4 + .uleb128 0x11 + .4byte 0x34a7 + .uleb128 0x11 + .4byte 0xc6 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe157 + .uleb128 0x10 + .4byte 0xe18b + .uleb128 0x11 + .4byte 0xe0a4 + .uleb128 0x11 + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe17b + .uleb128 0x1f + .4byte .LASF2933 + .byte 0x4 + .4byte 0x6d + .byte 0x1 + .byte 0x33 + .4byte 0xe1ba + .uleb128 0xc + .4byte .LASF2934 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2935 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2936 + .byte 0x3 + .uleb128 0xc + .4byte .LASF2937 + .byte 0x4 + .byte 0 + .uleb128 0x1f + .4byte .LASF2938 + .byte 0x4 + .4byte 0x6d + .byte 0x1 + .byte 0x3a + .4byte 0xe1e3 + .uleb128 0xc + .4byte .LASF2939 + .byte 0 + .uleb128 0xc + .4byte .LASF2940 + .byte 0x1 + .uleb128 0xc + .4byte .LASF2941 + .byte 0x2 + .uleb128 0xc + .4byte .LASF2942 + .byte 0x3 + .byte 0 + .uleb128 0x26 + .4byte .LASF2943 + .2byte 0x268 + .byte 0x1 + .byte 0x42 + .4byte 0xe462 + .uleb128 0xe + .4byte .LASF2944 + .byte 0x1 + .byte 0x43 + .4byte 0x29 + .byte 0 + .uleb128 0xe + .4byte .LASF2945 + .byte 0x1 + .byte 0x44 + .4byte 0x21e + .byte 0x8 + .uleb128 0xe + .4byte .LASF2946 + .byte 0x1 + .byte 0x45 + .4byte 0x21e + .byte 0x10 + .uleb128 0xe + .4byte .LASF2947 + .byte 0x1 + .byte 0x46 + .4byte 0xc6 + .byte 0x18 + .uleb128 0xe + .4byte .LASF2948 + .byte 0x1 + .byte 0x47 + .4byte 0xc6 + .byte 0x1c + .uleb128 0xe + .4byte .LASF2949 + .byte 0x1 + .byte 0x48 + .4byte 0xc6 + .byte 0x20 + .uleb128 0xe + .4byte .LASF2950 + .byte 0x1 + .byte 0x49 + .4byte 0x29 + .byte 0x28 + .uleb128 0xe + .4byte .LASF2951 + .byte 0x1 + .byte 0x4a + .4byte 0xc6 + .byte 0x30 + .uleb128 0xe + .4byte .LASF2952 + .byte 0x1 + .byte 0x4b + .4byte 0xc6 + .byte 0x34 + .uleb128 0xe + .4byte .LASF2953 + .byte 0x1 + .byte 0x4c + .4byte 0x61 + .byte 0x38 + .uleb128 0xe + .4byte .LASF2954 + .byte 0x1 + .byte 0x4d + .4byte 0x61 + .byte 0x39 + .uleb128 0xe + .4byte .LASF2955 + .byte 0x1 + .byte 0x4e + .4byte 0xc6 + .byte 0x3c + .uleb128 0xe + .4byte .LASF2956 + .byte 0x1 + .byte 0x4f + .4byte 0xc6 + .byte 0x40 + .uleb128 0xe + .4byte .LASF2957 + .byte 0x1 + .byte 0x50 + .4byte 0xc6 + .byte 0x44 + .uleb128 0xe + .4byte .LASF2958 + .byte 0x1 + .byte 0x51 + .4byte 0xc6 + .byte 0x48 + .uleb128 0xe + .4byte .LASF2959 + .byte 0x1 + .byte 0x52 + .4byte 0xc6 + .byte 0x4c + .uleb128 0xe + .4byte .LASF2960 + .byte 0x1 + .byte 0x53 + .4byte 0xc6 + .byte 0x50 + .uleb128 0xe + .4byte .LASF2961 + .byte 0x1 + .byte 0x54 + .4byte 0xc6 + .byte 0x54 + .uleb128 0xe + .4byte .LASF2962 + .byte 0x1 + .byte 0x55 + .4byte 0xc6 + .byte 0x58 + .uleb128 0xe + .4byte .LASF2870 + .byte 0x1 + .byte 0x56 + .4byte 0xc6 + .byte 0x5c + .uleb128 0xe + .4byte .LASF262 + .byte 0x1 + .byte 0x57 + .4byte 0xc6 + .byte 0x60 + .uleb128 0xe + .4byte .LASF2963 + .byte 0x1 + .byte 0x58 + .4byte 0xc6 + .byte 0x64 + .uleb128 0x20 + .string "dev" + .byte 0x1 + .byte 0x59 + .4byte 0xa496 + .byte 0x68 + .uleb128 0xe + .4byte .LASF2964 + .byte 0x1 + .byte 0x5a + .4byte 0xd7b8 + .byte 0x70 + .uleb128 0xe + .4byte .LASF2965 + .byte 0x1 + .byte 0x5b + .4byte 0xc6 + .byte 0x90 + .uleb128 0xe + .4byte .LASF2966 + .byte 0x1 + .byte 0x5c + .4byte 0xbfee + .byte 0x98 + .uleb128 0xe + .4byte .LASF2967 + .byte 0x1 + .byte 0x5d + .4byte 0xbfee + .byte 0xa0 + .uleb128 0xe + .4byte .LASF2968 + .byte 0x1 + .byte 0x5e + .4byte 0xbfee + .byte 0xa8 + .uleb128 0xe + .4byte .LASF2969 + .byte 0x1 + .byte 0x5f + .4byte 0xbfee + .byte 0xb0 + .uleb128 0xe + .4byte .LASF2970 + .byte 0x1 + .byte 0x60 + .4byte 0xe462 + .byte 0xb8 + .uleb128 0xe + .4byte .LASF2971 + .byte 0x1 + .byte 0x61 + .4byte 0xc6 + .byte 0xc8 + .uleb128 0xe + .4byte .LASF2972 + .byte 0x1 + .byte 0x62 + .4byte 0x21e + .byte 0xd0 + .uleb128 0xe + .4byte .LASF2973 + .byte 0x1 + .byte 0x63 + .4byte 0xe472 + .byte 0xd8 + .uleb128 0xe + .4byte .LASF2974 + .byte 0x1 + .byte 0x64 + .4byte 0xe472 + .byte 0xe0 + .uleb128 0xe + .4byte .LASF2975 + .byte 0x1 + .byte 0x65 + .4byte 0xe472 + .byte 0xe8 + .uleb128 0xe + .4byte .LASF2976 + .byte 0x1 + .byte 0x66 + .4byte 0xe472 + .byte 0xf0 + .uleb128 0xe + .4byte .LASF2977 + .byte 0x1 + .byte 0x67 + .4byte 0xc6 + .byte 0xf8 + .uleb128 0xe + .4byte .LASF2978 + .byte 0x1 + .byte 0x68 + .4byte 0xc6 + .byte 0xfc + .uleb128 0x27 + .4byte .LASF2979 + .byte 0x1 + .byte 0x69 + .4byte 0xd728 + .2byte 0x100 + .uleb128 0x27 + .4byte .LASF2980 + .byte 0x1 + .byte 0x6a + .4byte 0xc6 + .2byte 0x1d0 + .uleb128 0x27 + .4byte .LASF2981 + .byte 0x1 + .byte 0x6c + .4byte 0xc6 + .2byte 0x1d4 + .uleb128 0x27 + .4byte .LASF2982 + .byte 0x1 + .byte 0x6e + .4byte 0x316c + .2byte 0x1d8 + .uleb128 0x27 + .4byte .LASF2983 + .byte 0x1 + .byte 0x71 + .4byte 0x316c + .2byte 0x210 + .uleb128 0x27 + .4byte .LASF2984 + .byte 0x1 + .byte 0x74 + .4byte 0xc6 + .2byte 0x248 + .uleb128 0x27 + .4byte .LASF2985 + .byte 0x1 + .byte 0x76 + .4byte 0xc6 + .2byte 0x24c + .uleb128 0x27 + .4byte .LASF2986 + .byte 0x1 + .byte 0x78 + .4byte 0xc6 + .2byte 0x250 + .uleb128 0x27 + .4byte .LASF2987 + .byte 0x1 + .byte 0x7a + .4byte 0xc6 + .2byte 0x254 + .uleb128 0x27 + .4byte .LASF2988 + .byte 0x1 + .byte 0x7b + .4byte 0xc6 + .2byte 0x258 + .uleb128 0x27 + .4byte .LASF2989 + .byte 0x1 + .byte 0x7c + .4byte 0xc6 + .2byte 0x25c + .uleb128 0x27 + .4byte .LASF2990 + .byte 0x1 + .byte 0x7d + .4byte 0xc6 + .2byte 0x260 + .uleb128 0x27 + .4byte .LASF2991 + .byte 0x1 + .byte 0x7e + .4byte 0xc6 + .2byte 0x264 + .byte 0 + .uleb128 0x5 + .4byte 0x458 + .4byte 0xe472 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd828 + .uleb128 0x47 + .string "ebc" + .2byte 0x328 + .byte 0x1 + .byte 0x81 + .4byte 0xe4c2 + .uleb128 0x20 + .string "dev" + .byte 0x1 + .byte 0x82 + .4byte 0xa496 + .byte 0 + .uleb128 0xe + .4byte .LASF2906 + .byte 0x1 + .byte 0x83 + .4byte 0xe0a4 + .byte 0x8 + .uleb128 0xe + .4byte .LASF2907 + .byte 0x1 + .byte 0x84 + .4byte 0xda8c + .byte 0x10 + .uleb128 0xe + .4byte .LASF2992 + .byte 0x1 + .byte 0x85 + .4byte 0xde87 + .byte 0x18 + .uleb128 0xe + .4byte .LASF1742 + .byte 0x1 + .byte 0x86 + .4byte 0xe1e3 + .byte 0xc0 + .byte 0 + .uleb128 0x48 + .4byte .LASF2993 + .byte 0x1 + .byte 0x8b + .4byte 0xe4d7 + .uleb128 0x9 + .byte 0x3 + .8byte global_ebc + .uleb128 0x7 + .byte 0x8 + .4byte 0xe478 + .uleb128 0x48 + .4byte .LASF2994 + .byte 0x1 + .byte 0x8c + .4byte 0x2eff + .uleb128 0x9 + .byte 0x3 + .8byte ebc_task + .uleb128 0x48 + .4byte .LASF2995 + .byte 0x1 + .byte 0x8d + .4byte 0x2eff + .uleb128 0x9 + .byte 0x3 + .8byte ebc_auto_task + .uleb128 0x48 + .4byte .LASF2996 + .byte 0x1 + .byte 0x8e + .4byte 0x159a + .uleb128 0x9 + .byte 0x3 + .8byte ebc_thread_wq + .uleb128 0x48 + .4byte .LASF2997 + .byte 0x1 + .byte 0x8f + .4byte 0x5a97 + .uleb128 0x9 + .byte 0x3 + .8byte ebc_auto_thread_sem + .uleb128 0x48 + .4byte .LASF2998 + .byte 0x1 + .byte 0x91 + .4byte 0x2eff + .uleb128 0x9 + .byte 0x3 + .8byte ebc_auto_assist_task + .uleb128 0x48 + .4byte .LASF2999 + .byte 0x1 + .byte 0x92 + .4byte 0x5a97 + .uleb128 0x9 + .byte 0x3 + .8byte ebc_auto_assist_thread_sem + .uleb128 0x48 + .4byte .LASF3000 + .byte 0x1 + .byte 0x93 + .4byte 0x5a97 + .uleb128 0x9 + .byte 0x3 + .8byte ebc_assist_finished_flag_sem + .uleb128 0x49 + .4byte .LASF3001 + .byte 0x1 + .2byte 0x929 + .4byte 0xc6 + .uleb128 0x9 + .byte 0x3 + .8byte resume_frame_count + .uleb128 0x49 + .4byte .LASF3002 + .byte 0x1 + .2byte 0x92a + .4byte 0xc6 + .uleb128 0x9 + .byte 0x3 + .8byte resume_count_start + .uleb128 0x49 + .4byte .LASF3003 + .byte 0x1 + .2byte 0xc5b + .4byte 0x7c9 + .uleb128 0x9 + .byte 0x3 + .8byte ebc_ops + .uleb128 0x49 + .4byte .LASF3004 + .byte 0x1 + .2byte 0xc65 + .4byte 0xc536 + .uleb128 0x9 + .byte 0x3 + .8byte ebc_misc + .uleb128 0x49 + .4byte .LASF3005 + .byte 0x1 + .2byte 0xc82 + .4byte 0x7c9 + .uleb128 0x9 + .byte 0x3 + .8byte waveform_ops + .uleb128 0x49 + .4byte .LASF3006 + .byte 0x1 + .2byte 0xc88 + .4byte 0xc536 + .uleb128 0x9 + .byte 0x3 + .8byte waveform_misc + .uleb128 0x49 + .4byte .LASF3007 + .byte 0x1 + .2byte 0xc97 + .4byte 0xb2c3 + .uleb128 0x9 + .byte 0x3 + .8byte dev_attr_waveform_version + .uleb128 0x49 + .4byte .LASF3008 + .byte 0x1 + .2byte 0xca2 + .4byte 0xb2c3 + .uleb128 0x9 + .byte 0x3 + .8byte dev_attr_pmic_name + .uleb128 0x49 + .4byte .LASF3009 + .byte 0x1 + .2byte 0xcb0 + .4byte 0xb2c3 + .uleb128 0x9 + .byte 0x3 + .8byte dev_attr_pmic_temp + .uleb128 0x49 + .4byte .LASF3010 + .byte 0x1 + .2byte 0xcd3 + .4byte 0xb2c3 + .uleb128 0x9 + .byte 0x3 + .8byte dev_attr_pmic_vcom + .uleb128 0x49 + .4byte .LASF3011 + .byte 0x1 + .2byte 0xcdd + .4byte 0xb2c3 + .uleb128 0x9 + .byte 0x3 + .8byte dev_attr_ebc_version + .uleb128 0x49 + .4byte .LASF3012 + .byte 0x1 + .2byte 0xce6 + .4byte 0xb2c3 + .uleb128 0x9 + .byte 0x3 + .8byte dev_attr_ebc_state + .uleb128 0x49 + .4byte .LASF3013 + .byte 0x1 + .2byte 0xcef + .4byte 0xb2c3 + .uleb128 0x9 + .byte 0x3 + .8byte dev_attr_ebc_buf_state + .uleb128 0x49 + .4byte .LASF3014 + .byte 0x1 + .2byte 0xd02 + .4byte 0xb2c3 + .uleb128 0x9 + .byte 0x3 + .8byte dev_attr_auto_frame_state + .uleb128 0x49 + .4byte .LASF3015 + .byte 0x1 + .2byte 0xed8 + .4byte 0xa482 + .uleb128 0x9 + .byte 0x3 + .8byte ebc_pm + .uleb128 0x5 + .4byte 0xb0c1 + .4byte 0xe6ca + .uleb128 0x6 + .4byte 0x4f + .byte 0x1 + .byte 0 + .uleb128 0x3 + .4byte 0xe6ba + .uleb128 0x49 + .4byte .LASF3016 + .byte 0x1 + .2byte 0xedd + .4byte 0xe6ca + .uleb128 0x9 + .byte 0x3 + .8byte ebc_match + .uleb128 0x49 + .4byte .LASF3017 + .byte 0x1 + .2byte 0xee3 + .4byte 0xd5c4 + .uleb128 0x9 + .byte 0x3 + .8byte ebc_driver + .uleb128 0x49 + .4byte .LASF3018 + .byte 0x1 + .2byte 0xef7 + .4byte 0x458 + .uleb128 0x9 + .byte 0x3 + .8byte __addressable_ebc_init3831 + .uleb128 0x49 + .4byte .LASF3019 + .byte 0x1 + .2byte 0xef8 + .4byte 0x4ac + .uleb128 0x9 + .byte 0x3 + .8byte __exitcall_ebc_exit + .uleb128 0x4a + .4byte .LASF3074 + .byte 0x1 + .2byte 0xef2 + .8byte .LFB2875 + .8byte .LFE2875-.LFB2875 + .uleb128 0x1 + .byte 0x9c + .4byte 0xe753 + .uleb128 0x4b + .8byte .LVL74 + .4byte 0x16c45 + .byte 0 + .uleb128 0x4c + .4byte .LASF3020 + .byte 0x1 + .2byte 0xeed + .4byte 0xc6 + .8byte .LFB2874 + .8byte .LFE2874-.LFB2874 + .uleb128 0x1 + .byte 0x9c + .4byte 0xe783 + .uleb128 0x4b + .8byte .LVL720 + .4byte 0x16c50 + .byte 0 + .uleb128 0x4d + .4byte .LASF3021 + .byte 0x1 + .2byte 0xecc + .4byte 0xc6 + .8byte .LFB2873 + .8byte .LFE2873-.LFB2873 + .uleb128 0x1 + .byte 0x9c + .4byte 0xe81f + .uleb128 0x4e + .string "dev" + .byte 0x1 + .2byte 0xecc + .4byte 0xa496 + .4byte .LLST22 + .uleb128 0x4f + .string "ebc" + .byte 0x1 + .2byte 0xece + .4byte 0xe4d7 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xecf + .4byte 0xe81f + .uleb128 0x50 + .4byte 0x15ee7 + .8byte .LBB1128 + .8byte .LBE1128-.LBB1128 + .byte 0x1 + .2byte 0xece + .4byte 0xe7ef + .uleb128 0x51 + .4byte 0x15ef8 + .byte 0 + .uleb128 0x50 + .4byte 0x15ad8 + .8byte .LBB1130 + .8byte .LBE1130-.LBB1130 + .byte 0x1 + .2byte 0xed1 + .4byte 0xe811 + .uleb128 0x51 + .4byte 0x15ae4 + .byte 0 + .uleb128 0x4b + .8byte .LVL78 + .4byte 0x16c5b + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xe1e3 + .uleb128 0x4d + .4byte .LASF3023 + .byte 0x1 + .2byte 0xebb + .4byte 0xc6 + .8byte .LFB2872 + .8byte .LFE2872-.LFB2872 + .uleb128 0x1 + .byte 0x9c + .4byte 0xe92c + .uleb128 0x4e + .string "dev" + .byte 0x1 + .2byte 0xebb + .4byte 0xa496 + .4byte .LLST268 + .uleb128 0x4f + .string "ebc" + .byte 0x1 + .2byte 0xebd + .4byte 0xe4d7 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xebe + .4byte 0xe81f + .uleb128 0x52 + .4byte .LASF3024 + .4byte 0xe93c + .uleb128 0x9 + .byte 0x3 + .8byte __func__.35860 + .uleb128 0x50 + .4byte 0x15ee7 + .8byte .LBB1638 + .8byte .LBE1638-.LBB1638 + .byte 0x1 + .2byte 0xebd + .4byte 0xe8a4 + .uleb128 0x51 + .4byte 0x15ef8 + .byte 0 + .uleb128 0x50 + .4byte 0x15af0 + .8byte .LBB1640 + .8byte .LBE1640-.LBB1640 + .byte 0x1 + .2byte 0xec6 + .4byte 0xe8c6 + .uleb128 0x51 + .4byte 0x15afc + .byte 0 + .uleb128 0x50 + .4byte 0x15728 + .8byte .LBB1642 + .8byte .LBE1642-.LBB1642 + .byte 0x1 + .2byte 0xec2 + .4byte 0xe911 + .uleb128 0x51 + .4byte 0x15745 + .uleb128 0x51 + .4byte 0x15739 + .uleb128 0x53 + .8byte .LBB1643 + .8byte .LBE1643-.LBB1643 + .uleb128 0x54 + .4byte 0x15751 + .uleb128 0x4b + .8byte .LVL888 + .4byte 0x166e9 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL886 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL887 + .4byte 0x16c5b + .byte 0 + .uleb128 0x5 + .4byte 0x68 + .4byte 0xe93c + .uleb128 0x6 + .4byte 0x4f + .byte 0xb + .byte 0 + .uleb128 0x3 + .4byte 0xe92c + .uleb128 0x4c + .4byte .LASF3025 + .byte 0x1 + .2byte 0xeb4 + .4byte 0xc6 + .8byte .LFB2871 + .8byte .LFE2871-.LFB2871 + .uleb128 0x1 + .byte 0x9c + .4byte 0xe981 + .uleb128 0x55 + .4byte .LASF3026 + .byte 0x1 + .2byte 0xeb4 + .4byte 0xd640 + .4byte .LLST24 + .uleb128 0x4b + .8byte .LVL84 + .4byte 0x16c67 + .byte 0 + .uleb128 0x4c + .4byte .LASF3027 + .byte 0x1 + .2byte 0xe34 + .4byte 0xc6 + .8byte .LFB2870 + .8byte .LFE2870-.LFB2870 + .uleb128 0x1 + .byte 0x9c + .4byte 0xfee4 + .uleb128 0x55 + .4byte .LASF3026 + .byte 0x1 + .2byte 0xe34 + .4byte 0xd640 + .4byte .LLST298 + .uleb128 0x4f + .string "dev" + .byte 0x1 + .2byte 0xe36 + .4byte 0xa496 + .uleb128 0x43 + .4byte .LASF3028 + .byte 0x1 + .2byte 0xe37 + .4byte 0xb7ba + .uleb128 0x56 + .4byte .LASF3029 + .byte 0x1 + .2byte 0xe38 + .4byte 0xd640 + .4byte .LLST299 + .uleb128 0x43 + .4byte .LASF3030 + .byte 0x1 + .2byte 0xe39 + .4byte 0xb7ba + .uleb128 0x56 + .4byte .LASF3031 + .byte 0x1 + .2byte 0xe3a + .4byte 0xbf69 + .4byte .LLST300 + .uleb128 0x4f + .string "ebc" + .byte 0x1 + .2byte 0xe3b + .4byte 0xe4d7 + .uleb128 0x56 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xe3c + .4byte 0xe81f + .4byte .LLST301 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0xe3d + .4byte 0xe0e4 + .uleb128 0x56 + .4byte .LASF932 + .byte 0x1 + .2byte 0xe3e + .4byte 0xbbe6 + .4byte .LLST302 + .uleb128 0x43 + .4byte .LASF2389 + .byte 0x1 + .2byte 0xe3f + .4byte 0xbb86 + .uleb128 0x4f + .string "ret" + .byte 0x1 + .2byte 0xe40 + .4byte 0xc6 + .uleb128 0x56 + .4byte .LASF957 + .byte 0x1 + .2byte 0xe41 + .4byte 0xc6 + .4byte .LLST303 + .uleb128 0x57 + .string "i" + .byte 0x1 + .2byte 0xe42 + .4byte 0xc6 + .4byte .LLST304 + .uleb128 0x58 + .4byte 0x15f05 + .8byte .LBB1938 + .4byte .Ldebug_ranges0+0x1500 + .byte 0x1 + .2byte 0xe44 + .4byte 0xea9a + .uleb128 0x51 + .4byte 0x15f2e + .uleb128 0x51 + .4byte 0x15f22 + .uleb128 0x51 + .4byte 0x15f16 + .uleb128 0x4b + .8byte .LVL998 + .4byte 0x16c72 + .byte 0 + .uleb128 0x50 + .4byte 0x15de2 + .8byte .LBB1942 + .8byte .LBE1942-.LBB1942 + .byte 0x1 + .2byte 0xe56 + .4byte 0xead9 + .uleb128 0x51 + .4byte 0x15df2 + .uleb128 0x59 + .4byte 0x15ee7 + .8byte .LBB1943 + .8byte .LBE1943-.LBB1943 + .byte 0xbd + .byte 0xdb + .uleb128 0x51 + .4byte 0x15ef8 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e04 + .8byte .LBB1945 + .8byte .LBE1945-.LBB1945 + .byte 0x1 + .2byte 0xe71 + .4byte 0xeb19 + .uleb128 0x51 + .4byte 0x15e15 + .uleb128 0x5a + .4byte 0x15ee7 + .8byte .LBB1946 + .8byte .LBE1946-.LBB1946 + .byte 0xa1 + .2byte 0x166 + .uleb128 0x51 + .4byte 0x15ef8 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x120cc + .8byte .LBB1948 + .4byte .Ldebug_ranges0+0x1530 + .byte 0x1 + .2byte 0xe85 + .4byte 0xf5e8 + .uleb128 0x51 + .4byte 0x120dd + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1530 + .uleb128 0x54 + .4byte 0x120e9 + .uleb128 0x58 + .4byte 0x15e28 + .8byte .LBB1950 + .4byte .Ldebug_ranges0+0x1580 + .byte 0x1 + .2byte 0xb3d + .4byte 0xeba9 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5c + .4byte 0x15e5d + .8byte .LBB1951 + .4byte .Ldebug_ranges0+0x1580 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1580 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1023 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1962 + .8byte .LBE1962-.LBB1962 + .byte 0x1 + .2byte 0xb40 + .4byte 0xec26 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1963 + .8byte .LBE1963-.LBB1963 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1964 + .8byte .LBE1964-.LBB1964 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1024 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1965 + .8byte .LBE1965-.LBB1965 + .byte 0x1 + .2byte 0xb43 + .4byte 0xeca3 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1966 + .8byte .LBE1966-.LBB1966 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1967 + .8byte .LBE1967-.LBB1967 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1025 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1968 + .8byte .LBE1968-.LBB1968 + .byte 0x1 + .2byte 0xb46 + .4byte 0xed20 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1969 + .8byte .LBE1969-.LBB1969 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1970 + .8byte .LBE1970-.LBB1970 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1026 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1971 + .8byte .LBE1971-.LBB1971 + .byte 0x1 + .2byte 0xb49 + .4byte 0xed9d + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1972 + .8byte .LBE1972-.LBB1972 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1973 + .8byte .LBE1973-.LBB1973 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1027 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1974 + .8byte .LBE1974-.LBB1974 + .byte 0x1 + .2byte 0xb4c + .4byte 0xee1a + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1975 + .8byte .LBE1975-.LBB1975 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1976 + .8byte .LBE1976-.LBB1976 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1028 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1977 + .8byte .LBE1977-.LBB1977 + .byte 0x1 + .2byte 0xb4f + .4byte 0xee97 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1978 + .8byte .LBE1978-.LBB1978 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1979 + .8byte .LBE1979-.LBB1979 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1029 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1980 + .8byte .LBE1980-.LBB1980 + .byte 0x1 + .2byte 0xb52 + .4byte 0xef14 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1981 + .8byte .LBE1981-.LBB1981 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1982 + .8byte .LBE1982-.LBB1982 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1030 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1983 + .8byte .LBE1983-.LBB1983 + .byte 0x1 + .2byte 0xb55 + .4byte 0xef91 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1984 + .8byte .LBE1984-.LBB1984 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1985 + .8byte .LBE1985-.LBB1985 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1031 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1986 + .8byte .LBE1986-.LBB1986 + .byte 0x1 + .2byte 0xb58 + .4byte 0xf00e + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1987 + .8byte .LBE1987-.LBB1987 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1988 + .8byte .LBE1988-.LBB1988 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1032 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1989 + .8byte .LBE1989-.LBB1989 + .byte 0x1 + .2byte 0xb5b + .4byte 0xf08b + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1990 + .8byte .LBE1990-.LBB1990 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1991 + .8byte .LBE1991-.LBB1991 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1033 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1992 + .8byte .LBE1992-.LBB1992 + .byte 0x1 + .2byte 0xb5e + .4byte 0xf108 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1993 + .8byte .LBE1993-.LBB1993 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1994 + .8byte .LBE1994-.LBB1994 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1034 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1995 + .8byte .LBE1995-.LBB1995 + .byte 0x1 + .2byte 0xb61 + .4byte 0xf185 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1996 + .8byte .LBE1996-.LBB1996 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB1997 + .8byte .LBE1997-.LBB1997 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1035 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB1998 + .8byte .LBE1998-.LBB1998 + .byte 0x1 + .2byte 0xb64 + .4byte 0xf202 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB1999 + .8byte .LBE1999-.LBB1999 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2000 + .8byte .LBE2000-.LBB2000 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1036 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB2001 + .8byte .LBE2001-.LBB2001 + .byte 0x1 + .2byte 0xb67 + .4byte 0xf27f + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB2002 + .8byte .LBE2002-.LBB2002 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2003 + .8byte .LBE2003-.LBB2003 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1037 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB2004 + .8byte .LBE2004-.LBB2004 + .byte 0x1 + .2byte 0xb6a + .4byte 0xf2fc + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB2005 + .8byte .LBE2005-.LBB2005 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2006 + .8byte .LBE2006-.LBB2006 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1038 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB2007 + .8byte .LBE2007-.LBB2007 + .byte 0x1 + .2byte 0xb6d + .4byte 0xf379 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB2008 + .8byte .LBE2008-.LBB2008 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2009 + .8byte .LBE2009-.LBB2009 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1039 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB2010 + .8byte .LBE2010-.LBB2010 + .byte 0x1 + .2byte 0xb70 + .4byte 0xf3f6 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB2011 + .8byte .LBE2011-.LBB2011 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2012 + .8byte .LBE2012-.LBB2012 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1040 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB2013 + .8byte .LBE2013-.LBB2013 + .byte 0x1 + .2byte 0xb73 + .4byte 0xf473 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB2014 + .8byte .LBE2014-.LBB2014 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2015 + .8byte .LBE2015-.LBB2015 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1041 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB2016 + .8byte .LBE2016-.LBB2016 + .byte 0x1 + .2byte 0xb76 + .4byte 0xf4f0 + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB2017 + .8byte .LBE2017-.LBB2017 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2018 + .8byte .LBE2018-.LBB2018 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1042 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15e28 + .8byte .LBB2019 + .8byte .LBE2019-.LBB2019 + .byte 0x1 + .2byte 0xb79 + .4byte 0xf56d + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB2020 + .8byte .LBE2020-.LBB2020 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2021 + .8byte .LBE2021-.LBB2021 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1043 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x5a + .4byte 0x15e28 + .8byte .LBB2022 + .8byte .LBE2022-.LBB2022 + .byte 0x1 + .2byte 0xb7c + .uleb128 0x51 + .4byte 0x15e50 + .uleb128 0x51 + .4byte 0x15e44 + .uleb128 0x51 + .4byte 0x15e39 + .uleb128 0x5a + .4byte 0x15e5d + .8byte .LBB2023 + .8byte .LBE2023-.LBB2023 + .byte 0xd + .2byte 0x49c + .uleb128 0x51 + .4byte 0x15e91 + .uleb128 0x51 + .4byte 0x15e85 + .uleb128 0x51 + .4byte 0x15e79 + .uleb128 0x51 + .4byte 0x15e6e + .uleb128 0x53 + .8byte .LBB2024 + .8byte .LBE2024-.LBB2024 + .uleb128 0x54 + .4byte 0x15e9c + .uleb128 0x4b + .8byte .LVL1044 + .4byte 0x16c7e + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x10020 + .8byte .LBB2031 + .4byte .Ldebug_ranges0+0x15d0 + .byte 0x1 + .2byte 0xe90 + .4byte 0xf6e1 + .uleb128 0x51 + .4byte 0x10031 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x15d0 + .uleb128 0x5d + .4byte 0x1003d + .4byte .LLST305 + .uleb128 0x54 + .4byte 0x10049 + .uleb128 0x54 + .4byte 0x10055 + .uleb128 0x54 + .4byte 0x10061 + .uleb128 0x5e + .4byte 0x1006d + .uleb128 0x3 + .byte 0x91 + .sleb128 -104 + .uleb128 0x54 + .4byte 0x10077 + .uleb128 0x54 + .4byte 0x10083 + .uleb128 0x54 + .4byte 0x1008f + .uleb128 0x54 + .4byte 0x10099 + .uleb128 0x58 + .4byte 0x15f3b + .8byte .LBB2033 + .4byte .Ldebug_ranges0+0x1660 + .byte 0x1 + .2byte 0xd5e + .4byte 0xf65d + .uleb128 0x51 + .4byte 0x15f4b + .byte 0 + .uleb128 0x4b + .8byte .LVL1046 + .4byte 0x16c8a + .uleb128 0x4b + .8byte .LVL1047 + .4byte 0x16c96 + .uleb128 0x4b + .8byte .LVL1048 + .4byte 0x16ca1 + .uleb128 0x4b + .8byte .LVL1049 + .4byte 0x16cac + .uleb128 0x4b + .8byte .LVL1050 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL1051 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL1126 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1166 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1177 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1183 + .4byte 0x16cc1 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x100a6 + .8byte .LBB2045 + .4byte .Ldebug_ranges0+0x1690 + .byte 0x1 + .2byte 0xe97 + .4byte 0xf7ba + .uleb128 0x51 + .4byte 0x100b7 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1690 + .uleb128 0x54 + .4byte 0x100c3 + .uleb128 0x5d + .4byte 0x100cf + .4byte .LLST306 + .uleb128 0x54 + .4byte 0x100db + .uleb128 0x5e + .4byte 0x100e7 + .uleb128 0x3 + .byte 0x91 + .sleb128 -104 + .uleb128 0x5d + .4byte 0x100f1 + .4byte .LLST307 + .uleb128 0x54 + .4byte 0x100fd + .uleb128 0x54 + .4byte 0x10109 + .uleb128 0x58 + .4byte 0x15f3b + .8byte .LBB2047 + .4byte .Ldebug_ranges0+0x16f0 + .byte 0x1 + .2byte 0xd28 + .4byte 0xf750 + .uleb128 0x51 + .4byte 0x15f4b + .byte 0 + .uleb128 0x4b + .8byte .LVL1053 + .4byte 0x16c8a + .uleb128 0x4b + .8byte .LVL1054 + .4byte 0x16c96 + .uleb128 0x4b + .8byte .LVL1065 + .4byte 0x16ca1 + .uleb128 0x4b + .8byte .LVL1066 + .4byte 0x16ccd + .uleb128 0x4b + .8byte .LVL1162 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1163 + .4byte 0x16cd8 + .uleb128 0x4b + .8byte .LVL1164 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1194 + .4byte 0x16cc1 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0xffe8 + .8byte .LBB2056 + .4byte .Ldebug_ranges0+0x1720 + .byte 0x1 + .2byte 0xe9e + .4byte 0xf976 + .uleb128 0x51 + .4byte 0xfff9 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1720 + .uleb128 0x5e + .4byte 0x10005 + .uleb128 0x3 + .byte 0x91 + .sleb128 -104 + .uleb128 0x50 + .4byte 0x1617e + .8byte .LBB2058 + .8byte .LBE2058-.LBB2058 + .byte 0x1 + .2byte 0xd98 + .4byte 0xf830 + .uleb128 0x51 + .4byte 0x16193 + .uleb128 0x51 + .4byte 0x1618a + .uleb128 0x53 + .8byte .LBB2059 + .8byte .LBE2059-.LBB2059 + .uleb128 0x5d + .4byte 0x1619c + .4byte .LLST308 + .uleb128 0x5d + .4byte 0x161a6 + .4byte .LLST309 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x1617e + .8byte .LBB2060 + .8byte .LBE2060-.LBB2060 + .byte 0x1 + .2byte 0xda1 + .4byte 0xf87b + .uleb128 0x51 + .4byte 0x16193 + .uleb128 0x51 + .4byte 0x1618a + .uleb128 0x53 + .8byte .LBB2061 + .8byte .LBE2061-.LBB2061 + .uleb128 0x5d + .4byte 0x1619c + .4byte .LLST310 + .uleb128 0x5d + .4byte 0x161a6 + .4byte .LLST311 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB2062 + .8byte .LBE2062-.LBB2062 + .4byte 0xf8b4 + .uleb128 0x5d + .4byte 0x10012 + .4byte .LLST312 + .uleb128 0x4b + .8byte .LVL1080 + .4byte 0x16ce3 + .uleb128 0x4b + .8byte .LVL1082 + .4byte 0x16cee + .byte 0 + .uleb128 0x50 + .4byte 0x1617e + .8byte .LBB2063 + .8byte .LBE2063-.LBB2063 + .byte 0x1 + .2byte 0xdac + .4byte 0xf8ff + .uleb128 0x51 + .4byte 0x16193 + .uleb128 0x51 + .4byte 0x1618a + .uleb128 0x53 + .8byte .LBB2064 + .8byte .LBE2064-.LBB2064 + .uleb128 0x5d + .4byte 0x1619c + .4byte .LLST313 + .uleb128 0x5d + .4byte 0x161a6 + .4byte .LLST314 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1067 + .4byte 0x16ce3 + .uleb128 0x4b + .8byte .LVL1068 + .4byte 0x16cfa + .uleb128 0x4b + .8byte .LVL1073 + .4byte 0x16ce3 + .uleb128 0x4b + .8byte .LVL1074 + .4byte 0x16cfa + .uleb128 0x4b + .8byte .LVL1079 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1083 + .4byte 0x16cfa + .uleb128 0x4b + .8byte .LVL1168 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1171 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1175 + .4byte 0x16cc1 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0xffce + .8byte .LBB2068 + .8byte .LBE2068-.LBB2068 + .byte 0x1 + .2byte 0xea5 + .4byte 0xfa10 + .uleb128 0x51 + .4byte 0xffdb + .uleb128 0x58 + .4byte 0x15b6e + .8byte .LBB2070 + .4byte .Ldebug_ranges0+0x1770 + .byte 0x1 + .2byte 0xdc4 + .4byte 0xf9db + .uleb128 0x51 + .4byte 0x15b90 + .uleb128 0x51 + .4byte 0x15b85 + .uleb128 0x51 + .4byte 0x15b7a + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1770 + .uleb128 0x5d + .4byte 0x15b9b + .4byte .LLST315 + .uleb128 0x4b + .8byte .LVL1089 + .4byte 0x16d06 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1090 + .4byte 0x16d11 + .uleb128 0x4b + .8byte .LVL1091 + .4byte 0x16d1c + .uleb128 0x4b + .8byte .LVL1092 + .4byte 0x16d11 + .uleb128 0x4b + .8byte .LVL1093 + .4byte 0x16d1c + .byte 0 + .uleb128 0x58 + .4byte 0xfee4 + .8byte .LBB2074 + .4byte .Ldebug_ranges0+0x17a0 + .byte 0x1 + .2byte 0xea8 + .4byte 0xfd19 + .uleb128 0x51 + .4byte 0xff01 + .uleb128 0x51 + .4byte 0xfef5 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x17a0 + .uleb128 0x54 + .4byte 0xff0d + .uleb128 0x5d + .4byte 0xff19 + .4byte .LLST316 + .uleb128 0x5d + .4byte 0xff25 + .4byte .LLST317 + .uleb128 0x5d + .4byte 0xff31 + .4byte .LLST318 + .uleb128 0x5d + .4byte 0xff3d + .4byte .LLST319 + .uleb128 0x5d + .4byte 0xff49 + .4byte .LLST320 + .uleb128 0x5d + .4byte 0xff55 + .4byte .LLST321 + .uleb128 0x54 + .4byte 0xff61 + .uleb128 0x5d + .4byte 0xff6d + .4byte .LLST322 + .uleb128 0x5d + .4byte 0xff79 + .4byte .LLST323 + .uleb128 0x50 + .4byte 0x12176 + .8byte .LBB2076 + .8byte .LBE2076-.LBB2076 + .byte 0x1 + .2byte 0xe08 + .4byte 0xfaf2 + .uleb128 0x51 + .4byte 0x12187 + .uleb128 0x51 + .4byte 0x12187 + .uleb128 0x53 + .8byte .LBB2077 + .8byte .LBE2077-.LBB2077 + .uleb128 0x5d + .4byte 0x12193 + .4byte .LLST324 + .uleb128 0x4b + .8byte .LVL1108 + .4byte 0x16d27 + .uleb128 0x4b + .8byte .LVL1110 + .4byte 0x16d32 + .uleb128 0x4b + .8byte .LVL1111 + .4byte 0x16d3d + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15ceb + .8byte .LBB2078 + .8byte .LBE2078-.LBB2078 + .byte 0x1 + .2byte 0xdee + .4byte 0xfb49 + .uleb128 0x51 + .4byte 0x15d08 + .uleb128 0x51 + .4byte 0x15cfc + .uleb128 0x5a + .4byte 0x15d15 + .8byte .LBB2079 + .8byte .LBE2079-.LBB2079 + .byte 0x10 + .2byte 0x2e7 + .uleb128 0x51 + .4byte 0x15d32 + .uleb128 0x51 + .4byte 0x15d26 + .uleb128 0x4b + .8byte .LVL1132 + .4byte 0x16d48 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0xff86 + .8byte .LBB2081 + .4byte .Ldebug_ranges0+0x17f0 + .byte 0x1 + .2byte 0xe0e + .4byte 0xfb89 + .uleb128 0x51 + .4byte 0xffab + .uleb128 0x60 + .4byte 0xff9f + .4byte .LLST325 + .uleb128 0x51 + .4byte 0xff93 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x17f0 + .uleb128 0x54 + .4byte 0xffb7 + .uleb128 0x5d + .4byte 0xffc1 + .4byte .LLST326 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15ceb + .8byte .LBB2085 + .8byte .LBE2085-.LBB2085 + .byte 0x1 + .2byte 0xdfc + .4byte 0xfbe0 + .uleb128 0x51 + .4byte 0x15d08 + .uleb128 0x51 + .4byte 0x15cfc + .uleb128 0x5a + .4byte 0x15d15 + .8byte .LBB2086 + .8byte .LBE2086-.LBB2086 + .byte 0x10 + .2byte 0x2e7 + .uleb128 0x51 + .4byte 0x15d32 + .uleb128 0x51 + .4byte 0x15d26 + .uleb128 0x4b + .8byte .LVL1147 + .4byte 0x16d48 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0xff86 + .8byte .LBB2088 + .4byte .Ldebug_ranges0+0x1820 + .byte 0x1 + .2byte 0xe1c + .4byte 0xfc20 + .uleb128 0x51 + .4byte 0xffab + .uleb128 0x60 + .4byte 0xff9f + .4byte .LLST327 + .uleb128 0x51 + .4byte 0xff93 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1820 + .uleb128 0x54 + .4byte 0xffb7 + .uleb128 0x5d + .4byte 0xffc1 + .4byte .LLST328 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1095 + .4byte 0x16d54 + .uleb128 0x4b + .8byte .LVL1097 + .4byte 0x16d54 + .uleb128 0x4b + .8byte .LVL1099 + .4byte 0x16d5f + .uleb128 0x4b + .8byte .LVL1103 + .4byte 0x16d5f + .uleb128 0x4b + .8byte .LVL1106 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1107 + .4byte 0x16d6b + .uleb128 0x4b + .8byte .LVL1112 + .4byte 0x16d76 + .uleb128 0x4b + .8byte .LVL1113 + .4byte 0x16d76 + .uleb128 0x4b + .8byte .LVL1129 + .4byte 0x16d81 + .uleb128 0x4b + .8byte .LVL1131 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1136 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1139 + .4byte 0x16d27 + .uleb128 0x4b + .8byte .LVL1144 + .4byte 0x16d3d + .uleb128 0x4b + .8byte .LVL1146 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1150 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1153 + .4byte 0x16d27 + .uleb128 0x4b + .8byte .LVL1157 + .4byte 0x16d3d + .uleb128 0x4b + .8byte .LVL1189 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1192 + .4byte 0x16cc1 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15dbf + .8byte .LBB2095 + .8byte .LBE2095-.LBB2095 + .byte 0x1 + .2byte 0xeaa + .4byte 0xfd62 + .uleb128 0x51 + .4byte 0x15dd6 + .uleb128 0x51 + .4byte 0x15dcb + .uleb128 0x59 + .4byte 0x15ec1 + .8byte .LBB2096 + .8byte .LBE2096-.LBB2096 + .byte 0xbd + .byte 0xe1 + .uleb128 0x51 + .4byte 0x15eda + .uleb128 0x51 + .4byte 0x15ece + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x1012c + .8byte .LBB2098 + .8byte .LBE2098-.LBB2098 + .byte 0x1 + .2byte 0xead + .4byte 0xfe06 + .uleb128 0x51 + .4byte 0x1013d + .uleb128 0x4b + .8byte .LVL1114 + .4byte 0x16d96 + .uleb128 0x4b + .8byte .LVL1115 + .4byte 0x16d96 + .uleb128 0x4b + .8byte .LVL1116 + .4byte 0x16da1 + .uleb128 0x4b + .8byte .LVL1117 + .4byte 0x16da1 + .uleb128 0x4b + .8byte .LVL1118 + .4byte 0x16da1 + .uleb128 0x4b + .8byte .LVL1119 + .4byte 0x16da1 + .uleb128 0x4b + .8byte .LVL1120 + .4byte 0x16da1 + .uleb128 0x4b + .8byte .LVL1121 + .4byte 0x16da1 + .uleb128 0x4b + .8byte .LVL1122 + .4byte 0x16da1 + .uleb128 0x4b + .8byte .LVL1123 + .4byte 0x16da1 + .byte 0 + .uleb128 0x4b + .8byte .LVL999 + .4byte 0x16c8a + .uleb128 0x4b + .8byte .LVL1000 + .4byte 0x16dad + .uleb128 0x4b + .8byte .LVL1002 + .4byte 0x16db8 + .uleb128 0x4b + .8byte .LVL1008 + .4byte 0x16dc4 + .uleb128 0x4b + .8byte .LVL1011 + .4byte 0x16dd0 + .uleb128 0x4b + .8byte .LVL1012 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1020 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1055 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1057 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1060 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1062 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1124 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1127 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1160 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1169 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1179 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1185 + .4byte 0x16ddc + .byte 0 + .uleb128 0x61 + .4byte .LASF3045 + .byte 0x1 + .2byte 0xddc + .4byte 0xc6 + .byte 0x1 + .4byte 0xff86 + .uleb128 0x62 + .string "ebc" + .byte 0x1 + .2byte 0xddc + .4byte 0xe4d7 + .uleb128 0x63 + .4byte .LASF2992 + .byte 0x1 + .2byte 0xddc + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xdde + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF3032 + .byte 0x1 + .2byte 0xddf + .4byte 0x6d + .uleb128 0x43 + .4byte .LASF3033 + .byte 0x1 + .2byte 0xde0 + .4byte 0x6d + .uleb128 0x43 + .4byte .LASF3034 + .byte 0x1 + .2byte 0xde1 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3035 + .byte 0x1 + .2byte 0xde2 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3036 + .byte 0x1 + .2byte 0xde3 + .4byte 0x21e + .uleb128 0x43 + .4byte .LASF3037 + .byte 0x1 + .2byte 0xde4 + .4byte 0x21e + .uleb128 0x4f + .string "buf" + .byte 0x1 + .2byte 0xde5 + .4byte 0xe472 + .uleb128 0x43 + .4byte .LASF3038 + .byte 0x1 + .2byte 0xde6 + .4byte 0x458 + .uleb128 0x43 + .4byte .LASF3039 + .byte 0x1 + .2byte 0xde7 + .4byte 0x458 + .byte 0 + .uleb128 0x64 + .4byte .LASF3043 + .byte 0x1 + .2byte 0xdd0 + .byte 0x1 + .4byte 0xffce + .uleb128 0x63 + .4byte .LASF3040 + .byte 0x1 + .2byte 0xdd0 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3041 + .byte 0x1 + .2byte 0xdd0 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF957 + .byte 0x1 + .2byte 0xdd0 + .4byte 0xc6 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0xdd2 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3042 + .byte 0x1 + .2byte 0xdd3 + .4byte 0x110 + .byte 0 + .uleb128 0x64 + .4byte .LASF3044 + .byte 0x1 + .2byte 0xdb1 + .byte 0x1 + .4byte 0xffe8 + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xdb1 + .4byte 0xe81f + .byte 0 + .uleb128 0x61 + .4byte .LASF3046 + .byte 0x1 + .2byte 0xd8e + .4byte 0xc6 + .byte 0x1 + .4byte 0x10020 + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xd8e + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF2434 + .byte 0x1 + .2byte 0xd90 + .4byte 0xd740 + .uleb128 0x65 + .uleb128 0x4f + .string "__k" + .byte 0x1 + .2byte 0xda6 + .4byte 0x2eff + .byte 0 + .byte 0 + .uleb128 0x61 + .4byte .LASF3047 + .byte 0x1 + .2byte 0xd41 + .4byte 0xc6 + .byte 0x1 + .4byte 0x100a6 + .uleb128 0x62 + .string "ebc" + .byte 0x1 + .2byte 0xd41 + .4byte 0xe4d7 + .uleb128 0x4f + .string "dev" + .byte 0x1 + .2byte 0xd43 + .4byte 0xa496 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0xd44 + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xd45 + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF3048 + .byte 0x1 + .2byte 0xd46 + .4byte 0xb7ba + .uleb128 0x4f + .string "r" + .byte 0x1 + .2byte 0xd47 + .4byte 0x9672 + .uleb128 0x43 + .4byte .LASF3049 + .byte 0x1 + .2byte 0xd48 + .4byte 0xc6 + .uleb128 0x4f + .string "ret" + .byte 0x1 + .2byte 0xd49 + .4byte 0xc6 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0xd49 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3050 + .byte 0x1 + .2byte 0xd4a + .4byte 0xc6 + .byte 0 + .uleb128 0x61 + .4byte .LASF3051 + .byte 0x1 + .2byte 0xd15 + .4byte 0xc6 + .byte 0x1 + .4byte 0x10117 + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xd15 + .4byte 0xe81f + .uleb128 0x4f + .string "ret" + .byte 0x1 + .2byte 0xd17 + .4byte 0xc6 + .uleb128 0x4f + .string "dev" + .byte 0x1 + .2byte 0xd18 + .4byte 0xa496 + .uleb128 0x43 + .4byte .LASF3048 + .byte 0x1 + .2byte 0xd19 + .4byte 0xb7ba + .uleb128 0x4f + .string "r" + .byte 0x1 + .2byte 0xd1a + .4byte 0x9672 + .uleb128 0x43 + .4byte .LASF2950 + .byte 0x1 + .2byte 0xd1b + .4byte 0x29 + .uleb128 0x43 + .4byte .LASF2951 + .byte 0x1 + .2byte 0xd1c + .4byte 0xc6 + .uleb128 0x66 + .4byte .LASF3024 + .4byte 0x10127 + .4byte .LASF3051 + .byte 0 + .uleb128 0x5 + .4byte 0x68 + .4byte 0x10127 + .uleb128 0x6 + .4byte 0x4f + .byte 0x12 + .byte 0 + .uleb128 0x3 + .4byte 0x10117 + .uleb128 0x61 + .4byte .LASF3052 + .byte 0x1 + .2byte 0xd04 + .4byte 0xc6 + .byte 0x1 + .4byte 0x1014a + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xd04 + .4byte 0xe81f + .byte 0 + .uleb128 0x61 + .4byte .LASF3053 + .byte 0x1 + .2byte 0xcf1 + .4byte 0x2ee + .byte 0x1 + .4byte 0x101a2 + .uleb128 0x63 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xcf1 + .4byte 0xa496 + .uleb128 0x63 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xcf2 + .4byte 0xb311 + .uleb128 0x62 + .string "buf" + .byte 0x1 + .2byte 0xcf3 + .4byte 0x21e + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0xcf5 + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xcf6 + .4byte 0xe81f + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0xcf7 + .4byte 0xc6 + .byte 0 + .uleb128 0x4c + .4byte .LASF3054 + .byte 0x1 + .2byte 0xce8 + .4byte 0x2ee + .8byte .LFB2861 + .8byte .LFE2861-.LFB2861 + .uleb128 0x1 + .byte 0x9c + .4byte 0x10202 + .uleb128 0x55 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xce8 + .4byte 0xa496 + .4byte .LLST211 + .uleb128 0x55 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xce9 + .4byte 0xb311 + .4byte .LLST212 + .uleb128 0x4e + .string "buf" + .byte 0x1 + .2byte 0xcea + .4byte 0x21e + .4byte .LLST213 + .uleb128 0x4b + .8byte .LVL698 + .4byte 0x16de6 + .byte 0 + .uleb128 0x4c + .4byte .LASF3055 + .byte 0x1 + .2byte 0xcdf + .4byte 0x2ee + .8byte .LFB2860 + .8byte .LFE2860-.LFB2860 + .uleb128 0x1 + .byte 0x9c + .4byte 0x10262 + .uleb128 0x55 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xcdf + .4byte 0xa496 + .4byte .LLST196 + .uleb128 0x55 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xce0 + .4byte 0xb311 + .4byte .LLST197 + .uleb128 0x4e + .string "buf" + .byte 0x1 + .2byte 0xce1 + .4byte 0x21e + .4byte .LLST198 + .uleb128 0x4b + .8byte .LVL670 + .4byte 0x16df1 + .byte 0 + .uleb128 0x4c + .4byte .LASF3056 + .byte 0x1 + .2byte 0xcd6 + .4byte 0x2ee + .8byte .LFB2859 + .8byte .LFE2859-.LFB2859 + .uleb128 0x1 + .byte 0x9c + .4byte 0x102c2 + .uleb128 0x55 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xcd6 + .4byte 0xa496 + .4byte .LLST199 + .uleb128 0x55 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xcd7 + .4byte 0xb311 + .4byte .LLST200 + .uleb128 0x4e + .string "buf" + .byte 0x1 + .2byte 0xcd8 + .4byte 0x21e + .4byte .LLST201 + .uleb128 0x4b + .8byte .LVL675 + .4byte 0x16df1 + .byte 0 + .uleb128 0x4c + .4byte .LASF3057 + .byte 0x1 + .2byte 0xcbe + .4byte 0x2ee + .8byte .LFB2858 + .8byte .LFE2858-.LFB2858 + .uleb128 0x1 + .byte 0x9c + .4byte 0x10392 + .uleb128 0x55 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xcbe + .4byte 0xa496 + .4byte .LLST214 + .uleb128 0x55 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xcbf + .4byte 0xb311 + .4byte .LLST215 + .uleb128 0x4e + .string "buf" + .byte 0x1 + .2byte 0xcc0 + .4byte 0x56 + .4byte .LLST216 + .uleb128 0x55 + .4byte .LASF383 + .byte 0x1 + .2byte 0xcc0 + .4byte 0x2e3 + .4byte .LLST217 + .uleb128 0x57 + .string "ebc" + .byte 0x1 + .2byte 0xcc2 + .4byte 0xe4d7 + .4byte .LLST218 + .uleb128 0x56 + .4byte .LASF2424 + .byte 0x1 + .2byte 0xcc3 + .4byte 0xc6 + .4byte .LLST219 + .uleb128 0x4f + .string "ret" + .byte 0x1 + .2byte 0xcc3 + .4byte 0xc6 + .uleb128 0x4b + .8byte .LVL704 + .4byte 0x16dfd + .uleb128 0x4b + .8byte .LVL706 + .4byte 0x16e09 + .uleb128 0x4b + .8byte .LVL711 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL714 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL715 + .4byte 0x16ddc + .byte 0 + .uleb128 0x4d + .4byte .LASF3058 + .byte 0x1 + .2byte 0xcb2 + .4byte 0x2ee + .8byte .LFB2857 + .8byte .LFE2857-.LFB2857 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1042c + .uleb128 0x55 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xcb2 + .4byte 0xa496 + .4byte .LLST202 + .uleb128 0x55 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xcb3 + .4byte 0xb311 + .4byte .LLST203 + .uleb128 0x4e + .string "buf" + .byte 0x1 + .2byte 0xcb4 + .4byte 0x21e + .4byte .LLST204 + .uleb128 0x4f + .string "ebc" + .byte 0x1 + .2byte 0xcb6 + .4byte 0xe4d7 + .uleb128 0x43 + .4byte .LASF2424 + .byte 0x1 + .2byte 0xcb7 + .4byte 0xc6 + .uleb128 0x50 + .4byte 0x15a97 + .8byte .LBB1588 + .8byte .LBE1588-.LBB1588 + .byte 0x1 + .2byte 0xcb9 + .4byte 0x1041e + .uleb128 0x51 + .4byte 0x15aa7 + .byte 0 + .uleb128 0x4b + .8byte .LVL680 + .4byte 0x16df1 + .byte 0 + .uleb128 0x4d + .4byte .LASF3059 + .byte 0x1 + .2byte 0xca4 + .4byte 0x2ee + .8byte .LFB2856 + .8byte .LFE2856-.LFB2856 + .uleb128 0x1 + .byte 0x9c + .4byte 0x104d5 + .uleb128 0x55 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xca4 + .4byte 0xa496 + .4byte .LLST205 + .uleb128 0x55 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xca5 + .4byte 0xb311 + .4byte .LLST206 + .uleb128 0x4e + .string "buf" + .byte 0x1 + .2byte 0xca6 + .4byte 0x21e + .4byte .LLST207 + .uleb128 0x4f + .string "ebc" + .byte 0x1 + .2byte 0xca8 + .4byte 0xe4d7 + .uleb128 0x67 + .string "t" + .byte 0x1 + .2byte 0xca9 + .4byte 0xc6 + .uleb128 0x2 + .byte 0x91 + .sleb128 4 + .uleb128 0x58 + .4byte 0x15ab3 + .8byte .LBB1590 + .4byte .Ldebug_ranges0+0xee0 + .byte 0x1 + .2byte 0xcab + .4byte 0x104ba + .uleb128 0x51 + .4byte 0x15ace + .uleb128 0x51 + .4byte 0x15ac3 + .byte 0 + .uleb128 0x4b + .8byte .LVL687 + .4byte 0x16df1 + .uleb128 0x4b + .8byte .LVL690 + .4byte 0x16ddc + .byte 0 + .uleb128 0x4c + .4byte .LASF3060 + .byte 0x1 + .2byte 0xc99 + .4byte 0x2ee + .8byte .LFB2855 + .8byte .LFE2855-.LFB2855 + .uleb128 0x1 + .byte 0x9c + .4byte 0x10541 + .uleb128 0x55 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xc99 + .4byte 0xa496 + .4byte .LLST208 + .uleb128 0x55 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xc9a + .4byte 0xb311 + .4byte .LLST209 + .uleb128 0x4e + .string "buf" + .byte 0x1 + .2byte 0xc9b + .4byte 0x21e + .4byte .LLST210 + .uleb128 0x4f + .string "ebc" + .byte 0x1 + .2byte 0xc9d + .4byte 0xe4d7 + .uleb128 0x4b + .8byte .LVL695 + .4byte 0x16df1 + .byte 0 + .uleb128 0x4c + .4byte .LASF3061 + .byte 0x1 + .2byte 0xc8e + .4byte 0x2ee + .8byte .LFB2854 + .8byte .LFE2854-.LFB2854 + .uleb128 0x1 + .byte 0x9c + .4byte 0x105ba + .uleb128 0x55 + .4byte .LASF2168 + .byte 0x1 + .2byte 0xc8e + .4byte 0xa496 + .4byte .LLST220 + .uleb128 0x55 + .4byte .LASF2083 + .byte 0x1 + .2byte 0xc8f + .4byte 0xb311 + .4byte .LLST221 + .uleb128 0x4e + .string "buf" + .byte 0x1 + .2byte 0xc90 + .4byte 0x21e + .4byte .LLST222 + .uleb128 0x43 + .4byte .LASF3062 + .byte 0x1 + .2byte 0xc92 + .4byte 0x56 + .uleb128 0x4b + .8byte .LVL717 + .4byte 0x16e14 + .uleb128 0x4b + .8byte .LVL718 + .4byte 0x16df1 + .byte 0 + .uleb128 0x61 + .4byte .LASF3063 + .byte 0x1 + .2byte 0xc7b + .4byte 0xc6 + .byte 0x1 + .4byte 0x105e4 + .uleb128 0x63 + .4byte .LASF418 + .byte 0x1 + .2byte 0xc7b + .4byte 0x1c7f + .uleb128 0x63 + .4byte .LASF1241 + .byte 0x1 + .2byte 0xc7b + .4byte 0x5482 + .byte 0 + .uleb128 0x4c + .4byte .LASF3064 + .byte 0x1 + .2byte 0xc6b + .4byte 0xc6 + .8byte .LFB2852 + .8byte .LFE2852-.LFB2852 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1064c + .uleb128 0x55 + .4byte .LASF1241 + .byte 0x1 + .2byte 0xc6b + .4byte 0x5482 + .4byte .LLST27 + .uleb128 0x4e + .string "vma" + .byte 0x1 + .2byte 0xc6b + .4byte 0x3be9 + .4byte .LLST28 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xc6d + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF854 + .byte 0x1 + .2byte 0xc6e + .4byte 0x29 + .uleb128 0x4b + .8byte .LVL92 + .4byte 0x16e1f + .byte 0 + .uleb128 0x68 + .4byte .LASF3065 + .byte 0x1 + .2byte 0xc54 + .4byte 0xc6 + .4byte 0x10675 + .uleb128 0x63 + .4byte .LASF418 + .byte 0x1 + .2byte 0xc54 + .4byte 0x1c7f + .uleb128 0x63 + .4byte .LASF1241 + .byte 0x1 + .2byte 0xc54 + .4byte 0x5482 + .byte 0 + .uleb128 0x4c + .4byte .LASF3066 + .byte 0x1 + .2byte 0xc45 + .4byte 0xc6 + .8byte .LFB2850 + .8byte .LFE2850-.LFB2850 + .uleb128 0x1 + .byte 0x9c + .4byte 0x106de + .uleb128 0x55 + .4byte .LASF1241 + .byte 0x1 + .2byte 0xc45 + .4byte 0x5482 + .4byte .LLST25 + .uleb128 0x4e + .string "vma" + .byte 0x1 + .2byte 0xc45 + .4byte 0x3be9 + .4byte .LLST26 + .uleb128 0x43 + .4byte .LASF854 + .byte 0x1 + .2byte 0xc47 + .4byte 0x29 + .uleb128 0x4b + .8byte .LVL86 + .4byte 0x16e2b + .uleb128 0x4b + .8byte .LVL87 + .4byte 0x16e1f + .byte 0 + .uleb128 0x4c + .4byte .LASF3067 + .byte 0x1 + .2byte 0xb82 + .4byte 0x199 + .8byte .LFB2849 + .8byte .LFE2849-.LFB2849 + .uleb128 0x1 + .byte 0x9c + .4byte 0x120b7 + .uleb128 0x55 + .4byte .LASF1241 + .byte 0x1 + .2byte 0xb82 + .4byte 0x5482 + .4byte .LLST29 + .uleb128 0x4e + .string "cmd" + .byte 0x1 + .2byte 0xb82 + .4byte 0x6d + .4byte .LLST30 + .uleb128 0x4e + .string "arg" + .byte 0x1 + .2byte 0xb82 + .4byte 0x29 + .4byte .LLST31 + .uleb128 0x43 + .4byte .LASF3068 + .byte 0x1 + .2byte 0xb84 + .4byte 0x458 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0xb85 + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xb86 + .4byte 0xe81f + .uleb128 0x49 + .4byte .LASF3069 + .byte 0x1 + .2byte 0xb87 + .4byte 0xd95a + .uleb128 0x3 + .byte 0x91 + .sleb128 -72 + .uleb128 0x4f + .string "buf" + .byte 0x1 + .2byte 0xb88 + .4byte 0xe472 + .uleb128 0x43 + .4byte .LASF3070 + .byte 0x1 + .2byte 0xb89 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3071 + .byte 0x1 + .2byte 0xb8a + .4byte 0x29 + .uleb128 0x4f + .string "ret" + .byte 0x1 + .2byte 0xb8b + .4byte 0xc6 + .uleb128 0x52 + .4byte .LASF3024 + .4byte 0x120c7 + .uleb128 0x9 + .byte 0x3 + .8byte __func__.35512 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xc0 + .4byte 0x109dd + .uleb128 0x56 + .4byte .LASF3072 + .byte 0x1 + .2byte 0xc15 + .4byte 0xc6 + .4byte .LLST40 + .uleb128 0x5c + .4byte 0x15ba6 + .8byte .LBB1166 + .4byte .Ldebug_ranges0+0x100 + .byte 0x1 + .2byte 0xc16 + .uleb128 0x51 + .4byte 0x15bcb + .uleb128 0x51 + .4byte 0x15bc0 + .uleb128 0x51 + .4byte 0x15bb6 + .uleb128 0x6a + .4byte 0x15c04 + .8byte .LBB1167 + .4byte .Ldebug_ranges0+0x100 + .byte 0x8 + .byte 0x9b + .uleb128 0x51 + .4byte 0x15c29 + .uleb128 0x51 + .4byte 0x15c1e + .uleb128 0x51 + .4byte 0x15c14 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1169 + .4byte .Ldebug_ranges0+0x150 + .byte 0x8 + .byte 0x84 + .4byte 0x10912 + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST41 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x150 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST42 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST43 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1171 + .8byte .LBE1171-.LBB1171 + .byte 0x5 + .byte 0x4d + .4byte 0x10878 + .uleb128 0x53 + .8byte .LBB1172 + .8byte .LBE1172-.LBB1172 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST44 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1173 + .8byte .LBE1173-.LBB1173 + .4byte 0x108cc + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1174 + .8byte .LBE1174-.LBB1174 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1175 + .8byte .LBE1175-.LBB1175 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1176 + .8byte .LBE1176-.LBB1176 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1177 + .8byte .LBE1177-.LBB1177 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1183 + .8byte .LBE1183-.LBB1183 + .byte 0x8 + .byte 0x86 + .4byte 0x109cd + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1184 + .8byte .LBE1184-.LBB1184 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST45 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1a0 + .4byte 0x10998 + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST46 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1186 + .8byte .LBE1186-.LBB1186 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1187 + .8byte .LBE1187-.LBB1187 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1188 + .8byte .LBE1188-.LBB1188 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1189 + .8byte .LBE1189-.LBB1189 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST47 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL132 + .4byte 0x16e36 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15bd5 + .8byte .LBB1132 + .4byte .Ldebug_ranges0+0 + .byte 0x1 + .2byte 0xc37 + .4byte 0x10c19 + .uleb128 0x51 + .4byte 0x15bfa + .uleb128 0x51 + .4byte 0x15bef + .uleb128 0x51 + .4byte 0x15be5 + .uleb128 0x6a + .4byte 0x15c33 + .8byte .LBB1133 + .4byte .Ldebug_ranges0+0 + .byte 0x8 + .byte 0x93 + .uleb128 0x51 + .4byte 0x15c58 + .uleb128 0x51 + .4byte 0x15c4d + .uleb128 0x51 + .4byte 0x15c43 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0 + .uleb128 0x5d + .4byte 0x15c61 + .4byte .LLST32 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1135 + .4byte .Ldebug_ranges0+0x50 + .byte 0x8 + .byte 0x72 + .4byte 0x10b41 + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST33 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x50 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST34 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST35 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1137 + .8byte .LBE1137-.LBB1137 + .byte 0x5 + .byte 0x4d + .4byte 0x10aa7 + .uleb128 0x53 + .8byte .LBB1138 + .8byte .LBE1138-.LBB1138 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST36 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x1605f + .8byte .LBB1139 + .8byte .LBE1139-.LBB1139 + .byte 0x5 + .byte 0x55 + .4byte 0x10aef + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1140 + .8byte .LBE1140-.LBB1140 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .uleb128 0x53 + .8byte .LBB1142 + .8byte .LBE1142-.LBB1142 + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1143 + .8byte .LBE1143-.LBB1143 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1144 + .8byte .LBE1144-.LBB1144 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1149 + .8byte .LBE1149-.LBB1149 + .byte 0x8 + .byte 0x74 + .4byte 0x10bfc + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1150 + .8byte .LBE1150-.LBB1150 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST37 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x90 + .4byte 0x10bc7 + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST38 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1152 + .8byte .LBE1152-.LBB1152 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1153 + .8byte .LBE1153-.LBB1153 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1154 + .8byte .LBE1154-.LBB1154 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1155 + .8byte .LBE1155-.LBB1155 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST39 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL110 + .4byte 0x16e42 + .uleb128 0x4b + .8byte .LVL316 + .4byte 0x16cb7 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15ba6 + .8byte .LBB1202 + .4byte .Ldebug_ranges0+0x1d0 + .byte 0x1 + .2byte 0xc11 + .4byte 0x10e39 + .uleb128 0x51 + .4byte 0x15bcb + .uleb128 0x51 + .4byte 0x15bc0 + .uleb128 0x51 + .4byte 0x15bb6 + .uleb128 0x6a + .4byte 0x15c04 + .8byte .LBB1203 + .4byte .Ldebug_ranges0+0x1d0 + .byte 0x8 + .byte 0x9b + .uleb128 0x51 + .4byte 0x15c29 + .uleb128 0x51 + .4byte 0x15c1e + .uleb128 0x51 + .4byte 0x15c14 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1205 + .4byte .Ldebug_ranges0+0x210 + .byte 0x8 + .byte 0x84 + .4byte 0x10d6f + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST48 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x210 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST49 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST50 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1207 + .8byte .LBE1207-.LBB1207 + .byte 0x5 + .byte 0x4d + .4byte 0x10cd5 + .uleb128 0x53 + .8byte .LBB1208 + .8byte .LBE1208-.LBB1208 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST51 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1209 + .8byte .LBE1209-.LBB1209 + .4byte 0x10d29 + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1210 + .8byte .LBE1210-.LBB1210 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1211 + .8byte .LBE1211-.LBB1211 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1212 + .8byte .LBE1212-.LBB1212 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1213 + .8byte .LBE1213-.LBB1213 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1217 + .8byte .LBE1217-.LBB1217 + .byte 0x8 + .byte 0x86 + .4byte 0x10e2a + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1218 + .8byte .LBE1218-.LBB1218 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST52 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x250 + .4byte 0x10df5 + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST53 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1220 + .8byte .LBE1220-.LBB1220 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1221 + .8byte .LBE1221-.LBB1221 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1222 + .8byte .LBE1222-.LBB1222 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1223 + .8byte .LBE1223-.LBB1223 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST54 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL151 + .4byte 0x16e36 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15bd5 + .8byte .LBB1231 + .4byte .Ldebug_ranges0+0x280 + .byte 0x1 + .2byte 0xc2e + .4byte 0x11075 + .uleb128 0x51 + .4byte 0x15bfa + .uleb128 0x51 + .4byte 0x15bef + .uleb128 0x51 + .4byte 0x15be5 + .uleb128 0x6a + .4byte 0x15c33 + .8byte .LBB1232 + .4byte .Ldebug_ranges0+0x280 + .byte 0x8 + .byte 0x93 + .uleb128 0x51 + .4byte 0x15c58 + .uleb128 0x51 + .4byte 0x15c4d + .uleb128 0x51 + .4byte 0x15c43 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x280 + .uleb128 0x5d + .4byte 0x15c61 + .4byte .LLST55 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1234 + .4byte .Ldebug_ranges0+0x2e0 + .byte 0x8 + .byte 0x72 + .4byte 0x10f9d + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST56 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x2e0 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST57 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST58 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1236 + .8byte .LBE1236-.LBB1236 + .byte 0x5 + .byte 0x4d + .4byte 0x10f03 + .uleb128 0x53 + .8byte .LBB1237 + .8byte .LBE1237-.LBB1237 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST59 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1238 + .8byte .LBE1238-.LBB1238 + .4byte 0x10f57 + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1239 + .8byte .LBE1239-.LBB1239 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1240 + .8byte .LBE1240-.LBB1240 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1241 + .8byte .LBE1241-.LBB1241 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1242 + .8byte .LBE1242-.LBB1242 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1248 + .8byte .LBE1248-.LBB1248 + .byte 0x8 + .byte 0x74 + .4byte 0x11058 + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1249 + .8byte .LBE1249-.LBB1249 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST60 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x330 + .4byte 0x11023 + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST61 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1251 + .8byte .LBE1251-.LBB1251 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1252 + .8byte .LBE1252-.LBB1252 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1253 + .8byte .LBE1253-.LBB1253 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1254 + .8byte .LBE1254-.LBB1254 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST62 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL162 + .4byte 0x16e42 + .uleb128 0x4b + .8byte .LVL322 + .4byte 0x16cb7 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15bd5 + .8byte .LBB1267 + .4byte .Ldebug_ranges0+0x360 + .byte 0x1 + .2byte 0xbe2 + .4byte 0x112a0 + .uleb128 0x51 + .4byte 0x15bfa + .uleb128 0x51 + .4byte 0x15bef + .uleb128 0x51 + .4byte 0x15be5 + .uleb128 0x6a + .4byte 0x15c33 + .8byte .LBB1268 + .4byte .Ldebug_ranges0+0x360 + .byte 0x8 + .byte 0x93 + .uleb128 0x51 + .4byte 0x15c58 + .uleb128 0x51 + .4byte 0x15c4d + .uleb128 0x51 + .4byte 0x15c43 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x360 + .uleb128 0x54 + .4byte 0x15c61 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1270 + .4byte .Ldebug_ranges0+0x3a0 + .byte 0x8 + .byte 0x72 + .4byte 0x111d5 + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST63 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x3a0 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST64 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST65 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1272 + .8byte .LBE1272-.LBB1272 + .byte 0x5 + .byte 0x4d + .4byte 0x1113b + .uleb128 0x53 + .8byte .LBB1273 + .8byte .LBE1273-.LBB1273 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST66 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1274 + .8byte .LBE1274-.LBB1274 + .4byte 0x1118f + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1275 + .8byte .LBE1275-.LBB1275 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1276 + .8byte .LBE1276-.LBB1276 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1277 + .8byte .LBE1277-.LBB1277 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1278 + .8byte .LBE1278-.LBB1278 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1282 + .8byte .LBE1282-.LBB1282 + .byte 0x8 + .byte 0x74 + .4byte 0x11290 + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1283 + .8byte .LBE1283-.LBB1283 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST67 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x3e0 + .4byte 0x1125b + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST68 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1285 + .8byte .LBE1285-.LBB1285 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1286 + .8byte .LBE1286-.LBB1286 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1287 + .8byte .LBE1287-.LBB1287 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1288 + .8byte .LBE1288-.LBB1288 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST69 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL176 + .4byte 0x16e42 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15ba6 + .8byte .LBB1296 + .4byte .Ldebug_ranges0+0x410 + .byte 0x1 + .2byte 0xbaf + .4byte 0x114c0 + .uleb128 0x51 + .4byte 0x15bcb + .uleb128 0x51 + .4byte 0x15bc0 + .uleb128 0x51 + .4byte 0x15bb6 + .uleb128 0x6a + .4byte 0x15c04 + .8byte .LBB1297 + .4byte .Ldebug_ranges0+0x410 + .byte 0x8 + .byte 0x9b + .uleb128 0x51 + .4byte 0x15c29 + .uleb128 0x51 + .4byte 0x15c1e + .uleb128 0x51 + .4byte 0x15c14 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1299 + .4byte .Ldebug_ranges0+0x460 + .byte 0x8 + .byte 0x84 + .4byte 0x113f6 + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST70 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x460 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST71 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST72 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1301 + .8byte .LBE1301-.LBB1301 + .byte 0x5 + .byte 0x4d + .4byte 0x1135c + .uleb128 0x53 + .8byte .LBB1302 + .8byte .LBE1302-.LBB1302 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST73 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1303 + .8byte .LBE1303-.LBB1303 + .4byte 0x113b0 + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1304 + .8byte .LBE1304-.LBB1304 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1305 + .8byte .LBE1305-.LBB1305 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1306 + .8byte .LBE1306-.LBB1306 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1307 + .8byte .LBE1307-.LBB1307 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1313 + .8byte .LBE1313-.LBB1313 + .byte 0x8 + .byte 0x86 + .4byte 0x114b1 + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1314 + .8byte .LBE1314-.LBB1314 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST74 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x4b0 + .4byte 0x1147c + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST75 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1316 + .8byte .LBE1316-.LBB1316 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1317 + .8byte .LBE1317-.LBB1317 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1318 + .8byte .LBE1318-.LBB1318 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1319 + .8byte .LBE1319-.LBB1319 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST76 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL195 + .4byte 0x16e36 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15bd5 + .8byte .LBB1330 + .4byte .Ldebug_ranges0+0x4e0 + .byte 0x1 + .2byte 0xc1a + .4byte 0x116fc + .uleb128 0x51 + .4byte 0x15bfa + .uleb128 0x51 + .4byte 0x15bef + .uleb128 0x51 + .4byte 0x15be5 + .uleb128 0x6a + .4byte 0x15c33 + .8byte .LBB1331 + .4byte .Ldebug_ranges0+0x4e0 + .byte 0x8 + .byte 0x93 + .uleb128 0x51 + .4byte 0x15c58 + .uleb128 0x51 + .4byte 0x15c4d + .uleb128 0x51 + .4byte 0x15c43 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x4e0 + .uleb128 0x5d + .4byte 0x15c61 + .4byte .LLST77 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1333 + .4byte .Ldebug_ranges0+0x540 + .byte 0x8 + .byte 0x72 + .4byte 0x11624 + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST78 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x540 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST79 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST80 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1335 + .8byte .LBE1335-.LBB1335 + .byte 0x5 + .byte 0x4d + .4byte 0x1158a + .uleb128 0x53 + .8byte .LBB1336 + .8byte .LBE1336-.LBB1336 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST81 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1337 + .8byte .LBE1337-.LBB1337 + .4byte 0x115de + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1338 + .8byte .LBE1338-.LBB1338 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1339 + .8byte .LBE1339-.LBB1339 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1340 + .8byte .LBE1340-.LBB1340 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1341 + .8byte .LBE1341-.LBB1341 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1347 + .8byte .LBE1347-.LBB1347 + .byte 0x8 + .byte 0x74 + .4byte 0x116df + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1348 + .8byte .LBE1348-.LBB1348 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST82 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x590 + .4byte 0x116aa + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST83 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1350 + .8byte .LBE1350-.LBB1350 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1351 + .8byte .LBE1351-.LBB1351 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1352 + .8byte .LBE1352-.LBB1352 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1353 + .8byte .LBE1353-.LBB1353 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST84 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL208 + .4byte 0x16e42 + .uleb128 0x4b + .8byte .LVL310 + .4byte 0x16cb7 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15ba6 + .8byte .LBB1366 + .4byte .Ldebug_ranges0+0x5c0 + .byte 0x1 + .2byte 0xc28 + .4byte 0x1191c + .uleb128 0x51 + .4byte 0x15bcb + .uleb128 0x51 + .4byte 0x15bc0 + .uleb128 0x51 + .4byte 0x15bb6 + .uleb128 0x6a + .4byte 0x15c04 + .8byte .LBB1367 + .4byte .Ldebug_ranges0+0x5c0 + .byte 0x8 + .byte 0x9b + .uleb128 0x51 + .4byte 0x15c29 + .uleb128 0x51 + .4byte 0x15c1e + .uleb128 0x51 + .4byte 0x15c14 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1369 + .4byte .Ldebug_ranges0+0x620 + .byte 0x8 + .byte 0x84 + .4byte 0x11852 + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST85 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x620 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST86 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST87 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1371 + .8byte .LBE1371-.LBB1371 + .byte 0x5 + .byte 0x4d + .4byte 0x117b8 + .uleb128 0x53 + .8byte .LBB1372 + .8byte .LBE1372-.LBB1372 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST88 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1373 + .8byte .LBE1373-.LBB1373 + .4byte 0x1180c + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1374 + .8byte .LBE1374-.LBB1374 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1375 + .8byte .LBE1375-.LBB1375 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1376 + .8byte .LBE1376-.LBB1376 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1377 + .8byte .LBE1377-.LBB1377 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1385 + .8byte .LBE1385-.LBB1385 + .byte 0x8 + .byte 0x86 + .4byte 0x1190d + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1386 + .8byte .LBE1386-.LBB1386 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST89 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x670 + .4byte 0x118d8 + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST90 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1388 + .8byte .LBE1388-.LBB1388 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1389 + .8byte .LBE1389-.LBB1389 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1390 + .8byte .LBE1390-.LBB1390 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1391 + .8byte .LBE1391-.LBB1391 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST91 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL296 + .4byte 0x16e36 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15bd5 + .8byte .LBB1402 + .4byte .Ldebug_ranges0+0x6a0 + .byte 0x1 + .2byte 0xbca + .4byte 0x11b47 + .uleb128 0x51 + .4byte 0x15bfa + .uleb128 0x51 + .4byte 0x15bef + .uleb128 0x51 + .4byte 0x15be5 + .uleb128 0x6a + .4byte 0x15c33 + .8byte .LBB1403 + .4byte .Ldebug_ranges0+0x6a0 + .byte 0x8 + .byte 0x93 + .uleb128 0x51 + .4byte 0x15c58 + .uleb128 0x51 + .4byte 0x15c4d + .uleb128 0x51 + .4byte 0x15c43 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x6a0 + .uleb128 0x54 + .4byte 0x15c61 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1405 + .4byte .Ldebug_ranges0+0x6e0 + .byte 0x8 + .byte 0x72 + .4byte 0x11a7c + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST92 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x6e0 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST93 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST94 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1407 + .8byte .LBE1407-.LBB1407 + .byte 0x5 + .byte 0x4d + .4byte 0x119e2 + .uleb128 0x53 + .8byte .LBB1408 + .8byte .LBE1408-.LBB1408 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST95 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1409 + .8byte .LBE1409-.LBB1409 + .4byte 0x11a36 + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1410 + .8byte .LBE1410-.LBB1410 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1411 + .8byte .LBE1411-.LBB1411 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1412 + .8byte .LBE1412-.LBB1412 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1413 + .8byte .LBE1413-.LBB1413 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1417 + .8byte .LBE1417-.LBB1417 + .byte 0x8 + .byte 0x74 + .4byte 0x11b37 + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1418 + .8byte .LBE1418-.LBB1418 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST96 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x720 + .4byte 0x11b02 + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST97 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1420 + .8byte .LBE1420-.LBB1420 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1421 + .8byte .LBE1421-.LBB1421 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1422 + .8byte .LBE1422-.LBB1422 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1423 + .8byte .LBE1423-.LBB1423 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST98 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL231 + .4byte 0x16e42 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15bd5 + .8byte .LBB1431 + .4byte .Ldebug_ranges0+0x750 + .byte 0x1 + .2byte 0xbb2 + .4byte 0x11d83 + .uleb128 0x51 + .4byte 0x15bfa + .uleb128 0x51 + .4byte 0x15bef + .uleb128 0x51 + .4byte 0x15be5 + .uleb128 0x6a + .4byte 0x15c33 + .8byte .LBB1432 + .4byte .Ldebug_ranges0+0x750 + .byte 0x8 + .byte 0x93 + .uleb128 0x51 + .4byte 0x15c58 + .uleb128 0x51 + .4byte 0x15c4d + .uleb128 0x51 + .4byte 0x15c43 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x750 + .uleb128 0x5d + .4byte 0x15c61 + .4byte .LLST99 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1434 + .4byte .Ldebug_ranges0+0x7a0 + .byte 0x8 + .byte 0x72 + .4byte 0x11cab + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST100 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x7a0 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST101 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST102 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1436 + .8byte .LBE1436-.LBB1436 + .byte 0x5 + .byte 0x4d + .4byte 0x11c11 + .uleb128 0x53 + .8byte .LBB1437 + .8byte .LBE1437-.LBB1437 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST103 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB1438 + .8byte .LBE1438-.LBB1438 + .4byte 0x11c65 + .uleb128 0x54 + .4byte 0x15cde + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1439 + .8byte .LBE1439-.LBB1439 + .byte 0x5 + .byte 0x56 + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1440 + .8byte .LBE1440-.LBB1440 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1605f + .8byte .LBB1441 + .8byte .LBE1441-.LBB1441 + .byte 0x5 + .byte 0x55 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1442 + .8byte .LBE1442-.LBB1442 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1446 + .8byte .LBE1446-.LBB1446 + .byte 0x8 + .byte 0x74 + .4byte 0x11d66 + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1447 + .8byte .LBE1447-.LBB1447 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST104 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x7e0 + .4byte 0x11d31 + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST105 + .uleb128 0x59 + .4byte 0x160ca + .8byte .LBB1449 + .8byte .LBE1449-.LBB1449 + .byte 0x5 + .byte 0xfe + .uleb128 0x51 + .4byte 0x160e5 + .uleb128 0x51 + .4byte 0x160da + .uleb128 0x53 + .8byte .LBB1450 + .8byte .LBE1450-.LBB1450 + .uleb128 0x54 + .4byte 0x160f0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x59 + .4byte 0x1608b + .8byte .LBB1451 + .8byte .LBE1451-.LBB1451 + .byte 0x5 + .byte 0xfd + .uleb128 0x53 + .8byte .LBB1452 + .8byte .LBE1452-.LBB1452 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST106 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL248 + .4byte 0x16e42 + .uleb128 0x4b + .8byte .LVL328 + .4byte 0x16cb7 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x15ba6 + .8byte .LBB1462 + .4byte .Ldebug_ranges0+0x810 + .byte 0x1 + .2byte 0xbc2 + .4byte 0x11f3d + .uleb128 0x51 + .4byte 0x15bcb + .uleb128 0x51 + .4byte 0x15bc0 + .uleb128 0x51 + .4byte 0x15bb6 + .uleb128 0x6a + .4byte 0x15c04 + .8byte .LBB1463 + .4byte .Ldebug_ranges0+0x810 + .byte 0x8 + .byte 0x9b + .uleb128 0x51 + .4byte 0x15c29 + .uleb128 0x51 + .4byte 0x15c1e + .uleb128 0x51 + .4byte 0x15c14 + .uleb128 0x6b + .4byte 0x15ca1 + .8byte .LBB1465 + .4byte .Ldebug_ranges0+0x870 + .byte 0x8 + .byte 0x84 + .4byte 0x11ea0 + .uleb128 0x51 + .4byte 0x15cbc + .uleb128 0x60 + .4byte 0x15cb1 + .4byte .LLST107 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x870 + .uleb128 0x5d + .4byte 0x15cc7 + .4byte .LLST108 + .uleb128 0x5d + .4byte 0x15cd2 + .4byte .LLST109 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1467 + .8byte .LBE1467-.LBB1467 + .byte 0x5 + .byte 0x4d + .4byte 0x11e3f + .uleb128 0x53 + .8byte .LBB1468 + .8byte .LBE1468-.LBB1468 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST110 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x1605f + .8byte .LBB1469 + .8byte .LBE1469-.LBB1469 + .byte 0x5 + .byte 0x55 + .4byte 0x11e87 + .uleb128 0x51 + .4byte 0x16079 + .uleb128 0x51 + .4byte 0x1606f + .uleb128 0x59 + .4byte 0x16152 + .8byte .LBB1470 + .8byte .LBE1470-.LBB1470 + .byte 0xc9 + .byte 0x61 + .uleb128 0x51 + .4byte 0x1616c + .uleb128 0x51 + .4byte 0x16162 + .byte 0 + .byte 0 + .uleb128 0x53 + .8byte .LBB1472 + .8byte .LBE1472-.LBB1472 + .uleb128 0x54 + .4byte 0x15cde + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6c + .4byte 0x15c6d + .8byte .LBB1479 + .8byte .LBE1479-.LBB1479 + .byte 0x8 + .byte 0x86 + .4byte 0x11f2e + .uleb128 0x51 + .4byte 0x15c7d + .uleb128 0x53 + .8byte .LBB1480 + .8byte .LBE1480-.LBB1480 + .uleb128 0x5d + .4byte 0x15c88 + .4byte .LLST111 + .uleb128 0x6c + .4byte 0x1608b + .8byte .LBB1481 + .8byte .LBE1481-.LBB1481 + .byte 0x5 + .byte 0xfd + .4byte 0x11f11 + .uleb128 0x53 + .8byte .LBB1482 + .8byte .LBE1482-.LBB1482 + .uleb128 0x5d + .4byte 0x1609b + .4byte .LLST112 + .byte 0 + .byte 0 + .uleb128 0x53 + .8byte .LBB1483 + .8byte .LBE1483-.LBB1483 + .uleb128 0x5d + .4byte 0x15c94 + .4byte .LLST113 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL303 + .4byte 0x16e36 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL96 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL112 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL134 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL135 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL136 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL137 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL164 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL177 + .4byte 0x16e4e + .uleb128 0x4b + .8byte .LVL178 + .4byte 0x16e59 + .uleb128 0x4b + .8byte .LVL179 + .4byte 0x16d81 + .uleb128 0x4b + .8byte .LVL180 + .4byte 0x16e64 + .uleb128 0x4b + .8byte .LVL181 + .4byte 0x16e2b + .uleb128 0x4b + .8byte .LVL196 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL197 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL210 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL219 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL232 + .4byte 0x16e2b + .uleb128 0x4b + .8byte .LVL233 + .4byte 0x16e6f + .uleb128 0x4b + .8byte .LVL235 + .4byte 0x16d3d + .uleb128 0x4b + .8byte .LVL250 + .4byte 0x16d27 + .uleb128 0x4b + .8byte .LVL252 + .4byte 0x16e2b + .uleb128 0x4b + .8byte .LVL261 + .4byte 0x16e7a + .uleb128 0x4b + .8byte .LVL263 + .4byte 0x16e85 + .uleb128 0x4b + .8byte .LVL288 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL305 + .4byte 0x16d81 + .uleb128 0x4b + .8byte .LVL311 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL317 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL323 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL326 + .4byte 0x16ddc + .byte 0 + .uleb128 0x5 + .4byte 0x68 + .4byte 0x120c7 + .uleb128 0x6 + .4byte 0x4f + .byte 0xa + .byte 0 + .uleb128 0x3 + .4byte 0x120b7 + .uleb128 0x61 + .4byte .LASF3073 + .byte 0x1 + .2byte 0xb39 + .4byte 0xc6 + .byte 0x1 + .4byte 0x120f6 + .uleb128 0x63 + .4byte .LASF2992 + .byte 0x1 + .2byte 0xb39 + .4byte 0xe0e4 + .uleb128 0x4f + .string "dev" + .byte 0x1 + .2byte 0xb3b + .4byte 0xa496 + .byte 0 + .uleb128 0x4a + .4byte .LASF3075 + .byte 0x1 + .2byte 0xb33 + .8byte .LFB2847 + .8byte .LFE2847-.LFB2847 + .uleb128 0x1 + .byte 0x9c + .4byte 0x12130 + .uleb128 0x4e + .string "t" + .byte 0x1 + .2byte 0xb33 + .4byte 0x31cc + .4byte .LLST192 + .uleb128 0x4b + .8byte .LVL646 + .4byte 0x13669 + .byte 0 + .uleb128 0x4a + .4byte .LASF3076 + .byte 0x1 + .2byte 0xb29 + .8byte .LFB2846 + .8byte .LFE2846-.LFB2846 + .uleb128 0x1 + .byte 0x9c + .4byte 0x12176 + .uleb128 0x4e + .string "t" + .byte 0x1 + .2byte 0xb29 + .4byte 0x31cc + .4byte .LLST23 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0xb2b + .4byte 0xe81f + .uleb128 0x4b + .8byte .LVL81 + .4byte 0x16c5b + .byte 0 + .uleb128 0x61 + .4byte .LASF3077 + .byte 0x1 + .2byte 0xb18 + .4byte 0xc6 + .byte 0x1 + .4byte 0x121a0 + .uleb128 0x63 + .4byte .LASF2992 + .byte 0x1 + .2byte 0xb18 + .4byte 0xe0e4 + .uleb128 0x4f + .string "buf" + .byte 0x1 + .2byte 0xb1a + .4byte 0xe472 + .byte 0 + .uleb128 0x4c + .4byte .LASF3078 + .byte 0x1 + .2byte 0x92b + .4byte 0xc6 + .8byte .LFB2844 + .8byte .LFE2844-.LFB2844 + .uleb128 0x1 + .byte 0x9c + .4byte 0x133a4 + .uleb128 0x4e + .string "ptr" + .byte 0x1 + .2byte 0x92b + .4byte 0x458 + .4byte .LLST358 + .uleb128 0x57 + .string "ebc" + .byte 0x1 + .2byte 0x92d + .4byte 0xe4d7 + .4byte .LLST359 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x92e + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x92f + .4byte 0xe0e4 + .uleb128 0x4f + .string "buf" + .byte 0x1 + .2byte 0x930 + .4byte 0xe472 + .uleb128 0x56 + .4byte .LASF3079 + .byte 0x1 + .2byte 0x931 + .4byte 0xc6 + .4byte .LLST360 + .uleb128 0x56 + .4byte .LASF2960 + .byte 0x1 + .2byte 0x932 + .4byte 0xc6 + .4byte .LLST361 + .uleb128 0x49 + .4byte .LASF874 + .byte 0x1 + .2byte 0x933 + .4byte 0xc6 + .uleb128 0x1 + .byte 0x65 + .uleb128 0x56 + .4byte .LASF3080 + .byte 0x1 + .2byte 0x934 + .4byte 0xc6 + .4byte .LLST362 + .uleb128 0x43 + .4byte .LASF3081 + .byte 0x1 + .2byte 0x935 + .4byte 0xc6 + .uleb128 0x6d + .4byte .LASF3101 + .byte 0x1 + .2byte 0xa30 + .uleb128 0x6e + .4byte .LASF3083 + .byte 0x1 + .2byte 0xadf + .8byte .L1365 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2390 + .4byte 0x12315 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0x94d + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2378 + .8byte .LBE2378-.LBB2378 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0x94d + .8byte .L1266 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0x94d + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0x94d + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2379 + .8byte .LBE2379-.LBB2379 + .4byte 0x122f9 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0x94d + .4byte 0x199 + .4byte .LLST390 + .uleb128 0x4b + .8byte .LVL1533 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1534 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1530 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1535 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x24f0 + .4byte 0x123cf + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0x9d6 + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2409 + .8byte .LBE2409-.LBB2409 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0x9d6 + .8byte .L1337 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0x9d6 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0x9d6 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2410 + .8byte .LBE2410-.LBB2410 + .4byte 0x123b3 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0x9d6 + .4byte 0x199 + .4byte .LLST399 + .uleb128 0x4b + .8byte .LVL1615 + .4byte 0x16e9b + .uleb128 0x4b + .8byte .LVL1617 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1618 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1614 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1619 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x23c0 + .4byte 0x12419 + .uleb128 0x4f + .string "ret" + .byte 0x1 + .2byte 0x9dc + .4byte 0xc6 + .uleb128 0x4b + .8byte .LVL1430 + .4byte 0x16a80 + .uleb128 0x4b + .8byte .LVL1580 + .4byte 0x16ebf + .uleb128 0x4b + .8byte .LVL1581 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1582 + .4byte 0x16e7a + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x23f0 + .4byte 0x1255c + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0x9f4 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2384 + .8byte .LBE2384-.LBB2384 + .4byte 0x12454 + .uleb128 0x56 + .4byte .LASF3087 + .byte 0x1 + .2byte 0x9f4 + .4byte 0x2b0 + .4byte .LLST391 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2430 + .4byte 0x12530 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0x9f4 + .8byte .L1344 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0x9f4 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x56 + .4byte .LASF3082 + .byte 0x1 + .2byte 0x9f4 + .4byte 0x199 + .4byte .LLST392 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2460 + .4byte 0x124e6 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0x9f4 + .4byte 0x199 + .4byte .LLST393 + .uleb128 0x5f + .8byte .LBB2389 + .8byte .LBE2389-.LBB2389 + .4byte 0x124cb + .uleb128 0x56 + .4byte .LASF3087 + .byte 0x1 + .2byte 0x9f4 + .4byte 0x2b0 + .4byte .LLST394 + .byte 0 + .uleb128 0x4b + .8byte .LVL1567 + .4byte 0x16e9b + .uleb128 0x4b + .8byte .LVL1587 + .4byte 0x16eca + .byte 0 + .uleb128 0x50 + .4byte 0x15f8f + .8byte .LBB2386 + .8byte .LBE2386-.LBB2386 + .byte 0x1 + .2byte 0x9f4 + .4byte 0x12515 + .uleb128 0x51 + .4byte 0x15fa0 + .uleb128 0x4b + .8byte .LVL1564 + .4byte 0x16ed5 + .byte 0 + .uleb128 0x4b + .8byte .LVL1566 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1570 + .4byte 0x16eb3 + .byte 0 + .uleb128 0x5a + .4byte 0x15f8f + .8byte .LBB2382 + .8byte .LBE2382-.LBB2382 + .byte 0x1 + .2byte 0x9f4 + .uleb128 0x51 + .4byte 0x15fa0 + .uleb128 0x4b + .8byte .LVL1433 + .4byte 0x16ed5 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2490 + .4byte 0x12609 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa05 + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2393 + .8byte .LBE2393-.LBB2393 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xa05 + .8byte .L1354 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xa05 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa05 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2394 + .8byte .LBE2394-.LBB2394 + .4byte 0x125ed + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xa05 + .4byte 0x199 + .4byte .LLST395 + .uleb128 0x4b + .8byte .LVL1634 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1635 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1632 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1636 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB2446 + .8byte .LBE2446-.LBB2446 + .4byte 0x126c2 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa3f + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2447 + .8byte .LBE2447-.LBB2447 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xa3f + .8byte .L1377 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xa3f + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa3f + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2448 + .8byte .LBE2448-.LBB2448 + .4byte 0x126a6 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xa3f + .4byte 0x199 + .4byte .LLST407 + .uleb128 0x4b + .8byte .LVL1598 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1599 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1596 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1600 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2630 + .4byte 0x1276f + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa45 + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2442 + .8byte .LBE2442-.LBB2442 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xa45 + .8byte .L1381 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xa45 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa45 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2443 + .8byte .LBE2443-.LBB2443 + .4byte 0x12760 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xa45 + .4byte 0x199 + .4byte .LLST406 + .uleb128 0x4b + .8byte .LVL1623 + .4byte 0x16e9b + .uleb128 0x4b + .8byte .LVL1625 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1626 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1622 + .4byte 0x16ea7 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB2405 + .8byte .LBE2405-.LBB2405 + .4byte 0x12828 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa72 + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2406 + .8byte .LBE2406-.LBB2406 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xa72 + .8byte .L1389 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xa72 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xa72 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2407 + .8byte .LBE2407-.LBB2407 + .4byte 0x1280c + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xa72 + .4byte 0x199 + .4byte .LLST398 + .uleb128 0x4b + .8byte .LVL1484 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1485 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1482 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1486 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB2411 + .8byte .LBE2411-.LBB2411 + .4byte 0x1285b + .uleb128 0x57 + .string "ret" + .byte 0x1 + .2byte 0xa7c + .4byte 0xc6 + .4byte .LLST400 + .uleb128 0x4b + .8byte .LVL1493 + .4byte 0x16a80 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2520 + .4byte 0x1299e + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xab8 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2415 + .8byte .LBE2415-.LBB2415 + .4byte 0x12896 + .uleb128 0x56 + .4byte .LASF3087 + .byte 0x1 + .2byte 0xab8 + .4byte 0x2b0 + .4byte .LLST401 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2550 + .4byte 0x12972 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xab8 + .8byte .L1406 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xab8 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x56 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xab8 + .4byte 0x199 + .4byte .LLST402 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2580 + .4byte 0x12928 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xab8 + .4byte 0x199 + .4byte .LLST403 + .uleb128 0x5f + .8byte .LBB2420 + .8byte .LBE2420-.LBB2420 + .4byte 0x1290d + .uleb128 0x56 + .4byte .LASF3087 + .byte 0x1 + .2byte 0xab8 + .4byte 0x2b0 + .4byte .LLST404 + .byte 0 + .uleb128 0x4b + .8byte .LVL1507 + .4byte 0x16e9b + .uleb128 0x4b + .8byte .LVL1612 + .4byte 0x16eca + .byte 0 + .uleb128 0x50 + .4byte 0x15f8f + .8byte .LBB2417 + .8byte .LBE2417-.LBB2417 + .byte 0x1 + .2byte 0xab8 + .4byte 0x12957 + .uleb128 0x51 + .4byte 0x15fa0 + .uleb128 0x4b + .8byte .LVL1504 + .4byte 0x16ed5 + .byte 0 + .uleb128 0x4b + .8byte .LVL1506 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1510 + .4byte 0x16eb3 + .byte 0 + .uleb128 0x5a + .4byte 0x15f8f + .8byte .LBB2413 + .8byte .LBE2413-.LBB2413 + .byte 0x1 + .2byte 0xab8 + .uleb128 0x51 + .4byte 0x15fa0 + .uleb128 0x4b + .8byte .LVL1501 + .4byte 0x16ed5 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x25b0 + .4byte 0x12a4b + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xad3 + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2424 + .8byte .LBE2424-.LBB2424 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xad3 + .8byte .L1411 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xad3 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xad3 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2425 + .8byte .LBE2425-.LBB2425 + .4byte 0x12a2f + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xad3 + .4byte 0x199 + .4byte .LLST405 + .uleb128 0x4b + .8byte .LVL1538 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1539 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1536 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1540 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1eb0 + .4byte 0x12b1d + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xaf8 + .4byte 0x199 + .uleb128 0x6f + .4byte 0x12a72 + .uleb128 0x43 + .4byte .LASF3087 + .byte 0x1 + .2byte 0xaf8 + .4byte 0x2b0 + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1eb0 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xaf8 + .8byte .L1420 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xaf8 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x56 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xaf8 + .4byte 0x199 + .4byte .LLST363 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1f10 + .4byte 0x12b01 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xaf8 + .4byte 0x199 + .4byte .LLST364 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1f80 + .4byte 0x12ad9 + .uleb128 0x56 + .4byte .LASF3087 + .byte 0x1 + .2byte 0xaf8 + .4byte 0x2b0 + .4byte .LLST365 + .byte 0 + .uleb128 0x4b + .8byte .LVL1455 + .4byte 0x16e9b + .uleb128 0x4b + .8byte .LVL1460 + .4byte 0x16eca + .uleb128 0x4b + .8byte .LVL1461 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1453 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1464 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x5f + .8byte .LBB2396 + .8byte .LBE2396-.LBB2396 + .4byte 0x12be3 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xb01 + .4byte 0xc6 + .uleb128 0x53 + .8byte .LBB2397 + .8byte .LBE2397-.LBB2397 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xb01 + .8byte .L1426 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xb01 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xb01 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2398 + .8byte .LBE2398-.LBB2398 + .4byte 0x12bc7 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xb01 + .4byte 0x199 + .4byte .LLST396 + .uleb128 0x4b + .8byte .LVL1467 + .4byte 0x16e9b + .uleb128 0x4b + .8byte .LVL1469 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1470 + .4byte 0x16e9b + .byte 0 + .uleb128 0x4b + .8byte .LVL1466 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1471 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x24c0 + .4byte 0x12c84 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xb10 + .4byte 0xc6 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x24c0 + .uleb128 0x6e + .4byte .LASF3084 + .byte 0x1 + .2byte 0xb10 + .8byte .L1433 + .uleb128 0x49 + .4byte .LASF3085 + .byte 0x1 + .2byte 0xb10 + .4byte 0x1528 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x43 + .4byte .LASF3082 + .byte 0x1 + .2byte 0xb10 + .4byte 0x199 + .uleb128 0x5f + .8byte .LBB2403 + .8byte .LBE2403-.LBB2403 + .4byte 0x12c68 + .uleb128 0x56 + .4byte .LASF3086 + .byte 0x1 + .2byte 0xb10 + .4byte 0x199 + .4byte .LLST397 + .uleb128 0x4b + .8byte .LVL1476 + .4byte 0x16e9b + .uleb128 0x4b + .8byte .LVL1478 + .4byte 0x16e90 + .byte 0 + .uleb128 0x4b + .8byte .LVL1475 + .4byte 0x16ea7 + .uleb128 0x4b + .8byte .LVL1639 + .4byte 0x16eb3 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x155a2 + .8byte .LBB2316 + .4byte .Ldebug_ranges0+0x1fc0 + .byte 0x1 + .2byte 0x952 + .4byte 0x12de7 + .uleb128 0x51 + .4byte 0x155eb + .uleb128 0x51 + .4byte 0x155eb + .uleb128 0x51 + .4byte 0x155eb + .uleb128 0x60 + .4byte 0x155df + .4byte .LLST366 + .uleb128 0x60 + .4byte 0x155d3 + .4byte .LLST367 + .uleb128 0x60 + .4byte 0x155c7 + .4byte .LLST368 + .uleb128 0x60 + .4byte 0x155bb + .4byte .LLST369 + .uleb128 0x60 + .4byte 0x155af + .4byte .LLST370 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1fc0 + .uleb128 0x54 + .4byte 0x155f7 + .uleb128 0x5d + .4byte 0x15603 + .4byte .LLST371 + .uleb128 0x54 + .4byte 0x1560f + .uleb128 0x5d + .4byte 0x1561b + .4byte .LLST372 + .uleb128 0x5d + .4byte 0x15627 + .4byte .LLST373 + .uleb128 0x5d + .4byte 0x15633 + .4byte .LLST374 + .uleb128 0x5d + .4byte 0x1563f + .4byte .LLST375 + .uleb128 0x5d + .4byte 0x1564b + .4byte .LLST376 + .uleb128 0x5e + .4byte 0x15657 + .uleb128 0x1 + .byte 0x66 + .uleb128 0x5d + .4byte 0x15661 + .4byte .LLST377 + .uleb128 0x5d + .4byte 0x1566b + .4byte .LLST378 + .uleb128 0x5d + .4byte 0x15677 + .4byte .LLST379 + .uleb128 0x5d + .4byte 0x15683 + .4byte .LLST380 + .uleb128 0x5d + .4byte 0x1568f + .4byte .LLST381 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2040 + .4byte 0x12d64 + .uleb128 0x5d + .4byte 0x156d6 + .4byte .LLST382 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x20b0 + .4byte 0x12d77 + .uleb128 0x5d + .4byte 0x156e8 + .4byte .LLST383 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2120 + .4byte 0x12d8a + .uleb128 0x5d + .4byte 0x156fa + .4byte .LLST384 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2190 + .4byte 0x12d9d + .uleb128 0x5d + .4byte 0x1570c + .4byte .LLST385 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2200 + .4byte 0x12db0 + .uleb128 0x5d + .4byte 0x1571a + .4byte .LLST386 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2270 + .4byte 0x12dc3 + .uleb128 0x5d + .4byte 0x156a0 + .4byte .LLST387 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x22d0 + .4byte 0x12dd6 + .uleb128 0x5d + .4byte 0x156b2 + .4byte .LLST388 + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x2330 + .uleb128 0x5d + .4byte 0x156c4 + .4byte .LLST389 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x13444 + .8byte .LBB2375 + .8byte .LBE2375-.LBB2375 + .byte 0x1 + .2byte 0xa88 + .4byte 0x12e4d + .uleb128 0x51 + .4byte 0x13455 + .uleb128 0x51 + .4byte 0x13461 + .uleb128 0x51 + .4byte 0x1346d + .uleb128 0x53 + .8byte .LBB2376 + .8byte .LBE2376-.LBB2376 + .uleb128 0x54 + .4byte 0x13479 + .uleb128 0x54 + .4byte 0x13483 + .uleb128 0x54 + .4byte 0x1348f + .uleb128 0x54 + .4byte 0x1349b + .uleb128 0x54 + .4byte 0x134a7 + .uleb128 0x54 + .4byte 0x134b3 + .uleb128 0x54 + .4byte 0x134bf + .uleb128 0x70 + .4byte 0x134cb + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15728 + .8byte .LBB2399 + .8byte .LBE2399-.LBB2399 + .byte 0x1 + .2byte 0xb0d + .4byte 0x12e98 + .uleb128 0x51 + .4byte 0x15745 + .uleb128 0x51 + .4byte 0x15739 + .uleb128 0x53 + .8byte .LBB2400 + .8byte .LBE2400-.LBB2400 + .uleb128 0x54 + .4byte 0x15751 + .uleb128 0x4b + .8byte .LVL1474 + .4byte 0x166e9 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x13d17 + .8byte .LBB2428 + .4byte .Ldebug_ranges0+0x25e0 + .byte 0x1 + .2byte 0xa20 + .4byte 0x12f4d + .uleb128 0x51 + .4byte 0x13d24 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x25e0 + .uleb128 0x54 + .4byte 0x13d30 + .uleb128 0x54 + .4byte 0x13d3c + .uleb128 0x54 + .4byte 0x13d48 + .uleb128 0x50 + .4byte 0x13d6b + .8byte .LBB2430 + .8byte .LBE2430-.LBB2430 + .byte 0x1 + .2byte 0x65e + .4byte 0x12efd + .uleb128 0x51 + .4byte 0x13d84 + .uleb128 0x51 + .4byte 0x13d78 + .uleb128 0x4b + .8byte .LVL1549 + .4byte 0x165e7 + .byte 0 + .uleb128 0x4b + .8byte .LVL1547 + .4byte 0x147bd + .uleb128 0x4b + .8byte .LVL1548 + .4byte 0x147bd + .uleb128 0x4b + .8byte .LVL1572 + .4byte 0x14e71 + .uleb128 0x4b + .8byte .LVL1573 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1607 + .4byte 0x14e71 + .uleb128 0x4b + .8byte .LVL1637 + .4byte 0x16b91 + .byte 0 + .byte 0 + .uleb128 0x50 + .4byte 0x15f8f + .8byte .LBB2435 + .8byte .LBE2435-.LBB2435 + .byte 0x1 + .2byte 0xa29 + .4byte 0x12f7c + .uleb128 0x51 + .4byte 0x15fa0 + .uleb128 0x4b + .8byte .LVL1551 + .4byte 0x16ed5 + .byte 0 + .uleb128 0x50 + .4byte 0x15728 + .8byte .LBB2437 + .8byte .LBE2437-.LBB2437 + .byte 0x1 + .2byte 0x93a + .4byte 0x12fc7 + .uleb128 0x51 + .4byte 0x15745 + .uleb128 0x51 + .4byte 0x15739 + .uleb128 0x53 + .8byte .LBB2438 + .8byte .LBE2438-.LBB2438 + .uleb128 0x54 + .4byte 0x15751 + .uleb128 0x4b + .8byte .LVL1557 + .4byte 0x166e9 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1324 + .4byte 0x16ee1 + .uleb128 0x4b + .8byte .LVL1372 + .4byte 0x13544 + .uleb128 0x4b + .8byte .LVL1373 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1374 + .4byte 0x13b51 + .uleb128 0x4b + .8byte .LVL1375 + .4byte 0x16e7a + .uleb128 0x4b + .8byte .LVL1394 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1395 + .4byte 0x16e7a + .uleb128 0x4b + .8byte .LVL1405 + .4byte 0x16eec + .uleb128 0x4b + .8byte .LVL1410 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1412 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1413 + .4byte 0x16e7a + .uleb128 0x4b + .8byte .LVL1414 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL1415 + .4byte 0x16e7a + .uleb128 0x4b + .8byte .LVL1417 + .4byte 0x16cee + .uleb128 0x4b + .8byte .LVL1418 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1421 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1422 + .4byte 0x16a27 + .uleb128 0x4b + .8byte .LVL1423 + .4byte 0x16e7a + .uleb128 0x4b + .8byte .LVL1425 + .4byte 0x16b91 + .uleb128 0x4b + .8byte .LVL1426 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1427 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1431 + .4byte 0x16ebf + .uleb128 0x4b + .8byte .LVL1432 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1436 + .4byte 0x16ebf + .uleb128 0x4b + .8byte .LVL1439 + .4byte 0x15309 + .uleb128 0x4b + .8byte .LVL1441 + .4byte 0x16ef7 + .uleb128 0x4b + .8byte .LVL1442 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1443 + .4byte 0x16a27 + .uleb128 0x4b + .8byte .LVL1447 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1449 + .4byte 0x16ebf + .uleb128 0x4b + .8byte .LVL1451 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1472 + .4byte 0x16ebf + .uleb128 0x4b + .8byte .LVL1473 + .4byte 0x16f02 + .uleb128 0x4b + .8byte .LVL1481 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1488 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1491 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1498 + .4byte 0x13544 + .uleb128 0x4b + .8byte .LVL1499 + .4byte 0x16ebf + .uleb128 0x4b + .8byte .LVL1500 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1511 + .4byte 0x16ebf + .uleb128 0x4b + .8byte .LVL1513 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1514 + .4byte 0x13b51 + .uleb128 0x4b + .8byte .LVL1515 + .4byte 0x16d1c + .uleb128 0x4b + .8byte .LVL1518 + .4byte 0x16d1c + .uleb128 0x4b + .8byte .LVL1521 + .4byte 0x16b91 + .uleb128 0x4b + .8byte .LVL1523 + .4byte 0x15242 + .uleb128 0x4b + .8byte .LVL1524 + .4byte 0x13544 + .uleb128 0x4b + .8byte .LVL1525 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1526 + .4byte 0x13b51 + .uleb128 0x4b + .8byte .LVL1527 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1528 + .4byte 0x16ef7 + .uleb128 0x4b + .8byte .LVL1529 + .4byte 0x16e7a + .uleb128 0x4b + .8byte .LVL1544 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1545 + .4byte 0x13544 + .uleb128 0x4b + .8byte .LVL1546 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1550 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1552 + .4byte 0x16d1c + .uleb128 0x4b + .8byte .LVL1553 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1554 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1555 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1559 + .4byte 0x16ef7 + .uleb128 0x4b + .8byte .LVL1574 + .4byte 0x16b91 + .uleb128 0x4b + .8byte .LVL1575 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1578 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1579 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1589 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1590 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1593 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1594 + .4byte 0x16e7a + .uleb128 0x4b + .8byte .LVL1595 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL1601 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1603 + .4byte 0x16d8c + .uleb128 0x4b + .8byte .LVL1621 + .4byte 0x16ddc + .uleb128 0x4b + .8byte .LVL1628 + .4byte 0x16ebf + .uleb128 0x4b + .8byte .LVL1629 + .4byte 0x16f02 + .uleb128 0x4b + .8byte .LVL1631 + .4byte 0x16ef7 + .byte 0 + .uleb128 0x61 + .4byte .LASF3088 + .byte 0x1 + .2byte 0x8fe + .4byte 0xc6 + .byte 0x1 + .4byte 0x13444 + .uleb128 0x63 + .4byte .LASF3089 + .byte 0x1 + .2byte 0x8fe + .4byte 0xe472 + .uleb128 0x63 + .4byte .LASF3090 + .byte 0x1 + .2byte 0x8fe + .4byte 0xe472 + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x8fe + .4byte 0xe81f + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x900 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3091 + .byte 0x1 + .2byte 0x901 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3092 + .byte 0x1 + .2byte 0x901 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3093 + .byte 0x1 + .2byte 0x902 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3094 + .byte 0x1 + .2byte 0x903 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3095 + .byte 0x1 + .2byte 0x904 + .4byte 0x45aa + .uleb128 0x43 + .4byte .LASF3096 + .byte 0x1 + .2byte 0x905 + .4byte 0x45aa + .uleb128 0x43 + .4byte .LASF3097 + .byte 0x1 + .2byte 0x906 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3098 + .byte 0x1 + .2byte 0x907 + .4byte 0xc6 + .byte 0 + .uleb128 0x61 + .4byte .LASF3099 + .byte 0x1 + .2byte 0x8e7 + .4byte 0xc6 + .byte 0x1 + .4byte 0x134d4 + .uleb128 0x63 + .4byte .LASF3089 + .byte 0x1 + .2byte 0x8e7 + .4byte 0xe472 + .uleb128 0x63 + .4byte .LASF3090 + .byte 0x1 + .2byte 0x8e7 + .4byte 0xe472 + .uleb128 0x63 + .4byte .LASF3100 + .byte 0x1 + .2byte 0x8e7 + .4byte 0xc6 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x8e9 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3091 + .byte 0x1 + .2byte 0x8ea + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3092 + .byte 0x1 + .2byte 0x8ea + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3093 + .byte 0x1 + .2byte 0x8eb + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3094 + .byte 0x1 + .2byte 0x8ec + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3095 + .byte 0x1 + .2byte 0x8ed + .4byte 0x45aa + .uleb128 0x43 + .4byte .LASF3096 + .byte 0x1 + .2byte 0x8ee + .4byte 0x45aa + .uleb128 0x6d + .4byte .LASF3102 + .byte 0x1 + .2byte 0x8fa + .byte 0 + .uleb128 0x61 + .4byte .LASF3103 + .byte 0x1 + .2byte 0x8ce + .4byte 0xc6 + .byte 0x1 + .4byte 0x13544 + .uleb128 0x62 + .string "buf" + .byte 0x1 + .2byte 0x8ce + .4byte 0xe472 + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x8ce + .4byte 0xe81f + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x8d0 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3091 + .byte 0x1 + .2byte 0x8d1 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3095 + .byte 0x1 + .2byte 0x8d2 + .4byte 0x45aa + .uleb128 0x43 + .4byte .LASF3104 + .byte 0x1 + .2byte 0x8d3 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3100 + .byte 0x1 + .2byte 0x8d4 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3098 + .byte 0x1 + .2byte 0x8d5 + .4byte 0xc6 + .byte 0 + .uleb128 0x4d + .4byte .LASF3105 + .byte 0x1 + .2byte 0x870 + .4byte 0xc6 + .8byte .LFB2840 + .8byte .LFE2840-.LFB2840 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1363f + .uleb128 0x4e + .string "ebc" + .byte 0x1 + .2byte 0x870 + .4byte 0xe4d7 + .4byte .LLST193 + .uleb128 0x55 + .4byte .LASF2837 + .byte 0x1 + .2byte 0x870 + .4byte 0xc6 + .4byte .LLST194 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x872 + .4byte 0xe81f + .uleb128 0x56 + .4byte .LASF3106 + .byte 0x1 + .2byte 0x873 + .4byte 0xc6 + .4byte .LLST195 + .uleb128 0x67 + .string "ret" + .byte 0x1 + .2byte 0x874 + .4byte 0xc6 + .uleb128 0x1 + .byte 0x64 + .uleb128 0x43 + .4byte .LASF3107 + .byte 0x1 + .2byte 0x875 + .4byte 0xc6 + .uleb128 0x50 + .4byte 0x15ab3 + .8byte .LBB1586 + .8byte .LBE1586-.LBB1586 + .byte 0x1 + .2byte 0x878 + .4byte 0x135e3 + .uleb128 0x51 + .4byte 0x15ace + .uleb128 0x51 + .4byte 0x15ac3 + .byte 0 + .uleb128 0x4b + .8byte .LVL653 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL654 + .4byte 0x16f0d + .uleb128 0x4b + .8byte .LVL656 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL660 + .4byte 0x16cc1 + .uleb128 0x4b + .8byte .LVL661 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL663 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL665 + .4byte 0x16ddc + .byte 0 + .uleb128 0x61 + .4byte .LASF3108 + .byte 0x1 + .2byte 0x845 + .4byte 0xc6 + .byte 0x1 + .4byte 0x13669 + .uleb128 0x63 + .4byte .LASF874 + .byte 0x1 + .2byte 0x845 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3107 + .byte 0x1 + .2byte 0x847 + .4byte 0xc6 + .byte 0 + .uleb128 0x4a + .4byte .LASF3109 + .byte 0x1 + .2byte 0x814 + .8byte .LFB2838 + .8byte .LFE2838-.LFB2838 + .uleb128 0x1 + .byte 0x9c + .4byte 0x13723 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x816 + .4byte 0xe81f + .uleb128 0x4b + .8byte .LVL634 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL635 + .4byte 0x16d81 + .uleb128 0x4b + .8byte .LVL636 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL637 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL638 + .4byte 0x16d1c + .uleb128 0x4b + .8byte .LVL639 + .4byte 0x16d81 + .uleb128 0x4b + .8byte .LVL640 + .4byte 0x16cee + .uleb128 0x4b + .8byte .LVL641 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL642 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL643 + .4byte 0x16d1c + .uleb128 0x4b + .8byte .LVL644 + .4byte 0x16cee + .byte 0 + .uleb128 0x4c + .4byte .LASF3110 + .byte 0x1 + .2byte 0x752 + .4byte 0xc6 + .8byte .LFB2837 + .8byte .LFE2837-.LFB2837 + .uleb128 0x1 + .byte 0x9c + .4byte 0x139ba + .uleb128 0x55 + .4byte .LASF793 + .byte 0x1 + .2byte 0x752 + .4byte 0x458 + .4byte .LLST408 + .uleb128 0x67 + .string "ebc" + .byte 0x1 + .2byte 0x754 + .4byte 0xe4d7 + .uleb128 0x1 + .byte 0x66 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x755 + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x756 + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF3111 + .byte 0x1 + .2byte 0x757 + .4byte 0xe1ba + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x2660 + .4byte 0x13819 + .uleb128 0x3c + .byte 0x8 + .byte 0x1 + .2byte 0x765 + .4byte 0x137b2 + .uleb128 0x3e + .4byte .LASF3112 + .byte 0x1 + .2byte 0x765 + .4byte 0x1a0 + .uleb128 0x3a + .string "__c" + .byte 0x1 + .2byte 0x765 + .4byte 0x139ba + .byte 0 + .uleb128 0x4f + .string "__u" + .byte 0x1 + .2byte 0x765 + .4byte 0x13790 + .uleb128 0x58 + .4byte 0x1623b + .8byte .LBB2457 + .4byte .Ldebug_ranges0+0x26a0 + .byte 0x1 + .2byte 0x765 + .4byte 0x137e6 + .uleb128 0x51 + .4byte 0x1625e + .uleb128 0x51 + .4byte 0x16252 + .uleb128 0x51 + .4byte 0x16248 + .byte 0 + .uleb128 0x5a + .4byte 0x1608b + .8byte .LBB2460 + .8byte .LBE2460-.LBB2460 + .byte 0x1 + .2byte 0x765 + .uleb128 0x53 + .8byte .LBB2461 + .8byte .LBE2461-.LBB2461 + .uleb128 0x5e + .4byte 0x1609b + .uleb128 0x1 + .byte 0x68 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1644 + .4byte 0x165e7 + .uleb128 0x4b + .8byte .LVL1645 + .4byte 0x16cee + .uleb128 0x4b + .8byte .LVL1646 + .4byte 0x164fd + .uleb128 0x4b + .8byte .LVL1647 + .4byte 0x16f18 + .uleb128 0x4b + .8byte .LVL1648 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL1649 + .4byte 0x16f22 + .uleb128 0x4b + .8byte .LVL1650 + .4byte 0x16f22 + .uleb128 0x4b + .8byte .LVL1651 + .4byte 0x165e7 + .uleb128 0x4b + .8byte .LVL1652 + .4byte 0x16cee + .uleb128 0x4b + .8byte .LVL1653 + .4byte 0x140d9 + .uleb128 0x4b + .8byte .LVL1654 + .4byte 0x165e7 + .uleb128 0x4b + .8byte .LVL1655 + .4byte 0x16cee + .uleb128 0x4b + .8byte .LVL1656 + .4byte 0x167a9 + .uleb128 0x4b + .8byte .LVL1657 + .4byte 0x165e7 + .uleb128 0x4b + .8byte .LVL1658 + .4byte 0x16cee + .uleb128 0x4b + .8byte .LVL1659 + .4byte 0x147bd + .uleb128 0x4b + .8byte .LVL1660 + .4byte 0x142b5 + .uleb128 0x4b + .8byte .LVL1661 + .4byte 0x16f18 + .uleb128 0x4b + .8byte .LVL1662 + .4byte 0x1629d + .uleb128 0x4b + .8byte .LVL1663 + .4byte 0x14e71 + .uleb128 0x4b + .8byte .LVL1664 + .4byte 0x1643e + .uleb128 0x4b + .8byte .LVL1665 + .4byte 0x16910 + .uleb128 0x4b + .8byte .LVL1666 + .4byte 0x16f18 + .uleb128 0x4b + .8byte .LVL1667 + .4byte 0x140d9 + .uleb128 0x4b + .8byte .LVL1668 + .4byte 0x16d1c + .uleb128 0x4b + .8byte .LVL1669 + .4byte 0x16f18 + .uleb128 0x4b + .8byte .LVL1670 + .4byte 0x147bd + .uleb128 0x4b + .8byte .LVL1671 + .4byte 0x145e0 + .uleb128 0x4b + .8byte .LVL1672 + .4byte 0x142b5 + .uleb128 0x4b + .8byte .LVL1673 + .4byte 0x14e71 + .uleb128 0x4b + .8byte .LVL1674 + .4byte 0x15242 + .uleb128 0x4b + .8byte .LVL1675 + .4byte 0x15309 + .byte 0 + .uleb128 0x5 + .4byte 0x61 + .4byte 0x139ca + .uleb128 0x6 + .4byte 0x4f + .byte 0 + .byte 0 + .uleb128 0x4c + .4byte .LASF3113 + .byte 0x1 + .2byte 0x6f9 + .4byte 0xc6 + .8byte .LFB2836 + .8byte .LFE2836-.LFB2836 + .uleb128 0x1 + .byte 0x9c + .4byte 0x13b51 + .uleb128 0x55 + .4byte .LASF793 + .byte 0x1 + .2byte 0x6f9 + .4byte 0x458 + .4byte .LLST293 + .uleb128 0x67 + .string "ebc" + .byte 0x1 + .2byte 0x6fb + .4byte 0xe4d7 + .uleb128 0x1 + .byte 0x69 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x6fc + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x6fd + .4byte 0xe81f + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1490 + .4byte 0x13ab4 + .uleb128 0x3c + .byte 0x8 + .byte 0x1 + .2byte 0x704 + .4byte 0x13a4d + .uleb128 0x3e + .4byte .LASF3112 + .byte 0x1 + .2byte 0x704 + .4byte 0x1a0 + .uleb128 0x3a + .string "__c" + .byte 0x1 + .2byte 0x704 + .4byte 0x139ba + .byte 0 + .uleb128 0x4f + .string "__u" + .byte 0x1 + .2byte 0x704 + .4byte 0x13a2b + .uleb128 0x58 + .4byte 0x1623b + .8byte .LBB1779 + .4byte .Ldebug_ranges0+0x14d0 + .byte 0x1 + .2byte 0x704 + .4byte 0x13a81 + .uleb128 0x51 + .4byte 0x1625e + .uleb128 0x51 + .4byte 0x16252 + .uleb128 0x51 + .4byte 0x16248 + .byte 0 + .uleb128 0x5a + .4byte 0x1608b + .8byte .LBB1782 + .8byte .LBE1782-.LBB1782 + .byte 0x1 + .2byte 0x704 + .uleb128 0x53 + .8byte .LBB1783 + .8byte .LBE1783-.LBB1783 + .uleb128 0x5e + .4byte 0x1609b + .uleb128 0x1 + .byte 0x67 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL976 + .4byte 0x164fd + .uleb128 0x4b + .8byte .LVL977 + .4byte 0x16f18 + .uleb128 0x4b + .8byte .LVL978 + .4byte 0x16f18 + .uleb128 0x4b + .8byte .LVL979 + .4byte 0x16e90 + .uleb128 0x4b + .8byte .LVL980 + .4byte 0x16f22 + .uleb128 0x4b + .8byte .LVL981 + .4byte 0x140d9 + .uleb128 0x4b + .8byte .LVL982 + .4byte 0x167a9 + .uleb128 0x4b + .8byte .LVL983 + .4byte 0x147bd + .uleb128 0x4b + .8byte .LVL984 + .4byte 0x142b5 + .uleb128 0x4b + .8byte .LVL985 + .4byte 0x14e71 + .uleb128 0x4b + .8byte .LVL986 + .4byte 0x1643e + .uleb128 0x4b + .8byte .LVL987 + .4byte 0x16910 + .byte 0 + .uleb128 0x4a + .4byte .LASF3114 + .byte 0x1 + .2byte 0x668 + .8byte .LFB2835 + .8byte .LFE2835-.LFB2835 + .uleb128 0x1 + .byte 0x9c + .4byte 0x13d17 + .uleb128 0x4e + .string "ebc" + .byte 0x1 + .2byte 0x668 + .4byte 0xe4d7 + .4byte .LLST292 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x66a + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x66b + .4byte 0xe81f + .uleb128 0x52 + .4byte .LASF3024 + .4byte 0xb866 + .uleb128 0x9 + .byte 0x3 + .8byte __func__.35152 + .uleb128 0x50 + .4byte 0x13d6b + .8byte .LBB1774 + .8byte .LBE1774-.LBB1774 + .byte 0x1 + .2byte 0x67f + .4byte 0x13bde + .uleb128 0x51 + .4byte 0x13d84 + .uleb128 0x51 + .4byte 0x13d78 + .uleb128 0x4b + .8byte .LVL952 + .4byte 0x165e7 + .byte 0 + .uleb128 0x50 + .4byte 0x13d6b + .8byte .LBB1776 + .8byte .LBE1776-.LBB1776 + .byte 0x1 + .2byte 0x6f1 + .4byte 0x13c12 + .uleb128 0x51 + .4byte 0x13d84 + .uleb128 0x51 + .4byte 0x13d78 + .uleb128 0x4b + .8byte .LVL959 + .4byte 0x165e7 + .byte 0 + .uleb128 0x4b + .8byte .LVL943 + .4byte 0x1643e + .uleb128 0x4b + .8byte .LVL944 + .4byte 0x164fd + .uleb128 0x4b + .8byte .LVL946 + .4byte 0x16910 + .uleb128 0x4b + .8byte .LVL947 + .4byte 0x167a9 + .uleb128 0x4b + .8byte .LVL950 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL951 + .4byte 0x145e0 + .uleb128 0x4b + .8byte .LVL953 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL954 + .4byte 0x1629d + .uleb128 0x4b + .8byte .LVL957 + .4byte 0x142b5 + .uleb128 0x4b + .8byte .LVL958 + .4byte 0x140d9 + .uleb128 0x4b + .8byte .LVL962 + .4byte 0x140d9 + .uleb128 0x4b + .8byte .LVL963 + .4byte 0x1629d + .uleb128 0x4b + .8byte .LVL964 + .4byte 0x167a9 + .uleb128 0x4b + .8byte .LVL965 + .4byte 0x16910 + .uleb128 0x4b + .8byte .LVL966 + .4byte 0x164fd + .uleb128 0x4b + .8byte .LVL967 + .4byte 0x1643e + .uleb128 0x4b + .8byte .LVL968 + .4byte 0x142b5 + .uleb128 0x4b + .8byte .LVL969 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL970 + .4byte 0x145e0 + .uleb128 0x4b + .8byte .LVL971 + .4byte 0x16c5b + .byte 0 + .uleb128 0x64 + .4byte .LASF3115 + .byte 0x1 + .2byte 0x636 + .byte 0x1 + .4byte 0x13d56 + .uleb128 0x62 + .string "ebc" + .byte 0x1 + .2byte 0x636 + .4byte 0xe4d7 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x638 + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x639 + .4byte 0xe81f + .uleb128 0x66 + .4byte .LASF3024 + .4byte 0x13d66 + .4byte .LASF3115 + .byte 0 + .uleb128 0x5 + .4byte 0x68 + .4byte 0x13d66 + .uleb128 0x6 + .4byte 0x4f + .byte 0x1a + .byte 0 + .uleb128 0x3 + .4byte 0x13d56 + .uleb128 0x64 + .4byte .LASF3116 + .byte 0x1 + .2byte 0x630 + .byte 0x1 + .4byte 0x13d91 + .uleb128 0x63 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x630 + .4byte 0xe0e4 + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x630 + .4byte 0xe81f + .byte 0 + .uleb128 0x64 + .4byte .LASF3117 + .byte 0x1 + .2byte 0x625 + .byte 0x1 + .4byte 0x13dc3 + .uleb128 0x63 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x625 + .4byte 0xe0e4 + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x625 + .4byte 0xe81f + .uleb128 0x4f + .string "buf" + .byte 0x1 + .2byte 0x627 + .4byte 0x13dc3 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xde56 + .uleb128 0x64 + .4byte .LASF3118 + .byte 0x1 + .2byte 0x5f7 + .byte 0x1 + .4byte 0x13e93 + .uleb128 0x63 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x5f7 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x5f7 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x5f7 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x5f7 + .4byte 0xe81f + .uleb128 0x63 + .4byte .LASF874 + .byte 0x1 + .2byte 0x5f7 + .4byte 0xe1ba + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x5f9 + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x5fa + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x5fa + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x5fb + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x5fb + .4byte 0xc6 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x5fc + .4byte 0xc6 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x5fc + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3124 + .byte 0x1 + .2byte 0x5fd + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x5fe + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3125 + .byte 0x1 + .2byte 0x5ff + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3126 + .byte 0x1 + .2byte 0x600 + .4byte 0xbfee + .byte 0 + .uleb128 0x64 + .4byte .LASF3127 + .byte 0x1 + .2byte 0x5cc + .byte 0x1 + .4byte 0x13f5d + .uleb128 0x63 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x5cc + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x5cc + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x5cc + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x5cc + .4byte 0xe81f + .uleb128 0x63 + .4byte .LASF874 + .byte 0x1 + .2byte 0x5cc + .4byte 0xe1ba + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x5ce + .4byte 0xe0e4 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x5cf + .4byte 0xc6 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x5cf + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x5d0 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x5d1 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x5d2 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x5d2 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3124 + .byte 0x1 + .2byte 0x5d3 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x5d4 + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3125 + .byte 0x1 + .2byte 0x5d5 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3126 + .byte 0x1 + .2byte 0x5d6 + .4byte 0xbfee + .byte 0 + .uleb128 0x64 + .4byte .LASF3128 + .byte 0x1 + .2byte 0x59f + .byte 0x1 + .4byte 0x1401b + .uleb128 0x63 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x59f + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x59f + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x59f + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x59f + .4byte 0xe81f + .uleb128 0x63 + .4byte .LASF874 + .byte 0x1 + .2byte 0x59f + .4byte 0xe1ba + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x5a1 + .4byte 0xe0e4 + .uleb128 0x43 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x5a2 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x5a2 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x5a3 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x5a3 + .4byte 0xc6 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x5a4 + .4byte 0xc6 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x5a4 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3124 + .byte 0x1 + .2byte 0x5a5 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x5a6 + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3125 + .byte 0x1 + .2byte 0x5a7 + .4byte 0xc6 + .byte 0 + .uleb128 0x64 + .4byte .LASF3129 + .byte 0x1 + .2byte 0x575 + .byte 0x1 + .4byte 0x140d9 + .uleb128 0x63 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x575 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x575 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x575 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x575 + .4byte 0xe81f + .uleb128 0x63 + .4byte .LASF874 + .byte 0x1 + .2byte 0x575 + .4byte 0xe1ba + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x577 + .4byte 0xe0e4 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x578 + .4byte 0xc6 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x578 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x579 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x57a + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x57b + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x57b + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3124 + .byte 0x1 + .2byte 0x57c + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x57d + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3125 + .byte 0x1 + .2byte 0x57e + .4byte 0xc6 + .byte 0 + .uleb128 0x4a + .4byte .LASF3130 + .byte 0x1 + .2byte 0x53c + .8byte .LFB2827 + .8byte .LFE2827-.LFB2827 + .uleb128 0x1 + .byte 0x9c + .4byte 0x14207 + .uleb128 0x55 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x53c + .4byte 0xbfee + .4byte .LLST240 + .uleb128 0x55 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x53c + .4byte 0x45aa + .4byte .LLST241 + .uleb128 0x55 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x53c + .4byte 0x45aa + .4byte .LLST242 + .uleb128 0x55 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x53c + .4byte 0xbfee + .4byte .LLST243 + .uleb128 0x55 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x53c + .4byte 0xe81f + .4byte .LLST244 + .uleb128 0x55 + .4byte .LASF874 + .byte 0x1 + .2byte 0x53c + .4byte 0xe1ba + .4byte .LLST245 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x53e + .4byte 0xe0e4 + .uleb128 0x57 + .string "i" + .byte 0x1 + .2byte 0x53f + .4byte 0xc6 + .4byte .LLST246 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x540 + .4byte 0xc6 + .uleb128 0x56 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x541 + .4byte 0xc6 + .4byte .LLST247 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x542 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x543 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x543 + .4byte 0x15a + .uleb128 0x56 + .4byte .LASF3126 + .byte 0x1 + .2byte 0x544 + .4byte 0xbfee + .4byte .LLST248 + .uleb128 0x56 + .4byte .LASF3093 + .byte 0x1 + .2byte 0x545 + .4byte 0xc6 + .4byte .LLST249 + .uleb128 0x56 + .4byte .LASF3132 + .byte 0x1 + .2byte 0x546 + .4byte 0x45a4 + .4byte .LLST250 + .uleb128 0x4b + .8byte .LVL790 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL798 + .4byte 0x163ca + .uleb128 0x4b + .8byte .LVL803 + .4byte 0x163ca + .byte 0 + .uleb128 0x61 + .4byte .LASF3133 + .byte 0x1 + .2byte 0x4c3 + .4byte 0x13f + .byte 0x1 + .4byte 0x142b5 + .uleb128 0x63 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x4c3 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x4c3 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x4c3 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x4c3 + .4byte 0xe81f + .uleb128 0x63 + .4byte .LASF845 + .byte 0x1 + .2byte 0x4c3 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x4c5 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x4c6 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x4c7 + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x4c8 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF3136 + .byte 0x1 + .2byte 0x4c8 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x4c9 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x4ca + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x4cb + .4byte 0x15a + .byte 0 + .uleb128 0x4a + .4byte .LASF3138 + .byte 0x1 + .2byte 0x419 + .8byte .LFB2825 + .8byte .LFE2825-.LFB2825 + .uleb128 0x1 + .byte 0x9c + .4byte 0x14414 + .uleb128 0x71 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x419 + .4byte 0xbfee + .uleb128 0x1 + .byte 0x50 + .uleb128 0x71 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x419 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x51 + .uleb128 0x71 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x419 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x52 + .uleb128 0x71 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x419 + .4byte 0xbfee + .uleb128 0x1 + .byte 0x53 + .uleb128 0x71 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x419 + .4byte 0xe81f + .uleb128 0x1 + .byte 0x54 + .uleb128 0x55 + .4byte .LASF874 + .byte 0x1 + .2byte 0x419 + .4byte 0xe1ba + .4byte .LLST12 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x41b + .4byte 0xe0e4 + .uleb128 0x57 + .string "i" + .byte 0x1 + .2byte 0x41c + .4byte 0xc6 + .4byte .LLST13 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x41d + .4byte 0xc6 + .uleb128 0x56 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x41e + .4byte 0xc6 + .4byte .LLST14 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x41f + .4byte 0xc6 + .uleb128 0x56 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x420 + .4byte 0x15a + .4byte .LLST15 + .uleb128 0x56 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x420 + .4byte 0x15a + .4byte .LLST16 + .uleb128 0x56 + .4byte .LASF3126 + .byte 0x1 + .2byte 0x421 + .4byte 0xbfee + .4byte .LLST17 + .uleb128 0x49 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x422 + .4byte 0x110 + .uleb128 0x1 + .byte 0x5d + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x423 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x424 + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF2916 + .byte 0x1 + .2byte 0x425 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x426 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3136 + .byte 0x1 + .2byte 0x426 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x427 + .4byte 0x15a + .4byte .LLST18 + .uleb128 0x56 + .4byte .LASF3093 + .byte 0x1 + .2byte 0x428 + .4byte 0xc6 + .4byte .LLST19 + .uleb128 0x56 + .4byte .LASF3132 + .byte 0x1 + .2byte 0x429 + .4byte 0x45a4 + .4byte .LLST20 + .byte 0 + .uleb128 0x64 + .4byte .LASF3139 + .byte 0x1 + .2byte 0x3e5 + .byte 0x1 + .4byte 0x1453e + .uleb128 0x63 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x3e5 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x3e5 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x3e5 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x3e5 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3140 + .byte 0x1 + .2byte 0x3e5 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x3e5 + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x3e7 + .4byte 0xe0e4 + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x3e8 + .4byte 0xc6 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x3e9 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x3ea + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x3eb + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x3ec + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x3ec + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3141 + .byte 0x1 + .2byte 0x3ed + .4byte 0x45aa + .uleb128 0x43 + .4byte .LASF3142 + .byte 0x1 + .2byte 0x3ed + .4byte 0x45aa + .uleb128 0x43 + .4byte .LASF3126 + .byte 0x1 + .2byte 0x3ee + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3143 + .byte 0x1 + .2byte 0x3ef + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x3f0 + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3145 + .byte 0x1 + .2byte 0x3f1 + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3146 + .byte 0x1 + .2byte 0x3f1 + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF2838 + .byte 0x1 + .2byte 0x3f2 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2840 + .byte 0x1 + .2byte 0x3f3 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2839 + .byte 0x1 + .2byte 0x3f4 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2841 + .byte 0x1 + .2byte 0x3f5 + .4byte 0xc6 + .byte 0 + .uleb128 0x61 + .4byte .LASF3147 + .byte 0x1 + .2byte 0x388 + .4byte 0x13f + .byte 0x1 + .4byte 0x145e0 + .uleb128 0x63 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x388 + .4byte 0x15a + .uleb128 0x63 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x388 + .4byte 0x15a + .uleb128 0x63 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x388 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3140 + .byte 0x1 + .2byte 0x388 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x388 + .4byte 0xe81f + .uleb128 0x63 + .4byte .LASF845 + .byte 0x1 + .2byte 0x388 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x38a + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x38b + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x38c + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF3136 + .byte 0x1 + .2byte 0x38c + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x38d + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x38e + .4byte 0x110 + .byte 0 + .uleb128 0x4a + .4byte .LASF3149 + .byte 0x1 + .2byte 0x2f7 + .8byte .LFB2822 + .8byte .LFE2822-.LFB2822 + .uleb128 0x1 + .byte 0x9c + .4byte 0x147bd + .uleb128 0x55 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x2f7 + .4byte 0xbfee + .4byte .LLST0 + .uleb128 0x71 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x2f7 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x51 + .uleb128 0x71 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x2f7 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x52 + .uleb128 0x71 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x2f7 + .4byte 0xbfee + .uleb128 0x1 + .byte 0x53 + .uleb128 0x71 + .4byte .LASF3140 + .byte 0x1 + .2byte 0x2f7 + .4byte 0xbfee + .uleb128 0x1 + .byte 0x54 + .uleb128 0x71 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x2f7 + .4byte 0xe81f + .uleb128 0x1 + .byte 0x55 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x2f9 + .4byte 0xe0e4 + .uleb128 0x67 + .string "i" + .byte 0x1 + .2byte 0x2fa + .4byte 0xc6 + .uleb128 0x1 + .byte 0x67 + .uleb128 0x67 + .string "j" + .byte 0x1 + .2byte 0x2fb + .4byte 0xc6 + .uleb128 0x1 + .byte 0x5a + .uleb128 0x56 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x2fc + .4byte 0xc6 + .4byte .LLST1 + .uleb128 0x56 + .4byte .LASF262 + .byte 0x1 + .2byte 0x2fd + .4byte 0xc6 + .4byte .LLST2 + .uleb128 0x56 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x2fe + .4byte 0x15a + .4byte .LLST3 + .uleb128 0x56 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x2fe + .4byte 0x15a + .4byte .LLST4 + .uleb128 0x43 + .4byte .LASF3141 + .byte 0x1 + .2byte 0x2ff + .4byte 0x45aa + .uleb128 0x43 + .4byte .LASF3142 + .byte 0x1 + .2byte 0x2ff + .4byte 0x45aa + .uleb128 0x56 + .4byte .LASF3126 + .byte 0x1 + .2byte 0x300 + .4byte 0xbfee + .4byte .LLST5 + .uleb128 0x49 + .4byte .LASF3150 + .byte 0x1 + .2byte 0x301 + .4byte 0xbfee + .uleb128 0x1 + .byte 0x5c + .uleb128 0x43 + .4byte .LASF3143 + .byte 0x1 + .2byte 0x302 + .4byte 0xbfee + .uleb128 0x56 + .4byte .LASF3144 + .byte 0x1 + .2byte 0x303 + .4byte 0xbfee + .4byte .LLST6 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x304 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x305 + .4byte 0xbfee + .uleb128 0x43 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x306 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3145 + .byte 0x1 + .2byte 0x307 + .4byte 0xbfee + .uleb128 0x49 + .4byte .LASF3146 + .byte 0x1 + .2byte 0x307 + .4byte 0xbfee + .uleb128 0x1 + .byte 0x60 + .uleb128 0x43 + .4byte .LASF2916 + .byte 0x1 + .2byte 0x308 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x309 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3136 + .byte 0x1 + .2byte 0x309 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x30a + .4byte 0x15a + .4byte .LLST7 + .uleb128 0x56 + .4byte .LASF2838 + .byte 0x1 + .2byte 0x30b + .4byte 0xc6 + .4byte .LLST8 + .uleb128 0x56 + .4byte .LASF2840 + .byte 0x1 + .2byte 0x30c + .4byte 0xc6 + .4byte .LLST9 + .uleb128 0x56 + .4byte .LASF2839 + .byte 0x1 + .2byte 0x30d + .4byte 0xc6 + .4byte .LLST10 + .uleb128 0x56 + .4byte .LASF2841 + .byte 0x1 + .2byte 0x30e + .4byte 0xc6 + .4byte .LLST11 + .byte 0 + .uleb128 0x4a + .4byte .LASF3151 + .byte 0x1 + .2byte 0x29a + .8byte .LFB2821 + .8byte .LFE2821-.LFB2821 + .uleb128 0x1 + .byte 0x9c + .4byte 0x14e71 + .uleb128 0x55 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x29a + .4byte 0xbfee + .4byte .LLST114 + .uleb128 0x55 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x29a + .4byte 0x45aa + .4byte .LLST115 + .uleb128 0x55 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x29a + .4byte 0x45aa + .4byte .LLST116 + .uleb128 0x55 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x29a + .4byte 0xbfee + .4byte .LLST117 + .uleb128 0x55 + .4byte .LASF3140 + .byte 0x1 + .2byte 0x29a + .4byte 0xbfee + .4byte .LLST118 + .uleb128 0x55 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x29a + .4byte 0xe81f + .4byte .LLST119 + .uleb128 0x55 + .4byte .LASF874 + .byte 0x1 + .2byte 0x29a + .4byte 0xe1ba + .4byte .LLST120 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x29c + .4byte 0xe0e4 + .uleb128 0x57 + .string "i" + .byte 0x1 + .2byte 0x29d + .4byte 0xc6 + .4byte .LLST121 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x29d + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x29d + .4byte 0xc6 + .uleb128 0x56 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x29d + .4byte 0xc6 + .4byte .LLST122 + .uleb128 0x56 + .4byte .LASF3093 + .byte 0x1 + .2byte 0x29e + .4byte 0xc6 + .4byte .LLST123 + .uleb128 0x56 + .4byte .LASF3132 + .byte 0x1 + .2byte 0x29f + .4byte 0x45a4 + .4byte .LLST124 + .uleb128 0x43 + .4byte .LASF3125 + .byte 0x1 + .2byte 0x2a0 + .4byte 0xc6 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x8c0 + .4byte 0x14e63 + .uleb128 0x56 + .4byte .LASF3126 + .byte 0x1 + .2byte 0x2b7 + .4byte 0xbfee + .4byte .LLST125 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x8f0 + .4byte 0x14b9a + .uleb128 0x56 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x2b9 + .4byte 0x15a + .4byte .LLST126 + .uleb128 0x56 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x2ba + .4byte 0x15a + .4byte .LLST127 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x930 + .uleb128 0x56 + .4byte .LASF3152 + .byte 0x1 + .2byte 0x2bd + .4byte 0x2b0 + .4byte .LLST128 + .uleb128 0x49 + .4byte .LASF3136 + .byte 0x1 + .2byte 0x2be + .4byte 0x13f + .uleb128 0x1 + .byte 0x56 + .uleb128 0x56 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x2bf + .4byte 0x15a + .4byte .LLST129 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x970 + .4byte 0x1497a + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2c2 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2c2 + .4byte 0x110 + .4byte .LLST130 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c2 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2c2 + .4byte 0x13f + .4byte .LLST131 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c2 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x9b0 + .4byte 0x149c8 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2c3 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2c3 + .4byte 0x110 + .4byte .LLST132 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c3 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2c3 + .4byte 0x13f + .4byte .LLST133 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c3 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x9e0 + .4byte 0x14a16 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2c4 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2c4 + .4byte 0x110 + .4byte .LLST134 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c4 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2c4 + .4byte 0x13f + .4byte .LLST135 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c4 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xa10 + .4byte 0x14a64 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2c5 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2c5 + .4byte 0x110 + .4byte .LLST136 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c5 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2c5 + .4byte 0x13f + .4byte .LLST137 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c5 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xa40 + .4byte 0x14ab2 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2c6 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2c6 + .4byte 0x110 + .4byte .LLST138 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c6 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2c6 + .4byte 0x13f + .4byte .LLST139 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c6 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xa70 + .4byte 0x14b00 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x110 + .4byte .LLST140 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x13f + .4byte .LLST141 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c7 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xaa0 + .4byte 0x14b4e + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2c8 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2c8 + .4byte 0x110 + .4byte .LLST142 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c8 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2c8 + .4byte 0x13f + .4byte .LLST143 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c8 + .4byte 0xbfee + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xad0 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2c9 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2c9 + .4byte 0x110 + .4byte .LLST144 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2c9 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2c9 + .4byte 0x13f + .4byte .LLST145 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2c9 + .4byte 0xbfee + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xb00 + .uleb128 0x56 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x2d7 + .4byte 0x15a + .4byte .LLST146 + .uleb128 0x56 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x2d8 + .4byte 0x15a + .4byte .LLST147 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xb30 + .uleb128 0x56 + .4byte .LASF3152 + .byte 0x1 + .2byte 0x2db + .4byte 0x2b0 + .4byte .LLST148 + .uleb128 0x56 + .4byte .LASF3136 + .byte 0x1 + .2byte 0x2dc + .4byte 0x13f + .4byte .LLST149 + .uleb128 0x56 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x2dd + .4byte 0x15a + .4byte .LLST150 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xb60 + .4byte 0x14c42 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2e0 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2e0 + .4byte 0x110 + .4byte .LLST151 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e0 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2e0 + .4byte 0x13f + .4byte .LLST152 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e0 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xba0 + .4byte 0x14c90 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2e1 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2e1 + .4byte 0x110 + .4byte .LLST153 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e1 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2e1 + .4byte 0x13f + .4byte .LLST154 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e1 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xbd0 + .4byte 0x14cde + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2e2 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2e2 + .4byte 0x110 + .4byte .LLST155 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e2 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2e2 + .4byte 0x13f + .4byte .LLST156 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e2 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xc00 + .4byte 0x14d2c + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x110 + .4byte .LLST157 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x13f + .4byte .LLST158 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e3 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xc30 + .4byte 0x14d7a + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2e4 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2e4 + .4byte 0x110 + .4byte .LLST159 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e4 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2e4 + .4byte 0x13f + .4byte .LLST160 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e4 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xc60 + .4byte 0x14dc8 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2e5 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2e5 + .4byte 0x110 + .4byte .LLST161 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e5 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2e5 + .4byte 0x13f + .4byte .LLST162 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e5 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xc90 + .4byte 0x14e16 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2e6 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2e6 + .4byte 0x110 + .4byte .LLST163 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e6 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2e6 + .4byte 0x13f + .4byte .LLST164 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e6 + .4byte 0xbfee + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xcc0 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x2e7 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x2e7 + .4byte 0x110 + .4byte .LLST165 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x2e7 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x2e7 + .4byte 0x13f + .4byte .LLST166 + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x2e7 + .4byte 0xbfee + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL340 + .4byte 0x16cb7 + .byte 0 + .uleb128 0x4a + .4byte .LASF3153 + .byte 0x1 + .2byte 0x252 + .8byte .LFB2820 + .8byte .LFE2820-.LFB2820 + .uleb128 0x1 + .byte 0x9c + .4byte 0x15242 + .uleb128 0x55 + .4byte .LASF3119 + .byte 0x1 + .2byte 0x252 + .4byte 0xbfee + .4byte .LLST167 + .uleb128 0x55 + .4byte .LASF3120 + .byte 0x1 + .2byte 0x252 + .4byte 0x45aa + .4byte .LLST168 + .uleb128 0x55 + .4byte .LASF3121 + .byte 0x1 + .2byte 0x252 + .4byte 0x45aa + .4byte .LLST169 + .uleb128 0x55 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x252 + .4byte 0xbfee + .4byte .LLST170 + .uleb128 0x55 + .4byte .LASF3140 + .byte 0x1 + .2byte 0x252 + .4byte 0xbfee + .4byte .LLST171 + .uleb128 0x55 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x252 + .4byte 0xe81f + .4byte .LLST172 + .uleb128 0x55 + .4byte .LASF874 + .byte 0x1 + .2byte 0x252 + .4byte 0xe1ba + .4byte .LLST173 + .uleb128 0x43 + .4byte .LASF2992 + .byte 0x1 + .2byte 0x254 + .4byte 0xe0e4 + .uleb128 0x57 + .string "i" + .byte 0x1 + .2byte 0x255 + .4byte 0xc6 + .4byte .LLST174 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x255 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x255 + .4byte 0xc6 + .uleb128 0x56 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x255 + .4byte 0xc6 + .4byte .LLST175 + .uleb128 0x56 + .4byte .LASF3093 + .byte 0x1 + .2byte 0x256 + .4byte 0xc6 + .4byte .LLST176 + .uleb128 0x56 + .4byte .LASF3132 + .byte 0x1 + .2byte 0x257 + .4byte 0x45a4 + .4byte .LLST177 + .uleb128 0x56 + .4byte .LASF3125 + .byte 0x1 + .2byte 0x258 + .4byte 0xc6 + .4byte .LLST178 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xcf0 + .4byte 0x15227 + .uleb128 0x56 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x277 + .4byte 0x15a + .4byte .LLST179 + .uleb128 0x56 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x278 + .4byte 0x15a + .4byte .LLST180 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xd20 + .uleb128 0x56 + .4byte .LASF3152 + .byte 0x1 + .2byte 0x27b + .4byte 0x2b0 + .4byte .LLST181 + .uleb128 0x56 + .4byte .LASF3126 + .byte 0x1 + .2byte 0x27c + .4byte 0xbfee + .4byte .LLST182 + .uleb128 0x43 + .4byte .LASF3136 + .byte 0x1 + .2byte 0x27d + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x27e + .4byte 0x15a + .4byte .LLST183 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xd50 + .4byte 0x15023 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x281 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x281 + .4byte 0x110 + .4byte .LLST184 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x281 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x281 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x281 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xd90 + .4byte 0x1506d + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x282 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x282 + .4byte 0x110 + .4byte .LLST185 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x282 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x282 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x282 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xdc0 + .4byte 0x150b7 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x283 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x283 + .4byte 0x110 + .4byte .LLST186 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x283 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x283 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x283 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xdf0 + .4byte 0x15101 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x284 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x284 + .4byte 0x110 + .4byte .LLST187 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x284 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x284 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x284 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xe20 + .4byte 0x1514b + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x287 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x287 + .4byte 0x110 + .4byte .LLST188 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x287 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x287 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x287 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xe50 + .4byte 0x15195 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x288 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x288 + .4byte 0x110 + .4byte .LLST189 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x288 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x288 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x288 + .4byte 0xbfee + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0xe80 + .4byte 0x151df + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x289 + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x289 + .4byte 0x110 + .4byte .LLST190 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x289 + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x289 + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x289 + .4byte 0xbfee + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xeb0 + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x28a + .4byte 0x110 + .uleb128 0x56 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x28a + .4byte 0x110 + .4byte .LLST191 + .uleb128 0x43 + .4byte .LASF2953 + .byte 0x1 + .2byte 0x28a + .4byte 0x110 + .uleb128 0x43 + .4byte .LASF3135 + .byte 0x1 + .2byte 0x28a + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x28a + .4byte 0xbfee + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL556 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL621 + .4byte 0x16cb7 + .byte 0 + .uleb128 0x72 + .4byte .LASF3159 + .byte 0x1 + .2byte 0x216 + .8byte .LFB2819 + .8byte .LFE2819-.LFB2819 + .uleb128 0x1 + .byte 0x9c + .4byte 0x15309 + .uleb128 0x71 + .4byte .LASF3154 + .byte 0x1 + .2byte 0x216 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x50 + .uleb128 0x71 + .4byte .LASF3155 + .byte 0x1 + .2byte 0x216 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x51 + .uleb128 0x71 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x216 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x52 + .uleb128 0x55 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x216 + .4byte 0xe81f + .4byte .LLST354 + .uleb128 0x49 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x218 + .4byte 0xc6 + .uleb128 0x1 + .byte 0x5e + .uleb128 0x49 + .4byte .LASF262 + .byte 0x1 + .2byte 0x218 + .4byte 0xc6 + .uleb128 0x1 + .byte 0x5a + .uleb128 0x43 + .4byte .LASF3156 + .byte 0x1 + .2byte 0x219 + .4byte 0x15a + .uleb128 0x56 + .4byte .LASF3157 + .byte 0x1 + .2byte 0x219 + .4byte 0x15a + .4byte .LLST355 + .uleb128 0x56 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x21a + .4byte 0x15a + .4byte .LLST356 + .uleb128 0x67 + .string "i" + .byte 0x1 + .2byte 0x21b + .4byte 0xc6 + .uleb128 0x1 + .byte 0x5d + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x21b + .4byte 0xc6 + .uleb128 0x56 + .4byte .LASF3158 + .byte 0x1 + .2byte 0x21c + .4byte 0x15a + .4byte .LLST357 + .byte 0 + .uleb128 0x72 + .4byte .LASF3160 + .byte 0x1 + .2byte 0x1e5 + .8byte .LFB2818 + .8byte .LFE2818-.LFB2818 + .uleb128 0x1 + .byte 0x9c + .4byte 0x155a2 + .uleb128 0x71 + .4byte .LASF3154 + .byte 0x1 + .2byte 0x1e5 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x50 + .uleb128 0x71 + .4byte .LASF3161 + .byte 0x1 + .2byte 0x1e5 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x51 + .uleb128 0x71 + .4byte .LASF3155 + .byte 0x1 + .2byte 0x1e5 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x52 + .uleb128 0x71 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x1e5 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x53 + .uleb128 0x71 + .4byte .LASF3140 + .byte 0x1 + .2byte 0x1e5 + .4byte 0x45aa + .uleb128 0x1 + .byte 0x54 + .uleb128 0x55 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x1e5 + .4byte 0xe81f + .4byte .LLST334 + .uleb128 0x56 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x1e7 + .4byte 0xc6 + .4byte .LLST335 + .uleb128 0x49 + .4byte .LASF262 + .byte 0x1 + .2byte 0x1e7 + .4byte 0xc6 + .uleb128 0x1 + .byte 0x5c + .uleb128 0x43 + .4byte .LASF3156 + .byte 0x1 + .2byte 0x1e8 + .4byte 0x15a + .uleb128 0x56 + .4byte .LASF3162 + .byte 0x1 + .2byte 0x1e8 + .4byte 0x15a + .4byte .LLST336 + .uleb128 0x49 + .4byte .LASF3157 + .byte 0x1 + .2byte 0x1e8 + .4byte 0x15a + .uleb128 0x1 + .byte 0x5a + .uleb128 0x56 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x1e9 + .4byte 0x15a + .4byte .LLST337 + .uleb128 0x43 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x1ea + .4byte 0x15a + .uleb128 0x57 + .string "i" + .byte 0x1 + .2byte 0x1eb + .4byte 0xc6 + .4byte .LLST338 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x1eb + .4byte 0xc6 + .uleb128 0x49 + .4byte .LASF3158 + .byte 0x1 + .2byte 0x1ec + .4byte 0x15a + .uleb128 0x1 + .byte 0x55 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1ab0 + .4byte 0x1541f + .uleb128 0x49 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1fb + .4byte 0x15a + .uleb128 0x1 + .byte 0x55 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1b10 + .4byte 0x15439 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1fc + .4byte 0x15a + .4byte .LLST344 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1b60 + .4byte 0x15453 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1fd + .4byte 0x15a + .4byte .LLST345 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1850 + .4byte 0x1546d + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1fe + .4byte 0x15a + .4byte .LLST339 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x18d0 + .4byte 0x15487 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1ff + .4byte 0x15a + .4byte .LLST340 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1960 + .4byte 0x154a1 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x200 + .4byte 0x15a + .4byte .LLST341 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x19f0 + .4byte 0x154bb + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x201 + .4byte 0x15a + .4byte .LLST342 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1a70 + .4byte 0x154d5 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x202 + .4byte 0x15a + .4byte .LLST343 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1c10 + .4byte 0x154ef + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x204 + .4byte 0x15a + .4byte .LLST347 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1c80 + .4byte 0x15509 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x205 + .4byte 0x15a + .4byte .LLST348 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1ce0 + .4byte 0x15523 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x206 + .4byte 0x15a + .4byte .LLST349 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1d40 + .4byte 0x1553d + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x207 + .4byte 0x15a + .4byte .LLST350 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1da0 + .4byte 0x15557 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x208 + .4byte 0x15a + .4byte .LLST351 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1e00 + .4byte 0x15571 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x209 + .4byte 0x15a + .4byte .LLST352 + .byte 0 + .uleb128 0x69 + .4byte .Ldebug_ranges0+0x1e60 + .4byte 0x1558b + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x20a + .4byte 0x15a + .4byte .LLST353 + .byte 0 + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1bb0 + .uleb128 0x56 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x20b + .4byte 0x15a + .4byte .LLST346 + .byte 0 + .byte 0 + .uleb128 0x64 + .4byte .LASF3164 + .byte 0x1 + .2byte 0x1a5 + .byte 0x1 + .4byte 0x15728 + .uleb128 0x63 + .4byte .LASF3154 + .byte 0x1 + .2byte 0x1a5 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3161 + .byte 0x1 + .2byte 0x1a5 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3155 + .byte 0x1 + .2byte 0x1a5 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3131 + .byte 0x1 + .2byte 0x1a5 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF3140 + .byte 0x1 + .2byte 0x1a5 + .4byte 0x45aa + .uleb128 0x63 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x1a5 + .4byte 0xe81f + .uleb128 0x43 + .4byte .LASF2870 + .byte 0x1 + .2byte 0x1a7 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF262 + .byte 0x1 + .2byte 0x1a7 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF3156 + .byte 0x1 + .2byte 0x1a8 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3162 + .byte 0x1 + .2byte 0x1a8 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3157 + .byte 0x1 + .2byte 0x1a8 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3134 + .byte 0x1 + .2byte 0x1a9 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3148 + .byte 0x1 + .2byte 0x1aa + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3158 + .byte 0x1 + .2byte 0x1ab + .4byte 0x15a + .uleb128 0x4f + .string "i" + .byte 0x1 + .2byte 0x1ac + .4byte 0xc6 + .uleb128 0x4f + .string "j" + .byte 0x1 + .2byte 0x1ad + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2838 + .byte 0x1 + .2byte 0x1ae + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2840 + .byte 0x1 + .2byte 0x1af + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2839 + .byte 0x1 + .2byte 0x1b0 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2841 + .byte 0x1 + .2byte 0x1b1 + .4byte 0xc6 + .uleb128 0x6f + .4byte 0x156ad + .uleb128 0x43 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1ce + .4byte 0x15a + .byte 0 + .uleb128 0x6f + .4byte 0x156bf + .uleb128 0x43 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1cf + .4byte 0x15a + .byte 0 + .uleb128 0x6f + .4byte 0x156d1 + .uleb128 0x43 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1d0 + .4byte 0x15a + .byte 0 + .uleb128 0x6f + .4byte 0x156e3 + .uleb128 0x43 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1d1 + .4byte 0x15a + .byte 0 + .uleb128 0x6f + .4byte 0x156f5 + .uleb128 0x43 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1d2 + .4byte 0x15a + .byte 0 + .uleb128 0x6f + .4byte 0x15707 + .uleb128 0x43 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1d3 + .4byte 0x15a + .byte 0 + .uleb128 0x6f + .4byte 0x15719 + .uleb128 0x43 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1d4 + .4byte 0x15a + .byte 0 + .uleb128 0x65 + .uleb128 0x43 + .4byte .LASF3163 + .byte 0x1 + .2byte 0x1d5 + .4byte 0x15a + .byte 0 + .byte 0 + .uleb128 0x61 + .4byte .LASF3165 + .byte 0x1 + .2byte 0x186 + .4byte 0xc6 + .byte 0x1 + .4byte 0x1575e + .uleb128 0x62 + .string "ebc" + .byte 0x1 + .2byte 0x186 + .4byte 0xe4d7 + .uleb128 0x63 + .4byte .LASF3166 + .byte 0x1 + .2byte 0x186 + .4byte 0xc6 + .uleb128 0x43 + .4byte .LASF2943 + .byte 0x1 + .2byte 0x188 + .4byte 0xe81f + .byte 0 + .uleb128 0x61 + .4byte .LASF3167 + .byte 0x1 + .2byte 0x168 + .4byte 0x13f + .byte 0x3 + .4byte 0x157ac + .uleb128 0x63 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x168 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x168 + .4byte 0x15a + .uleb128 0x63 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x168 + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3168 + .byte 0x1 + .2byte 0x16a + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x16b + .4byte 0x15a + .byte 0 + .uleb128 0x61 + .4byte .LASF3169 + .byte 0x1 + .2byte 0x14a + .4byte 0x13f + .byte 0x3 + .4byte 0x157fa + .uleb128 0x63 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x14a + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x14a + .4byte 0x15a + .uleb128 0x63 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x14a + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3168 + .byte 0x1 + .2byte 0x14c + .4byte 0x13f + .uleb128 0x43 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x14d + .4byte 0x15a + .byte 0 + .uleb128 0x61 + .4byte .LASF3170 + .byte 0x1 + .2byte 0x12c + .4byte 0x11f + .byte 0x3 + .4byte 0x15848 + .uleb128 0x63 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x12c + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x12c + .4byte 0x15a + .uleb128 0x63 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x12c + .4byte 0x15a + .uleb128 0x43 + .4byte .LASF3168 + .byte 0x1 + .2byte 0x12e + .4byte 0x11f + .uleb128 0x43 + .4byte .LASF3137 + .byte 0x1 + .2byte 0x12f + .4byte 0x15a + .byte 0 + .uleb128 0x61 + .4byte .LASF3171 + .byte 0x1 + .2byte 0x120 + .4byte 0x13f + .byte 0x3 + .4byte 0x1587e + .uleb128 0x63 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x120 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x120 + .4byte 0x15a + .uleb128 0x63 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x120 + .4byte 0x15a + .byte 0 + .uleb128 0x61 + .4byte .LASF3172 + .byte 0x1 + .2byte 0x114 + .4byte 0x13f + .byte 0x3 + .4byte 0x158b4 + .uleb128 0x63 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x114 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x114 + .4byte 0x15a + .uleb128 0x63 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x114 + .4byte 0x15a + .byte 0 + .uleb128 0x61 + .4byte .LASF3173 + .byte 0x1 + .2byte 0x108 + .4byte 0x11f + .byte 0x3 + .4byte 0x158ea + .uleb128 0x63 + .4byte .LASF2826 + .byte 0x1 + .2byte 0x108 + .4byte 0xbfee + .uleb128 0x63 + .4byte .LASF3122 + .byte 0x1 + .2byte 0x108 + .4byte 0x15a + .uleb128 0x63 + .4byte .LASF3123 + .byte 0x1 + .2byte 0x108 + .4byte 0x15a + .byte 0 + .uleb128 0x73 + .4byte .LASF3174 + .byte 0xa + .byte 0x4a + .byte 0x3 + .4byte 0x1590d + .uleb128 0x74 + .4byte .LASF2906 + .byte 0xa + .byte 0x4a + .4byte 0xe0a4 + .uleb128 0x74 + .4byte .LASF2953 + .byte 0xa + .byte 0x4a + .4byte 0xc6 + .byte 0 + .uleb128 0x73 + .4byte .LASF3175 + .byte 0xa + .byte 0x3b + .byte 0x3 + .4byte 0x1593b + .uleb128 0x74 + .4byte .LASF2906 + .byte 0xa + .byte 0x3b + .4byte 0xe0a4 + .uleb128 0x74 + .4byte .LASF3176 + .byte 0xa + .byte 0x3b + .4byte 0x13f + .uleb128 0x74 + .4byte .LASF3177 + .byte 0xa + .byte 0x3b + .4byte 0x13f + .byte 0 + .uleb128 0x73 + .4byte .LASF3178 + .byte 0xa + .byte 0x35 + .byte 0x3 + .4byte 0x1597f + .uleb128 0x74 + .4byte .LASF2906 + .byte 0xa + .byte 0x35 + .4byte 0xe0a4 + .uleb128 0x74 + .4byte .LASF3179 + .byte 0xa + .byte 0x35 + .4byte 0xc6 + .uleb128 0x74 + .4byte .LASF3180 + .byte 0xa + .byte 0x36 + .4byte 0xc6 + .uleb128 0x74 + .4byte .LASF3181 + .byte 0xa + .byte 0x36 + .4byte 0xc6 + .uleb128 0x74 + .4byte .LASF3182 + .byte 0xa + .byte 0x36 + .4byte 0xc6 + .byte 0 + .uleb128 0x73 + .4byte .LASF3183 + .byte 0xa + .byte 0x30 + .byte 0x3 + .4byte 0x15997 + .uleb128 0x74 + .4byte .LASF2906 + .byte 0xa + .byte 0x30 + .4byte 0xe0a4 + .byte 0 + .uleb128 0x75 + .4byte .LASF3184 + .byte 0xa + .byte 0x2b + .4byte 0xc6 + .byte 0x3 + .4byte 0x159be + .uleb128 0x74 + .4byte .LASF2906 + .byte 0xa + .byte 0x2b + .4byte 0xe0a4 + .uleb128 0x74 + .4byte .LASF2992 + .byte 0xa + .byte 0x2b + .4byte 0xe0e4 + .byte 0 + .uleb128 0x64 + .4byte .LASF3185 + .byte 0x9 + .2byte 0x1ab + .byte 0x3 + .4byte 0x15a08 + .uleb128 0x62 + .string "dev" + .byte 0x9 + .2byte 0x1ab + .4byte 0xa496 + .uleb128 0x63 + .4byte .LASF1118 + .byte 0x9 + .2byte 0x1ac + .4byte 0x325 + .uleb128 0x63 + .4byte .LASF957 + .byte 0x9 + .2byte 0x1ac + .4byte 0x2e3 + .uleb128 0x62 + .string "dir" + .byte 0x9 + .2byte 0x1ad + .4byte 0xdaf2 + .uleb128 0x4f + .string "ops" + .byte 0x9 + .2byte 0x1af + .4byte 0xb6df + .byte 0 + .uleb128 0x61 + .4byte .LASF3186 + .byte 0x9 + .2byte 0x108 + .4byte 0xb6df + .byte 0x3 + .4byte 0x15a26 + .uleb128 0x62 + .string "dev" + .byte 0x9 + .2byte 0x108 + .4byte 0xa496 + .byte 0 + .uleb128 0x75 + .4byte .LASF3187 + .byte 0xc7 + .byte 0x1d + .4byte 0xb6df + .byte 0x3 + .4byte 0x15a42 + .uleb128 0x76 + .string "bus" + .byte 0xc7 + .byte 0x1d + .4byte 0xacfd + .byte 0 + .uleb128 0x75 + .4byte .LASF3188 + .byte 0x9 + .byte 0xd1 + .4byte 0xc6 + .byte 0x3 + .4byte 0x15a5e + .uleb128 0x74 + .4byte .LASF3189 + .byte 0x9 + .byte 0xd1 + .4byte 0xc6 + .byte 0 + .uleb128 0x73 + .4byte .LASF3190 + .byte 0xca + .byte 0xa3 + .byte 0x3 + .4byte 0x15a97 + .uleb128 0x76 + .string "dev" + .byte 0xca + .byte 0xa3 + .4byte 0xa496 + .uleb128 0x74 + .4byte .LASF3191 + .byte 0xca + .byte 0xa4 + .4byte 0x325 + .uleb128 0x74 + .4byte .LASF957 + .byte 0xca + .byte 0xa5 + .4byte 0x2e3 + .uleb128 0x74 + .4byte .LASF3192 + .byte 0xca + .byte 0xa5 + .4byte 0xc6 + .byte 0 + .uleb128 0x75 + .4byte .LASF3193 + .byte 0x3 + .byte 0x35 + .4byte 0xc6 + .byte 0x3 + .4byte 0x15ab3 + .uleb128 0x74 + .4byte .LASF2907 + .byte 0x3 + .byte 0x35 + .4byte 0xda8c + .byte 0 + .uleb128 0x75 + .4byte .LASF3194 + .byte 0x3 + .byte 0x30 + .4byte 0xc6 + .byte 0x3 + .4byte 0x15ad8 + .uleb128 0x74 + .4byte .LASF2907 + .byte 0x3 + .byte 0x30 + .4byte 0xda8c + .uleb128 0x76 + .string "t" + .byte 0x3 + .byte 0x30 + .4byte 0x45a4 + .byte 0 + .uleb128 0x73 + .4byte .LASF3195 + .byte 0x3 + .byte 0x2b + .byte 0x3 + .4byte 0x15af0 + .uleb128 0x74 + .4byte .LASF2907 + .byte 0x3 + .byte 0x2b + .4byte 0xda8c + .byte 0 + .uleb128 0x73 + .4byte .LASF3196 + .byte 0x3 + .byte 0x26 + .byte 0x3 + .4byte 0x15b08 + .uleb128 0x74 + .4byte .LASF2907 + .byte 0x3 + .byte 0x26 + .4byte 0xda8c + .byte 0 + .uleb128 0x73 + .4byte .LASF3197 + .byte 0x3 + .byte 0x21 + .byte 0x3 + .4byte 0x15b20 + .uleb128 0x74 + .4byte .LASF2907 + .byte 0x3 + .byte 0x21 + .4byte 0xda8c + .byte 0 + .uleb128 0x73 + .4byte .LASF3198 + .byte 0x3 + .byte 0x1c + .byte 0x3 + .4byte 0x15b38 + .uleb128 0x74 + .4byte .LASF2907 + .byte 0x3 + .byte 0x1c + .4byte 0xda8c + .byte 0 + .uleb128 0x73 + .4byte .LASF3199 + .byte 0xb + .byte 0x42 + .byte 0x3 + .4byte 0x15b50 + .uleb128 0x74 + .4byte .LASF116 + .byte 0xb + .byte 0x42 + .4byte 0x15b50 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd728 + .uleb128 0x73 + .4byte .LASF2807 + .byte 0xb + .byte 0x38 + .byte 0x3 + .4byte 0x15b6e + .uleb128 0x74 + .4byte .LASF116 + .byte 0xb + .byte 0x38 + .4byte 0x15b50 + .byte 0 + .uleb128 0x73 + .4byte .LASF3200 + .byte 0xb + .byte 0x24 + .byte 0x3 + .4byte 0x15ba6 + .uleb128 0x74 + .4byte .LASF116 + .byte 0xb + .byte 0x24 + .4byte 0x15b50 + .uleb128 0x74 + .4byte .LASF193 + .byte 0xb + .byte 0x24 + .4byte 0xc6 + .uleb128 0x74 + .4byte .LASF265 + .byte 0xb + .byte 0x25 + .4byte 0x56 + .uleb128 0x77 + .string "ws" + .byte 0xb + .byte 0x27 + .4byte 0xac33 + .byte 0 + .uleb128 0x75 + .4byte .LASF3201 + .byte 0x8 + .byte 0x98 + .4byte 0x29 + .byte 0x3 + .4byte 0x15bd5 + .uleb128 0x76 + .string "to" + .byte 0x8 + .byte 0x98 + .4byte 0x458 + .uleb128 0x74 + .4byte .LASF1973 + .byte 0x8 + .byte 0x98 + .4byte 0x30b6 + .uleb128 0x76 + .string "n" + .byte 0x8 + .byte 0x98 + .4byte 0x29 + .byte 0 + .uleb128 0x75 + .4byte .LASF3202 + .byte 0x8 + .byte 0x90 + .4byte 0x29 + .byte 0x3 + .4byte 0x15c04 + .uleb128 0x76 + .string "to" + .byte 0x8 + .byte 0x90 + .4byte 0x458 + .uleb128 0x74 + .4byte .LASF1973 + .byte 0x8 + .byte 0x90 + .4byte 0x30b6 + .uleb128 0x76 + .string "n" + .byte 0x8 + .byte 0x90 + .4byte 0x29 + .byte 0 + .uleb128 0x75 + .4byte .LASF3203 + .byte 0x8 + .byte 0x81 + .4byte 0x29 + .byte 0x3 + .4byte 0x15c33 + .uleb128 0x76 + .string "to" + .byte 0x8 + .byte 0x81 + .4byte 0x458 + .uleb128 0x74 + .4byte .LASF1973 + .byte 0x8 + .byte 0x81 + .4byte 0x30b6 + .uleb128 0x76 + .string "n" + .byte 0x8 + .byte 0x81 + .4byte 0x29 + .byte 0 + .uleb128 0x75 + .4byte .LASF3204 + .byte 0x8 + .byte 0x6e + .4byte 0x29 + .byte 0x3 + .4byte 0x15c6d + .uleb128 0x76 + .string "to" + .byte 0x8 + .byte 0x6e + .4byte 0x458 + .uleb128 0x74 + .4byte .LASF1973 + .byte 0x8 + .byte 0x6e + .4byte 0x30b6 + .uleb128 0x76 + .string "n" + .byte 0x8 + .byte 0x6e + .4byte 0x29 + .uleb128 0x77 + .string "res" + .byte 0x8 + .byte 0x70 + .4byte 0x29 + .byte 0 + .uleb128 0x75 + .4byte .LASF3205 + .byte 0x5 + .byte 0xf5 + .4byte 0x458 + .byte 0x3 + .4byte 0x15ca1 + .uleb128 0x76 + .string "ptr" + .byte 0x5 + .byte 0xf5 + .4byte 0x30b6 + .uleb128 0x78 + .4byte .LASF3206 + .byte 0x5 + .byte 0xf7 + .4byte 0x458 + .uleb128 0x65 + .uleb128 0x78 + .4byte .LASF3207 + .byte 0x5 + .byte 0xfe + .4byte 0x15a + .byte 0 + .byte 0 + .uleb128 0x75 + .4byte .LASF3208 + .byte 0x5 + .byte 0x4b + .4byte 0x29 + .byte 0x3 + .4byte 0x15ceb + .uleb128 0x74 + .4byte .LASF1118 + .byte 0x5 + .byte 0x4b + .4byte 0x30b6 + .uleb128 0x74 + .4byte .LASF957 + .byte 0x5 + .byte 0x4b + .4byte 0x29 + .uleb128 0x77 + .string "ret" + .byte 0x5 + .byte 0x4d + .4byte 0x29 + .uleb128 0x78 + .4byte .LASF3209 + .byte 0x5 + .byte 0x4d + .4byte 0x29 + .uleb128 0x65 + .uleb128 0x78 + .4byte .LASF3207 + .byte 0x5 + .byte 0x56 + .4byte 0x15a + .byte 0 + .byte 0 + .uleb128 0x61 + .4byte .LASF3210 + .byte 0x10 + .2byte 0x2e5 + .4byte 0x458 + .byte 0x3 + .4byte 0x15d15 + .uleb128 0x63 + .4byte .LASF957 + .byte 0x10 + .2byte 0x2e5 + .4byte 0x2e3 + .uleb128 0x63 + .4byte .LASF171 + .byte 0x10 + .2byte 0x2e5 + .4byte 0x330 + .byte 0 + .uleb128 0x61 + .4byte .LASF3211 + .byte 0x10 + .2byte 0x216 + .4byte 0x458 + .byte 0x3 + .4byte 0x15d4d + .uleb128 0x63 + .4byte .LASF957 + .byte 0x10 + .2byte 0x216 + .4byte 0x2e3 + .uleb128 0x63 + .4byte .LASF171 + .byte 0x10 + .2byte 0x216 + .4byte 0x330 + .uleb128 0x65 + .uleb128 0x43 + .4byte .LASF850 + .byte 0x10 + .2byte 0x21a + .4byte 0x6d + .byte 0 + .byte 0 + .uleb128 0x61 + .4byte .LASF3212 + .byte 0x10 + .2byte 0x1dd + .4byte 0x458 + .byte 0x3 + .4byte 0x15d83 + .uleb128 0x63 + .4byte .LASF957 + .byte 0x10 + .2byte 0x1dd + .4byte 0x2e3 + .uleb128 0x63 + .4byte .LASF171 + .byte 0x10 + .2byte 0x1dd + .4byte 0x330 + .uleb128 0x43 + .4byte .LASF3213 + .byte 0x10 + .2byte 0x1df + .4byte 0x6d + .byte 0 + .uleb128 0x61 + .4byte .LASF3214 + .byte 0x10 + .2byte 0x159 + .4byte 0x6d + .byte 0x3 + .4byte 0x15da1 + .uleb128 0x63 + .4byte .LASF957 + .byte 0x10 + .2byte 0x159 + .4byte 0x2e3 + .byte 0 + .uleb128 0x61 + .4byte .LASF3215 + .byte 0x10 + .2byte 0x13d + .4byte 0xd6c9 + .byte 0x3 + .4byte 0x15dbf + .uleb128 0x63 + .4byte .LASF171 + .byte 0x10 + .2byte 0x13d + .4byte 0x330 + .byte 0 + .uleb128 0x73 + .4byte .LASF3216 + .byte 0xbd + .byte 0xde + .byte 0x3 + .4byte 0x15de2 + .uleb128 0x74 + .4byte .LASF3026 + .byte 0xbd + .byte 0xde + .4byte 0xd640 + .uleb128 0x74 + .4byte .LASF793 + .byte 0xbd + .byte 0xdf + .4byte 0x458 + .byte 0 + .uleb128 0x75 + .4byte .LASF3217 + .byte 0xbd + .byte 0xd9 + .4byte 0x458 + .byte 0x3 + .4byte 0x15dfe + .uleb128 0x74 + .4byte .LASF3026 + .byte 0xbd + .byte 0xd9 + .4byte 0x15dfe + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xd598 + .uleb128 0x61 + .4byte .LASF3218 + .byte 0xa1 + .2byte 0x164 + .4byte 0x458 + .byte 0x3 + .4byte 0x15e22 + .uleb128 0x62 + .string "dev" + .byte 0xa1 + .2byte 0x164 + .4byte 0x15e22 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xbfe9 + .uleb128 0x61 + .4byte .LASF3219 + .byte 0xd + .2byte 0x498 + .4byte 0xc6 + .byte 0x3 + .4byte 0x15e5d + .uleb128 0x62 + .string "np" + .byte 0xd + .2byte 0x498 + .4byte 0xbbe0 + .uleb128 0x63 + .4byte .LASF3220 + .byte 0xd + .2byte 0x499 + .4byte 0x56 + .uleb128 0x63 + .4byte .LASF3221 + .byte 0xd + .2byte 0x49a + .4byte 0xac0 + .byte 0 + .uleb128 0x61 + .4byte .LASF3222 + .byte 0xd + .2byte 0x1ef + .4byte 0xc6 + .byte 0x3 + .4byte 0x15ea9 + .uleb128 0x62 + .string "np" + .byte 0xd + .2byte 0x1ef + .4byte 0xbbe0 + .uleb128 0x63 + .4byte .LASF3220 + .byte 0xd + .2byte 0x1f0 + .4byte 0x56 + .uleb128 0x63 + .4byte .LASF3223 + .byte 0xd + .2byte 0x1f1 + .4byte 0xac0 + .uleb128 0x62 + .string "sz" + .byte 0xd + .2byte 0x1f1 + .4byte 0x2e3 + .uleb128 0x4f + .string "ret" + .byte 0xd + .2byte 0x1f3 + .4byte 0xc6 + .byte 0 + .uleb128 0x73 + .4byte .LASF3224 + .byte 0xd + .byte 0x83 + .byte 0x3 + .4byte 0x15ec1 + .uleb128 0x74 + .4byte .LASF838 + .byte 0xd + .byte 0x83 + .4byte 0xb7ba + .byte 0 + .uleb128 0x64 + .4byte .LASF3225 + .byte 0x2 + .2byte 0x4a0 + .byte 0x3 + .4byte 0x15ee7 + .uleb128 0x62 + .string "dev" + .byte 0x2 + .2byte 0x4a0 + .4byte 0xa496 + .uleb128 0x63 + .4byte .LASF793 + .byte 0x2 + .2byte 0x4a0 + .4byte 0x458 + .byte 0 + .uleb128 0x61 + .4byte .LASF3226 + .byte 0x2 + .2byte 0x49b + .4byte 0x458 + .byte 0x3 + .4byte 0x15f05 + .uleb128 0x62 + .string "dev" + .byte 0x2 + .2byte 0x49b + .4byte 0xba50 + .byte 0 + .uleb128 0x61 + .4byte .LASF3227 + .byte 0x2 + .2byte 0x2c5 + .4byte 0x458 + .byte 0x3 + .4byte 0x15f3b + .uleb128 0x62 + .string "dev" + .byte 0x2 + .2byte 0x2c5 + .4byte 0xa496 + .uleb128 0x63 + .4byte .LASF957 + .byte 0x2 + .2byte 0x2c5 + .4byte 0x2e3 + .uleb128 0x62 + .string "gfp" + .byte 0x2 + .2byte 0x2c5 + .4byte 0x330 + .byte 0 + .uleb128 0x75 + .4byte .LASF3228 + .byte 0xe + .byte 0xca + .4byte 0x351 + .byte 0x3 + .4byte 0x15f57 + .uleb128 0x76 + .string "res" + .byte 0xe + .byte 0xca + .4byte 0xc0fa + .byte 0 + .uleb128 0x75 + .4byte .LASF3229 + .byte 0xcb + .byte 0x22 + .4byte 0x2b0 + .byte 0x3 + .4byte 0x15f73 + .uleb128 0x76 + .string "ptr" + .byte 0xcb + .byte 0x22 + .4byte 0x30b6 + .byte 0 + .uleb128 0x75 + .4byte .LASF3230 + .byte 0xcc + .byte 0x1d + .4byte 0xc6 + .byte 0x3 + .4byte 0x15f8f + .uleb128 0x74 + .4byte .LASF957 + .byte 0xcc + .byte 0x1d + .4byte 0x29 + .byte 0 + .uleb128 0x61 + .4byte .LASF3231 + .byte 0x11 + .2byte 0x169 + .4byte 0x29 + .byte 0x3 + .4byte 0x15fab + .uleb128 0x62 + .string "m" + .byte 0x11 + .2byte 0x169 + .4byte 0x74 + .byte 0 + .uleb128 0x61 + .4byte .LASF3232 + .byte 0x11 + .2byte 0x148 + .4byte 0x29 + .byte 0x3 + .4byte 0x15fc7 + .uleb128 0x62 + .string "m" + .byte 0x11 + .2byte 0x148 + .4byte 0x74 + .byte 0 + .uleb128 0x75 + .4byte .LASF3233 + .byte 0xc9 + .byte 0x97 + .4byte 0x2b0 + .byte 0x3 + .4byte 0x16003 + .uleb128 0x74 + .4byte .LASF1118 + .byte 0xc9 + .byte 0x97 + .4byte 0x30b6 + .uleb128 0x74 + .4byte .LASF3234 + .byte 0xc9 + .byte 0x97 + .4byte 0x2e3 + .uleb128 0x74 + .4byte .LASF3235 + .byte 0xc9 + .byte 0x97 + .4byte 0x2b0 + .uleb128 0x77 + .string "sz" + .byte 0xc9 + .byte 0x99 + .4byte 0xc6 + .byte 0 + .uleb128 0x73 + .4byte .LASF3236 + .byte 0xc9 + .byte 0x91 + .byte 0x3 + .4byte 0x16033 + .uleb128 0x74 + .4byte .LASF957 + .byte 0xc9 + .byte 0x91 + .4byte 0xc6 + .uleb128 0x74 + .4byte .LASF383 + .byte 0xc9 + .byte 0x91 + .4byte 0x29 + .uleb128 0x65 + .uleb128 0x78 + .4byte .LASF3237 + .byte 0xc9 + .byte 0x93 + .4byte 0xc6 + .byte 0 + .byte 0 + .uleb128 0x73 + .4byte .LASF3238 + .byte 0xc9 + .byte 0x80 + .byte 0x3 + .4byte 0x1605f + .uleb128 0x76 + .string "ptr" + .byte 0xc9 + .byte 0x80 + .4byte 0x30b6 + .uleb128 0x76 + .string "n" + .byte 0xc9 + .byte 0x80 + .4byte 0x29 + .uleb128 0x74 + .4byte .LASF3239 + .byte 0xc9 + .byte 0x81 + .4byte 0x2b0 + .byte 0 + .uleb128 0x75 + .4byte .LASF3240 + .byte 0xc9 + .byte 0x5f + .4byte 0xc6 + .byte 0x3 + .4byte 0x16085 + .uleb128 0x76 + .string "ti" + .byte 0xc9 + .byte 0x5f + .4byte 0x16085 + .uleb128 0x74 + .4byte .LASF3241 + .byte 0xc9 + .byte 0x5f + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xc33 + .uleb128 0x75 + .4byte .LASF3242 + .byte 0x4 + .byte 0xf + .4byte 0x2eff + .byte 0x3 + .4byte 0x160a7 + .uleb128 0x78 + .4byte .LASF3243 + .byte 0x4 + .byte 0x11 + .4byte 0x29 + .byte 0 + .uleb128 0x79 + .4byte .LASF3326 + .byte 0x1f + .2byte 0x126 + .byte 0x3 + .uleb128 0x75 + .4byte .LASF3244 + .byte 0xcd + .byte 0x22 + .4byte 0xc6 + .byte 0x3 + .4byte 0x160ca + .uleb128 0x76 + .string "n" + .byte 0xcd + .byte 0x22 + .4byte 0x15a + .byte 0 + .uleb128 0x75 + .4byte .LASF3245 + .byte 0x7 + .byte 0x9a + .4byte 0xe2 + .byte 0x3 + .4byte 0x160fc + .uleb128 0x74 + .4byte .LASF2424 + .byte 0x7 + .byte 0x9a + .4byte 0xf4 + .uleb128 0x74 + .4byte .LASF850 + .byte 0x7 + .byte 0x9a + .4byte 0xc6 + .uleb128 0x78 + .4byte .LASF261 + .byte 0x7 + .byte 0x9c + .4byte 0x8b + .byte 0 + .uleb128 0x75 + .4byte .LASF3246 + .byte 0xce + .byte 0x50 + .4byte 0xd2 + .byte 0x3 + .4byte 0x16116 + .uleb128 0x76 + .string "p" + .byte 0xce + .byte 0x50 + .4byte 0xbbe6 + .byte 0 + .uleb128 0x75 + .4byte .LASF3247 + .byte 0xcf + .byte 0xb8 + .4byte 0xd2 + .byte 0x3 + .4byte 0x16130 + .uleb128 0x76 + .string "p" + .byte 0xcf + .byte 0xb8 + .4byte 0x16130 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0xdd + .uleb128 0x75 + .4byte .LASF3248 + .byte 0xcf + .byte 0x39 + .4byte 0xd2 + .byte 0x3 + .4byte 0x16152 + .uleb128 0x76 + .string "val" + .byte 0xcf + .byte 0x39 + .4byte 0xd2 + .byte 0 + .uleb128 0x75 + .4byte .LASF3249 + .byte 0x6 + .byte 0x68 + .4byte 0xc6 + .byte 0x3 + .4byte 0x16178 + .uleb128 0x76 + .string "nr" + .byte 0x6 + .byte 0x68 + .4byte 0xc6 + .uleb128 0x74 + .4byte .LASF1118 + .byte 0x6 + .byte 0x68 + .4byte 0x16178 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x3a + .uleb128 0x73 + .4byte .LASF3250 + .byte 0xf + .byte 0x2f + .byte 0x3 + .4byte 0x161b1 + .uleb128 0x76 + .string "i" + .byte 0xf + .byte 0x2f + .4byte 0xc6 + .uleb128 0x76 + .string "v" + .byte 0xf + .byte 0x2f + .4byte 0x161b1 + .uleb128 0x77 + .string "w0" + .byte 0xf + .byte 0x2f + .4byte 0xc6 + .uleb128 0x77 + .string "x1" + .byte 0xf + .byte 0x2f + .4byte 0x161b1 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x37c + .uleb128 0x75 + .4byte .LASF3251 + .byte 0xd0 + .byte 0x1b + .4byte 0xc6 + .byte 0x3 + .4byte 0x161d1 + .uleb128 0x76 + .string "x" + .byte 0xd0 + .byte 0x1b + .4byte 0xf4 + .byte 0 + .uleb128 0x75 + .4byte .LASF3252 + .byte 0xd1 + .byte 0xb + .4byte 0x29 + .byte 0x3 + .4byte 0x161ed + .uleb128 0x74 + .4byte .LASF2457 + .byte 0xd1 + .byte 0xb + .4byte 0x29 + .byte 0 + .uleb128 0x73 + .4byte .LASF3253 + .byte 0xd2 + .byte 0xb + .byte 0x3 + .4byte 0x1620e + .uleb128 0x76 + .string "p" + .byte 0xd2 + .byte 0xb + .4byte 0x1620e + .uleb128 0x74 + .4byte .LASF957 + .byte 0xd2 + .byte 0xb + .4byte 0x6d + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x16215 + .uleb128 0x7a + .uleb128 0x3 + .4byte 0x16214 + .uleb128 0x73 + .4byte .LASF3254 + .byte 0xd2 + .byte 0x9 + .byte 0x3 + .4byte 0x1623b + .uleb128 0x76 + .string "p" + .byte 0xd2 + .byte 0x9 + .4byte 0x1620e + .uleb128 0x74 + .4byte .LASF957 + .byte 0xd2 + .byte 0x9 + .4byte 0x6d + .byte 0 + .uleb128 0x64 + .4byte .LASF3255 + .byte 0xc + .2byte 0x11c + .byte 0x3 + .4byte 0x1626b + .uleb128 0x62 + .string "p" + .byte 0xc + .2byte 0x11c + .4byte 0x1626b + .uleb128 0x62 + .string "res" + .byte 0xc + .2byte 0x11c + .4byte 0x458 + .uleb128 0x63 + .4byte .LASF957 + .byte 0xc + .2byte 0x11c + .4byte 0xc6 + .byte 0 + .uleb128 0x7 + .byte 0x8 + .4byte 0x16214 + .uleb128 0x7b + .4byte 0x105ba + .8byte .LFB2853 + .8byte .LFE2853-.LFB2853 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1629d + .uleb128 0x60 + .4byte 0x105cb + .4byte .LLST21 + .uleb128 0x7c + .4byte 0x105d7 + .uleb128 0x1 + .byte 0x51 + .byte 0 + .uleb128 0x7b + .4byte 0x14414 + .8byte .LFB2876 + .8byte .LFE2876-.LFB2876 + .uleb128 0x1 + .byte 0x9c + .4byte 0x163ca + .uleb128 0x60 + .4byte 0x14421 + .4byte .LLST223 + .uleb128 0x7c + .4byte 0x1442d + .uleb128 0x1 + .byte 0x51 + .uleb128 0x7c + .4byte 0x14439 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x7c + .4byte 0x14445 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x7c + .4byte 0x1445d + .uleb128 0x1 + .byte 0x54 + .uleb128 0x51 + .4byte 0x14451 + .uleb128 0x54 + .4byte 0x14469 + .uleb128 0x5e + .4byte 0x14475 + .uleb128 0x1 + .byte 0x65 + .uleb128 0x5d + .4byte 0x1447f + .4byte .LLST224 + .uleb128 0x5d + .4byte 0x14489 + .4byte .LLST225 + .uleb128 0x5d + .4byte 0x14495 + .4byte .LLST226 + .uleb128 0x5d + .4byte 0x144a1 + .4byte .LLST227 + .uleb128 0x5d + .4byte 0x144ad + .4byte .LLST228 + .uleb128 0x54 + .4byte 0x144b9 + .uleb128 0x54 + .4byte 0x144c5 + .uleb128 0x5d + .4byte 0x144d1 + .4byte .LLST229 + .uleb128 0x54 + .4byte 0x144dd + .uleb128 0x5d + .4byte 0x144e9 + .4byte .LLST230 + .uleb128 0x54 + .4byte 0x144f5 + .uleb128 0x54 + .4byte 0x14501 + .uleb128 0x5d + .4byte 0x1450d + .4byte .LLST231 + .uleb128 0x5d + .4byte 0x14519 + .4byte .LLST232 + .uleb128 0x5d + .4byte 0x14525 + .4byte .LLST233 + .uleb128 0x5d + .4byte 0x14531 + .4byte .LLST234 + .uleb128 0x5c + .4byte 0x1453e + .8byte .LBB1596 + .4byte .Ldebug_ranges0+0xf10 + .byte 0x1 + .2byte 0x413 + .uleb128 0x51 + .4byte 0x1458b + .uleb128 0x51 + .4byte 0x1457f + .uleb128 0x51 + .4byte 0x14573 + .uleb128 0x51 + .4byte 0x14567 + .uleb128 0x51 + .4byte 0x1455b + .uleb128 0x51 + .4byte 0x1454f + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xf10 + .uleb128 0x54 + .4byte 0x14597 + .uleb128 0x54 + .4byte 0x145a3 + .uleb128 0x54 + .4byte 0x145af + .uleb128 0x5d + .4byte 0x145bb + .4byte .LLST235 + .uleb128 0x5d + .4byte 0x145c7 + .4byte .LLST236 + .uleb128 0x54 + .4byte 0x145d3 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x7b + .4byte 0x14207 + .8byte .LFB2877 + .8byte .LFE2877-.LFB2877 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1643e + .uleb128 0x7c + .4byte 0x14224 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x7c + .4byte 0x14230 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x60 + .4byte 0x14248 + .4byte .LLST237 + .uleb128 0x51 + .4byte 0x1423c + .uleb128 0x51 + .4byte 0x1423c + .uleb128 0x51 + .4byte 0x14218 + .uleb128 0x54 + .4byte 0x14254 + .uleb128 0x54 + .4byte 0x14260 + .uleb128 0x54 + .4byte 0x1426c + .uleb128 0x54 + .4byte 0x14278 + .uleb128 0x5e + .4byte 0x14284 + .uleb128 0x1 + .byte 0x57 + .uleb128 0x5d + .4byte 0x14290 + .4byte .LLST238 + .uleb128 0x54 + .4byte 0x1429c + .uleb128 0x5d + .4byte 0x142a8 + .4byte .LLST239 + .byte 0 + .uleb128 0x7b + .4byte 0x1401b + .8byte .LFB2878 + .8byte .LFE2878-.LFB2878 + .uleb128 0x1 + .byte 0x9c + .4byte 0x164fd + .uleb128 0x60 + .4byte 0x14028 + .4byte .LLST251 + .uleb128 0x7c + .4byte 0x14034 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x7c + .4byte 0x14040 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x60 + .4byte 0x14058 + .4byte .LLST252 + .uleb128 0x51 + .4byte 0x1404c + .uleb128 0x51 + .4byte 0x1404c + .uleb128 0x51 + .4byte 0x1404c + .uleb128 0x54 + .4byte 0x14064 + .uleb128 0x5d + .4byte 0x14070 + .4byte .LLST253 + .uleb128 0x54 + .4byte 0x1407a + .uleb128 0x5d + .4byte 0x14084 + .4byte .LLST254 + .uleb128 0x54 + .4byte 0x14090 + .uleb128 0x5d + .4byte 0x1409c + .4byte .LLST255 + .uleb128 0x5d + .4byte 0x140a8 + .4byte .LLST256 + .uleb128 0x5d + .4byte 0x140b4 + .4byte .LLST257 + .uleb128 0x5e + .4byte 0x140c0 + .uleb128 0x1 + .byte 0x55 + .uleb128 0x5d + .4byte 0x140cc + .4byte .LLST258 + .uleb128 0x5a + .4byte 0x158b4 + .8byte .LBB1604 + .8byte .LBE1604-.LBB1604 + .byte 0x1 + .2byte 0x59a + .uleb128 0x51 + .4byte 0x158dd + .uleb128 0x51 + .4byte 0x158d1 + .uleb128 0x51 + .4byte 0x158c5 + .byte 0 + .byte 0 + .uleb128 0x7b + .4byte 0x13e93 + .8byte .LFB2879 + .8byte .LFE2879-.LFB2879 + .uleb128 0x1 + .byte 0x9c + .4byte 0x165e7 + .uleb128 0x7c + .4byte 0x13ea0 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x7c + .4byte 0x13eac + .uleb128 0x1 + .byte 0x51 + .uleb128 0x7c + .4byte 0x13eb8 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x60 + .4byte 0x13ed0 + .4byte .LLST259 + .uleb128 0x51 + .4byte 0x13ec4 + .uleb128 0x51 + .4byte 0x13ec4 + .uleb128 0x51 + .4byte 0x13ec4 + .uleb128 0x54 + .4byte 0x13edc + .uleb128 0x5d + .4byte 0x13ee8 + .4byte .LLST260 + .uleb128 0x54 + .4byte 0x13ef2 + .uleb128 0x5d + .4byte 0x13efc + .4byte .LLST261 + .uleb128 0x54 + .4byte 0x13f08 + .uleb128 0x54 + .4byte 0x13f14 + .uleb128 0x54 + .4byte 0x13f20 + .uleb128 0x5d + .4byte 0x13f2c + .4byte .LLST262 + .uleb128 0x5e + .4byte 0x13f38 + .uleb128 0x1 + .byte 0x55 + .uleb128 0x5d + .4byte 0x13f44 + .4byte .LLST263 + .uleb128 0x5d + .4byte 0x13f50 + .4byte .LLST264 + .uleb128 0x50 + .4byte 0x1587e + .8byte .LBB1606 + .8byte .LBE1606-.LBB1606 + .byte 0x1 + .2byte 0x5ec + .4byte 0x165be + .uleb128 0x51 + .4byte 0x158a7 + .uleb128 0x51 + .4byte 0x1589b + .uleb128 0x51 + .4byte 0x1588f + .byte 0 + .uleb128 0x5a + .4byte 0x15848 + .8byte .LBB1608 + .8byte .LBE1608-.LBB1608 + .byte 0x1 + .2byte 0x5f1 + .uleb128 0x51 + .4byte 0x15871 + .uleb128 0x51 + .4byte 0x15865 + .uleb128 0x51 + .4byte 0x15859 + .byte 0 + .byte 0 + .uleb128 0x7d + .4byte 0x13d91 + .8byte .LFB2880 + .8byte .LFE2880-.LFB2880 + .uleb128 0x1 + .byte 0x9c + .4byte 0x166e9 + .uleb128 0x60 + .4byte 0x13d9e + .4byte .LLST265 + .uleb128 0x51 + .4byte 0x13daa + .uleb128 0x54 + .4byte 0x13db6 + .uleb128 0x58 + .4byte 0x159be + .8byte .LBB1610 + .4byte .Ldebug_ranges0+0xf60 + .byte 0x1 + .2byte 0x629 + .4byte 0x16667 + .uleb128 0x51 + .4byte 0x159ef + .uleb128 0x51 + .4byte 0x159e3 + .uleb128 0x51 + .4byte 0x159d7 + .uleb128 0x51 + .4byte 0x159cb + .uleb128 0x5b + .4byte .Ldebug_ranges0+0xf60 + .uleb128 0x54 + .4byte 0x159fb + .uleb128 0x5c + .4byte 0x15a08 + .8byte .LBB1612 + .4byte .Ldebug_ranges0+0xfb0 + .byte 0x9 + .2byte 0x1af + .uleb128 0x51 + .4byte 0x15a19 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x1593b + .8byte .LBB1621 + .4byte .Ldebug_ranges0+0xfe0 + .byte 0x1 + .2byte 0x62a + .4byte 0x16699 + .uleb128 0x51 + .4byte 0x15973 + .uleb128 0x51 + .4byte 0x15968 + .uleb128 0x51 + .4byte 0x1595d + .uleb128 0x51 + .4byte 0x15952 + .uleb128 0x51 + .4byte 0x15947 + .byte 0 + .uleb128 0x50 + .4byte 0x1590d + .8byte .LBB1627 + .8byte .LBE1627-.LBB1627 + .byte 0x1 + .2byte 0x62b + .4byte 0x166c5 + .uleb128 0x51 + .4byte 0x1592f + .uleb128 0x51 + .4byte 0x15924 + .uleb128 0x51 + .4byte 0x15919 + .byte 0 + .uleb128 0x5a + .4byte 0x158ea + .8byte .LBB1629 + .8byte .LBE1629-.LBB1629 + .byte 0x1 + .2byte 0x62c + .uleb128 0x51 + .4byte 0x15901 + .uleb128 0x51 + .4byte 0x158f6 + .byte 0 + .byte 0 + .uleb128 0x7d + .4byte 0x15728 + .8byte .LFB2883 + .8byte .LFE2883-.LFB2883 + .uleb128 0x1 + .byte 0x9c + .4byte 0x167a9 + .uleb128 0x60 + .4byte 0x15739 + .4byte .LLST266 + .uleb128 0x60 + .4byte 0x15745 + .4byte .LLST267 + .uleb128 0x54 + .4byte 0x15751 + .uleb128 0x50 + .4byte 0x1597f + .8byte .LBB1632 + .8byte .LBE1632-.LBB1632 + .byte 0x1 + .2byte 0x198 + .4byte 0x1673d + .uleb128 0x51 + .4byte 0x1598b + .byte 0 + .uleb128 0x50 + .4byte 0x15b08 + .8byte .LBB1634 + .8byte .LBE1634-.LBB1634 + .byte 0x1 + .2byte 0x199 + .4byte 0x1675f + .uleb128 0x51 + .4byte 0x15b14 + .byte 0 + .uleb128 0x50 + .4byte 0x15b38 + .8byte .LBB1636 + .8byte .LBE1636-.LBB1636 + .byte 0x1 + .2byte 0x19c + .4byte 0x1678e + .uleb128 0x51 + .4byte 0x15b44 + .uleb128 0x4b + .8byte .LVL880 + .4byte 0x16f2d + .byte 0 + .uleb128 0x4b + .8byte .LVL877 + .4byte 0x16c5b + .uleb128 0x4b + .8byte .LVL881 + .4byte 0x16c5b + .byte 0 + .uleb128 0x7b + .4byte 0x13dc9 + .8byte .LFB2884 + .8byte .LFE2884-.LFB2884 + .uleb128 0x1 + .byte 0x9c + .4byte 0x16910 + .uleb128 0x60 + .4byte 0x13dd6 + .4byte .LLST269 + .uleb128 0x60 + .4byte 0x13de2 + .4byte .LLST270 + .uleb128 0x60 + .4byte 0x13dee + .4byte .LLST271 + .uleb128 0x60 + .4byte 0x13e06 + .4byte .LLST272 + .uleb128 0x51 + .4byte 0x13dfa + .uleb128 0x51 + .4byte 0x13dfa + .uleb128 0x51 + .4byte 0x13dfa + .uleb128 0x54 + .4byte 0x13e12 + .uleb128 0x54 + .4byte 0x13e1e + .uleb128 0x54 + .4byte 0x13e2a + .uleb128 0x5d + .4byte 0x13e36 + .4byte .LLST273 + .uleb128 0x54 + .4byte 0x13e42 + .uleb128 0x5d + .4byte 0x13e4e + .4byte .LLST274 + .uleb128 0x54 + .4byte 0x13e58 + .uleb128 0x5d + .4byte 0x13e62 + .4byte .LLST275 + .uleb128 0x5d + .4byte 0x13e6e + .4byte .LLST276 + .uleb128 0x54 + .4byte 0x13e7a + .uleb128 0x5d + .4byte 0x13e86 + .4byte .LLST277 + .uleb128 0x58 + .4byte 0x157ac + .8byte .LBB1644 + .4byte .Ldebug_ranges0+0x1020 + .byte 0x1 + .2byte 0x618 + .4byte 0x168a2 + .uleb128 0x51 + .4byte 0x157d5 + .uleb128 0x51 + .4byte 0x157c9 + .uleb128 0x51 + .4byte 0x157bd + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1020 + .uleb128 0x54 + .4byte 0x157e1 + .uleb128 0x5d + .4byte 0x157ed + .4byte .LLST278 + .uleb128 0x5c + .4byte 0x1587e + .8byte .LBB1646 + .4byte .Ldebug_ranges0+0x1070 + .byte 0x1 + .2byte 0x163 + .uleb128 0x51 + .4byte 0x158a7 + .uleb128 0x51 + .4byte 0x1589b + .uleb128 0x51 + .4byte 0x1588f + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x58 + .4byte 0x1575e + .8byte .LBB1681 + .4byte .Ldebug_ranges0+0x1180 + .byte 0x1 + .2byte 0x61f + .4byte 0x16902 + .uleb128 0x51 + .4byte 0x15787 + .uleb128 0x51 + .4byte 0x1577b + .uleb128 0x51 + .4byte 0x1576f + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1180 + .uleb128 0x54 + .4byte 0x15793 + .uleb128 0x5d + .4byte 0x1579f + .4byte .LLST279 + .uleb128 0x5c + .4byte 0x15848 + .8byte .LBB1683 + .4byte .Ldebug_ranges0+0x11e0 + .byte 0x1 + .2byte 0x181 + .uleb128 0x51 + .4byte 0x15871 + .uleb128 0x51 + .4byte 0x15865 + .uleb128 0x51 + .4byte 0x15859 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL894 + .4byte 0x16cb7 + .byte 0 + .uleb128 0x7b + .4byte 0x13f5d + .8byte .LFB2885 + .8byte .LFE2885-.LFB2885 + .uleb128 0x1 + .byte 0x9c + .4byte 0x16a27 + .uleb128 0x60 + .4byte 0x13f6a + .4byte .LLST280 + .uleb128 0x60 + .4byte 0x13f76 + .4byte .LLST281 + .uleb128 0x60 + .4byte 0x13f82 + .4byte .LLST282 + .uleb128 0x60 + .4byte 0x13f9a + .4byte .LLST283 + .uleb128 0x51 + .4byte 0x13f8e + .uleb128 0x51 + .4byte 0x13f8e + .uleb128 0x51 + .4byte 0x13f8e + .uleb128 0x54 + .4byte 0x13fa6 + .uleb128 0x5d + .4byte 0x13fb2 + .4byte .LLST284 + .uleb128 0x5d + .4byte 0x13fbe + .4byte .LLST285 + .uleb128 0x5d + .4byte 0x13fca + .4byte .LLST286 + .uleb128 0x54 + .4byte 0x13fd6 + .uleb128 0x5d + .4byte 0x13fe2 + .4byte .LLST287 + .uleb128 0x54 + .4byte 0x13fec + .uleb128 0x5d + .4byte 0x13ff6 + .4byte .LLST288 + .uleb128 0x5d + .4byte 0x14002 + .4byte .LLST289 + .uleb128 0x5d + .4byte 0x1400e + .4byte .LLST290 + .uleb128 0x58 + .4byte 0x157fa + .8byte .LBB1730 + .4byte .Ldebug_ranges0+0x1310 + .byte 0x1 + .2byte 0x5c6 + .4byte 0x16a0c + .uleb128 0x51 + .4byte 0x15823 + .uleb128 0x51 + .4byte 0x15817 + .uleb128 0x51 + .4byte 0x1580b + .uleb128 0x5b + .4byte .Ldebug_ranges0+0x1310 + .uleb128 0x54 + .4byte 0x1582f + .uleb128 0x5d + .4byte 0x1583b + .4byte .LLST291 + .uleb128 0x5c + .4byte 0x158b4 + .8byte .LBB1732 + .4byte .Ldebug_ranges0+0x1360 + .byte 0x1 + .2byte 0x145 + .uleb128 0x51 + .4byte 0x158dd + .uleb128 0x51 + .4byte 0x158d1 + .uleb128 0x51 + .4byte 0x158c5 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL924 + .4byte 0x16cb7 + .uleb128 0x4b + .8byte .LVL936 + .4byte 0x16cb7 + .byte 0 + .uleb128 0x7b + .4byte 0x134d4 + .8byte .LFB2887 + .8byte .LFE2887-.LFB2887 + .uleb128 0x1 + .byte 0x9c + .4byte 0x16a80 + .uleb128 0x51 + .4byte 0x134f1 + .uleb128 0x51 + .4byte 0x134e5 + .uleb128 0x54 + .4byte 0x134fd + .uleb128 0x54 + .4byte 0x13507 + .uleb128 0x54 + .4byte 0x13513 + .uleb128 0x5d + .4byte 0x1351f + .4byte .LLST294 + .uleb128 0x54 + .4byte 0x1352b + .uleb128 0x5d + .4byte 0x13537 + .4byte .LLST295 + .uleb128 0x4b + .8byte .LVL990 + .4byte 0x16f38 + .byte 0 + .uleb128 0x7b + .4byte 0x133a4 + .8byte .LFB2888 + .8byte .LFE2888-.LFB2888 + .uleb128 0x1 + .byte 0x9c + .4byte 0x16af4 + .uleb128 0x51 + .4byte 0x133cd + .uleb128 0x51 + .4byte 0x133cd + .uleb128 0x51 + .4byte 0x133c1 + .uleb128 0x51 + .4byte 0x133b5 + .uleb128 0x54 + .4byte 0x133d9 + .uleb128 0x54 + .4byte 0x133e3 + .uleb128 0x54 + .4byte 0x133ef + .uleb128 0x5e + .4byte 0x133fb + .uleb128 0x1 + .byte 0x59 + .uleb128 0x54 + .4byte 0x13407 + .uleb128 0x54 + .4byte 0x13413 + .uleb128 0x54 + .4byte 0x1341f + .uleb128 0x5d + .4byte 0x1342b + .4byte .LLST296 + .uleb128 0x5d + .4byte 0x13437 + .4byte .LLST297 + .uleb128 0x4b + .8byte .LVL995 + .4byte 0x16f38 + .byte 0 + .uleb128 0x7b + .4byte 0x1014a + .8byte .LFB2862 + .8byte .LFE2862-.LFB2862 + .uleb128 0x1 + .byte 0x9c + .4byte 0x16b91 + .uleb128 0x60 + .4byte 0x1015b + .4byte .LLST329 + .uleb128 0x60 + .4byte 0x10167 + .4byte .LLST330 + .uleb128 0x60 + .4byte 0x10173 + .4byte .LLST331 + .uleb128 0x54 + .4byte 0x1017f + .uleb128 0x54 + .4byte 0x1018b + .uleb128 0x5d + .4byte 0x10197 + .4byte .LLST332 + .uleb128 0x5f + .8byte .LBB2117 + .8byte .LBE2117-.LBB2117 + .4byte 0x16b83 + .uleb128 0x51 + .4byte 0x1015b + .uleb128 0x51 + .4byte 0x10167 + .uleb128 0x51 + .4byte 0x10173 + .uleb128 0x53 + .8byte .LBB2118 + .8byte .LBE2118-.LBB2118 + .uleb128 0x54 + .4byte 0x16b2a + .uleb128 0x54 + .4byte 0x16b2f + .uleb128 0x54 + .4byte 0x16b34 + .byte 0 + .byte 0 + .uleb128 0x4b + .8byte .LVL1203 + .4byte 0x16df1 + .byte 0 + .uleb128 0x7d + .4byte 0x15728 + .8byte .LFB2893 + .8byte .LFE2893-.LFB2893 + .uleb128 0x1 + .byte 0x9c + .4byte 0x16c45 + .uleb128 0x60 + .4byte 0x15739 + .4byte .LLST333 + .uleb128 0x54 + .4byte 0x15751 + .uleb128 0x51 + .4byte 0x15745 + .uleb128 0x50 + .4byte 0x15b20 + .8byte .LBB2119 + .8byte .LBE2119-.LBB2119 + .byte 0x1 + .2byte 0x191 + .4byte 0x16be1 + .uleb128 0x51 + .4byte 0x15b2c + .byte 0 + .uleb128 0x50 + .4byte 0x15997 + .8byte .LBB2121 + .8byte .LBE2121-.LBB2121 + .byte 0x1 + .2byte 0x192 + .4byte 0x16c08 + .uleb128 0x51 + .4byte 0x159b2 + .uleb128 0x51 + .4byte 0x159a7 + .byte 0 + .uleb128 0x50 + .4byte 0x15b56 + .8byte .LBB2123 + .8byte .LBE2123-.LBB2123 + .byte 0x1 + .2byte 0x18e + .4byte 0x16c37 + .uleb128 0x51 + .4byte 0x15b62 + .uleb128 0x4b + .8byte .LVL1211 + .4byte 0x16f43 + .byte 0 + .uleb128 0x4b + .8byte .LVL1208 + .4byte 0x16c5b + .byte 0 + .uleb128 0x7e + .4byte .LASF3256 + .4byte .LASF3256 + .byte 0xbd + .byte 0xcf + .uleb128 0x7e + .4byte .LASF3257 + .4byte .LASF3257 + .byte 0xbd + .byte 0xcd + .uleb128 0x7f + .4byte .LASF3258 + .4byte .LASF3258 + .byte 0x2 + .2byte 0x5d1 + .uleb128 0x7e + .4byte .LASF3259 + .4byte .LASF3259 + .byte 0xab + .byte 0x4f + .uleb128 0x7f + .4byte .LASF3260 + .4byte .LASF3260 + .byte 0x2 + .2byte 0x2bf + .uleb128 0x7f + .4byte .LASF3261 + .4byte .LASF3261 + .byte 0xd + .2byte 0x149 + .uleb128 0x7f + .4byte .LASF3262 + .4byte .LASF3262 + .byte 0xd + .2byte 0x172 + .uleb128 0x7e + .4byte .LASF3263 + .4byte .LASF3263 + .byte 0xd3 + .byte 0x78 + .uleb128 0x7e + .4byte .LASF3264 + .4byte .LASF3264 + .byte 0xa9 + .byte 0x59 + .uleb128 0x7e + .4byte .LASF3265 + .4byte .LASF3265 + .byte 0xc2 + .byte 0x34 + .uleb128 0x80 + .4byte .LASF3276 + .4byte .LASF3276 + .uleb128 0x7f + .4byte .LASF3266 + .4byte .LASF3266 + .byte 0x2 + .2byte 0x5cb + .uleb128 0x7e + .4byte .LASF3267 + .4byte .LASF3267 + .byte 0xc1 + .byte 0x29 + .uleb128 0x7e + .4byte .LASF3268 + .4byte .LASF3268 + .byte 0xc1 + .byte 0x2a + .uleb128 0x7e + .4byte .LASF3269 + .4byte .LASF3269 + .byte 0xaa + .byte 0x9 + .uleb128 0x7f + .4byte .LASF3270 + .4byte .LASF3270 + .byte 0x47 + .2byte 0x6b7 + .uleb128 0x7f + .4byte .LASF3271 + .4byte .LASF3271 + .byte 0x47 + .2byte 0x675 + .uleb128 0x7e + .4byte .LASF3272 + .4byte .LASF3272 + .byte 0x9a + .byte 0x67 + .uleb128 0x7e + .4byte .LASF3273 + .4byte .LASF3273 + .byte 0x52 + .byte 0x53 + .uleb128 0x7e + .4byte .LASF3274 + .4byte .LASF3274 + .byte 0x52 + .byte 0xa5 + .uleb128 0x7e + .4byte .LASF3275 + .4byte .LASF3275 + .byte 0xc2 + .byte 0x2f + .uleb128 0x7e + .4byte .LASF3276 + .4byte .LASF3276 + .byte 0xd4 + .byte 0x36 + .uleb128 0x7e + .4byte .LASF3277 + .4byte .LASF3277 + .byte 0xc2 + .byte 0x28 + .uleb128 0x7f + .4byte .LASF3278 + .4byte .LASF3278 + .byte 0x10 + .2byte 0x184 + .uleb128 0x7e + .4byte .LASF3279 + .4byte .LASF3279 + .byte 0xd5 + .byte 0x51 + .uleb128 0x7f + .4byte .LASF3280 + .4byte .LASF3280 + .byte 0x1f + .2byte 0x1d9 + .uleb128 0x7e + .4byte .LASF3281 + .4byte .LASF3281 + .byte 0x3 + .byte 0x3b + .uleb128 0x7e + .4byte .LASF3282 + .4byte .LASF3282 + .byte 0x10 + .byte 0xb9 + .uleb128 0x7e + .4byte .LASF3283 + .4byte .LASF3283 + .byte 0x39 + .byte 0xc2 + .uleb128 0x80 + .4byte .LASF3284 + .4byte .LASF3284 + .uleb128 0x7e + .4byte .LASF3285 + .4byte .LASF3285 + .byte 0xab + .byte 0x4e + .uleb128 0x7f + .4byte .LASF3286 + .4byte .LASF3286 + .byte 0x2 + .2byte 0x287 + .uleb128 0x7e + .4byte .LASF3287 + .4byte .LASF3287 + .byte 0xbe + .byte 0x38 + .uleb128 0x7f + .4byte .LASF3288 + .4byte .LASF3288 + .byte 0xd + .2byte 0x165 + .uleb128 0x7f + .4byte .LASF3289 + .4byte .LASF3289 + .byte 0xa1 + .2byte 0x37b + .uleb128 0x7f + .4byte .LASF3290 + .4byte .LASF3290 + .byte 0xd + .2byte 0x125 + .uleb128 0x80 + .4byte .LASF3291 + .4byte .LASF3291 + .uleb128 0x7e + .4byte .LASF3292 + .4byte .LASF3292 + .byte 0xc2 + .byte 0x32 + .uleb128 0x7f + .4byte .LASF3293 + .4byte .LASF3293 + .byte 0x1f + .2byte 0x1c7 + .uleb128 0x7f + .4byte .LASF3294 + .4byte .LASF3294 + .byte 0x1f + .2byte 0x17e + .uleb128 0x7e + .4byte .LASF3295 + .4byte .LASF3295 + .byte 0x3 + .byte 0x3a + .uleb128 0x7e + .4byte .LASF3296 + .4byte .LASF3296 + .byte 0xc1 + .byte 0x2b + .uleb128 0x7f + .4byte .LASF3297 + .4byte .LASF3297 + .byte 0x74 + .2byte 0xa10 + .uleb128 0x7e + .4byte .LASF3298 + .4byte .LASF3298 + .byte 0xc2 + .byte 0x30 + .uleb128 0x7f + .4byte .LASF3299 + .4byte .LASF3299 + .byte 0x5 + .2byte 0x19f + .uleb128 0x7f + .4byte .LASF3300 + .4byte .LASF3300 + .byte 0x5 + .2byte 0x199 + .uleb128 0x7e + .4byte .LASF3301 + .4byte .LASF3301 + .byte 0xc2 + .byte 0x26 + .uleb128 0x7e + .4byte .LASF3302 + .4byte .LASF3302 + .byte 0xc2 + .byte 0x29 + .uleb128 0x7e + .4byte .LASF3303 + .4byte .LASF3303 + .byte 0xc2 + .byte 0x25 + .uleb128 0x7e + .4byte .LASF3304 + .4byte .LASF3304 + .byte 0xc2 + .byte 0x2e + .uleb128 0x7e + .4byte .LASF3305 + .4byte .LASF3305 + .byte 0xc2 + .byte 0x27 + .uleb128 0x7e + .4byte .LASF3306 + .4byte .LASF3306 + .byte 0xc2 + .byte 0x24 + .uleb128 0x7e + .4byte .LASF3307 + .4byte .LASF3307 + .byte 0x47 + .byte 0xdc + .uleb128 0x7f + .4byte .LASF3308 + .4byte .LASF3308 + .byte 0x39 + .2byte 0x473 + .uleb128 0x7f + .4byte .LASF3309 + .4byte .LASF3309 + .byte 0x39 + .2byte 0x103 + .uleb128 0x7f + .4byte .LASF3310 + .4byte .LASF3310 + .byte 0x39 + .2byte 0x474 + .uleb128 0x7e + .4byte .LASF3311 + .4byte .LASF3311 + .byte 0xc2 + .byte 0x2a + .uleb128 0x7e + .4byte .LASF3312 + .4byte .LASF3312 + .byte 0x47 + .byte 0xd7 + .uleb128 0x7f + .4byte .LASF3313 + .4byte .LASF3313 + .byte 0x11 + .2byte 0x12b + .uleb128 0x7e + .4byte .LASF3314 + .4byte .LASF3314 + .byte 0xc2 + .byte 0x2d + .uleb128 0x7e + .4byte .LASF3315 + .4byte .LASF3315 + .byte 0xc2 + .byte 0x2c + .uleb128 0x7e + .4byte .LASF3316 + .4byte .LASF3316 + .byte 0xc3 + .byte 0x7b + .uleb128 0x7e + .4byte .LASF3317 + .4byte .LASF3317 + .byte 0xc2 + .byte 0x2b + .uleb128 0x7e + .4byte .LASF3318 + .4byte .LASF3318 + .byte 0xc1 + .byte 0x2c + .uleb128 0x81 + .string "up" + .string "up" + .byte 0x76 + .byte 0x2c + .uleb128 0x7e + .4byte .LASF3319 + .4byte .LASF3319 + .byte 0x76 + .byte 0x27 + .uleb128 0x7e + .4byte .LASF3320 + .4byte .LASF3320 + .byte 0x9a + .byte 0x73 + .uleb128 0x7e + .4byte .LASF3321 + .4byte .LASF3321 + .byte 0x1d + .byte 0xb0 + .uleb128 0x7e + .4byte .LASF3322 + .4byte .LASF3322 + .byte 0x9a + .byte 0x71 + .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 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x3 + .uleb128 0x26 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4 + .uleb128 0x35 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5 + .uleb128 0x1 + .byte 0x1 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x6 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x7 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x8 + .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 0x9 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0 + .byte 0 + .uleb128 0xa + .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 0xb + .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 0xc + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xb + .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 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x10 + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x11 + .uleb128 0x5 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x12 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x13 + .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 0x14 + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x15 + .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 0x16 + .uleb128 0x15 + .byte 0 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x17 + .uleb128 0x15 + .byte 0 + .uleb128 0x27 + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x18 + .uleb128 0x21 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x19 + .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 0x1a + .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 0x1b + .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 0x1c + .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 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 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 0x1f + .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 0x20 + .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 0x21 + .uleb128 0x17 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .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 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x23 + .uleb128 0xd + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x24 + .uleb128 0x13 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x25 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .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 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 0x28 + .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 0x29 + .uleb128 0xd + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2a + .uleb128 0x13 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x2b + .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 0x2c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x2d + .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 0x2e + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2f + .uleb128 0xd + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x30 + .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 0x31 + .uleb128 0x17 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x32 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x33 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0xb + .uleb128 0xb + .uleb128 0xd + .uleb128 0xb + .uleb128 0xc + .uleb128 0xb + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x34 + .uleb128 0x26 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x35 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0xb + .uleb128 0xb + .uleb128 0xd + .uleb128 0xb + .uleb128 0xc + .uleb128 0xb + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x36 + .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 0x37 + .uleb128 0x13 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x38 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0xb + .uleb128 0xb + .uleb128 0xd + .uleb128 0xb + .uleb128 0xc + .uleb128 0xb + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x39 + .uleb128 0x17 + .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 0x3a + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3b + .uleb128 0x17 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x3c + .uleb128 0x17 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3d + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0xb + .uleb128 0xb + .uleb128 0xd + .uleb128 0xb + .uleb128 0xc + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x3e + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3f + .uleb128 0x17 + .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 0x40 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x41 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x42 + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x43 + .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 0x44 + .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 0x45 + .uleb128 0x13 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x46 + .uleb128 0x4 + .byte 0x1 + .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 0x47 + .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 0x48 + .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 0x49 + .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 0x4a + .uleb128 0x2e + .byte 0x1 + .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 0x4b + .uleb128 0x4109 + .byte 0 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4c + .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 0x4d + .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 0x2116 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4e + .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 0x4f + .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 0x50 + .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 0x51 + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x52 + .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 0x53 + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .byte 0 + .byte 0 + .uleb128 0x54 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x55 + .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 0x56 + .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 0x57 + .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 0x58 + .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 0x59 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x5a + .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 0x5b + .uleb128 0xb + .byte 0x1 + .uleb128 0x55 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x5c + .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 0x5d + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x5e + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x5f + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x60 + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x61 + .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 0x62 + .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 0x63 + .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 0x64 + .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 0x65 + .uleb128 0xb + .byte 0x1 + .byte 0 + .byte 0 + .uleb128 0x66 + .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 0x67 + .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 0x68 + .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 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x69 + .uleb128 0xb + .byte 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x6a + .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 0x6b + .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 0x6c + .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 0x6d + .uleb128 0xa + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x6e + .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 0x6f + .uleb128 0xb + .byte 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x70 + .uleb128 0xa + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x71 + .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 0x72 + .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 0x73 + .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 0x74 + .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 0x75 + .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 0x76 + .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 0x77 + .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 0x78 + .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 0x79 + .uleb128 0x2e + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x7a + .uleb128 0x35 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x7b + .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 0x7c + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x7d + .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 0x7e + .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 0x7f + .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 0x80 + .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 0x81 + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0x8 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LLST22: + .8byte .LVL75 + .8byte .LVL76 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST268: + .8byte .LVL883 + .8byte .LVL884 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST24: + .8byte .LVL82 + .8byte .LVL83 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST298: + .8byte .LVL996 + .8byte .LVL997 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST299: + .8byte .LVL1000 + .8byte .LVL1001 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1012 + .8byte .LVL1013 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1151 + .8byte .LVL1152 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST300: + .8byte .LVL1008 + .8byte .LVL1009 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1058 + .8byte .LVL1059 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST301: + .8byte .LVL1012 + .8byte .LVL1014 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1021 + .8byte .LVL1058 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1063 + .8byte .LVL1151 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1161 + .8byte .LVL1178 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1180 + .8byte .LFE2870 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST302: + .8byte .LVL1003 + .8byte .LVL1015 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1019 + .8byte .LVL1022 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1058 + .8byte .LVL1063 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1159 + .8byte .LVL1161 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST303: + .8byte .LVL1003 + .8byte .LVL1004 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1004 + .8byte .LVL1005 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1006 + .8byte .LVL1010 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1010 + .8byte .LVL1061 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1061 + .8byte .LVL1151 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1159 + .8byte .LVL1178 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte .LVL1180 + .8byte .LFE2870 + .2byte 0x2 + .byte 0x91 + .sleb128 -32 + .8byte 0 + .8byte 0 +.LLST304: + .8byte .LVL1007 + .8byte .LVL1014 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1019 + .8byte .LVL1021 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1058 + .8byte .LVL1063 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST305: + .8byte .LVL1012 + .8byte .LVL1017 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1045 + .8byte .LVL1052 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1125 + .8byte .LVL1128 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1165 + .8byte .LVL1167 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1172 + .8byte .LVL1173 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1176 + .8byte .LVL1178 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1180 + .8byte .LVL1181 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1182 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST306: + .8byte .LVL1012 + .8byte .LVL1017 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1052 + .8byte .LVL1056 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1063 + .8byte .LVL1064 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1181 + .8byte .LVL1182 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST307: + .8byte .LVL1064 + .8byte .LVL1065-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST308: + .8byte .LVL1069 + .8byte .LVL1072 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST309: + .8byte .LVL1070 + .8byte .LVL1071 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST310: + .8byte .LVL1075 + .8byte .LVL1078 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST311: + .8byte .LVL1076 + .8byte .LVL1077 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST312: + .8byte .LVL1012 + .8byte .LVL1017 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1081 + .8byte .LVL1088 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1168 + .8byte .LVL1170 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1173 + .8byte .LVL1174 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1174 + .8byte .LVL1176 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST313: + .8byte .LVL1084 + .8byte .LVL1087 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST314: + .8byte .LVL1085 + .8byte .LVL1086 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST315: + .8byte .LVL1087 + .8byte .LVL1089-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST316: + .8byte .LVL1012 + .8byte .LVL1019 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1094 + .8byte .LVL1125 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1128 + .8byte .LVL1134 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1134 + .8byte .LVL1135 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1138 + .8byte .LVL1151 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte .LVL1187 + .8byte .LVL1193 + .2byte 0x2 + .byte 0x91 + .sleb128 -28 + .8byte 0 + .8byte 0 +.LLST317: + .8byte .LVL1012 + .8byte .LVL1019 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte .LVL1094 + .8byte .LVL1125 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte .LVL1128 + .8byte .LVL1148 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte .LVL1148 + .8byte .LVL1149 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte .LVL1184 + .8byte .LVL1193 + .2byte 0x2 + .byte 0x91 + .sleb128 -24 + .8byte 0 + .8byte 0 +.LLST318: + .8byte .LVL1012 + .8byte .LVL1017 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1100 + .8byte .LVL1109 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1111 + .8byte .LVL1125 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1128 + .8byte .LVL1130 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1138 + .8byte .LVL1151 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1186 + .8byte .LVL1187 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1190 + .8byte .LVL1193 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST319: + .8byte .LVL1012 + .8byte .LVL1016 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1104 + .8byte .LVL1125 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1128 + .8byte .LVL1130 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1137 + .8byte .LVL1151 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1190 + .8byte .LVL1193 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST320: + .8byte .LVL1012 + .8byte .LVL1017 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1096 + .8byte .LVL1100 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1111 + .8byte .LVL1125 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1128 + .8byte .LVL1145 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1184 + .8byte .LVL1186 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1187 + .8byte .LVL1190 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST321: + .8byte .LVL1012 + .8byte .LVL1016 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1098 + .8byte .LVL1104 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1105 + .8byte .LVL1125 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1128 + .8byte .LVL1137 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1184 + .8byte .LVL1190 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST322: + .8byte .LVL1012 + .8byte .LVL1018 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1101 + .8byte .LVL1125 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1128 + .8byte .LVL1130 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1133 + .8byte .LVL1151 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1184 + .8byte .LVL1187 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1187 + .8byte .LVL1188 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1188 + .8byte .LVL1193 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST323: + .8byte .LVL1012 + .8byte .LVL1018 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1102 + .8byte .LVL1125 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1128 + .8byte .LVL1130 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1138 + .8byte .LVL1151 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x6b + .8byte .LVL1190 + .8byte .LVL1191 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1191 + .8byte .LVL1193 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST324: + .8byte .LVL1012 + .8byte .LVL1017 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1109 + .8byte .LVL1125 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1128 + .8byte .LVL1130 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1152 + .8byte .LVL1158 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1184 + .8byte .LVL1185 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST325: + .8byte .LVL1140 + .8byte .LVL1143 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST326: + .8byte .LVL1141 + .8byte .LVL1142 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST327: + .8byte .LVL1154 + .8byte .LVL1157-1 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST328: + .8byte .LVL1155 + .8byte .LVL1156 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST211: + .8byte .LVL696 + .8byte .LVL697 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST212: + .8byte .LVL696 + .8byte .LVL698-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST213: + .8byte .LVL696 + .8byte .LVL698-1 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST196: + .8byte .LVL666 + .8byte .LVL667 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST197: + .8byte .LVL666 + .8byte .LVL668 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST198: + .8byte .LVL666 + .8byte .LVL669 + .2byte 0x1 + .byte 0x52 + .8byte .LVL669 + .8byte .LVL670-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST199: + .8byte .LVL671 + .8byte .LVL672 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST200: + .8byte .LVL671 + .8byte .LVL673 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST201: + .8byte .LVL671 + .8byte .LVL674 + .2byte 0x1 + .byte 0x52 + .8byte .LVL674 + .8byte .LVL675-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST214: + .8byte .LVL699 + .8byte .LVL700 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST215: + .8byte .LVL699 + .8byte .LVL701 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST216: + .8byte .LVL699 + .8byte .LVL703 + .2byte 0x1 + .byte 0x52 + .8byte .LVL703 + .8byte .LVL708 + .2byte 0x1 + .byte 0x65 + .8byte .LVL709 + .8byte .LFE2858 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST217: + .8byte .LVL699 + .8byte .LVL704-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL704-1 + .8byte .LVL707 + .2byte 0x1 + .byte 0x64 + .8byte .LVL709 + .8byte .LVL710 + .2byte 0x1 + .byte 0x64 + .8byte .LVL712 + .8byte .LVL713 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST218: + .8byte .LVL702 + .8byte .LVL708 + .2byte 0x1 + .byte 0x66 + .8byte .LVL709 + .8byte .LFE2858 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST219: + .8byte .LVL705 + .8byte .LVL709 + .2byte 0x2 + .byte 0x91 + .sleb128 20 + .8byte .LVL712 + .8byte .LFE2858 + .2byte 0x2 + .byte 0x91 + .sleb128 20 + .8byte 0 + .8byte 0 +.LLST202: + .8byte .LVL676 + .8byte .LVL677 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST203: + .8byte .LVL676 + .8byte .LVL678 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST204: + .8byte .LVL676 + .8byte .LVL679-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL679-1 + .8byte .LVL681 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST205: + .8byte .LVL682 + .8byte .LVL683 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST206: + .8byte .LVL682 + .8byte .LVL684 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST207: + .8byte .LVL682 + .8byte .LVL685 + .2byte 0x1 + .byte 0x52 + .8byte .LVL685 + .8byte .LVL688 + .2byte 0x1 + .byte 0x64 + .8byte .LVL689 + .8byte .LFE2856 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST208: + .8byte .LVL691 + .8byte .LVL692 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST209: + .8byte .LVL691 + .8byte .LVL693 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST210: + .8byte .LVL691 + .8byte .LVL694 + .2byte 0x1 + .byte 0x52 + .8byte .LVL694 + .8byte .LVL695-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST220: + .8byte .LVL716 + .8byte .LVL717-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST221: + .8byte .LVL716 + .8byte .LVL717-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST222: + .8byte .LVL716 + .8byte .LVL717-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL717-1 + .8byte .LVL719 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST27: + .8byte .LVL89 + .8byte .LVL90 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST28: + .8byte .LVL89 + .8byte .LVL91 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST25: + .8byte .LVL85 + .8byte .LVL86-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST26: + .8byte .LVL85 + .8byte .LVL86-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL86-1 + .8byte .LVL88 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST29: + .8byte .LVL93 + .8byte .LVL94 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST30: + .8byte .LVL93 + .8byte .LVL95 + .2byte 0x1 + .byte 0x51 + .8byte .LVL97 + .8byte .LVL98 + .2byte 0x1 + .byte 0x51 + .8byte .LVL286 + .8byte .LVL287 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST31: + .8byte .LVL93 + .8byte .LVL97 + .2byte 0x1 + .byte 0x52 + .8byte .LVL97 + .8byte .LVL115 + .2byte 0x1 + .byte 0x65 + .8byte .LVL117 + .8byte .LVL234 + .2byte 0x1 + .byte 0x65 + .8byte .LVL236 + .8byte .LVL304 + .2byte 0x1 + .byte 0x65 + .8byte .LVL306 + .8byte .LFE2849 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST40: + .8byte .LVL113 + .8byte .LVL117 + .2byte 0x2 + .byte 0x91 + .sleb128 -12 + .8byte .LVL119 + .8byte .LVL133 + .2byte 0x2 + .byte 0x91 + .sleb128 -12 + .8byte .LVL275 + .8byte .LVL277 + .2byte 0x2 + .byte 0x91 + .sleb128 -12 + .8byte .LVL325 + .8byte .LVL326 + .2byte 0x2 + .byte 0x91 + .sleb128 -12 + .8byte 0 + .8byte 0 +.LLST41: + .8byte .LVL121 + .8byte .LVL122 + .2byte 0x1 + .byte 0x51 + .8byte .LVL123 + .8byte .LVL124 + .2byte 0x1 + .byte 0x51 + .8byte .LVL276 + .8byte .LVL277 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST42: + .8byte .LVL113 + .8byte .LVL114 + .2byte 0x1 + .byte 0x51 + .8byte .LVL123 + .8byte .LVL126 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST43: + .8byte .LVL120 + .8byte .LVL125 + .2byte 0x1 + .byte 0x50 + .8byte .LVL275 + .8byte .LVL277 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST44: + .8byte .LVL118 + .8byte .LVL122 + .2byte 0x1 + .byte 0x51 + .8byte .LVL275 + .8byte .LVL276 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST45: + .8byte .LVL130 + .8byte .LVL132-1 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST46: + .8byte .LVL128 + .8byte .LVL131 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST47: + .8byte .LVL127 + .8byte .LVL129 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST32: + .8byte .LVL110 + .8byte .LVL111 + .2byte 0x1 + .byte 0x50 + .8byte .LVL313 + .8byte .LVL315 + .2byte 0x1 + .byte 0x50 + .8byte .LVL331 + .8byte .LVL333 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST33: + .8byte .LVL101 + .8byte .LVL103 + .2byte 0x1 + .byte 0x50 + .8byte .LVL104 + .8byte .LVL105 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST34: + .8byte .LVL104 + .8byte .LVL110-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL312 + .8byte .LVL313 + .2byte 0x1 + .byte 0x50 + .8byte .LVL313 + .8byte .LVL316-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL332 + .8byte .LVL333 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST35: + .8byte .LVL100 + .8byte .LVL106 + .2byte 0x1 + .byte 0x51 + .8byte .LVL312 + .8byte .LVL314 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST36: + .8byte .LVL99 + .8byte .LVL101 + .2byte 0x1 + .byte 0x50 + .8byte .LVL102 + .8byte .LVL103 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST37: + .8byte .LVL108 + .8byte .LVL110-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST38: + .8byte .LVL107 + .8byte .LVL109 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST39: + .8byte .LVL106 + .8byte .LVL108 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST48: + .8byte .LVL140 + .8byte .LVL141 + .2byte 0x1 + .byte 0x51 + .8byte .LVL142 + .8byte .LVL143 + .2byte 0x1 + .byte 0x51 + .8byte .LVL282 + .8byte .LVL283 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST49: + .8byte .LVL113 + .8byte .LVL114 + .2byte 0x1 + .byte 0x51 + .8byte .LVL142 + .8byte .LVL145 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST50: + .8byte .LVL139 + .8byte .LVL144 + .2byte 0x1 + .byte 0x50 + .8byte .LVL281 + .8byte .LVL283 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST51: + .8byte .LVL138 + .8byte .LVL141 + .2byte 0x1 + .byte 0x51 + .8byte .LVL281 + .8byte .LVL282 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST52: + .8byte .LVL149 + .8byte .LVL151-1 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST53: + .8byte .LVL147 + .8byte .LVL150 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST54: + .8byte .LVL146 + .8byte .LVL148 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST55: + .8byte .LVL162 + .8byte .LVL163 + .2byte 0x1 + .byte 0x50 + .8byte .LVL319 + .8byte .LVL321 + .2byte 0x1 + .byte 0x50 + .8byte .LVL333 + .8byte .LFE2849 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST56: + .8byte .LVL154 + .8byte .LVL155 + .2byte 0x1 + .byte 0x50 + .8byte .LVL156 + .8byte .LVL157 + .2byte 0x1 + .byte 0x50 + .8byte .LVL278 + .8byte .LVL279 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST57: + .8byte .LVL156 + .8byte .LVL162-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL318 + .8byte .LVL319 + .2byte 0x1 + .byte 0x50 + .8byte .LVL319 + .8byte .LVL322-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL334 + .8byte .LFE2849 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST58: + .8byte .LVL153 + .8byte .LVL158 + .2byte 0x1 + .byte 0x51 + .8byte .LVL277 + .8byte .LVL279 + .2byte 0x1 + .byte 0x51 + .8byte .LVL318 + .8byte .LVL320 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST59: + .8byte .LVL152 + .8byte .LVL155 + .2byte 0x1 + .byte 0x50 + .8byte .LVL277 + .8byte .LVL278 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST60: + .8byte .LVL160 + .8byte .LVL162-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST61: + .8byte .LVL159 + .8byte .LVL161 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST62: + .8byte .LVL158 + .8byte .LVL160 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST63: + .8byte .LVL167 + .8byte .LVL168 + .2byte 0x1 + .byte 0x50 + .8byte .LVL169 + .8byte .LVL170 + .2byte 0x1 + .byte 0x50 + .8byte .LVL267 + .8byte .LVL268 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST64: + .8byte .LVL169 + .8byte .LVL171 + .2byte 0x1 + .byte 0x50 + .8byte .LVL264 + .8byte .LVL265 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST65: + .8byte .LVL113 + .8byte .LVL114 + .2byte 0x1 + .byte 0x51 + .8byte .LVL166 + .8byte .LVL172 + .2byte 0x1 + .byte 0x51 + .8byte .LVL264 + .8byte .LVL268 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST66: + .8byte .LVL165 + .8byte .LVL168 + .2byte 0x1 + .byte 0x50 + .8byte .LVL266 + .8byte .LVL267 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST67: + .8byte .LVL174 + .8byte .LVL176-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST68: + .8byte .LVL173 + .8byte .LVL175 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST69: + .8byte .LVL172 + .8byte .LVL174 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST70: + .8byte .LVL184 + .8byte .LVL185 + .2byte 0x1 + .byte 0x51 + .8byte .LVL186 + .8byte .LVL187 + .2byte 0x1 + .byte 0x51 + .8byte .LVL284 + .8byte .LVL285 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST71: + .8byte .LVL113 + .8byte .LVL114 + .2byte 0x1 + .byte 0x51 + .8byte .LVL186 + .8byte .LVL189 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST72: + .8byte .LVL183 + .8byte .LVL188 + .2byte 0x1 + .byte 0x50 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST73: + .8byte .LVL182 + .8byte .LVL185 + .2byte 0x1 + .byte 0x51 + .8byte .LVL283 + .8byte .LVL284 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST74: + .8byte .LVL193 + .8byte .LVL195-1 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST75: + .8byte .LVL191 + .8byte .LVL194 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST76: + .8byte .LVL190 + .8byte .LVL192 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST77: + .8byte .LVL208 + .8byte .LVL209 + .2byte 0x1 + .byte 0x50 + .8byte .LVL307 + .8byte .LVL309 + .2byte 0x1 + .byte 0x50 + .8byte .LVL329 + .8byte .LVL331 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST78: + .8byte .LVL200 + .8byte .LVL201 + .2byte 0x1 + .byte 0x50 + .8byte .LVL202 + .8byte .LVL203 + .2byte 0x1 + .byte 0x50 + .8byte .LVL280 + .8byte .LVL281 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST79: + .8byte .LVL202 + .8byte .LVL208-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL306 + .8byte .LVL307 + .2byte 0x1 + .byte 0x50 + .8byte .LVL307 + .8byte .LVL310-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL330 + .8byte .LVL331 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST80: + .8byte .LVL199 + .8byte .LVL204 + .2byte 0x1 + .byte 0x51 + .8byte .LVL279 + .8byte .LVL281 + .2byte 0x1 + .byte 0x51 + .8byte .LVL306 + .8byte .LVL308 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST81: + .8byte .LVL198 + .8byte .LVL201 + .2byte 0x1 + .byte 0x50 + .8byte .LVL279 + .8byte .LVL280 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST82: + .8byte .LVL206 + .8byte .LVL208-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST83: + .8byte .LVL205 + .8byte .LVL207 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST84: + .8byte .LVL204 + .8byte .LVL206 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST85: + .8byte .LVL213 + .8byte .LVL214 + .2byte 0x1 + .byte 0x50 + .8byte .LVL215 + .8byte .LVL216 + .2byte 0x1 + .byte 0x50 + .8byte .LVL270 + .8byte .LVL271 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST86: + .8byte .LVL215 + .8byte .LVL217 + .2byte 0x1 + .byte 0x50 + .8byte .LVL289 + .8byte .LVL291 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST87: + .8byte .LVL212 + .8byte .LVL218 + .2byte 0x1 + .byte 0x51 + .8byte .LVL268 + .8byte .LVL271 + .2byte 0x1 + .byte 0x51 + .8byte .LVL289 + .8byte .LVL290 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST88: + .8byte .LVL211 + .8byte .LVL219-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL268 + .8byte .LVL269 + .2byte 0x1 + .byte 0x52 + .8byte .LVL289 + .8byte .LVL293 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST89: + .8byte .LVL294 + .8byte .LVL296-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST90: + .8byte .LVL292 + .8byte .LVL295 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST91: + .8byte .LVL291 + .8byte .LVL294 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST92: + .8byte .LVL222 + .8byte .LVL223 + .2byte 0x1 + .byte 0x50 + .8byte .LVL224 + .8byte .LVL225 + .2byte 0x1 + .byte 0x50 + .8byte .LVL274 + .8byte .LVL275 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST93: + .8byte .LVL224 + .8byte .LVL226 + .2byte 0x1 + .byte 0x50 + .8byte .LVL264 + .8byte .LVL265 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST94: + .8byte .LVL113 + .8byte .LVL114 + .2byte 0x1 + .byte 0x51 + .8byte .LVL221 + .8byte .LVL227 + .2byte 0x1 + .byte 0x51 + .8byte .LVL264 + .8byte .LVL266 + .2byte 0x1 + .byte 0x51 + .8byte .LVL273 + .8byte .LVL275 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST95: + .8byte .LVL220 + .8byte .LVL223 + .2byte 0x1 + .byte 0x50 + .8byte .LVL273 + .8byte .LVL274 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST96: + .8byte .LVL229 + .8byte .LVL231-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST97: + .8byte .LVL228 + .8byte .LVL230 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST98: + .8byte .LVL227 + .8byte .LVL229 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST99: + .8byte .LVL113 + .8byte .LVL116 + .2byte 0x1 + .byte 0x67 + .8byte .LVL249 + .8byte .LVL251 + .2byte 0x1 + .byte 0x67 + .8byte .LVL324 + .8byte .LVL326 + .2byte 0x1 + .byte 0x67 + .8byte .LVL326 + .8byte .LVL327 + .2byte 0x1 + .byte 0x50 + .8byte .LVL327 + .8byte .LVL329 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST100: + .8byte .LVL239 + .8byte .LVL240 + .2byte 0x1 + .byte 0x50 + .8byte .LVL241 + .8byte .LVL242 + .2byte 0x1 + .byte 0x50 + .8byte .LVL272 + .8byte .LVL273 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST101: + .8byte .LVL241 + .8byte .LVL243 + .2byte 0x1 + .byte 0x50 + .8byte .LVL264 + .8byte .LVL265 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST102: + .8byte .LVL113 + .8byte .LVL114 + .2byte 0x1 + .byte 0x51 + .8byte .LVL238 + .8byte .LVL246 + .2byte 0x1 + .byte 0x51 + .8byte .LVL264 + .8byte .LVL266 + .2byte 0x1 + .byte 0x51 + .8byte .LVL271 + .8byte .LVL273 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST103: + .8byte .LVL237 + .8byte .LVL240 + .2byte 0x1 + .byte 0x50 + .8byte .LVL271 + .8byte .LVL272 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST104: + .8byte .LVL246 + .8byte .LVL248-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST105: + .8byte .LVL244 + .8byte .LVL247 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST106: + .8byte .LVL243 + .8byte .LVL245 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST107: + .8byte .LVL256 + .8byte .LVL258 + .2byte 0x1 + .byte 0x50 + .8byte .LVL285 + .8byte .LVL286 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST108: + .8byte .LVL257 + .8byte .LVL260 + .2byte 0x1 + .byte 0x50 + .8byte .LVL297 + .8byte .LVL298 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST109: + .8byte .LVL254 + .8byte .LVL261-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL285 + .8byte .LVL286 + .2byte 0x1 + .byte 0x51 + .8byte .LVL297 + .8byte .LVL300 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST110: + .8byte .LVL253 + .8byte .LVL255 + .2byte 0x1 + .byte 0x52 + .8byte .LVL257 + .8byte .LVL261-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL285 + .8byte .LVL286 + .2byte 0x1 + .byte 0x52 + .8byte .LVL297 + .8byte .LVL302 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST111: + .8byte .LVL301 + .8byte .LVL303-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST112: + .8byte .LVL298 + .8byte .LVL301 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST113: + .8byte .LVL112 + .8byte .LVL115 + .2byte 0x1 + .byte 0x66 + .8byte .LVL259 + .8byte .LVL262 + .2byte 0x1 + .byte 0x66 + .8byte .LVL299 + .8byte .LVL304 + .2byte 0x1 + .byte 0x66 + .8byte .LVL325 + .8byte .LVL326 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST192: + .8byte .LVL645 + .8byte .LVL646-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST23: + .8byte .LVL79 + .8byte .LVL80 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST358: + .8byte .LVL1310 + .8byte .LVL1311 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST359: + .8byte .LVL1312 + .8byte .LVL1320 + .2byte 0x1 + .byte 0x68 + .8byte .LVL1323 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST360: + .8byte .LVL1314 + .8byte .LVL1318 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1323 + .8byte .LVL1342 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1369 + .8byte .LVL1376 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1393 + .8byte .LVL1396 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1404 + .8byte .LVL1428 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1429 + .8byte .LVL1440 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1444 + .8byte .LVL1454 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1479 + .8byte .LVL1505 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1510 + .8byte .LVL1512 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1519 + .8byte .LVL1531 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1541 + .8byte .LVL1565 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1571 + .8byte .LVL1583 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1588 + .8byte .LVL1608 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1613 + .8byte .LVL1627 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1630 + .8byte .LVL1638 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST361: + .8byte .LVL1494 + .8byte .LVL1497 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1520 + .8byte .LVL1521-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1560 + .8byte .LVL1562 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST362: + .8byte .LVL1313 + .8byte .LVL1321 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1323 + .8byte .LVL1591 + .2byte 0x1 + .byte 0x6a + .8byte .LVL1591 + .8byte .LVL1592 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1592 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST390: + .8byte .LVL1419 + .8byte .LVL1420 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1532 + .8byte .LVL1533-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST399: + .8byte .LVL1489 + .8byte .LVL1490 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1616 + .8byte .LVL1617-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST391: + .8byte .LVL1434 + .8byte .LVL1436-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1562 + .8byte .LVL1563 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST392: + .8byte .LVL1314 + .8byte .LVL1318 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1323 + .8byte .LVL1342 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1369 + .8byte .LVL1376 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1393 + .8byte .LVL1396 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1404 + .8byte .LVL1407 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1411 + .8byte .LVL1428 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1429 + .8byte .LVL1440 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1444 + .8byte .LVL1454 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1479 + .8byte .LVL1480 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1487 + .8byte .LVL1492 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1522 + .8byte .LVL1531 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1543 + .8byte .LVL1560 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1562 + .8byte .LVL1602 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1604 + .8byte .LVL1608 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1613 + .8byte .LVL1627 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1630 + .8byte .LVL1638 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST393: + .8byte .LVL1435 + .8byte .LVL1436-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1585 + .8byte .LVL1586 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST394: + .8byte .LVL1568 + .8byte .LVL1569 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1583 + .8byte .LVL1584 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST395: + .8byte .LVL1448 + .8byte .LVL1449-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1633 + .8byte .LVL1634-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST407: + .8byte .LVL1576 + .8byte .LVL1577 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1597 + .8byte .LVL1598-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST406: + .8byte .LVL1576 + .8byte .LVL1577 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1624 + .8byte .LVL1625-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST398: + .8byte .LVL1408 + .8byte .LVL1409 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1483 + .8byte .LVL1484-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST400: + .8byte .LVL1314 + .8byte .LVL1319 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1323 + .8byte .LVL1341 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1369 + .8byte .LVL1376 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1393 + .8byte .LVL1396 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1404 + .8byte .LVL1495 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1496 + .8byte .LVL1560 + .2byte 0x1 + .byte 0x65 + .8byte .LVL1561 + .8byte .LVL1562 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1562 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST401: + .8byte .LVL1502 + .8byte .LVL1503 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1510 + .8byte .LVL1511-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST402: + .8byte .LVL1314 + .8byte .LVL1318 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1323 + .8byte .LVL1342 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1369 + .8byte .LVL1376 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1393 + .8byte .LVL1396 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1404 + .8byte .LVL1407 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1411 + .8byte .LVL1428 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1429 + .8byte .LVL1440 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1444 + .8byte .LVL1454 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1479 + .8byte .LVL1480 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1487 + .8byte .LVL1492 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1505 + .8byte .LVL1512 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1522 + .8byte .LVL1531 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1541 + .8byte .LVL1560 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1562 + .8byte .LVL1565 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1571 + .8byte .LVL1583 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1588 + .8byte .LVL1602 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1604 + .8byte .LVL1627 + .2byte 0x1 + .byte 0x64 + .8byte .LVL1630 + .8byte .LVL1638 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST403: + .8byte .LVL1510 + .8byte .LVL1511-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1610 + .8byte .LVL1611 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST404: + .8byte .LVL1508 + .8byte .LVL1509 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1608 + .8byte .LVL1609 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST405: + .8byte .LVL1516 + .8byte .LVL1517 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1537 + .8byte .LVL1538-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST363: + .8byte .LVL1314 + .8byte .LVL1318 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1323 + .8byte .LVL1325 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1404 + .8byte .LVL1406 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1452 + .8byte .LVL1479 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1556 + .8byte .LVL1558 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1620 + .8byte .LVL1621 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1627 + .8byte .LVL1630 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1638 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST364: + .8byte .LVL1458 + .8byte .LVL1459 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1464 + .8byte .LVL1465 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST365: + .8byte .LVL1456 + .8byte .LVL1457 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1462 + .8byte .LVL1463 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST396: + .8byte .LVL1468 + .8byte .LVL1469-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1471 + .8byte .LVL1472-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST397: + .8byte .LVL1314 + .8byte .LVL1315 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1316 + .8byte .LVL1317 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1477 + .8byte .LVL1478-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST366: + .8byte .LVL1337 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x58 + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x58 + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x58 + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x58 + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x58 + .8byte 0 + .8byte 0 +.LLST367: + .8byte .LVL1336 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5b + .8byte 0 + .8byte 0 +.LLST368: + .8byte .LVL1338 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5c + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x5c + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x5c + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5c + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5c + .8byte 0 + .8byte 0 +.LLST369: + .8byte .LVL1339 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5d + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x5d + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x5d + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5d + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5d + .8byte 0 + .8byte 0 +.LLST370: + .8byte .LVL1335 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x59 + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST371: + .8byte .LVL1330 + .8byte .LVL1340 + .2byte 0x1 + .byte 0x60 + .8byte .LVL1369 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x60 + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x60 + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST372: + .8byte .LVL1343 + .8byte .LVL1359 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1360 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1377 + .8byte .LVL1384 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1386 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1397 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST373: + .8byte .LVL1344 + .8byte .LVL1361 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1366 + .8byte .LVL1368 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST374: + .8byte .LVL1343 + .8byte .LVL1371 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1376 + .8byte .LVL1385 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1386 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1397 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST375: + .8byte .LVL1343 + .8byte .LVL1363 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1367 + .8byte .LVL1370 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST376: + .8byte .LVL1344 + .8byte .LVL1362 + .2byte 0x1 + .byte 0x52 + .8byte .LVL1365 + .8byte .LVL1368 + .2byte 0x1 + .byte 0x52 + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x52 + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST377: + .8byte .LVL1343 + .8byte .LVL1344 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1362 + .8byte .LVL1363 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1363 + .8byte .LVL1367 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1368 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST378: + .8byte .LVL1314 + .8byte .LVL1320 + .2byte 0x1 + .byte 0x67 + .8byte .LVL1323 + .8byte .LVL1329 + .2byte 0x1 + .byte 0x67 + .8byte .LVL1334 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST379: + .8byte .LVL1331 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5e + .8byte .LVL1376 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x5e + .8byte .LVL1396 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x5e + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5e + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST380: + .8byte .LVL1314 + .8byte .LVL1319 + .2byte 0x1 + .byte 0x66 + .8byte .LVL1323 + .8byte .LVL1327 + .2byte 0x1 + .byte 0x66 + .8byte .LVL1332 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST381: + .8byte .LVL1314 + .8byte .LVL1322 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1323 + .8byte .LVL1328 + .2byte 0x1 + .byte 0x6c + .8byte .LVL1333 + .8byte .LFE2844 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST382: + .8byte .LVL1343 + .8byte .LVL1345 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1346 + .8byte .LVL1347 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1348 + .8byte .LVL1349 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1350 + .8byte .LVL1353 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1354 + .8byte .LVL1355 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1356 + .8byte .LVL1357 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1358 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1376 + .8byte .LVL1377 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1381 + .8byte .LVL1382 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1384 + .8byte .LVL1386 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1391 + .8byte .LVL1392 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1396 + .8byte .LVL1397 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1401 + .8byte .LVL1402 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST383: + .8byte .LVL1343 + .8byte .LVL1345 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1346 + .8byte .LVL1347 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1348 + .8byte .LVL1349 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1350 + .8byte .LVL1351 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1352 + .8byte .LVL1355 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1356 + .8byte .LVL1357 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1358 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1376 + .8byte .LVL1377 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1383 + .8byte .LVL1386 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1387 + .8byte .LVL1388 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1396 + .8byte .LVL1397 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1402 + .8byte .LVL1403 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST384: + .8byte .LVL1343 + .8byte .LVL1345 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1346 + .8byte .LVL1347 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1348 + .8byte .LVL1349 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1350 + .8byte .LVL1351 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1352 + .8byte .LVL1353 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1354 + .8byte .LVL1357 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1358 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1376 + .8byte .LVL1378 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1384 + .8byte .LVL1387 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1396 + .8byte .LVL1398 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST385: + .8byte .LVL1343 + .8byte .LVL1345 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1346 + .8byte .LVL1347 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1348 + .8byte .LVL1349 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1350 + .8byte .LVL1351 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1352 + .8byte .LVL1353 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1354 + .8byte .LVL1355 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1356 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1376 + .8byte .LVL1377 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1378 + .8byte .LVL1379 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1384 + .8byte .LVL1386 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1389 + .8byte .LVL1390 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1396 + .8byte .LVL1397 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1400 + .8byte .LVL1401 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST386: + .8byte .LVL1343 + .8byte .LVL1344 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1359 + .8byte .LVL1364 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1368 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1376 + .8byte .LVL1377 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1384 + .8byte .LVL1386 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1396 + .8byte .LVL1397 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x54 + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST387: + .8byte .LVL1343 + .8byte .LVL1347 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1348 + .8byte .LVL1349 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1350 + .8byte .LVL1351 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1352 + .8byte .LVL1353 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1354 + .8byte .LVL1355 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1356 + .8byte .LVL1357 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1358 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1376 + .8byte .LVL1377 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1379 + .8byte .LVL1380 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1384 + .8byte .LVL1386 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1388 + .8byte .LVL1389 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1396 + .8byte .LVL1397 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1398 + .8byte .LVL1399 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST388: + .8byte .LVL1343 + .8byte .LVL1345 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1346 + .8byte .LVL1349 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1350 + .8byte .LVL1351 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1352 + .8byte .LVL1353 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1354 + .8byte .LVL1355 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1356 + .8byte .LVL1357 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1358 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1376 + .8byte .LVL1377 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1380 + .8byte .LVL1381 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1384 + .8byte .LVL1386 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1390 + .8byte .LVL1391 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1396 + .8byte .LVL1397 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1399 + .8byte .LVL1400 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST389: + .8byte .LVL1343 + .8byte .LVL1345 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1346 + .8byte .LVL1347 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1348 + .8byte .LVL1351 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1352 + .8byte .LVL1353 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1354 + .8byte .LVL1355 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1356 + .8byte .LVL1357 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1358 + .8byte .LVL1372-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1376 + .8byte .LVL1377 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1382 + .8byte .LVL1383 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1384 + .8byte .LVL1386 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1392 + .8byte .LVL1393 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1396 + .8byte .LVL1397 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1403 + .8byte .LVL1404 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1416 + .8byte .LVL1417-1 + .2byte 0x1 + .byte 0x5f + .8byte .LVL1424 + .8byte .LVL1425-1 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST193: + .8byte .LVL647 + .8byte .LVL648 + .2byte 0x1 + .byte 0x50 + .8byte .LVL648 + .8byte .LVL655 + .2byte 0x1 + .byte 0x64 + .8byte .LVL658 + .8byte .LVL664 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST194: + .8byte .LVL647 + .8byte .LVL650 + .2byte 0x1 + .byte 0x51 + .8byte .LVL650 + .8byte .LVL657 + .2byte 0x1 + .byte 0x66 + .8byte .LVL658 + .8byte .LFE2840 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST195: + .8byte .LVL649 + .8byte .LVL652 + .2byte 0x2 + .byte 0x70 + .sleb128 -12 + .8byte .LVL652 + .8byte .LVL659 + .2byte 0x2 + .byte 0x91 + .sleb128 20 + .8byte .LVL659 + .8byte .LVL662 + .2byte 0x2 + .byte 0x70 + .sleb128 -12 + .8byte .LVL662 + .8byte .LFE2840 + .2byte 0x2 + .byte 0x91 + .sleb128 20 + .8byte 0 + .8byte 0 +.LLST408: + .8byte .LVL1640 + .8byte .LVL1641 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST293: + .8byte .LVL972 + .8byte .LVL973 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST292: + .8byte .LVL942 + .8byte .LVL945 + .2byte 0x1 + .byte 0x50 + .8byte .LVL945 + .8byte .LVL948 + .2byte 0x1 + .byte 0x64 + .8byte .LVL948 + .8byte .LVL949 + .2byte 0x1 + .byte 0x50 + .8byte .LVL949 + .8byte .LVL955 + .2byte 0x1 + .byte 0x64 + .8byte .LVL955 + .8byte .LVL956 + .2byte 0x1 + .byte 0x50 + .8byte .LVL956 + .8byte .LVL960 + .2byte 0x1 + .byte 0x64 + .8byte .LVL961 + .8byte .LFE2835 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST240: + .8byte .LVL782 + .8byte .LVL783 + .2byte 0x1 + .byte 0x50 + .8byte .LVL788 + .8byte .LVL789 + .2byte 0x1 + .byte 0x52 + .8byte .LVL793 + .8byte .LVL794 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST241: + .8byte .LVL782 + .8byte .LVL784 + .2byte 0x1 + .byte 0x51 + .8byte .LVL784 + .8byte .LVL797 + .2byte 0x1 + .byte 0x64 + .8byte .LVL797 + .8byte .LVL801 + .2byte 0x1 + .byte 0x6b + .8byte .LVL801 + .8byte .LVL806 + .2byte 0x1 + .byte 0x64 + .8byte .LVL810 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST242: + .8byte .LVL782 + .8byte .LVL796 + .2byte 0x1 + .byte 0x52 + .8byte .LVL796 + .8byte .LVL800 + .2byte 0x1 + .byte 0x5f + .8byte .LVL800 + .8byte .LVL807 + .2byte 0x1 + .byte 0x65 + .8byte .LVL810 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST243: + .8byte .LVL782 + .8byte .LVL795 + .2byte 0x1 + .byte 0x53 + .8byte .LVL795 + .8byte .LVL802 + .2byte 0x1 + .byte 0x6c + .8byte .LVL802 + .8byte .LVL807 + .2byte 0x1 + .byte 0x66 + .8byte .LVL810 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST244: + .8byte .LVL782 + .8byte .LVL806 + .2byte 0x1 + .byte 0x54 + .8byte .LVL810 + .8byte .LVL819 + .2byte 0x1 + .byte 0x54 + .8byte .LVL819 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST245: + .8byte .LVL782 + .8byte .LVL790-1 + .2byte 0x1 + .byte 0x55 + .8byte .LVL810 + .8byte .LVL819 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST246: + .8byte .LVL786 + .8byte .LVL808 + .2byte 0x1 + .byte 0x67 + .8byte .LVL813 + .8byte .LVL816 + .2byte 0x1 + .byte 0x67 + .8byte .LVL817 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST247: + .8byte .LVL787 + .8byte .LVL809 + .2byte 0x1 + .byte 0x69 + .8byte .LVL810 + .8byte .LVL811 + .2byte 0x1 + .byte 0x69 + .8byte .LVL812 + .8byte .LVL814 + .2byte 0x1 + .byte 0x69 + .8byte .LVL815 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST248: + .8byte .LVL792 + .8byte .LVL809 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST249: + .8byte .LVL791 + .8byte .LVL798-1 + .2byte 0x1 + .byte 0x59 + .8byte .LVL799 + .8byte .LVL803-1 + .2byte 0x1 + .byte 0x59 + .8byte .LVL804 + .8byte .LVL810 + .2byte 0x1 + .byte 0x59 + .8byte .LVL820 + .8byte .LFE2827 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST250: + .8byte .LVL783 + .8byte .LVL785 + .2byte 0x1 + .byte 0x50 + .8byte .LVL805 + .8byte .LVL810 + .2byte 0x1 + .byte 0x50 + .8byte .LVL815 + .8byte .LVL818 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST12: + .8byte .LVL30 + .8byte .LVL39 + .2byte 0x1 + .byte 0x55 + .8byte .LVL44 + .8byte .LVL46 + .2byte 0x1 + .byte 0x55 + .8byte .LVL64 + .8byte .LVL71 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST13: + .8byte .LVL33 + .8byte .LVL68 + .2byte 0x1 + .byte 0x62 + .8byte .LVL69 + .8byte .LFE2825 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST14: + .8byte .LVL34 + .8byte .LVL67 + .2byte 0x1 + .byte 0x66 + .8byte .LVL68 + .8byte .LFE2825 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST15: + .8byte .LVL36 + .8byte .LVL47 + .2byte 0x1 + .byte 0x55 + .8byte .LVL49 + .8byte .LVL51 + .2byte 0x1 + .byte 0x55 + .8byte .LVL52 + .8byte .LVL53 + .2byte 0x1 + .byte 0x55 + .8byte .LVL54 + .8byte .LVL55 + .2byte 0x1 + .byte 0x55 + .8byte .LVL56 + .8byte .LVL57 + .2byte 0x1 + .byte 0x55 + .8byte .LVL58 + .8byte .LVL59 + .2byte 0x1 + .byte 0x55 + .8byte .LVL60 + .8byte .LVL61 + .2byte 0x1 + .byte 0x55 + .8byte .LVL62 + .8byte .LVL64 + .2byte 0x1 + .byte 0x55 + .8byte .LVL65 + .8byte .LVL68 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST16: + .8byte .LVL36 + .8byte .LVL48 + .2byte 0x1 + .byte 0x57 + .8byte .LVL50 + .8byte .LVL64 + .2byte 0x1 + .byte 0x57 + .8byte .LVL65 + .8byte .LVL68 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST17: + .8byte .LVL37 + .8byte .LVL38 + .2byte 0x1 + .byte 0x5a + .8byte .LVL45 + .8byte .LVL46 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST18: + .8byte .LVL40 + .8byte .LVL41 + .2byte 0x1 + .byte 0x58 + .8byte .LVL42 + .8byte .LVL43 + .2byte 0x1 + .byte 0x58 + .8byte .LVL50 + .8byte .LVL63 + .2byte 0x1 + .byte 0x58 + .8byte 0 + .8byte 0 +.LLST19: + .8byte .LVL35 + .8byte .LVL40 + .2byte 0x1 + .byte 0x58 + .8byte .LVL43 + .8byte .LVL46 + .2byte 0x1 + .byte 0x58 + .8byte .LVL63 + .8byte .LVL64 + .2byte 0x1 + .byte 0x58 + .8byte .LVL65 + .8byte .LVL68 + .2byte 0x1 + .byte 0x58 + .8byte 0 + .8byte 0 +.LLST20: + .8byte .LVL31 + .8byte .LVL66 + .2byte 0x1 + .byte 0x63 + .8byte .LVL68 + .8byte .LFE2825 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST0: + .8byte .LVL0 + .8byte .LVL1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL10 + .8byte .LVL13 + .2byte 0x1 + .byte 0x50 + .8byte .LVL20 + .8byte .LVL21 + .2byte 0x1 + .byte 0x50 + .8byte .LVL23 + .8byte .LFE2822 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST1: + .8byte .LVL4 + .8byte .LVL5 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST2: + .8byte .LVL3 + .8byte .LVL29 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST3: + .8byte .LVL8 + .8byte .LVL17 + .2byte 0x1 + .byte 0x57 + .8byte .LVL19 + .8byte .LFE2822 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST4: + .8byte .LVL8 + .8byte .LVL18 + .2byte 0x1 + .byte 0x58 + .8byte .LVL19 + .8byte .LFE2822 + .2byte 0x1 + .byte 0x58 + .8byte 0 + .8byte 0 +.LLST5: + .8byte .LVL8 + .8byte .LVL9 + .2byte 0x1 + .byte 0x5f + .8byte .LVL11 + .8byte .LVL22 + .2byte 0x1 + .byte 0x5f + .8byte .LVL24 + .8byte .LFE2822 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST6: + .8byte .LVL12 + .8byte .LVL13 + .2byte 0x1 + .byte 0x50 + .8byte .LVL15 + .8byte .LVL21 + .2byte 0x1 + .byte 0x50 + .8byte .LVL25 + .8byte .LFE2822 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST7: + .8byte .LVL14 + .8byte .LVL16 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST8: + .8byte .LVL7 + .8byte .LVL28 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST9: + .8byte .LVL2 + .8byte .LVL26 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST10: + .8byte .LVL6 + .8byte .LVL27 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST11: + .8byte .LVL4 + .8byte .LVL29 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST114: + .8byte .LVL335 + .8byte .LVL336 + .2byte 0x1 + .byte 0x50 + .8byte .LVL336 + .8byte .LVL478 + .2byte 0x1 + .byte 0x67 + .8byte .LVL481 + .8byte .LVL546 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST115: + .8byte .LVL335 + .8byte .LVL338 + .2byte 0x1 + .byte 0x51 + .8byte .LVL338 + .8byte .LVL479 + .2byte 0x1 + .byte 0x6a + .8byte .LVL481 + .8byte .LVL547 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST116: + .8byte .LVL335 + .8byte .LVL407 + .2byte 0x1 + .byte 0x52 + .8byte .LVL407 + .8byte .LVL476 + .2byte 0x1 + .byte 0x64 + .8byte .LVL481 + .8byte .LVL544 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST117: + .8byte .LVL335 + .8byte .LVL405 + .2byte 0x1 + .byte 0x53 + .8byte .LVL405 + .8byte .LVL480 + .2byte 0x1 + .byte 0x6b + .8byte .LVL481 + .8byte .LVL548 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST118: + .8byte .LVL335 + .8byte .LVL406 + .2byte 0x1 + .byte 0x54 + .8byte .LVL406 + .8byte .LVL480 + .2byte 0x1 + .byte 0x6c + .8byte .LVL481 + .8byte .LVL548 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST119: + .8byte .LVL335 + .8byte .LVL476 + .2byte 0x1 + .byte 0x55 + .8byte .LVL481 + .8byte .LVL536 + .2byte 0x1 + .byte 0x63 + .8byte .LVL536 + .8byte .LVL542 + .2byte 0x1 + .byte 0x55 + .8byte .LVL542 + .8byte .LVL544 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST120: + .8byte .LVL335 + .8byte .LVL340-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL536 + .8byte .LVL542 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST121: + .8byte .LVL339 + .8byte .LVL477 + .2byte 0x1 + .byte 0x65 + .8byte .LVL481 + .8byte .LVL536 + .2byte 0x1 + .byte 0x65 + .8byte .LVL539 + .8byte .LVL540 + .2byte 0x1 + .byte 0x65 + .8byte .LVL541 + .8byte .LVL545 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST122: + .8byte .LVL339 + .8byte .LVL477 + .2byte 0x1 + .byte 0x66 + .8byte .LVL481 + .8byte .LVL537 + .2byte 0x1 + .byte 0x66 + .8byte .LVL538 + .8byte .LVL545 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST123: + .8byte .LVL341 + .8byte .LVL347 + .2byte 0x1 + .byte 0x53 + .8byte .LVL403 + .8byte .LVL414 + .2byte 0x1 + .byte 0x53 + .8byte .LVL422 + .8byte .LVL425 + .2byte 0x1 + .byte 0x53 + .8byte .LVL429 + .8byte .LVL432 + .2byte 0x1 + .byte 0x53 + .8byte .LVL436 + .8byte .LVL439 + .2byte 0x1 + .byte 0x53 + .8byte .LVL443 + .8byte .LVL446 + .2byte 0x1 + .byte 0x53 + .8byte .LVL450 + .8byte .LVL454 + .2byte 0x1 + .byte 0x53 + .8byte .LVL457 + .8byte .LVL461 + .2byte 0x1 + .byte 0x53 + .8byte .LVL464 + .8byte .LVL468 + .2byte 0x1 + .byte 0x53 + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x53 + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x53 + .8byte .LVL531 + .8byte .LVL533 + .2byte 0x1 + .byte 0x53 + .8byte .LVL543 + .8byte .LFE2821 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST124: + .8byte .LVL337 + .8byte .LVL479 + .2byte 0x1 + .byte 0x69 + .8byte .LVL481 + .8byte .LVL547 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST125: + .8byte .LVL342 + .8byte .LVL343 + .2byte 0x1 + .byte 0x59 + .8byte .LVL475 + .8byte .LVL481 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST126: + .8byte .LVL342 + .8byte .LVL412 + .2byte 0x1 + .byte 0x52 + .8byte .LVL474 + .8byte .LVL483 + .2byte 0x1 + .byte 0x52 + .8byte .LVL485 + .8byte .LVL505 + .2byte 0x1 + .byte 0x52 + .8byte .LVL533 + .8byte .LVL536 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST127: + .8byte .LVL344 + .8byte .LVL410 + .2byte 0x1 + .byte 0x50 + .8byte .LVL481 + .8byte .LVL482 + .2byte 0x1 + .byte 0x50 + .8byte .LVL484 + .8byte .LVL487 + .2byte 0x1 + .byte 0x50 + .8byte .LVL488 + .8byte .LVL490 + .2byte 0x1 + .byte 0x50 + .8byte .LVL491 + .8byte .LVL493 + .2byte 0x1 + .byte 0x50 + .8byte .LVL494 + .8byte .LVL496 + .2byte 0x1 + .byte 0x50 + .8byte .LVL497 + .8byte .LVL499 + .2byte 0x1 + .byte 0x50 + .8byte .LVL500 + .8byte .LVL502 + .2byte 0x1 + .byte 0x50 + .8byte .LVL503 + .8byte .LVL505 + .2byte 0x1 + .byte 0x50 + .8byte .LVL533 + .8byte .LVL536 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST128: + .8byte .LVL342 + .8byte .LVL348 + .2byte 0x1 + .byte 0x5a + .8byte .LVL352 + .8byte .LVL413 + .2byte 0x1 + .byte 0x5a + .8byte .LVL422 + .8byte .LVL426 + .2byte 0x1 + .byte 0x5a + .8byte .LVL429 + .8byte .LVL433 + .2byte 0x1 + .byte 0x5a + .8byte .LVL436 + .8byte .LVL440 + .2byte 0x1 + .byte 0x5a + .8byte .LVL443 + .8byte .LVL447 + .2byte 0x1 + .byte 0x5a + .8byte .LVL450 + .8byte .LVL453 + .2byte 0x1 + .byte 0x5a + .8byte .LVL457 + .8byte .LVL460 + .2byte 0x1 + .byte 0x5a + .8byte .LVL464 + .8byte .LVL465 + .2byte 0x1 + .byte 0x5a + .8byte .LVL470 + .8byte .LVL505 + .2byte 0x1 + .byte 0x5a + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5a + .8byte .LVL531 + .8byte .LVL536 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST129: + .8byte .LVL344 + .8byte .LVL399 + .2byte 0x1 + .byte 0x55 + .8byte .LVL402 + .8byte .LVL409 + .2byte 0x1 + .byte 0x55 + .8byte .LVL485 + .8byte .LVL505 + .2byte 0x1 + .byte 0x55 + .8byte .LVL533 + .8byte .LVL536 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST130: + .8byte .LVL348 + .8byte .LVL352 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST131: + .8byte .LVL342 + .8byte .LVL349 + .2byte 0x1 + .byte 0x56 + .8byte .LVL353 + .8byte .LVL411 + .2byte 0x1 + .byte 0x56 + .8byte .LVL474 + .8byte .LVL505 + .2byte 0x1 + .byte 0x56 + .8byte .LVL533 + .8byte .LVL536 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST132: + .8byte .LVL355 + .8byte .LVL359 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST133: + .8byte .LVL342 + .8byte .LVL351 + .2byte 0x1 + .byte 0x5e + .8byte .LVL354 + .8byte .LVL357 + .2byte 0x1 + .byte 0x5e + .8byte .LVL360 + .8byte .LVL364 + .2byte 0x1 + .byte 0x5e + .8byte .LVL368 + .8byte .LVL371 + .2byte 0x1 + .byte 0x5e + .8byte .LVL375 + .8byte .LVL378 + .2byte 0x1 + .byte 0x5e + .8byte .LVL382 + .8byte .LVL385 + .2byte 0x1 + .byte 0x5e + .8byte .LVL389 + .8byte .LVL392 + .2byte 0x1 + .byte 0x5e + .8byte .LVL396 + .8byte .LVL398 + .2byte 0x1 + .byte 0x5e + .8byte .LVL402 + .8byte .LVL417 + .2byte 0x1 + .byte 0x5e + .8byte .LVL422 + .8byte .LVL424 + .2byte 0x1 + .byte 0x5e + .8byte .LVL429 + .8byte .LVL431 + .2byte 0x1 + .byte 0x5e + .8byte .LVL436 + .8byte .LVL438 + .2byte 0x1 + .byte 0x5e + .8byte .LVL443 + .8byte .LVL445 + .2byte 0x1 + .byte 0x5e + .8byte .LVL450 + .8byte .LVL452 + .2byte 0x1 + .byte 0x5e + .8byte .LVL457 + .8byte .LVL459 + .2byte 0x1 + .byte 0x5e + .8byte .LVL464 + .8byte .LVL467 + .2byte 0x1 + .byte 0x5e + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5e + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x5e + .8byte .LVL498 + .8byte .LVL501 + .2byte 0x1 + .byte 0x5e + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5e + .8byte .LVL531 + .8byte .LVL536 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST134: + .8byte .LVL362 + .8byte .LVL366 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST135: + .8byte .LVL342 + .8byte .LVL351 + .2byte 0x1 + .byte 0x5e + .8byte .LVL354 + .8byte .LVL357 + .2byte 0x1 + .byte 0x5e + .8byte .LVL361 + .8byte .LVL364 + .2byte 0x1 + .byte 0x5e + .8byte .LVL367 + .8byte .LVL371 + .2byte 0x1 + .byte 0x5e + .8byte .LVL375 + .8byte .LVL378 + .2byte 0x1 + .byte 0x5e + .8byte .LVL382 + .8byte .LVL385 + .2byte 0x1 + .byte 0x5e + .8byte .LVL389 + .8byte .LVL392 + .2byte 0x1 + .byte 0x5e + .8byte .LVL396 + .8byte .LVL398 + .2byte 0x1 + .byte 0x5e + .8byte .LVL402 + .8byte .LVL417 + .2byte 0x1 + .byte 0x5e + .8byte .LVL422 + .8byte .LVL424 + .2byte 0x1 + .byte 0x5e + .8byte .LVL429 + .8byte .LVL431 + .2byte 0x1 + .byte 0x5e + .8byte .LVL436 + .8byte .LVL438 + .2byte 0x1 + .byte 0x5e + .8byte .LVL443 + .8byte .LVL445 + .2byte 0x1 + .byte 0x5e + .8byte .LVL450 + .8byte .LVL452 + .2byte 0x1 + .byte 0x5e + .8byte .LVL457 + .8byte .LVL459 + .2byte 0x1 + .byte 0x5e + .8byte .LVL464 + .8byte .LVL467 + .2byte 0x1 + .byte 0x5e + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5e + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x5e + .8byte .LVL501 + .8byte .LVL504 + .2byte 0x1 + .byte 0x5e + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5e + .8byte .LVL531 + .8byte .LVL536 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST136: + .8byte .LVL369 + .8byte .LVL373 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST137: + .8byte .LVL342 + .8byte .LVL351 + .2byte 0x1 + .byte 0x5e + .8byte .LVL354 + .8byte .LVL357 + .2byte 0x1 + .byte 0x5e + .8byte .LVL361 + .8byte .LVL364 + .2byte 0x1 + .byte 0x5e + .8byte .LVL368 + .8byte .LVL371 + .2byte 0x1 + .byte 0x5e + .8byte .LVL374 + .8byte .LVL378 + .2byte 0x1 + .byte 0x5e + .8byte .LVL382 + .8byte .LVL385 + .2byte 0x1 + .byte 0x5e + .8byte .LVL389 + .8byte .LVL392 + .2byte 0x1 + .byte 0x5e + .8byte .LVL396 + .8byte .LVL398 + .2byte 0x1 + .byte 0x5e + .8byte .LVL402 + .8byte .LVL417 + .2byte 0x1 + .byte 0x5e + .8byte .LVL422 + .8byte .LVL424 + .2byte 0x1 + .byte 0x5e + .8byte .LVL429 + .8byte .LVL431 + .2byte 0x1 + .byte 0x5e + .8byte .LVL436 + .8byte .LVL438 + .2byte 0x1 + .byte 0x5e + .8byte .LVL443 + .8byte .LVL445 + .2byte 0x1 + .byte 0x5e + .8byte .LVL450 + .8byte .LVL452 + .2byte 0x1 + .byte 0x5e + .8byte .LVL457 + .8byte .LVL459 + .2byte 0x1 + .byte 0x5e + .8byte .LVL464 + .8byte .LVL467 + .2byte 0x1 + .byte 0x5e + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5e + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x5e + .8byte .LVL495 + .8byte .LVL498 + .2byte 0x1 + .byte 0x5e + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5e + .8byte .LVL531 + .8byte .LVL536 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST138: + .8byte .LVL376 + .8byte .LVL380 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST139: + .8byte .LVL342 + .8byte .LVL351 + .2byte 0x1 + .byte 0x5e + .8byte .LVL354 + .8byte .LVL357 + .2byte 0x1 + .byte 0x5e + .8byte .LVL361 + .8byte .LVL364 + .2byte 0x1 + .byte 0x5e + .8byte .LVL368 + .8byte .LVL371 + .2byte 0x1 + .byte 0x5e + .8byte .LVL375 + .8byte .LVL378 + .2byte 0x1 + .byte 0x5e + .8byte .LVL381 + .8byte .LVL385 + .2byte 0x1 + .byte 0x5e + .8byte .LVL389 + .8byte .LVL392 + .2byte 0x1 + .byte 0x5e + .8byte .LVL396 + .8byte .LVL398 + .2byte 0x1 + .byte 0x5e + .8byte .LVL402 + .8byte .LVL417 + .2byte 0x1 + .byte 0x5e + .8byte .LVL422 + .8byte .LVL424 + .2byte 0x1 + .byte 0x5e + .8byte .LVL429 + .8byte .LVL431 + .2byte 0x1 + .byte 0x5e + .8byte .LVL436 + .8byte .LVL438 + .2byte 0x1 + .byte 0x5e + .8byte .LVL443 + .8byte .LVL445 + .2byte 0x1 + .byte 0x5e + .8byte .LVL450 + .8byte .LVL452 + .2byte 0x1 + .byte 0x5e + .8byte .LVL457 + .8byte .LVL459 + .2byte 0x1 + .byte 0x5e + .8byte .LVL464 + .8byte .LVL467 + .2byte 0x1 + .byte 0x5e + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5e + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x5e + .8byte .LVL489 + .8byte .LVL492 + .2byte 0x1 + .byte 0x5e + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5e + .8byte .LVL531 + .8byte .LVL536 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST140: + .8byte .LVL383 + .8byte .LVL387 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST141: + .8byte .LVL342 + .8byte .LVL351 + .2byte 0x1 + .byte 0x5e + .8byte .LVL354 + .8byte .LVL357 + .2byte 0x1 + .byte 0x5e + .8byte .LVL361 + .8byte .LVL364 + .2byte 0x1 + .byte 0x5e + .8byte .LVL368 + .8byte .LVL371 + .2byte 0x1 + .byte 0x5e + .8byte .LVL375 + .8byte .LVL378 + .2byte 0x1 + .byte 0x5e + .8byte .LVL382 + .8byte .LVL385 + .2byte 0x1 + .byte 0x5e + .8byte .LVL388 + .8byte .LVL392 + .2byte 0x1 + .byte 0x5e + .8byte .LVL396 + .8byte .LVL398 + .2byte 0x1 + .byte 0x5e + .8byte .LVL402 + .8byte .LVL417 + .2byte 0x1 + .byte 0x5e + .8byte .LVL422 + .8byte .LVL424 + .2byte 0x1 + .byte 0x5e + .8byte .LVL429 + .8byte .LVL431 + .2byte 0x1 + .byte 0x5e + .8byte .LVL436 + .8byte .LVL438 + .2byte 0x1 + .byte 0x5e + .8byte .LVL443 + .8byte .LVL445 + .2byte 0x1 + .byte 0x5e + .8byte .LVL450 + .8byte .LVL452 + .2byte 0x1 + .byte 0x5e + .8byte .LVL457 + .8byte .LVL459 + .2byte 0x1 + .byte 0x5e + .8byte .LVL464 + .8byte .LVL467 + .2byte 0x1 + .byte 0x5e + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5e + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x5e + .8byte .LVL492 + .8byte .LVL495 + .2byte 0x1 + .byte 0x5e + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5e + .8byte .LVL531 + .8byte .LVL536 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST142: + .8byte .LVL390 + .8byte .LVL394 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST143: + .8byte .LVL342 + .8byte .LVL351 + .2byte 0x1 + .byte 0x5e + .8byte .LVL354 + .8byte .LVL357 + .2byte 0x1 + .byte 0x5e + .8byte .LVL361 + .8byte .LVL364 + .2byte 0x1 + .byte 0x5e + .8byte .LVL368 + .8byte .LVL371 + .2byte 0x1 + .byte 0x5e + .8byte .LVL375 + .8byte .LVL378 + .2byte 0x1 + .byte 0x5e + .8byte .LVL382 + .8byte .LVL385 + .2byte 0x1 + .byte 0x5e + .8byte .LVL389 + .8byte .LVL392 + .2byte 0x1 + .byte 0x5e + .8byte .LVL395 + .8byte .LVL398 + .2byte 0x1 + .byte 0x5e + .8byte .LVL402 + .8byte .LVL417 + .2byte 0x1 + .byte 0x5e + .8byte .LVL422 + .8byte .LVL424 + .2byte 0x1 + .byte 0x5e + .8byte .LVL429 + .8byte .LVL431 + .2byte 0x1 + .byte 0x5e + .8byte .LVL436 + .8byte .LVL438 + .2byte 0x1 + .byte 0x5e + .8byte .LVL443 + .8byte .LVL445 + .2byte 0x1 + .byte 0x5e + .8byte .LVL450 + .8byte .LVL452 + .2byte 0x1 + .byte 0x5e + .8byte .LVL457 + .8byte .LVL459 + .2byte 0x1 + .byte 0x5e + .8byte .LVL464 + .8byte .LVL467 + .2byte 0x1 + .byte 0x5e + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5e + .8byte .LVL485 + .8byte .LVL489 + .2byte 0x1 + .byte 0x5e + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5e + .8byte .LVL531 + .8byte .LVL536 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST144: + .8byte .LVL342 + .8byte .LVL356 + .2byte 0x1 + .byte 0x62 + .8byte .LVL361 + .8byte .LVL363 + .2byte 0x1 + .byte 0x62 + .8byte .LVL368 + .8byte .LVL370 + .2byte 0x1 + .byte 0x62 + .8byte .LVL375 + .8byte .LVL377 + .2byte 0x1 + .byte 0x62 + .8byte .LVL382 + .8byte .LVL384 + .2byte 0x1 + .byte 0x62 + .8byte .LVL389 + .8byte .LVL391 + .2byte 0x1 + .byte 0x62 + .8byte .LVL396 + .8byte .LVL423 + .2byte 0x1 + .byte 0x62 + .8byte .LVL429 + .8byte .LVL430 + .2byte 0x1 + .byte 0x62 + .8byte .LVL436 + .8byte .LVL437 + .2byte 0x1 + .byte 0x62 + .8byte .LVL443 + .8byte .LVL444 + .2byte 0x1 + .byte 0x62 + .8byte .LVL450 + .8byte .LVL451 + .2byte 0x1 + .byte 0x62 + .8byte .LVL457 + .8byte .LVL458 + .2byte 0x1 + .byte 0x62 + .8byte .LVL464 + .8byte .LVL486 + .2byte 0x1 + .byte 0x62 + .8byte .LVL504 + .8byte .LVL510 + .2byte 0x1 + .byte 0x62 + .8byte .LVL530 + .8byte .LVL536 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST145: + .8byte .LVL401 + .8byte .LVL403 + .2byte 0x1 + .byte 0x53 + .8byte .LVL481 + .8byte .LVL486 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST146: + .8byte .LVL342 + .8byte .LVL346 + .2byte 0x1 + .byte 0x55 + .8byte .LVL404 + .8byte .LVL481 + .2byte 0x1 + .byte 0x55 + .8byte .LVL505 + .8byte .LVL507 + .2byte 0x1 + .byte 0x55 + .8byte .LVL509 + .8byte .LVL533 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST147: + .8byte .LVL342 + .8byte .LVL345 + .2byte 0x1 + .byte 0x50 + .8byte .LVL408 + .8byte .LVL471 + .2byte 0x1 + .byte 0x50 + .8byte .LVL474 + .8byte .LVL481 + .2byte 0x1 + .byte 0x50 + .8byte .LVL505 + .8byte .LVL506 + .2byte 0x1 + .byte 0x50 + .8byte .LVL508 + .8byte .LVL511 + .2byte 0x1 + .byte 0x50 + .8byte .LVL512 + .8byte .LVL514 + .2byte 0x1 + .byte 0x50 + .8byte .LVL516 + .8byte .LVL518 + .2byte 0x1 + .byte 0x50 + .8byte .LVL520 + .8byte .LVL522 + .2byte 0x1 + .byte 0x50 + .8byte .LVL523 + .8byte .LVL525 + .2byte 0x1 + .byte 0x50 + .8byte .LVL526 + .8byte .LVL528 + .2byte 0x1 + .byte 0x50 + .8byte .LVL529 + .8byte .LVL533 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST148: + .8byte .LVL342 + .8byte .LVL343 + .2byte 0x1 + .byte 0x54 + .8byte .LVL408 + .8byte .LVL415 + .2byte 0x1 + .byte 0x54 + .8byte .LVL419 + .8byte .LVL481 + .2byte 0x1 + .byte 0x54 + .8byte .LVL505 + .8byte .LVL533 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST149: + .8byte .LVL421 + .8byte .LVL473 + .2byte 0x1 + .byte 0x52 + .8byte .LVL505 + .8byte .LVL531 + .2byte 0x1 + .byte 0x52 + .8byte .LVL532 + .8byte .LVL533 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST150: + .8byte .LVL342 + .8byte .LVL349 + .2byte 0x1 + .byte 0x56 + .8byte .LVL404 + .8byte .LVL466 + .2byte 0x1 + .byte 0x56 + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x56 + .8byte .LVL509 + .8byte .LVL534 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST151: + .8byte .LVL413 + .8byte .LVL418 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST152: + .8byte .LVL420 + .8byte .LVL421 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST153: + .8byte .LVL342 + .8byte .LVL356 + .2byte 0x1 + .byte 0x62 + .8byte .LVL361 + .8byte .LVL363 + .2byte 0x1 + .byte 0x62 + .8byte .LVL368 + .8byte .LVL370 + .2byte 0x1 + .byte 0x62 + .8byte .LVL375 + .8byte .LVL377 + .2byte 0x1 + .byte 0x62 + .8byte .LVL382 + .8byte .LVL384 + .2byte 0x1 + .byte 0x62 + .8byte .LVL389 + .8byte .LVL391 + .2byte 0x1 + .byte 0x62 + .8byte .LVL396 + .8byte .LVL397 + .2byte 0x1 + .byte 0x62 + .8byte .LVL402 + .8byte .LVL430 + .2byte 0x1 + .byte 0x62 + .8byte .LVL436 + .8byte .LVL437 + .2byte 0x1 + .byte 0x62 + .8byte .LVL443 + .8byte .LVL444 + .2byte 0x1 + .byte 0x62 + .8byte .LVL450 + .8byte .LVL451 + .2byte 0x1 + .byte 0x62 + .8byte .LVL457 + .8byte .LVL458 + .2byte 0x1 + .byte 0x62 + .8byte .LVL464 + .8byte .LVL481 + .2byte 0x1 + .byte 0x62 + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x62 + .8byte .LVL504 + .8byte .LVL510 + .2byte 0x1 + .byte 0x62 + .8byte .LVL527 + .8byte .LVL536 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST154: + .8byte .LVL342 + .8byte .LVL348 + .2byte 0x1 + .byte 0x5a + .8byte .LVL404 + .8byte .LVL413 + .2byte 0x1 + .byte 0x5a + .8byte .LVL422 + .8byte .LVL426 + .2byte 0x1 + .byte 0x5a + .8byte .LVL428 + .8byte .LVL433 + .2byte 0x1 + .byte 0x5a + .8byte .LVL436 + .8byte .LVL440 + .2byte 0x1 + .byte 0x5a + .8byte .LVL443 + .8byte .LVL447 + .2byte 0x1 + .byte 0x5a + .8byte .LVL450 + .8byte .LVL453 + .2byte 0x1 + .byte 0x5a + .8byte .LVL457 + .8byte .LVL460 + .2byte 0x1 + .byte 0x5a + .8byte .LVL464 + .8byte .LVL465 + .2byte 0x1 + .byte 0x5a + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5a + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5a + .8byte .LVL527 + .8byte .LVL530 + .2byte 0x1 + .byte 0x5a + .8byte .LVL531 + .8byte .LVL535 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST155: + .8byte .LVL342 + .8byte .LVL356 + .2byte 0x1 + .byte 0x62 + .8byte .LVL361 + .8byte .LVL363 + .2byte 0x1 + .byte 0x62 + .8byte .LVL368 + .8byte .LVL370 + .2byte 0x1 + .byte 0x62 + .8byte .LVL375 + .8byte .LVL377 + .2byte 0x1 + .byte 0x62 + .8byte .LVL382 + .8byte .LVL384 + .2byte 0x1 + .byte 0x62 + .8byte .LVL389 + .8byte .LVL391 + .2byte 0x1 + .byte 0x62 + .8byte .LVL396 + .8byte .LVL397 + .2byte 0x1 + .byte 0x62 + .8byte .LVL402 + .8byte .LVL423 + .2byte 0x1 + .byte 0x62 + .8byte .LVL429 + .8byte .LVL437 + .2byte 0x1 + .byte 0x62 + .8byte .LVL443 + .8byte .LVL444 + .2byte 0x1 + .byte 0x62 + .8byte .LVL450 + .8byte .LVL451 + .2byte 0x1 + .byte 0x62 + .8byte .LVL457 + .8byte .LVL458 + .2byte 0x1 + .byte 0x62 + .8byte .LVL464 + .8byte .LVL481 + .2byte 0x1 + .byte 0x62 + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x62 + .8byte .LVL504 + .8byte .LVL510 + .2byte 0x1 + .byte 0x62 + .8byte .LVL521 + .8byte .LVL524 + .2byte 0x1 + .byte 0x62 + .8byte .LVL530 + .8byte .LVL536 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST156: + .8byte .LVL342 + .8byte .LVL348 + .2byte 0x1 + .byte 0x5a + .8byte .LVL404 + .8byte .LVL413 + .2byte 0x1 + .byte 0x5a + .8byte .LVL422 + .8byte .LVL426 + .2byte 0x1 + .byte 0x5a + .8byte .LVL429 + .8byte .LVL433 + .2byte 0x1 + .byte 0x5a + .8byte .LVL435 + .8byte .LVL440 + .2byte 0x1 + .byte 0x5a + .8byte .LVL443 + .8byte .LVL447 + .2byte 0x1 + .byte 0x5a + .8byte .LVL450 + .8byte .LVL453 + .2byte 0x1 + .byte 0x5a + .8byte .LVL457 + .8byte .LVL460 + .2byte 0x1 + .byte 0x5a + .8byte .LVL464 + .8byte .LVL465 + .2byte 0x1 + .byte 0x5a + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5a + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5a + .8byte .LVL521 + .8byte .LVL524 + .2byte 0x1 + .byte 0x5a + .8byte .LVL531 + .8byte .LVL535 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST157: + .8byte .LVL342 + .8byte .LVL356 + .2byte 0x1 + .byte 0x62 + .8byte .LVL361 + .8byte .LVL363 + .2byte 0x1 + .byte 0x62 + .8byte .LVL368 + .8byte .LVL370 + .2byte 0x1 + .byte 0x62 + .8byte .LVL375 + .8byte .LVL377 + .2byte 0x1 + .byte 0x62 + .8byte .LVL382 + .8byte .LVL384 + .2byte 0x1 + .byte 0x62 + .8byte .LVL389 + .8byte .LVL391 + .2byte 0x1 + .byte 0x62 + .8byte .LVL396 + .8byte .LVL397 + .2byte 0x1 + .byte 0x62 + .8byte .LVL402 + .8byte .LVL423 + .2byte 0x1 + .byte 0x62 + .8byte .LVL429 + .8byte .LVL430 + .2byte 0x1 + .byte 0x62 + .8byte .LVL436 + .8byte .LVL444 + .2byte 0x1 + .byte 0x62 + .8byte .LVL450 + .8byte .LVL451 + .2byte 0x1 + .byte 0x62 + .8byte .LVL457 + .8byte .LVL458 + .2byte 0x1 + .byte 0x62 + .8byte .LVL464 + .8byte .LVL481 + .2byte 0x1 + .byte 0x62 + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x62 + .8byte .LVL504 + .8byte .LVL510 + .2byte 0x1 + .byte 0x62 + .8byte .LVL524 + .8byte .LVL527 + .2byte 0x1 + .byte 0x62 + .8byte .LVL530 + .8byte .LVL536 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST158: + .8byte .LVL342 + .8byte .LVL348 + .2byte 0x1 + .byte 0x5a + .8byte .LVL404 + .8byte .LVL413 + .2byte 0x1 + .byte 0x5a + .8byte .LVL422 + .8byte .LVL426 + .2byte 0x1 + .byte 0x5a + .8byte .LVL429 + .8byte .LVL433 + .2byte 0x1 + .byte 0x5a + .8byte .LVL436 + .8byte .LVL440 + .2byte 0x1 + .byte 0x5a + .8byte .LVL442 + .8byte .LVL447 + .2byte 0x1 + .byte 0x5a + .8byte .LVL450 + .8byte .LVL453 + .2byte 0x1 + .byte 0x5a + .8byte .LVL457 + .8byte .LVL460 + .2byte 0x1 + .byte 0x5a + .8byte .LVL464 + .8byte .LVL465 + .2byte 0x1 + .byte 0x5a + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5a + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5a + .8byte .LVL524 + .8byte .LVL527 + .2byte 0x1 + .byte 0x5a + .8byte .LVL531 + .8byte .LVL535 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST159: + .8byte .LVL342 + .8byte .LVL356 + .2byte 0x1 + .byte 0x62 + .8byte .LVL361 + .8byte .LVL363 + .2byte 0x1 + .byte 0x62 + .8byte .LVL368 + .8byte .LVL370 + .2byte 0x1 + .byte 0x62 + .8byte .LVL375 + .8byte .LVL377 + .2byte 0x1 + .byte 0x62 + .8byte .LVL382 + .8byte .LVL384 + .2byte 0x1 + .byte 0x62 + .8byte .LVL389 + .8byte .LVL391 + .2byte 0x1 + .byte 0x62 + .8byte .LVL396 + .8byte .LVL397 + .2byte 0x1 + .byte 0x62 + .8byte .LVL402 + .8byte .LVL423 + .2byte 0x1 + .byte 0x62 + .8byte .LVL429 + .8byte .LVL430 + .2byte 0x1 + .byte 0x62 + .8byte .LVL436 + .8byte .LVL437 + .2byte 0x1 + .byte 0x62 + .8byte .LVL443 + .8byte .LVL451 + .2byte 0x1 + .byte 0x62 + .8byte .LVL457 + .8byte .LVL458 + .2byte 0x1 + .byte 0x62 + .8byte .LVL464 + .8byte .LVL481 + .2byte 0x1 + .byte 0x62 + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x62 + .8byte .LVL504 + .8byte .LVL513 + .2byte 0x1 + .byte 0x62 + .8byte .LVL530 + .8byte .LVL536 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST160: + .8byte .LVL342 + .8byte .LVL348 + .2byte 0x1 + .byte 0x5a + .8byte .LVL404 + .8byte .LVL413 + .2byte 0x1 + .byte 0x5a + .8byte .LVL422 + .8byte .LVL426 + .2byte 0x1 + .byte 0x5a + .8byte .LVL429 + .8byte .LVL433 + .2byte 0x1 + .byte 0x5a + .8byte .LVL436 + .8byte .LVL440 + .2byte 0x1 + .byte 0x5a + .8byte .LVL443 + .8byte .LVL447 + .2byte 0x1 + .byte 0x5a + .8byte .LVL449 + .8byte .LVL453 + .2byte 0x1 + .byte 0x5a + .8byte .LVL457 + .8byte .LVL460 + .2byte 0x1 + .byte 0x5a + .8byte .LVL464 + .8byte .LVL465 + .2byte 0x1 + .byte 0x5a + .8byte .LVL470 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5a + .8byte .LVL509 + .8byte .LVL513 + .2byte 0x1 + .byte 0x5a + .8byte .LVL531 + .8byte .LVL535 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST161: + .8byte .LVL342 + .8byte .LVL356 + .2byte 0x1 + .byte 0x62 + .8byte .LVL361 + .8byte .LVL363 + .2byte 0x1 + .byte 0x62 + .8byte .LVL368 + .8byte .LVL370 + .2byte 0x1 + .byte 0x62 + .8byte .LVL375 + .8byte .LVL377 + .2byte 0x1 + .byte 0x62 + .8byte .LVL382 + .8byte .LVL384 + .2byte 0x1 + .byte 0x62 + .8byte .LVL389 + .8byte .LVL391 + .2byte 0x1 + .byte 0x62 + .8byte .LVL396 + .8byte .LVL397 + .2byte 0x1 + .byte 0x62 + .8byte .LVL402 + .8byte .LVL423 + .2byte 0x1 + .byte 0x62 + .8byte .LVL429 + .8byte .LVL430 + .2byte 0x1 + .byte 0x62 + .8byte .LVL436 + .8byte .LVL437 + .2byte 0x1 + .byte 0x62 + .8byte .LVL443 + .8byte .LVL444 + .2byte 0x1 + .byte 0x62 + .8byte .LVL450 + .8byte .LVL458 + .2byte 0x1 + .byte 0x62 + .8byte .LVL464 + .8byte .LVL481 + .2byte 0x1 + .byte 0x62 + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x62 + .8byte .LVL504 + .8byte .LVL510 + .2byte 0x1 + .byte 0x62 + .8byte .LVL513 + .8byte .LVL517 + .2byte 0x1 + .byte 0x62 + .8byte .LVL530 + .8byte .LVL536 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST162: + .8byte .LVL456 + .8byte .LVL461 + .2byte 0x1 + .byte 0x53 + .8byte .LVL464 + .8byte .LVL468 + .2byte 0x1 + .byte 0x53 + .8byte .LVL470 + .8byte .LVL472 + .2byte 0x1 + .byte 0x53 + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x53 + .8byte .LVL513 + .8byte .LVL515 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST163: + .8byte .LVL342 + .8byte .LVL356 + .2byte 0x1 + .byte 0x62 + .8byte .LVL361 + .8byte .LVL363 + .2byte 0x1 + .byte 0x62 + .8byte .LVL368 + .8byte .LVL370 + .2byte 0x1 + .byte 0x62 + .8byte .LVL375 + .8byte .LVL377 + .2byte 0x1 + .byte 0x62 + .8byte .LVL382 + .8byte .LVL384 + .2byte 0x1 + .byte 0x62 + .8byte .LVL389 + .8byte .LVL391 + .2byte 0x1 + .byte 0x62 + .8byte .LVL396 + .8byte .LVL397 + .2byte 0x1 + .byte 0x62 + .8byte .LVL402 + .8byte .LVL423 + .2byte 0x1 + .byte 0x62 + .8byte .LVL429 + .8byte .LVL430 + .2byte 0x1 + .byte 0x62 + .8byte .LVL436 + .8byte .LVL437 + .2byte 0x1 + .byte 0x62 + .8byte .LVL443 + .8byte .LVL444 + .2byte 0x1 + .byte 0x62 + .8byte .LVL450 + .8byte .LVL451 + .2byte 0x1 + .byte 0x62 + .8byte .LVL457 + .8byte .LVL481 + .2byte 0x1 + .byte 0x62 + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x62 + .8byte .LVL504 + .8byte .LVL510 + .2byte 0x1 + .byte 0x62 + .8byte .LVL517 + .8byte .LVL521 + .2byte 0x1 + .byte 0x62 + .8byte .LVL530 + .8byte .LVL536 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST164: + .8byte .LVL463 + .8byte .LVL468 + .2byte 0x1 + .byte 0x53 + .8byte .LVL470 + .8byte .LVL472 + .2byte 0x1 + .byte 0x53 + .8byte .LVL509 + .8byte .LVL510 + .2byte 0x1 + .byte 0x53 + .8byte .LVL517 + .8byte .LVL519 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST165: + .8byte .LVL342 + .8byte .LVL350 + .2byte 0x1 + .byte 0x5f + .8byte .LVL354 + .8byte .LVL358 + .2byte 0x1 + .byte 0x5f + .8byte .LVL361 + .8byte .LVL365 + .2byte 0x1 + .byte 0x5f + .8byte .LVL368 + .8byte .LVL372 + .2byte 0x1 + .byte 0x5f + .8byte .LVL375 + .8byte .LVL379 + .2byte 0x1 + .byte 0x5f + .8byte .LVL382 + .8byte .LVL386 + .2byte 0x1 + .byte 0x5f + .8byte .LVL389 + .8byte .LVL393 + .2byte 0x1 + .byte 0x5f + .8byte .LVL396 + .8byte .LVL400 + .2byte 0x1 + .byte 0x5f + .8byte .LVL402 + .8byte .LVL416 + .2byte 0x1 + .byte 0x5f + .8byte .LVL422 + .8byte .LVL427 + .2byte 0x1 + .byte 0x5f + .8byte .LVL429 + .8byte .LVL434 + .2byte 0x1 + .byte 0x5f + .8byte .LVL436 + .8byte .LVL441 + .2byte 0x1 + .byte 0x5f + .8byte .LVL443 + .8byte .LVL448 + .2byte 0x1 + .byte 0x5f + .8byte .LVL450 + .8byte .LVL455 + .2byte 0x1 + .byte 0x5f + .8byte .LVL457 + .8byte .LVL462 + .2byte 0x1 + .byte 0x5f + .8byte .LVL464 + .8byte .LVL481 + .2byte 0x1 + .byte 0x5f + .8byte .LVL485 + .8byte .LVL486 + .2byte 0x1 + .byte 0x5f + .8byte .LVL505 + .8byte .LVL510 + .2byte 0x1 + .byte 0x5f + .8byte .LVL531 + .8byte .LVL536 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST166: + .8byte .LVL469 + .8byte .LVL472 + .2byte 0x1 + .byte 0x53 + .8byte .LVL505 + .8byte .LVL510 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST167: + .8byte .LVL549 + .8byte .LVL551 + .2byte 0x1 + .byte 0x50 + .8byte .LVL551 + .8byte .LVL556-1 + .2byte 0x1 + .byte 0x55 + .8byte .LVL557 + .8byte .LVL559 + .2byte 0x1 + .byte 0x55 + .8byte .LVL559 + .8byte .LVL594 + .2byte 0x1 + .byte 0x66 + .8byte .LVL598 + .8byte .LVL619 + .2byte 0x1 + .byte 0x66 + .8byte .LVL619 + .8byte .LVL620 + .2byte 0x1 + .byte 0x55 + .8byte .LVL620 + .8byte .LVL625 + .2byte 0x1 + .byte 0x66 + .8byte .LVL629 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST168: + .8byte .LVL549 + .8byte .LVL594 + .2byte 0x1 + .byte 0x51 + .8byte .LVL598 + .8byte .LVL625 + .2byte 0x1 + .byte 0x65 + .8byte .LVL629 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST169: + .8byte .LVL549 + .8byte .LVL593 + .2byte 0x1 + .byte 0x52 + .8byte .LVL598 + .8byte .LVL624 + .2byte 0x1 + .byte 0x64 + .8byte .LVL629 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST170: + .8byte .LVL549 + .8byte .LVL595 + .2byte 0x1 + .byte 0x53 + .8byte .LVL598 + .8byte .LVL626 + .2byte 0x1 + .byte 0x68 + .8byte .LVL629 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST171: + .8byte .LVL549 + .8byte .LVL596 + .2byte 0x1 + .byte 0x54 + .8byte .LVL598 + .8byte .LVL627 + .2byte 0x1 + .byte 0x69 + .8byte .LVL629 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST172: + .8byte .LVL549 + .8byte .LVL550 + .2byte 0x1 + .byte 0x55 + .8byte .LVL550 + .8byte .LVL593 + .2byte 0x1 + .byte 0x63 + .8byte .LVL598 + .8byte .LVL624 + .2byte 0x1 + .byte 0x63 + .8byte .LVL629 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST173: + .8byte .LVL549 + .8byte .LVL556-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL619 + .8byte .LVL621-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL629 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST174: + .8byte .LVL554 + .8byte .LVL595 + .2byte 0x1 + .byte 0x67 + .8byte .LVL598 + .8byte .LVL626 + .2byte 0x1 + .byte 0x67 + .8byte .LVL630 + .8byte .LVL632 + .2byte 0x1 + .byte 0x67 + .8byte .LVL633 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST175: + .8byte .LVL553 + .8byte .LVL596 + .2byte 0x1 + .byte 0x6a + .8byte .LVL598 + .8byte .LVL627 + .2byte 0x1 + .byte 0x6a + .8byte .LVL631 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST176: + .8byte .LVL561 + .8byte .LVL562 + .2byte 0x1 + .byte 0x53 + .8byte .LVL592 + .8byte .LVL598 + .2byte 0x1 + .byte 0x53 + .8byte .LVL623 + .8byte .LVL629 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST177: + .8byte .LVL552 + .8byte .LVL597 + .2byte 0x1 + .byte 0x6c + .8byte .LVL598 + .8byte .LVL628 + .2byte 0x1 + .byte 0x6c + .8byte .LVL629 + .8byte .LFE2820 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST178: + .8byte .LVL555 + .8byte .LVL556-1 + .2byte 0x1 + .byte 0x5d + .8byte .LVL558 + .8byte .LVL560 + .2byte 0x1 + .byte 0x5d + .8byte .LVL619 + .8byte .LVL621-1 + .2byte 0x1 + .byte 0x5d + .8byte .LVL622 + .8byte .LVL629 + .2byte 0x1 + .byte 0x5d + .8byte 0 + .8byte 0 +.LLST179: + .8byte .LVL561 + .8byte .LVL600 + .2byte 0x1 + .byte 0x52 + .8byte .LVL602 + .8byte .LVL619 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST180: + .8byte .LVL561 + .8byte .LVL599 + .2byte 0x1 + .byte 0x50 + .8byte .LVL601 + .8byte .LVL604 + .2byte 0x1 + .byte 0x50 + .8byte .LVL605 + .8byte .LVL606 + .2byte 0x1 + .byte 0x50 + .8byte .LVL607 + .8byte .LVL608 + .2byte 0x1 + .byte 0x50 + .8byte .LVL609 + .8byte .LVL611 + .2byte 0x1 + .byte 0x50 + .8byte .LVL612 + .8byte .LVL614 + .2byte 0x1 + .byte 0x50 + .8byte .LVL615 + .8byte .LVL616 + .2byte 0x1 + .byte 0x50 + .8byte .LVL617 + .8byte .LVL619 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST181: + .8byte .LVL561 + .8byte .LVL563 + .2byte 0x1 + .byte 0x5e + .8byte .LVL565 + .8byte .LVL619 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST182: + .8byte .LVL561 + .8byte .LVL619 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST183: + .8byte .LVL561 + .8byte .LVL590 + .2byte 0x1 + .byte 0x55 + .8byte .LVL591 + .8byte .LVL598 + .2byte 0x1 + .byte 0x55 + .8byte .LVL602 + .8byte .LVL619 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST184: + .8byte .LVL563 + .8byte .LVL565 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST185: + .8byte .LVL567 + .8byte .LVL569 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST186: + .8byte .LVL571 + .8byte .LVL573 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST187: + .8byte .LVL575 + .8byte .LVL577 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST188: + .8byte .LVL561 + .8byte .LVL564 + .2byte 0x1 + .byte 0x62 + .8byte .LVL566 + .8byte .LVL568 + .2byte 0x1 + .byte 0x62 + .8byte .LVL570 + .8byte .LVL572 + .2byte 0x1 + .byte 0x62 + .8byte .LVL574 + .8byte .LVL576 + .2byte 0x1 + .byte 0x62 + .8byte .LVL578 + .8byte .LVL582 + .2byte 0x1 + .byte 0x62 + .8byte .LVL584 + .8byte .LVL586 + .2byte 0x1 + .byte 0x62 + .8byte .LVL588 + .8byte .LVL589 + .2byte 0x1 + .byte 0x62 + .8byte .LVL591 + .8byte .LVL598 + .2byte 0x1 + .byte 0x62 + .8byte .LVL602 + .8byte .LVL603 + .2byte 0x1 + .byte 0x62 + .8byte .LVL610 + .8byte .LVL613 + .2byte 0x1 + .byte 0x62 + .8byte .LVL618 + .8byte .LVL619 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST189: + .8byte .LVL581 + .8byte .LVL583 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST190: + .8byte .LVL585 + .8byte .LVL587 + .2byte 0x1 + .byte 0x60 + .8byte 0 + .8byte 0 +.LLST191: + .8byte .LVL561 + .8byte .LVL564 + .2byte 0x1 + .byte 0x62 + .8byte .LVL566 + .8byte .LVL568 + .2byte 0x1 + .byte 0x62 + .8byte .LVL570 + .8byte .LVL572 + .2byte 0x1 + .byte 0x62 + .8byte .LVL574 + .8byte .LVL576 + .2byte 0x1 + .byte 0x62 + .8byte .LVL578 + .8byte .LVL579 + .2byte 0x1 + .byte 0x62 + .8byte .LVL580 + .8byte .LVL582 + .2byte 0x1 + .byte 0x62 + .8byte .LVL584 + .8byte .LVL586 + .2byte 0x1 + .byte 0x62 + .8byte .LVL588 + .8byte .LVL603 + .2byte 0x1 + .byte 0x62 + .8byte .LVL618 + .8byte .LVL619 + .2byte 0x1 + .byte 0x62 + .8byte 0 + .8byte 0 +.LLST354: + .8byte .LVL1297 + .8byte .LVL1302 + .2byte 0x1 + .byte 0x53 + .8byte .LVL1309 + .8byte .LFE2819 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST355: + .8byte .LVL1301 + .8byte .LVL1304 + .2byte 0x1 + .byte 0x53 + .8byte .LVL1308 + .8byte .LFE2819 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST356: + .8byte .LVL1303 + .8byte .LVL1306 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST357: + .8byte .LVL1305 + .8byte .LVL1307 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST334: + .8byte .LVL1212 + .8byte .LVL1219 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1230 + .8byte .LVL1233 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1234 + .8byte .LVL1235 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST335: + .8byte .LVL1213 + .8byte .LVL1231 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1233 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST336: + .8byte .LVL1218 + .8byte .LVL1228 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1233 + .8byte .LVL1248 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1250 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST337: + .8byte .LVL1216 + .8byte .LVL1248 + .2byte 0x1 + .byte 0x5b + .8byte .LVL1248 + .8byte .LVL1249 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1249 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x5b + .8byte 0 + .8byte 0 +.LLST338: + .8byte .LVL1215 + .8byte .LVL1232 + .2byte 0x1 + .byte 0x6e + .8byte .LVL1233 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x6e + .8byte 0 + .8byte 0 +.LLST344: + .8byte .LVL1220 + .8byte .LVL1221 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1256 + .8byte .LVL1257 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1262 + .8byte .LVL1263 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1273 + .8byte .LVL1274 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST345: + .8byte .LVL1221 + .8byte .LVL1222 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1255 + .8byte .LVL1256 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1260 + .8byte .LVL1261 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1272 + .8byte .LVL1273 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST339: + .8byte .LVL1222 + .8byte .LVL1223 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1251 + .8byte .LVL1252 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1258 + .8byte .LVL1259 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1266 + .8byte .LVL1267 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST340: + .8byte .LVL1223 + .8byte .LVL1224 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1252 + .8byte .LVL1253 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1263 + .8byte .LVL1264 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1274 + .8byte .LVL1275 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST341: + .8byte .LVL1224 + .8byte .LVL1225 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1253 + .8byte .LVL1254 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1261 + .8byte .LVL1262 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1271 + .8byte .LVL1272 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST342: + .8byte .LVL1225 + .8byte .LVL1226 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1254 + .8byte .LVL1255 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1259 + .8byte .LVL1260 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1270 + .8byte .LVL1271 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST343: + .8byte .LVL1216 + .8byte .LVL1217 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1226 + .8byte .LVL1234 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1250 + .8byte .LVL1251 + .2byte 0x1 + .byte 0x57 + .8byte .LVL1265 + .8byte .LVL1266 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST347: + .8byte .LVL1219 + .8byte .LVL1229 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1233 + .8byte .LVL1234 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1235 + .8byte .LVL1268 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1269 + .8byte .LVL1290 + .2byte 0x1 + .byte 0x55 + .8byte .LVL1291 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST348: + .8byte .LVL1236 + .8byte .LVL1237 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1238 + .8byte .LVL1239 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1240 + .8byte .LVL1241 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1242 + .8byte .LVL1243 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1244 + .8byte .LVL1245 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1246 + .8byte .LVL1247 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1276 + .8byte .LVL1277 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1286 + .8byte .LVL1287 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1292 + .8byte .LVL1293 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST349: + .8byte .LVL1237 + .8byte .LVL1239 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1240 + .8byte .LVL1241 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1242 + .8byte .LVL1243 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1244 + .8byte .LVL1245 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1246 + .8byte .LVL1247 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1277 + .8byte .LVL1278 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1285 + .8byte .LVL1286 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1293 + .8byte .LVL1294 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST350: + .8byte .LVL1239 + .8byte .LVL1241 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1242 + .8byte .LVL1243 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1244 + .8byte .LVL1245 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1246 + .8byte .LVL1247 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1278 + .8byte .LVL1279 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1284 + .8byte .LVL1285 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1294 + .8byte .LVL1295 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST351: + .8byte .LVL1241 + .8byte .LVL1243 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1244 + .8byte .LVL1245 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1246 + .8byte .LVL1247 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1279 + .8byte .LVL1280 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1283 + .8byte .LVL1284 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1295 + .8byte .LVL1296 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST352: + .8byte .LVL1243 + .8byte .LVL1245 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1246 + .8byte .LVL1247 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1280 + .8byte .LVL1281 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1282 + .8byte .LVL1283 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1296 + .8byte .LFE2818 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST353: + .8byte .LVL1245 + .8byte .LVL1247 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1281 + .8byte .LVL1282 + .2byte 0x1 + .byte 0x69 + .8byte .LVL1288 + .8byte .LVL1289 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST346: + .8byte .LVL1227 + .8byte .LVL1228 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1248 + .8byte .LVL1251 + .2byte 0x1 + .byte 0x56 + .8byte .LVL1265 + .8byte .LVL1266 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST21: + .8byte .LVL72 + .8byte .LVL73 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST223: + .8byte .LVL721 + .8byte .LVL722 + .2byte 0x1 + .byte 0x50 + .8byte .LVL722 + .8byte .LVL737 + .2byte 0x1 + .byte 0x5a + .8byte .LVL737 + .8byte .LVL738 + .2byte 0x1 + .byte 0x55 + .8byte .LVL738 + .8byte .LVL745 + .2byte 0x1 + .byte 0x5a + .8byte .LVL755 + .8byte .LFE2876 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST224: + .8byte .LVL734 + .8byte .LVL739 + .2byte 0x1 + .byte 0x59 + .8byte .LVL740 + .8byte .LVL741 + .2byte 0x1 + .byte 0x59 + .8byte .LVL741 + .8byte .LVL755 + .2byte 0x1 + .byte 0x58 + .8byte .LVL755 + .8byte .LFE2876 + .2byte 0x1 + .byte 0x59 + .8byte 0 + .8byte 0 +.LLST225: + .8byte .LVL729 + .8byte .LVL730 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST226: + .8byte .LVL726 + .8byte .LVL728 + .2byte 0x1 + .byte 0x55 + .8byte .LVL728 + .8byte .LVL742 + .2byte 0x1 + .byte 0x56 + .8byte .LVL756 + .8byte .LFE2876 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST227: + .8byte .LVL734 + .8byte .LVL749 + .2byte 0x1 + .byte 0x56 + .8byte .LVL752 + .8byte .LFE2876 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST228: + .8byte .LVL734 + .8byte .LVL750 + .2byte 0x1 + .byte 0x57 + .8byte .LVL752 + .8byte .LFE2876 + .2byte 0x1 + .byte 0x57 + .8byte 0 + .8byte 0 +.LLST229: + .8byte .LVL732 + .8byte .LVL736 + .2byte 0x1 + .byte 0x5d + .8byte .LVL738 + .8byte .LFE2876 + .2byte 0x1 + .byte 0x5d + .8byte 0 + .8byte 0 +.LLST230: + .8byte .LVL744 + .8byte .LVL751 + .2byte 0x1 + .byte 0x50 + .8byte .LVL752 + .8byte .LVL753 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST231: + .8byte .LVL723 + .8byte .LVL743 + .2byte 0x1 + .byte 0x57 + .8byte .LVL755 + .8byte .LFE2876 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST232: + .8byte .LVL725 + .8byte .LVL759 + .2byte 0x1 + .byte 0x6e + .8byte 0 + .8byte 0 +.LLST233: + .8byte .LVL727 + .8byte .LVL758 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST234: + .8byte .LVL724 + .8byte .LVL726 + .2byte 0x1 + .byte 0x55 + .8byte .LVL726 + .8byte .LVL731 + .2byte 0x1 + .byte 0x59 + .8byte .LVL731 + .8byte .LVL733 + .2byte 0x1 + .byte 0x50 + .8byte .LVL734 + .8byte .LVL735 + .2byte 0x1 + .byte 0x50 + .8byte .LVL757 + .8byte .LFE2876 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST235: + .8byte .LVL745 + .8byte .LVL746 + .2byte 0x1 + .byte 0x5a + .8byte .LVL747 + .8byte .LVL754 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST236: + .8byte .LVL743 + .8byte .LVL748 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST237: + .8byte .LVL760 + .8byte .LVL764 + .2byte 0x1 + .byte 0x55 + .8byte .LVL765 + .8byte .LVL766 + .2byte 0x1 + .byte 0x55 + .8byte .LVL769 + .8byte .LFE2877 + .2byte 0x1 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST238: + .8byte .LVL762 + .8byte .LVL763 + .2byte 0x1 + .byte 0x58 + .8byte .LVL765 + .8byte .LVL766 + .2byte 0x1 + .byte 0x58 + .8byte .LVL769 + .8byte .LFE2877 + .2byte 0x1 + .byte 0x58 + .8byte 0 + .8byte 0 +.LLST239: + .8byte .LVL761 + .8byte .LVL767 + .2byte 0x1 + .byte 0x56 + .8byte .LVL768 + .8byte .LVL770 + .2byte 0x1 + .byte 0x56 + .8byte .LVL771 + .8byte .LVL772 + .2byte 0x1 + .byte 0x56 + .8byte .LVL773 + .8byte .LVL774 + .2byte 0x1 + .byte 0x56 + .8byte .LVL775 + .8byte .LVL776 + .2byte 0x1 + .byte 0x56 + .8byte .LVL777 + .8byte .LVL778 + .2byte 0x1 + .byte 0x56 + .8byte .LVL779 + .8byte .LVL780 + .2byte 0x1 + .byte 0x56 + .8byte .LVL781 + .8byte .LFE2877 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST251: + .8byte .LVL821 + .8byte .LVL829 + .2byte 0x1 + .byte 0x50 + .8byte .LVL829 + .8byte .LVL836 + .2byte 0x1 + .byte 0x5a + .8byte .LVL836 + .8byte .LVL838 + .2byte 0x1 + .byte 0x50 + .8byte .LVL838 + .8byte .LVL839 + .2byte 0x1 + .byte 0x5a + .8byte .LVL839 + .8byte .LFE2878 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST252: + .8byte .LVL821 + .8byte .LVL826 + .2byte 0x1 + .byte 0x56 + .8byte .LVL839 + .8byte .LVL840 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST253: + .8byte .LVL827 + .8byte .LVL839 + .2byte 0x1 + .byte 0x5c + .8byte .LVL842 + .8byte .LVL843 + .2byte 0x1 + .byte 0x5c + .8byte .LVL844 + .8byte .LFE2878 + .2byte 0x1 + .byte 0x5c + .8byte 0 + .8byte 0 +.LLST254: + .8byte .LVL825 + .8byte .LVL839 + .2byte 0x1 + .byte 0x5e + .8byte .LVL841 + .8byte .LFE2878 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST255: + .8byte .LVL831 + .8byte .LVL833 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST256: + .8byte .LVL832 + .8byte .LVL834 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST257: + .8byte .LVL822 + .8byte .LVL824 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST258: + .8byte .LVL828 + .8byte .LVL830 + .2byte 0x1 + .byte 0x5f + .8byte .LVL835 + .8byte .LVL836 + .2byte 0x1 + .byte 0x5f + .8byte .LVL837 + .8byte .LVL839 + .2byte 0x1 + .byte 0x5f + .8byte 0 + .8byte 0 +.LLST259: + .8byte .LVL845 + .8byte .LVL854 + .2byte 0x1 + .byte 0x56 + .8byte .LVL855 + .8byte .LFE2879 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST260: + .8byte .LVL849 + .8byte .LVL856 + .2byte 0x1 + .byte 0x5b + .8byte .LVL858 + .8byte .LVL862 + .2byte 0x1 + .byte 0x5b + .8byte .LVL863 + .8byte .LFE2879 + .2byte 0x1 + .byte 0x5b + .8byte 0 + .8byte 0 +.LLST261: + .8byte .LVL850 + .8byte .LVL857 + .2byte 0x1 + .byte 0x5e + .8byte .LVL859 + .8byte .LFE2879 + .2byte 0x1 + .byte 0x5e + .8byte 0 + .8byte 0 +.LLST262: + .8byte .LVL846 + .8byte .LVL847 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST263: + .8byte .LVL851 + .8byte .LVL852 + .2byte 0x1 + .byte 0x5d + .8byte .LVL860 + .8byte .LVL861 + .2byte 0x1 + .byte 0x5d + .8byte 0 + .8byte 0 +.LLST264: + .8byte .LVL853 + .8byte .LVL856 + .2byte 0x1 + .byte 0x58 + .8byte 0 + .8byte 0 +.LLST265: + .8byte .LVL864 + .8byte .LVL865 + .2byte 0x1 + .byte 0x50 + .8byte .LVL865 + .8byte .LVL870 + .2byte 0x1 + .byte 0x64 + .8byte .LVL871 + .8byte .LFE2880 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST266: + .8byte .LVL872 + .8byte .LVL874 + .2byte 0x1 + .byte 0x50 + .8byte .LVL874 + .8byte .LVL878 + .2byte 0x1 + .byte 0x63 + .8byte .LVL879 + .8byte .LVL882 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST267: + .8byte .LVL872 + .8byte .LVL873 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST269: + .8byte .LVL889 + .8byte .LVL907 + .2byte 0x1 + .byte 0x50 + .8byte .LVL910 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST270: + .8byte .LVL889 + .8byte .LVL900 + .2byte 0x1 + .byte 0x51 + .8byte .LVL900 + .8byte .LVL908 + .2byte 0x1 + .byte 0x68 + .8byte .LVL910 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST271: + .8byte .LVL889 + .8byte .LVL901 + .2byte 0x1 + .byte 0x52 + .8byte .LVL901 + .8byte .LVL909 + .2byte 0x1 + .byte 0x69 + .8byte .LVL910 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST272: + .8byte .LVL889 + .8byte .LVL894-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL910 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST273: + .8byte .LVL893 + .8byte .LVL908 + .2byte 0x1 + .byte 0x67 + .8byte .LVL910 + .8byte .LVL911 + .2byte 0x1 + .byte 0x67 + .8byte .LVL912 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST274: + .8byte .LVL893 + .8byte .LVL907 + .2byte 0x1 + .byte 0x65 + .8byte .LVL913 + .8byte .LVL914 + .2byte 0x1 + .byte 0x65 + .8byte .LVL915 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST275: + .8byte .LVL890 + .8byte .LVL891 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST276: + .8byte .LVL892 + .8byte .LVL906 + .2byte 0x1 + .byte 0x63 + .8byte .LVL910 + .8byte .LFE2884 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST277: + .8byte .LVL895 + .8byte .LVL910 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST278: + .8byte .LVL896 + .8byte .LVL898 + .2byte 0x1 + .byte 0x5a + .8byte .LVL899 + .8byte .LVL903 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST279: + .8byte .LVL895 + .8byte .LVL897 + .2byte 0x1 + .byte 0x5a + .8byte .LVL902 + .8byte .LVL904 + .2byte 0x1 + .byte 0x5a + .8byte .LVL905 + .8byte .LVL910 + .2byte 0x1 + .byte 0x5a + .8byte 0 + .8byte 0 +.LLST280: + .8byte .LVL916 + .8byte .LVL920 + .2byte 0x1 + .byte 0x50 + .8byte .LVL920 + .8byte .LVL934 + .2byte 0x1 + .byte 0x6b + .8byte .LVL935 + .8byte .LFE2885 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST281: + .8byte .LVL916 + .8byte .LVL930 + .2byte 0x1 + .byte 0x51 + .8byte .LVL935 + .8byte .LFE2885 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST282: + .8byte .LVL916 + .8byte .LVL931 + .2byte 0x1 + .byte 0x52 + .8byte .LVL935 + .8byte .LFE2885 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST283: + .8byte .LVL916 + .8byte .LVL924-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL935 + .8byte .LVL936-1 + .2byte 0x1 + .byte 0x56 + .8byte .LVL937 + .8byte .LFE2885 + .2byte 0x1 + .byte 0x56 + .8byte 0 + .8byte 0 +.LLST284: + .8byte .LVL926 + .8byte .LVL928 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST285: + .8byte .LVL927 + .8byte .LVL929 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST286: + .8byte .LVL921 + .8byte .LVL933 + .2byte 0x1 + .byte 0x69 + .8byte .LVL935 + .8byte .LVL937 + .2byte 0x1 + .byte 0x69 + .8byte .LVL939 + .8byte .LFE2885 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST287: + .8byte .LVL922 + .8byte .LVL932 + .2byte 0x1 + .byte 0x68 + .8byte .LVL935 + .8byte .LVL937 + .2byte 0x1 + .byte 0x68 + .8byte .LVL938 + .8byte .LVL940 + .2byte 0x1 + .byte 0x68 + .8byte .LVL941 + .8byte .LFE2885 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST288: + .8byte .LVL917 + .8byte .LVL918 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST289: + .8byte .LVL919 + .8byte .LVL930 + .2byte 0x1 + .byte 0x63 + .8byte .LVL935 + .8byte .LFE2885 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST290: + .8byte .LVL923 + .8byte .LVL933 + .2byte 0x1 + .byte 0x6a + .8byte .LVL935 + .8byte .LVL937 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST291: + .8byte .LVL925 + .8byte .LVL935 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST294: + .8byte .LVL989 + .8byte .LVL990-1 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST295: + .8byte .LVL988 + .8byte .LVL990-1 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST296: + .8byte .LVL992 + .8byte .LVL993 + .2byte 0x1 + .byte 0x54 + .8byte .LVL994 + .8byte .LVL995-1 + .2byte 0x1 + .byte 0x54 + .8byte 0 + .8byte 0 +.LLST297: + .8byte .LVL991 + .8byte .LVL995-1 + .2byte 0x1 + .byte 0x58 + .8byte 0 + .8byte 0 +.LLST329: + .8byte .LVL1195 + .8byte .LVL1196 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST330: + .8byte .LVL1195 + .8byte .LVL1197 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST331: + .8byte .LVL1195 + .8byte .LVL1202 + .2byte 0x1 + .byte 0x52 + .8byte .LVL1202 + .8byte .LVL1203-1 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST332: + .8byte .LVL1198 + .8byte .LVL1199 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1200 + .8byte .LVL1201 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST333: + .8byte .LVL1204 + .8byte .LVL1205 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1205 + .8byte .LVL1209 + .2byte 0x1 + .byte 0x63 + .8byte .LVL1210 + .8byte .LFE2893 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 + .section .debug_aranges,"",@progbits + .4byte 0x4c + .2byte 0x2 + .4byte .Ldebug_info0 + .byte 0x8 + .byte 0 + .2byte 0 + .2byte 0 + .8byte .Ltext0 + .8byte .Letext0-.Ltext0 + .8byte .LFB2875 + .8byte .LFE2875-.LFB2875 + .8byte .LFB2874 + .8byte .LFE2874-.LFB2874 + .8byte 0 + .8byte 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .8byte .LBB1132 + .8byte .LBE1132 + .8byte .LBB1163 + .8byte .LBE1163 + .8byte .LBB1164 + .8byte .LBE1164 + .8byte .LBB1516 + .8byte .LBE1516 + .8byte 0 + .8byte 0 + .8byte .LBB1135 + .8byte .LBE1135 + .8byte .LBB1147 + .8byte .LBE1147 + .8byte .LBB1148 + .8byte .LBE1148 + .8byte 0 + .8byte 0 + .8byte .LBB1151 + .8byte .LBE1151 + .8byte .LBB1156 + .8byte .LBE1156 + .8byte 0 + .8byte 0 + .8byte .LBB1165 + .8byte .LBE1165 + .8byte .LBB1502 + .8byte .LBE1502 + .8byte .LBB1503 + .8byte .LBE1503 + .8byte 0 + .8byte 0 + .8byte .LBB1166 + .8byte .LBE1166 + .8byte .LBB1199 + .8byte .LBE1199 + .8byte .LBB1200 + .8byte .LBE1200 + .8byte .LBB1201 + .8byte .LBE1201 + .8byte 0 + .8byte 0 + .8byte .LBB1169 + .8byte .LBE1169 + .8byte .LBB1182 + .8byte .LBE1182 + .8byte .LBB1191 + .8byte .LBE1191 + .8byte .LBB1192 + .8byte .LBE1192 + .8byte 0 + .8byte 0 + .8byte .LBB1185 + .8byte .LBE1185 + .8byte .LBB1190 + .8byte .LBE1190 + .8byte 0 + .8byte 0 + .8byte .LBB1202 + .8byte .LBE1202 + .8byte .LBB1508 + .8byte .LBE1508 + .8byte .LBB1509 + .8byte .LBE1509 + .8byte 0 + .8byte 0 + .8byte .LBB1205 + .8byte .LBE1205 + .8byte .LBB1225 + .8byte .LBE1225 + .8byte .LBB1226 + .8byte .LBE1226 + .8byte 0 + .8byte 0 + .8byte .LBB1219 + .8byte .LBE1219 + .8byte .LBB1224 + .8byte .LBE1224 + .8byte 0 + .8byte 0 + .8byte .LBB1231 + .8byte .LBE1231 + .8byte .LBB1266 + .8byte .LBE1266 + .8byte .LBB1504 + .8byte .LBE1504 + .8byte .LBB1505 + .8byte .LBE1505 + .8byte .LBB1517 + .8byte .LBE1517 + .8byte 0 + .8byte 0 + .8byte .LBB1234 + .8byte .LBE1234 + .8byte .LBB1247 + .8byte .LBE1247 + .8byte .LBB1256 + .8byte .LBE1256 + .8byte .LBB1257 + .8byte .LBE1257 + .8byte 0 + .8byte 0 + .8byte .LBB1250 + .8byte .LBE1250 + .8byte .LBB1255 + .8byte .LBE1255 + .8byte 0 + .8byte 0 + .8byte .LBB1267 + .8byte .LBE1267 + .8byte .LBB1494 + .8byte .LBE1494 + .8byte .LBB1495 + .8byte .LBE1495 + .8byte 0 + .8byte 0 + .8byte .LBB1270 + .8byte .LBE1270 + .8byte .LBB1290 + .8byte .LBE1290 + .8byte .LBB1291 + .8byte .LBE1291 + .8byte 0 + .8byte 0 + .8byte .LBB1284 + .8byte .LBE1284 + .8byte .LBB1289 + .8byte .LBE1289 + .8byte 0 + .8byte 0 + .8byte .LBB1296 + .8byte .LBE1296 + .8byte .LBB1329 + .8byte .LBE1329 + .8byte .LBB1510 + .8byte .LBE1510 + .8byte .LBB1511 + .8byte .LBE1511 + .8byte 0 + .8byte 0 + .8byte .LBB1299 + .8byte .LBE1299 + .8byte .LBB1312 + .8byte .LBE1312 + .8byte .LBB1321 + .8byte .LBE1321 + .8byte .LBB1322 + .8byte .LBE1322 + .8byte 0 + .8byte 0 + .8byte .LBB1315 + .8byte .LBE1315 + .8byte .LBB1320 + .8byte .LBE1320 + .8byte 0 + .8byte 0 + .8byte .LBB1330 + .8byte .LBE1330 + .8byte .LBB1365 + .8byte .LBE1365 + .8byte .LBB1506 + .8byte .LBE1506 + .8byte .LBB1507 + .8byte .LBE1507 + .8byte .LBB1515 + .8byte .LBE1515 + .8byte 0 + .8byte 0 + .8byte .LBB1333 + .8byte .LBE1333 + .8byte .LBB1346 + .8byte .LBE1346 + .8byte .LBB1355 + .8byte .LBE1355 + .8byte .LBB1356 + .8byte .LBE1356 + .8byte 0 + .8byte 0 + .8byte .LBB1349 + .8byte .LBE1349 + .8byte .LBB1354 + .8byte .LBE1354 + .8byte 0 + .8byte 0 + .8byte .LBB1366 + .8byte .LBE1366 + .8byte .LBB1401 + .8byte .LBE1401 + .8byte .LBB1496 + .8byte .LBE1496 + .8byte .LBB1497 + .8byte .LBE1497 + .8byte .LBB1513 + .8byte .LBE1513 + .8byte 0 + .8byte 0 + .8byte .LBB1369 + .8byte .LBE1369 + .8byte .LBB1382 + .8byte .LBE1382 + .8byte .LBB1383 + .8byte .LBE1383 + .8byte .LBB1384 + .8byte .LBE1384 + .8byte 0 + .8byte 0 + .8byte .LBB1387 + .8byte .LBE1387 + .8byte .LBB1392 + .8byte .LBE1392 + .8byte 0 + .8byte 0 + .8byte .LBB1402 + .8byte .LBE1402 + .8byte .LBB1500 + .8byte .LBE1500 + .8byte .LBB1501 + .8byte .LBE1501 + .8byte 0 + .8byte 0 + .8byte .LBB1405 + .8byte .LBE1405 + .8byte .LBB1425 + .8byte .LBE1425 + .8byte .LBB1426 + .8byte .LBE1426 + .8byte 0 + .8byte 0 + .8byte .LBB1419 + .8byte .LBE1419 + .8byte .LBB1424 + .8byte .LBE1424 + .8byte 0 + .8byte 0 + .8byte .LBB1431 + .8byte .LBE1431 + .8byte .LBB1498 + .8byte .LBE1498 + .8byte .LBB1499 + .8byte .LBE1499 + .8byte .LBB1518 + .8byte .LBE1518 + .8byte 0 + .8byte 0 + .8byte .LBB1434 + .8byte .LBE1434 + .8byte .LBB1454 + .8byte .LBE1454 + .8byte .LBB1455 + .8byte .LBE1455 + .8byte 0 + .8byte 0 + .8byte .LBB1448 + .8byte .LBE1448 + .8byte .LBB1453 + .8byte .LBE1453 + .8byte 0 + .8byte 0 + .8byte .LBB1462 + .8byte .LBE1462 + .8byte .LBB1492 + .8byte .LBE1492 + .8byte .LBB1493 + .8byte .LBE1493 + .8byte .LBB1512 + .8byte .LBE1512 + .8byte .LBB1514 + .8byte .LBE1514 + .8byte 0 + .8byte 0 + .8byte .LBB1465 + .8byte .LBE1465 + .8byte .LBB1476 + .8byte .LBE1476 + .8byte .LBB1477 + .8byte .LBE1477 + .8byte .LBB1478 + .8byte .LBE1478 + .8byte 0 + .8byte 0 + .8byte .LBB1519 + .8byte .LBE1519 + .8byte .LBB1564 + .8byte .LBE1564 + .8byte 0 + .8byte 0 + .8byte .LBB1520 + .8byte .LBE1520 + .8byte .LBB1561 + .8byte .LBE1561 + .8byte .LBB1563 + .8byte .LBE1563 + .8byte 0 + .8byte 0 + .8byte .LBB1521 + .8byte .LBE1521 + .8byte .LBB1539 + .8byte .LBE1539 + .8byte .LBB1540 + .8byte .LBE1540 + .8byte 0 + .8byte 0 + .8byte .LBB1522 + .8byte .LBE1522 + .8byte .LBB1523 + .8byte .LBE1523 + .8byte .LBB1538 + .8byte .LBE1538 + .8byte 0 + .8byte 0 + .8byte .LBB1524 + .8byte .LBE1524 + .8byte .LBB1536 + .8byte .LBE1536 + .8byte 0 + .8byte 0 + .8byte .LBB1525 + .8byte .LBE1525 + .8byte .LBB1537 + .8byte .LBE1537 + .8byte 0 + .8byte 0 + .8byte .LBB1526 + .8byte .LBE1526 + .8byte .LBB1535 + .8byte .LBE1535 + .8byte 0 + .8byte 0 + .8byte .LBB1527 + .8byte .LBE1527 + .8byte .LBB1533 + .8byte .LBE1533 + .8byte 0 + .8byte 0 + .8byte .LBB1528 + .8byte .LBE1528 + .8byte .LBB1534 + .8byte .LBE1534 + .8byte 0 + .8byte 0 + .8byte .LBB1529 + .8byte .LBE1529 + .8byte .LBB1532 + .8byte .LBE1532 + .8byte 0 + .8byte 0 + .8byte .LBB1530 + .8byte .LBE1530 + .8byte .LBB1531 + .8byte .LBE1531 + .8byte 0 + .8byte 0 + .8byte .LBB1541 + .8byte .LBE1541 + .8byte .LBB1562 + .8byte .LBE1562 + .8byte 0 + .8byte 0 + .8byte .LBB1542 + .8byte .LBE1542 + .8byte .LBB1560 + .8byte .LBE1560 + .8byte 0 + .8byte 0 + .8byte .LBB1543 + .8byte .LBE1543 + .8byte .LBB1544 + .8byte .LBE1544 + .8byte .LBB1559 + .8byte .LBE1559 + .8byte 0 + .8byte 0 + .8byte .LBB1545 + .8byte .LBE1545 + .8byte .LBB1558 + .8byte .LBE1558 + .8byte 0 + .8byte 0 + .8byte .LBB1546 + .8byte .LBE1546 + .8byte .LBB1556 + .8byte .LBE1556 + .8byte 0 + .8byte 0 + .8byte .LBB1547 + .8byte .LBE1547 + .8byte .LBB1557 + .8byte .LBE1557 + .8byte 0 + .8byte 0 + .8byte .LBB1548 + .8byte .LBE1548 + .8byte .LBB1553 + .8byte .LBE1553 + .8byte 0 + .8byte 0 + .8byte .LBB1549 + .8byte .LBE1549 + .8byte .LBB1554 + .8byte .LBE1554 + .8byte 0 + .8byte 0 + .8byte .LBB1550 + .8byte .LBE1550 + .8byte .LBB1555 + .8byte .LBE1555 + .8byte 0 + .8byte 0 + .8byte .LBB1551 + .8byte .LBE1551 + .8byte .LBB1552 + .8byte .LBE1552 + .8byte 0 + .8byte 0 + .8byte .LBB1565 + .8byte .LBE1565 + .8byte .LBB1585 + .8byte .LBE1585 + .8byte 0 + .8byte 0 + .8byte .LBB1566 + .8byte .LBE1566 + .8byte .LBB1584 + .8byte .LBE1584 + .8byte 0 + .8byte 0 + .8byte .LBB1567 + .8byte .LBE1567 + .8byte .LBB1568 + .8byte .LBE1568 + .8byte .LBB1582 + .8byte .LBE1582 + .8byte 0 + .8byte 0 + .8byte .LBB1569 + .8byte .LBE1569 + .8byte .LBB1583 + .8byte .LBE1583 + .8byte 0 + .8byte 0 + .8byte .LBB1570 + .8byte .LBE1570 + .8byte .LBB1581 + .8byte .LBE1581 + .8byte 0 + .8byte 0 + .8byte .LBB1571 + .8byte .LBE1571 + .8byte .LBB1579 + .8byte .LBE1579 + .8byte 0 + .8byte 0 + .8byte .LBB1572 + .8byte .LBE1572 + .8byte .LBB1580 + .8byte .LBE1580 + .8byte 0 + .8byte 0 + .8byte .LBB1573 + .8byte .LBE1573 + .8byte .LBB1578 + .8byte .LBE1578 + .8byte 0 + .8byte 0 + .8byte .LBB1574 + .8byte .LBE1574 + .8byte .LBB1577 + .8byte .LBE1577 + .8byte 0 + .8byte 0 + .8byte .LBB1575 + .8byte .LBE1575 + .8byte .LBB1576 + .8byte .LBE1576 + .8byte 0 + .8byte 0 + .8byte .LBB1590 + .8byte .LBE1590 + .8byte .LBB1593 + .8byte .LBE1593 + .8byte 0 + .8byte 0 + .8byte .LBB1596 + .8byte .LBE1596 + .8byte .LBB1601 + .8byte .LBE1601 + .8byte .LBB1602 + .8byte .LBE1602 + .8byte .LBB1603 + .8byte .LBE1603 + .8byte 0 + .8byte 0 + .8byte .LBB1610 + .8byte .LBE1610 + .8byte .LBB1619 + .8byte .LBE1619 + .8byte .LBB1620 + .8byte .LBE1620 + .8byte .LBB1631 + .8byte .LBE1631 + .8byte 0 + .8byte 0 + .8byte .LBB1612 + .8byte .LBE1612 + .8byte .LBB1615 + .8byte .LBE1615 + .8byte 0 + .8byte 0 + .8byte .LBB1621 + .8byte .LBE1621 + .8byte .LBB1625 + .8byte .LBE1625 + .8byte .LBB1626 + .8byte .LBE1626 + .8byte 0 + .8byte 0 + .8byte .LBB1644 + .8byte .LBE1644 + .8byte .LBB1723 + .8byte .LBE1723 + .8byte .LBB1724 + .8byte .LBE1724 + .8byte .LBB1725 + .8byte .LBE1725 + .8byte 0 + .8byte 0 + .8byte .LBB1646 + .8byte .LBE1646 + .8byte .LBB1663 + .8byte .LBE1663 + .8byte .LBB1664 + .8byte .LBE1664 + .8byte .LBB1665 + .8byte .LBE1665 + .8byte .LBB1666 + .8byte .LBE1666 + .8byte .LBB1667 + .8byte .LBE1667 + .8byte .LBB1668 + .8byte .LBE1668 + .8byte .LBB1669 + .8byte .LBE1669 + .8byte .LBB1670 + .8byte .LBE1670 + .8byte .LBB1671 + .8byte .LBE1671 + .8byte .LBB1672 + .8byte .LBE1672 + .8byte .LBB1673 + .8byte .LBE1673 + .8byte .LBB1674 + .8byte .LBE1674 + .8byte .LBB1675 + .8byte .LBE1675 + .8byte .LBB1676 + .8byte .LBE1676 + .8byte .LBB1677 + .8byte .LBE1677 + .8byte 0 + .8byte 0 + .8byte .LBB1681 + .8byte .LBE1681 + .8byte .LBB1726 + .8byte .LBE1726 + .8byte .LBB1727 + .8byte .LBE1727 + .8byte .LBB1728 + .8byte .LBE1728 + .8byte .LBB1729 + .8byte .LBE1729 + .8byte 0 + .8byte 0 + .8byte .LBB1683 + .8byte .LBE1683 + .8byte .LBB1702 + .8byte .LBE1702 + .8byte .LBB1703 + .8byte .LBE1703 + .8byte .LBB1704 + .8byte .LBE1704 + .8byte .LBB1705 + .8byte .LBE1705 + .8byte .LBB1706 + .8byte .LBE1706 + .8byte .LBB1707 + .8byte .LBE1707 + .8byte .LBB1708 + .8byte .LBE1708 + .8byte .LBB1709 + .8byte .LBE1709 + .8byte .LBB1710 + .8byte .LBE1710 + .8byte .LBB1711 + .8byte .LBE1711 + .8byte .LBB1712 + .8byte .LBE1712 + .8byte .LBB1713 + .8byte .LBE1713 + .8byte .LBB1714 + .8byte .LBE1714 + .8byte .LBB1715 + .8byte .LBE1715 + .8byte .LBB1716 + .8byte .LBE1716 + .8byte .LBB1717 + .8byte .LBE1717 + .8byte .LBB1718 + .8byte .LBE1718 + .8byte 0 + .8byte 0 + .8byte .LBB1730 + .8byte .LBE1730 + .8byte .LBB1771 + .8byte .LBE1771 + .8byte .LBB1772 + .8byte .LBE1772 + .8byte .LBB1773 + .8byte .LBE1773 + .8byte 0 + .8byte 0 + .8byte .LBB1732 + .8byte .LBE1732 + .8byte .LBB1751 + .8byte .LBE1751 + .8byte .LBB1752 + .8byte .LBE1752 + .8byte .LBB1753 + .8byte .LBE1753 + .8byte .LBB1754 + .8byte .LBE1754 + .8byte .LBB1755 + .8byte .LBE1755 + .8byte .LBB1756 + .8byte .LBE1756 + .8byte .LBB1757 + .8byte .LBE1757 + .8byte .LBB1758 + .8byte .LBE1758 + .8byte .LBB1759 + .8byte .LBE1759 + .8byte .LBB1760 + .8byte .LBE1760 + .8byte .LBB1761 + .8byte .LBE1761 + .8byte .LBB1762 + .8byte .LBE1762 + .8byte .LBB1763 + .8byte .LBE1763 + .8byte .LBB1764 + .8byte .LBE1764 + .8byte .LBB1765 + .8byte .LBE1765 + .8byte .LBB1766 + .8byte .LBE1766 + .8byte .LBB1767 + .8byte .LBE1767 + .8byte 0 + .8byte 0 + .8byte .LBB1778 + .8byte .LBE1778 + .8byte .LBB1785 + .8byte .LBE1785 + .8byte .LBB1786 + .8byte .LBE1786 + .8byte 0 + .8byte 0 + .8byte .LBB1779 + .8byte .LBE1779 + .8byte .LBB1784 + .8byte .LBE1784 + .8byte 0 + .8byte 0 + .8byte .LBB1938 + .8byte .LBE1938 + .8byte .LBB1941 + .8byte .LBE1941 + .8byte 0 + .8byte 0 + .8byte .LBB1948 + .8byte .LBE1948 + .8byte .LBB2028 + .8byte .LBE2028 + .8byte .LBB2029 + .8byte .LBE2029 + .8byte .LBB2030 + .8byte .LBE2030 + .8byte 0 + .8byte 0 + .8byte .LBB1950 + .8byte .LBE1950 + .8byte .LBB1959 + .8byte .LBE1959 + .8byte .LBB1960 + .8byte .LBE1960 + .8byte .LBB1961 + .8byte .LBE1961 + .8byte 0 + .8byte 0 + .8byte .LBB2031 + .8byte .LBE2031 + .8byte .LBB2044 + .8byte .LBE2044 + .8byte .LBB2100 + .8byte .LBE2100 + .8byte .LBB2104 + .8byte .LBE2104 + .8byte .LBB2107 + .8byte .LBE2107 + .8byte .LBB2109 + .8byte .LBE2109 + .8byte .LBB2110 + .8byte .LBE2110 + .8byte .LBB2112 + .8byte .LBE2112 + .8byte 0 + .8byte 0 + .8byte .LBB2033 + .8byte .LBE2033 + .8byte .LBB2036 + .8byte .LBE2036 + .8byte 0 + .8byte 0 + .8byte .LBB2045 + .8byte .LBE2045 + .8byte .LBB2055 + .8byte .LBE2055 + .8byte .LBB2103 + .8byte .LBE2103 + .8byte .LBB2111 + .8byte .LBE2111 + .8byte .LBB2114 + .8byte .LBE2114 + .8byte 0 + .8byte 0 + .8byte .LBB2047 + .8byte .LBE2047 + .8byte .LBB2050 + .8byte .LBE2050 + .8byte 0 + .8byte 0 + .8byte .LBB2056 + .8byte .LBE2056 + .8byte .LBB2105 + .8byte .LBE2105 + .8byte .LBB2106 + .8byte .LBE2106 + .8byte .LBB2108 + .8byte .LBE2108 + .8byte 0 + .8byte 0 + .8byte .LBB2070 + .8byte .LBE2070 + .8byte .LBB2073 + .8byte .LBE2073 + .8byte 0 + .8byte 0 + .8byte .LBB2074 + .8byte .LBE2074 + .8byte .LBB2101 + .8byte .LBE2101 + .8byte .LBB2102 + .8byte .LBE2102 + .8byte .LBB2113 + .8byte .LBE2113 + .8byte 0 + .8byte 0 + .8byte .LBB2081 + .8byte .LBE2081 + .8byte .LBB2084 + .8byte .LBE2084 + .8byte 0 + .8byte 0 + .8byte .LBB2088 + .8byte .LBE2088 + .8byte .LBB2091 + .8byte .LBE2091 + .8byte 0 + .8byte 0 + .8byte .LBB2125 + .8byte .LBE2125 + .8byte .LBB2133 + .8byte .LBE2133 + .8byte .LBB2137 + .8byte .LBE2137 + .8byte .LBB2161 + .8byte .LBE2161 + .8byte .LBB2163 + .8byte .LBE2163 + .8byte .LBB2174 + .8byte .LBE2174 + .8byte .LBB2182 + .8byte .LBE2182 + .8byte 0 + .8byte 0 + .8byte .LBB2126 + .8byte .LBE2126 + .8byte .LBB2132 + .8byte .LBE2132 + .8byte .LBB2138 + .8byte .LBE2138 + .8byte .LBB2162 + .8byte .LBE2162 + .8byte .LBB2164 + .8byte .LBE2164 + .8byte .LBB2166 + .8byte .LBE2166 + .8byte .LBB2179 + .8byte .LBE2179 + .8byte .LBB2189 + .8byte .LBE2189 + .8byte 0 + .8byte 0 + .8byte .LBB2127 + .8byte .LBE2127 + .8byte .LBB2131 + .8byte .LBE2131 + .8byte .LBB2139 + .8byte .LBE2139 + .8byte .LBB2165 + .8byte .LBE2165 + .8byte .LBB2167 + .8byte .LBE2167 + .8byte .LBB2169 + .8byte .LBE2169 + .8byte .LBB2177 + .8byte .LBE2177 + .8byte .LBB2186 + .8byte .LBE2186 + .8byte 0 + .8byte 0 + .8byte .LBB2128 + .8byte .LBE2128 + .8byte .LBB2130 + .8byte .LBE2130 + .8byte .LBB2140 + .8byte .LBE2140 + .8byte .LBB2168 + .8byte .LBE2168 + .8byte .LBB2170 + .8byte .LBE2170 + .8byte .LBB2175 + .8byte .LBE2175 + .8byte .LBB2185 + .8byte .LBE2185 + .8byte 0 + .8byte 0 + .8byte .LBB2129 + .8byte .LBE2129 + .8byte .LBB2141 + .8byte .LBE2141 + .8byte .LBB2143 + .8byte .LBE2143 + .8byte 0 + .8byte 0 + .8byte .LBB2134 + .8byte .LBE2134 + .8byte .LBB2173 + .8byte .LBE2173 + .8byte .LBB2180 + .8byte .LBE2180 + .8byte .LBB2183 + .8byte .LBE2183 + .8byte .LBB2184 + .8byte .LBE2184 + .8byte 0 + .8byte 0 + .8byte .LBB2135 + .8byte .LBE2135 + .8byte .LBB2172 + .8byte .LBE2172 + .8byte .LBB2178 + .8byte .LBE2178 + .8byte .LBB2188 + .8byte .LBE2188 + .8byte 0 + .8byte 0 + .8byte .LBB2136 + .8byte .LBE2136 + .8byte .LBB2171 + .8byte .LBE2171 + .8byte .LBB2176 + .8byte .LBE2176 + .8byte .LBB2187 + .8byte .LBE2187 + .8byte 0 + .8byte 0 + .8byte .LBB2142 + .8byte .LBE2142 + .8byte .LBB2158 + .8byte .LBE2158 + .8byte .LBB2159 + .8byte .LBE2159 + .8byte .LBB2160 + .8byte .LBE2160 + .8byte .LBB2181 + .8byte .LBE2181 + .8byte 0 + .8byte 0 + .8byte .LBB2144 + .8byte .LBE2144 + .8byte .LBB2145 + .8byte .LBE2145 + .8byte .LBB2190 + .8byte .LBE2190 + .8byte .LBB2202 + .8byte .LBE2202 + .8byte .LBB2204 + .8byte .LBE2204 + .8byte .LBB2205 + .8byte .LBE2205 + .8byte 0 + .8byte 0 + .8byte .LBB2146 + .8byte .LBE2146 + .8byte .LBB2147 + .8byte .LBE2147 + .8byte .LBB2191 + .8byte .LBE2191 + .8byte .LBB2201 + .8byte .LBE2201 + .8byte .LBB2206 + .8byte .LBE2206 + .8byte 0 + .8byte 0 + .8byte .LBB2148 + .8byte .LBE2148 + .8byte .LBB2149 + .8byte .LBE2149 + .8byte .LBB2192 + .8byte .LBE2192 + .8byte .LBB2200 + .8byte .LBE2200 + .8byte .LBB2207 + .8byte .LBE2207 + .8byte 0 + .8byte 0 + .8byte .LBB2150 + .8byte .LBE2150 + .8byte .LBB2151 + .8byte .LBE2151 + .8byte .LBB2193 + .8byte .LBE2193 + .8byte .LBB2199 + .8byte .LBE2199 + .8byte .LBB2208 + .8byte .LBE2208 + .8byte 0 + .8byte 0 + .8byte .LBB2152 + .8byte .LBE2152 + .8byte .LBB2153 + .8byte .LBE2153 + .8byte .LBB2194 + .8byte .LBE2194 + .8byte .LBB2198 + .8byte .LBE2198 + .8byte .LBB2209 + .8byte .LBE2209 + .8byte 0 + .8byte 0 + .8byte .LBB2154 + .8byte .LBE2154 + .8byte .LBB2155 + .8byte .LBE2155 + .8byte .LBB2195 + .8byte .LBE2195 + .8byte .LBB2197 + .8byte .LBE2197 + .8byte .LBB2210 + .8byte .LBE2210 + .8byte 0 + .8byte 0 + .8byte .LBB2156 + .8byte .LBE2156 + .8byte .LBB2157 + .8byte .LBE2157 + .8byte .LBB2196 + .8byte .LBE2196 + .8byte .LBB2203 + .8byte .LBE2203 + .8byte 0 + .8byte 0 + .8byte .LBB2298 + .8byte .LBE2298 + .8byte .LBB2313 + .8byte .LBE2313 + .8byte .LBB2314 + .8byte .LBE2314 + .8byte .LBB2315 + .8byte .LBE2315 + .8byte .LBB2395 + .8byte .LBE2395 + .8byte 0 + .8byte 0 + .8byte .LBB2300 + .8byte .LBE2300 + .8byte .LBB2304 + .8byte .LBE2304 + .8byte .LBB2305 + .8byte .LBE2305 + .8byte .LBB2306 + .8byte .LBE2306 + .8byte .LBB2307 + .8byte .LBE2307 + .8byte .LBB2308 + .8byte .LBE2308 + .8byte 0 + .8byte 0 + .8byte .LBB2301 + .8byte .LBE2301 + .8byte .LBB2302 + .8byte .LBE2302 + .8byte .LBB2303 + .8byte .LBE2303 + .8byte 0 + .8byte 0 + .8byte .LBB2316 + .8byte .LBE2316 + .8byte .LBB2369 + .8byte .LBE2369 + .8byte .LBB2370 + .8byte .LBE2370 + .8byte .LBB2371 + .8byte .LBE2371 + .8byte .LBB2372 + .8byte .LBE2372 + .8byte .LBB2373 + .8byte .LBE2373 + .8byte .LBB2374 + .8byte .LBE2374 + .8byte 0 + .8byte 0 + .8byte .LBB2318 + .8byte .LBE2318 + .8byte .LBB2329 + .8byte .LBE2329 + .8byte .LBB2330 + .8byte .LBE2330 + .8byte .LBB2344 + .8byte .LBE2344 + .8byte .LBB2353 + .8byte .LBE2353 + .8byte .LBB2360 + .8byte .LBE2360 + .8byte 0 + .8byte 0 + .8byte .LBB2319 + .8byte .LBE2319 + .8byte .LBB2331 + .8byte .LBE2331 + .8byte .LBB2332 + .8byte .LBE2332 + .8byte .LBB2346 + .8byte .LBE2346 + .8byte .LBB2349 + .8byte .LBE2349 + .8byte .LBB2361 + .8byte .LBE2361 + .8byte 0 + .8byte 0 + .8byte .LBB2320 + .8byte .LBE2320 + .8byte .LBB2333 + .8byte .LBE2333 + .8byte .LBB2334 + .8byte .LBE2334 + .8byte .LBB2340 + .8byte .LBE2340 + .8byte .LBB2348 + .8byte .LBE2348 + .8byte .LBB2356 + .8byte .LBE2356 + .8byte 0 + .8byte 0 + .8byte .LBB2321 + .8byte .LBE2321 + .8byte .LBB2335 + .8byte .LBE2335 + .8byte .LBB2336 + .8byte .LBE2336 + .8byte .LBB2341 + .8byte .LBE2341 + .8byte .LBB2351 + .8byte .LBE2351 + .8byte .LBB2359 + .8byte .LBE2359 + .8byte 0 + .8byte 0 + .8byte .LBB2322 + .8byte .LBE2322 + .8byte .LBB2337 + .8byte .LBE2337 + .8byte .LBB2338 + .8byte .LBE2338 + .8byte .LBB2339 + .8byte .LBE2339 + .8byte .LBB2347 + .8byte .LBE2347 + .8byte .LBB2355 + .8byte .LBE2355 + .8byte 0 + .8byte 0 + .8byte .LBB2323 + .8byte .LBE2323 + .8byte .LBB2324 + .8byte .LBE2324 + .8byte .LBB2342 + .8byte .LBE2342 + .8byte .LBB2350 + .8byte .LBE2350 + .8byte .LBB2357 + .8byte .LBE2357 + .8byte 0 + .8byte 0 + .8byte .LBB2325 + .8byte .LBE2325 + .8byte .LBB2326 + .8byte .LBE2326 + .8byte .LBB2343 + .8byte .LBE2343 + .8byte .LBB2352 + .8byte .LBE2352 + .8byte .LBB2358 + .8byte .LBE2358 + .8byte 0 + .8byte 0 + .8byte .LBB2327 + .8byte .LBE2327 + .8byte .LBB2328 + .8byte .LBE2328 + .8byte .LBB2345 + .8byte .LBE2345 + .8byte .LBB2354 + .8byte .LBE2354 + .8byte .LBB2362 + .8byte .LBE2362 + .8byte 0 + .8byte 0 + .8byte .LBB2377 + .8byte .LBE2377 + .8byte .LBB2426 + .8byte .LBE2426 + .8byte 0 + .8byte 0 + .8byte .LBB2380 + .8byte .LBE2380 + .8byte .LBB2444 + .8byte .LBE2444 + .8byte 0 + .8byte 0 + .8byte .LBB2381 + .8byte .LBE2381 + .8byte .LBB2439 + .8byte .LBE2439 + .8byte .LBB2445 + .8byte .LBE2445 + .8byte 0 + .8byte 0 + .8byte .LBB2385 + .8byte .LBE2385 + .8byte .LBB2391 + .8byte .LBE2391 + .8byte 0 + .8byte 0 + .8byte .LBB2388 + .8byte .LBE2388 + .8byte .LBB2390 + .8byte .LBE2390 + .8byte 0 + .8byte 0 + .8byte .LBB2392 + .8byte .LBE2392 + .8byte .LBB2453 + .8byte .LBE2453 + .8byte 0 + .8byte 0 + .8byte .LBB2401 + .8byte .LBE2401 + .8byte .LBB2455 + .8byte .LBE2455 + .8byte 0 + .8byte 0 + .8byte .LBB2408 + .8byte .LBE2408 + .8byte .LBB2451 + .8byte .LBE2451 + .8byte 0 + .8byte 0 + .8byte .LBB2412 + .8byte .LBE2412 + .8byte .LBB2450 + .8byte .LBE2450 + .8byte 0 + .8byte 0 + .8byte .LBB2416 + .8byte .LBE2416 + .8byte .LBB2422 + .8byte .LBE2422 + .8byte 0 + .8byte 0 + .8byte .LBB2419 + .8byte .LBE2419 + .8byte .LBB2421 + .8byte .LBE2421 + .8byte 0 + .8byte 0 + .8byte .LBB2423 + .8byte .LBE2423 + .8byte .LBB2427 + .8byte .LBE2427 + .8byte 0 + .8byte 0 + .8byte .LBB2428 + .8byte .LBE2428 + .8byte .LBB2440 + .8byte .LBE2440 + .8byte .LBB2449 + .8byte .LBE2449 + .8byte .LBB2454 + .8byte .LBE2454 + .8byte 0 + .8byte 0 + .8byte .LBB2441 + .8byte .LBE2441 + .8byte .LBB2452 + .8byte .LBE2452 + .8byte 0 + .8byte 0 + .8byte .LBB2456 + .8byte .LBE2456 + .8byte .LBB2463 + .8byte .LBE2463 + .8byte .LBB2464 + .8byte .LBE2464 + .8byte 0 + .8byte 0 + .8byte .LBB2457 + .8byte .LBE2457 + .8byte .LBB2462 + .8byte .LBE2462 + .8byte 0 + .8byte 0 + .8byte .Ltext0 + .8byte .Letext0 + .8byte .LFB2875 + .8byte .LFE2875 + .8byte .LFB2874 + .8byte .LFE2874 + .8byte 0 + .8byte 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF881: + .string "sival_int" +.LASF2594: + .string "PE_SIZE_PTE" +.LASF2337: + .string "device_attribute" +.LASF170: + .string "line" +.LASF1821: + .string "link" +.LASF660: + .string "start_time" +.LASF2069: + .string "kernfs_node" +.LASF2213: + .string "RPM_REQ_IDLE" +.LASF2349: + .string "suppliers" +.LASF3047: + .string "ebc_buffer_manage_init" +.LASF2850: + .string "EPD_FULL_GCC16" +.LASF38: + .string "dev_t" +.LASF1941: + .string "show_options2" +.LASF2596: + .string "PE_SIZE_PUD" +.LASF2559: + .string "__tracepoint_page_ref_mod" +.LASF2961: + .string "full_mode_num" +.LASF1013: + .string "nr_wakeups" +.LASF1849: + .string "start" +.LASF1307: + .string "start_brk" +.LASF100: + .string "read" +.LASF1648: + .string "d_ino_softlimit" +.LASF1937: + .string "copy_mnt_data" +.LASF1748: + .string "WRITE_LIFE_LONG" +.LASF2283: + .string "dev_pm_qos" +.LASF1170: + .string "UTASK_RUNNING" +.LASF165: + .string "hex_asc" +.LASF1038: + .string "watchdog_stamp" +.LASF2806: + .string "WAKE_LOCK_TYPE_COUNT" +.LASF2682: + .string "Elf64_Word" +.LASF833: + .string "PCPU_FC_PAGE" +.LASF2126: + .string "kset_uevent_ops" +.LASF371: + .string "__cpu_present_mask" +.LASF1417: + .string "zone_padding" +.LASF182: + .string "TT_NONE" +.LASF1636: + .string "acquire_dquot" +.LASF2181: + .string "coherent_dma_mask" +.LASF2329: + .string "dev_kobj" +.LASF475: + .string "d_release" +.LASF3187: + .string "get_arch_dma_ops" +.LASF305: + .string "__ctors_start" +.LASF577: + .string "state" +.LASF524: + .string "s_d_op" +.LASF2945: + .string "ebc_buffer_vir" +.LASF879: + .string "node_states" +.LASF2877: + .string "pmic_power_req" +.LASF871: + .string "hrtimer_resolution" +.LASF256: + .string "FTR_HIGHER_OR_ZERO_SAFE" +.LASF1057: + .string "need_qs" +.LASF2982: + .string "frame_control_timer" +.LASF137: + .string "panic_notifier_list" +.LASF1533: + .string "compact_defer_shift" +.LASF259: + .string "visible" +.LASF52: + .string "blkcnt_t" +.LASF1101: + .string "icq_tree" +.LASF916: + .string "si_code" +.LASF648: + .string "thread_node" +.LASF3106: + .string "temperature" +.LASF1270: + .string "map_pages" +.LASF544: + .string "vfsmount" +.LASF2199: + .string "iommu_fwspec" +.LASF345: + .string "tp2_value" +.LASF2421: + .string "nargs" +.LASF1510: + .string "vm_node_stat_diff" +.LASF1130: + .string "attributes" +.LASF1987: + .string "fs_kobj" +.LASF2520: + .string "TASKLET_SOFTIRQ" +.LASF1388: + .string "inodes_stat" +.LASF252: + .string "ftr_type" +.LASF650: + .string "set_child_tid" +.LASF887: + .string "_overrun" +.LASF159: + .string "system_state" +.LASF795: + .string "system_wq" +.LASF603: + .string "rcu_read_lock_nesting" +.LASF2979: + .string "suspend_lock" +.LASF2498: + .string "gpio_desc" +.LASF932: + .string "list" +.LASF3204: + .string "_copy_from_user" +.LASF3230: + .string "get_order" +.LASF915: + .string "si_errno" +.LASF534: + .string "s_inode_lru" +.LASF2659: + .string "sysctl_stat_interval" +.LASF1094: + .string "blk_plug" +.LASF2754: + .string "modules_disabled" +.LASF2612: + .string "PGSCAN_SKIP_DMA32" +.LASF546: + .string "sysctl_vfs_cache_pressure" +.LASF2598: + .string "compound_page_dtor" +.LASF803: + .string "refs" +.LASF1732: + .string "trace_events" +.LASF1311: + .string "env_start" +.LASF2886: + .string "DMA_FROM_DEVICE" +.LASF755: + .string "cpu_number" +.LASF404: + .string "d_flags" +.LASF1281: + .string "mm_rb" +.LASF2155: + .string "freeze_late" +.LASF3069: + .string "buf_info" +.LASF409: + .string "d_inode" +.LASF1800: + .string "hd_struct" +.LASF1171: + .string "UTASK_SSTEP" +.LASF638: + .string "real_parent" +.LASF218: + .string "locked" +.LASF73: + .string "exitcall_t" +.LASF2920: + .string "regs" +.LASF1007: + .string "slice_max" +.LASF671: + .string "last_switch_count" +.LASF2137: + .string "n_node" +.LASF1592: + .string "qsize_t" +.LASF3227: + .string "devm_kzalloc" +.LASF380: + .string "sequence" +.LASF2499: + .string "i2c_adapter_quirks" +.LASF673: + .string "files" +.LASF1331: + .string "file_caps_enabled" +.LASF2962: + .string "diff_percent" +.LASF1881: + .string "lock_manager_operations" +.LASF1670: + .string "s_state" +.LASF1036: + .string "run_list" +.LASF2521: + .string "SCHED_SOFTIRQ" +.LASF1898: + .string "fa_lock" +.LASF2742: + .string "mov0" +.LASF2743: + .string "mov1" +.LASF2744: + .string "mov2" +.LASF2772: + .string "module_sect_attrs" +.LASF1839: + .string "flc_lock" +.LASF1179: + .string "return_instance" +.LASF2723: + .string "param_ops_uint" +.LASF861: + .string "softirq_activated" +.LASF3026: + .string "pdev" +.LASF797: + .string "system_long_wq" +.LASF157: + .string "SYSTEM_RESTART" +.LASF2226: + .string "is_prepared" +.LASF1986: + .string "uevent_suppress" +.LASF1486: + .string "node_id" +.LASF1554: + .string "contig_page_data" +.LASF2262: + .string "autosuspend_delay" +.LASF3042: + .string "buffer_in" +.LASF3: + .string "unsigned int" +.LASF899: + .string "_addr_bnd" +.LASF161: + .string "c_true" +.LASF1546: + .string "notifier_call" +.LASF3074: + .string "ebc_exit" +.LASF1801: + .string "gendisk" +.LASF1661: + .string "spc_timelimit" +.LASF512: + .string "s_instances" +.LASF2866: + .string "EPD_AUTO_DU" +.LASF2704: + .string "sh_size" +.LASF771: + .string "desc" +.LASF379: + .string "seqcount" +.LASF320: + .string "__hyp_idmap_text_start" +.LASF405: + .string "d_seq" +.LASF941: + .string "rb_subtree_gap" +.LASF1511: + .string "zone_type" +.LASF47: + .string "size_t" +.LASF209: + .string "compat_elf_hwcap" +.LASF3308: + .string "prepare_to_wait_event" +.LASF1078: + .string "cap_permitted" +.LASF3018: + .string "__addressable_ebc_init3831" +.LASF183: + .string "TT_NATIVE" +.LASF1520: + .string "zone_pgdat" +.LASF548: + .string "pid_type" +.LASF1656: + .string "d_rt_spc_softlimit" +.LASF42: + .string "bool" +.LASF372: + .string "__cpu_active_mask" +.LASF2370: + .string "map_page" +.LASF609: + .string "rcu_tasks_idx" +.LASF608: + .string "rcu_tasks_holdout" +.LASF1247: + .string "f_count" +.LASF1737: + .string "target_list" +.LASF1353: + .string "RCU_BH_SYNC" +.LASF284: + .string "__init_end" +.LASF1539: + .string "zoneref" +.LASF2761: + .string "module_layout" +.LASF527: + .string "s_remove_count" +.LASF217: + .string "__reserved" +.LASF910: + .string "_sigfault" +.LASF2827: + .string "ebc_buf_status" +.LASF1775: + .string "empty_aops" +.LASF87: + .string "atomic_long_t" +.LASF2079: + .string "prealloc" +.LASF1273: + .string "pfn_mkwrite" +.LASF70: + .string "callback_head" +.LASF342: + .string "perf_event" +.LASF1256: + .string "f_security" +.LASF452: + .string "i_sb_list" +.LASF2465: + .string "detected" +.LASF774: + .string "read_cntpct_el0" +.LASF1289: + .string "pgtables_bytes" +.LASF1815: + .string "get_link" +.LASF55: + .string "fmode_t" +.LASF2192: + .string "devt" +.LASF918: + .string "siginfo_t" +.LASF2152: + .string "restore" +.LASF1366: + .string "delayed_call" +.LASF890: + .string "_status" +.LASF2875: + .string "pmic_name" +.LASF1432: + .string "NR_FREE_CMA_PAGES" +.LASF2396: + .string "kernel_ulong_t" +.LASF2179: + .string "dma_ops" +.LASF2108: + .string "bin_attribute" +.LASF1571: + .string "percpu_counter" +.LASF2981: + .string "first_in" +.LASF2297: + .string "dev_groups" +.LASF2927: + .string "image_addr_set" +.LASF301: + .string "__softirqentry_text_start" +.LASF321: + .string "__hyp_idmap_text_end" +.LASF632: + .string "memcg_kmem_skip_account" +.LASF2343: + .string "dl_dev_state" +.LASF866: + .string "expires_next" +.LASF2056: + .string "ida_bitmap" +.LASF446: + .string "i_io_list" +.LASF1897: + .string "fasync_struct" +.LASF2258: + .string "links_count" +.LASF2602: + .string "PGPGOUT" +.LASF1630: + .string "release_dqblk" +.LASF188: + .string "uaddr2" +.LASF30: + .string "__kernel_timer_t" +.LASF1722: + .string "notes_attrs" +.LASF2452: + .string "irqchip_fwnode_ops" +.LASF1582: + .string "dq_id" +.LASF3143: + .string "frame_count_tmp" +.LASF3155: + .string "image_fb" +.LASF1757: + .string "write_end" +.LASF1467: + .string "NR_ION_HEAP_POOL" +.LASF1392: + .string "sysctl_protected_hardlinks" +.LASF3300: + .string "__arch_copy_from_user" +.LASF1145: + .string "scan_objects" +.LASF1521: + .string "pageset" +.LASF1206: + .string "wb_err" +.LASF3201: + .string "copy_to_user" +.LASF734: + .string "trace_recursion" +.LASF1305: + .string "start_data" +.LASF1751: + .string "writepage" +.LASF1981: + .string "kref" +.LASF1082: + .string "jit_keyring" +.LASF169: + .string "file_disp" +.LASF3132: + .string "auto_need_refresh" +.LASF2812: + .string "WF_TYPE_GRAY2" +.LASF1060: + .string "rcu_special" +.LASF651: + .string "clear_child_tid" +.LASF698: + .string "backing_dev_info" +.LASF2517: + .string "NET_RX_SOFTIRQ" +.LASF2397: + .string "platform_device_id" +.LASF537: + .string "s_stack_depth" +.LASF1298: + .string "data_vm" +.LASF11: + .string "__s32" +.LASF2454: + .string "i2c_msg" +.LASF768: + .string "ate_match_acpi_oem_info" +.LASF392: + .string "nr_dentry" +.LASF2151: + .string "poweroff" +.LASF2045: + .string "stop" +.LASF2564: + .string "__tracepoint_page_ref_unfreeze" +.LASF2033: + .string "ratelimit_state" +.LASF531: + .string "s_pins" +.LASF2496: + .string "scl_gpiod" +.LASF2051: + .string "ioport_resource" +.LASF2669: + .string "init_on_alloc" +.LASF2433: + .string "param_count" +.LASF2083: + .string "attr" +.LASF2409: + .string "get_next_child_node" +.LASF2778: + .string "module_ktype" +.LASF1983: + .string "state_in_sysfs" +.LASF1192: + .string "vm_fault_t" +.LASF1173: + .string "UTASK_SSTEP_TRAPPED" +.LASF333: + .string "__entry_tramp_text_end" +.LASF1275: + .string "find_special_page" +.LASF2549: + .string "force_atomic" +.LASF106: + .string "poll" +.LASF2412: + .string "graph_get_next_endpoint" +.LASF1378: + .string "io_cq" +.LASF2824: + .string "epd_lut_data" +.LASF2300: + .string "probe" +.LASF2690: + .string "elf64_sym" +.LASF2734: + .string "latch_tree_node" +.LASF1123: + .string "cad_pid" +.LASF2914: + .string "lgonl" +.LASF535: + .string "destroy_work" +.LASF254: + .string "FTR_LOWER_SAFE" +.LASF127: + .string "clone_file_range" +.LASF2488: + .string "recover_bus" +.LASF2236: + .string "syscore" +.LASF13: + .string "__s64" +.LASF836: + .string "pcpu_chosen_fc" +.LASF391: + .string "dentry_stat_t" +.LASF3250: + .string "atomic_add" +.LASF1611: + .string "dqi_bgrace" +.LASF22: + .string "__kernel_pid_t" +.LASF158: + .string "SYSTEM_SUSPEND" +.LASF908: + .string "_timer" +.LASF1564: + .string "thread_sibling" +.LASF2366: + .string "dma_map_ops" +.LASF1999: + .string "ctl_table" +.LASF44: + .string "uid_t" +.LASF3279: + .string "strstr" +.LASF2818: + .string "WF_TYPE_A2" +.LASF2794: + .string "of_default_bus_match_table" +.LASF1189: + .string "__bp_harden_hyp_vecs_start" +.LASF1229: + .string "pgmap" +.LASF490: + .string "dq_op" +.LASF2336: + .string "sysfs_dev_char_kobj" +.LASF607: + .string "rcu_tasks_nvcsw" +.LASF101: + .string "write" +.LASF2563: + .string "__tracepoint_page_ref_freeze" +.LASF2904: + .string "panel_buffer" +.LASF317: + .string "__exception_text_end" +.LASF2702: + .string "sh_addr" +.LASF275: + .string "_text" +.LASF1855: + .string "fu_rcuhead" +.LASF2678: + .string "modprobe_path" +.LASF2185: + .string "dma_pools" +.LASF2047: + .string "arch_debugfs_dir" +.LASF898: + .string "_addr_lsb" +.LASF2005: + .string "ctl_table_poll" +.LASF463: + .string "i_generation" +.LASF911: + .string "_sigpoll" +.LASF281: + .string "__bss_start" +.LASF1899: + .string "magic" +.LASF2280: + .string "wakeup_count" +.LASF970: + .string "cpu_id_start" +.LASF2408: + .string "get_parent" +.LASF1018: + .string "nr_wakeups_affine" +.LASF764: + .string "arch_timer_read_ool_enabled" +.LASF805: + .string "pteval_t" +.LASF430: + .string "i_ino" +.LASF3326: + .string "might_fault" +.LASF1530: + .string "compact_cached_free_pfn" +.LASF850: + .string "index" +.LASF2172: + .string "driver_data" +.LASF2912: + .string "sdck" +.LASF2777: + .string "module_kset" +.LASF2387: + .string "removed_region" +.LASF2138: + .string "n_ref" +.LASF873: + .string "tick_cpu_device" +.LASF3170: + .string "ebc_get_8pix_wf_part" +.LASF1901: + .string "fa_next" +.LASF1244: + .string "f_op" +.LASF2672: + .string "randomize_va_space" +.LASF2548: + .string "confirm_switch" +.LASF2862: + .string "EPD_SUSPEND" +.LASF381: + .string "seqcount_t" +.LASF1813: + .string "inode_operations" +.LASF2418: + .string "port" +.LASF2799: + .string "usercopy_fallback" +.LASF896: + .string "_dummy_pkey" +.LASF2792: + .string "id_table" +.LASF1581: + .string "dq_sb" +.LASF872: + .string "tick_device" +.LASF128: + .string "dedupe_file_range" +.LASF1163: + .string "radix_tree_root" +.LASF1092: + .string "sighand_struct" +.LASF2808: + .string "sched_param" +.LASF1320: + .string "tlb_flush_pending" +.LASF171: + .string "flags" +.LASF710: + .string "cpuset_slab_spread_rotor" +.LASF1917: + .string "i_lock_key" +.LASF1216: + .string "kmem_cache" +.LASF2648: + .string "KCOMPACTD_FREE_SCANNED" +.LASF418: + .string "inode" +.LASF2747: + .string "drivers_dir" +.LASF1422: + .string "NR_ZONE_ACTIVE_ANON" +.LASF167: + .string "bug_entry" +.LASF288: + .string "__end_ro_after_init" +.LASF3146: + .string "wf_index_tmp1" +.LASF1363: + .string "rw_sem" +.LASF1741: + .string "dqio_sem" +.LASF1029: + .string "prev_sum_exec_runtime" +.LASF1706: + .string "gpl_future_syms" +.LASF2848: + .string "EPD_FULL_GLR16" +.LASF1012: + .string "nr_forced_migrations" +.LASF2044: + .string "seq_operations" +.LASF637: + .string "stack_canary" +.LASF3104: + .string "no_black_count" +.LASF1129: + .string "blksize" +.LASF641: + .string "sibling" +.LASF1254: + .string "f_ra" +.LASF1946: + .string "quota_write" +.LASF1966: + .string "fi_extents_max" +.LASF2449: + .string "translate" +.LASF2490: + .string "set_scl" +.LASF1825: + .string "rmdir" +.LASF2101: + .string "sock" +.LASF387: + .string "hash_len" +.LASF842: + .string "HRTIMER_RESTART" +.LASF2182: + .string "bus_dma_mask" +.LASF561: + .string "pidfd_fops" +.LASF1885: + .string "lm_put_owner" +.LASF3281: + .string "ebc_pmic_verity_vcom" +.LASF2492: + .string "set_sda" +.LASF474: + .string "d_init" +.LASF1276: + .string "core_thread" +.LASF1750: + .string "address_space_operations" +.LASF952: + .string "vm_userfaultfd_ctx" +.LASF2319: + .string "devnode" +.LASF849: + .string "cpu_base" +.LASF1210: + .string "objects" +.LASF2403: + .string "device_is_available" +.LASF1573: + .string "dquot" +.LASF1043: + .string "dl_runtime" +.LASF3107: + .string "lut_type" +.LASF85: + .string "initcall_debug" +.LASF559: + .string "numbers" +.LASF844: + .string "_softexpires" +.LASF2031: + .string "key_user" +.LASF2039: + .string "printk_ratelimit_state" +.LASF1336: + .string "semaphore" +.LASF647: + .string "thread_group" +.LASF2303: + .string "shutdown" +.LASF1578: + .string "dq_lock" +.LASF1808: + .string "i_cdev" +.LASF351: + .string "sve_vl_onexec" +.LASF1312: + .string "env_end" +.LASF1597: + .string "dqb_bhardlimit" +.LASF2003: + .string "extra1" +.LASF700: + .string "ptrace_message" +.LASF1733: + .string "num_trace_events" +.LASF889: + .string "_sys_private" +.LASF2391: + .string "properties" +.LASF523: + .string "s_subtype" +.LASF71: + .string "func" +.LASF1109: + .string "perf_event_context" +.LASF2995: + .string "ebc_auto_task" +.LASF94: + .string "printk_delay_msec" +.LASF2667: + .string "mmap_pages_allocated" +.LASF959: + .string "tlbflush_unmap_batch" +.LASF2141: + .string "power_group_name" +.LASF778: + .string "clock_event_device" +.LASF1167: + .string "m_count" +.LASF2132: + .string "hypervisor_kobj" +.LASF604: + .string "rcu_read_unlock_special" +.LASF913: + .string "siginfo" +.LASF966: + .string "read_bytes" +.LASF323: + .string "__hyp_text_end" +.LASF1960: + .string "fsverity_operations" +.LASF1061: + .string "wake_q_node" +.LASF1085: + .string "request_key_auth" +.LASF3006: + .string "waveform_misc" +.LASF1922: + .string "destroy_inode" +.LASF2952: + .string "is_busy_now" +.LASF58: + .string "irq_hw_number_t" +.LASF2335: + .string "sysfs_dev_block_kobj" +.LASF554: + .string "upid" +.LASF1067: + .string "completion" +.LASF2941: + .string "DATA_CALC_RIGHT" +.LASF1468: + .string "NR_GPU_HEAP" +.LASF831: + .string "PCPU_FC_AUTO" +.LASF1875: + .string "fl_break_time" +.LASF1172: + .string "UTASK_SSTEP_ACK" +.LASF77: + .string "__con_initcall_end" +.LASF1114: + .string "active_uprobe" +.LASF1940: + .string "show_options" +.LASF2111: + .string "uevent_helper" +.LASF3000: + .string "ebc_assist_finished_flag_sem" +.LASF2950: + .string "lut_buffer_phy" +.LASF110: + .string "mmap_supported_flags" +.LASF51: + .string "sector_t" +.LASF1186: + .string "bp_hardening_cb_t" +.LASF1777: + .string "bd_dev" +.LASF1816: + .string "permission" +.LASF1485: + .string "node_spanned_pages" +.LASF891: + .string "_utime" +.LASF2217: + .string "pm_subsys_data" +.LASF3303: + .string "ebc_empty_osd_buf_get" +.LASF2318: + .string "device_type" +.LASF1124: + .string "thread_union" +.LASF1780: + .string "bd_super" +.LASF2677: + .string "usermodehelper_table" +.LASF160: + .string "taint_flag" +.LASF1947: + .string "get_dquots" +.LASF3290: + .string "of_find_node_by_phandle" +.LASF2371: + .string "unmap_page" +.LASF798: + .string "system_unbound_wq" +.LASF517: + .string "s_uuid" +.LASF1635: + .string "destroy_dquot" +.LASF1647: + .string "d_ino_hardlimit" +.LASF1845: + .string "fsverity_info" +.LASF2009: + .string "nr_leaves_on_tree" +.LASF2975: + .string "prev_osd_buf" +.LASF1680: + .string "quota_on" +.LASF2427: + .string "of_root" +.LASF1264: + .string "vm_operations_struct" +.LASF2359: + .string "hwirq_max" +.LASF2933: + .string "ebc_refresh_mode" +.LASF3248: + .string "__fswab32" +.LASF2167: + .string "runtime_idle" +.LASF1861: + .string "fl_next" +.LASF2495: + .string "unprepare_recovery" +.LASF441: + .string "i_state" +.LASF593: + .string "sched_class" +.LASF1939: + .string "umount_end" +.LASF691: + .string "pi_waiters" +.LASF2626: + .string "PGSCAN_DIRECT" +.LASF1225: + .string "pt_frag_refcount" +.LASF1817: + .string "permission2" +.LASF1674: + .string "i_ino_timelimit" +.LASF226: + .string "cnts" +.LASF2209: + .string "RPM_SUSPENDED" +.LASF697: + .string "reclaim_state" +.LASF3325: + .string "/home/lyx/rk3566-11-eink/kernel" +.LASF138: + .string "vendor_panic_cb" +.LASF2767: + .string "num_symtab" +.LASF1567: + .string "cpu_scale" +.LASF2614: + .string "PGSCAN_SKIP_MOVABLE" +.LASF1924: + .string "write_inode" +.LASF415: + .string "d_fsdata" +.LASF2210: + .string "RPM_SUSPENDING" +.LASF2581: + .string "mmap_rnd_bits_max" +.LASF1200: + .string "nrpages" +.LASF816: + .string "_refcount" +.LASF466: + .string "i_crypt_info" +.LASF3064: + .string "waveform_mmap" +.LASF1840: + .string "flc_flock" +.LASF2745: + .string "module_alloc_base" +.LASF1720: + .string "core_kallsyms" +.LASF3284: + .string "memcpy" +.LASF2865: + .string "EPD_FORCE_FULL" +.LASF2369: + .string "get_sgtable" +.LASF3137: + .string "xor_val" +.LASF2124: + .string "envp_idx" +.LASF465: + .string "i_fsnotify_marks" +.LASF1984: + .string "state_add_uevent_sent" +.LASF2637: + .string "OOM_KILL" +.LASF445: + .string "i_hash" +.LASF3122: + .string "gray_old" +.LASF68: + .string "hlist_node" +.LASF3293: + .string "sprintf" +.LASF1877: + .string "fl_ops" +.LASF1684: + .string "quota_sync" +.LASF2676: + .string "debug_guardpage_ops" +.LASF2642: + .string "COMPACTISOLATED" +.LASF3261: + .string "of_property_read_variable_u32_array" +.LASF328: + .string "__inittext_begin" +.LASF1364: + .string "writer" +.LASF763: + .string "arch_timer_read_counter" +.LASF270: + .string "ftr_bits" +.LASF627: + .string "sched_remote_wakeup" +.LASF2148: + .string "resume" +.LASF690: + .string "wake_q" +.LASF2644: + .string "COMPACTFAIL" +.LASF695: + .string "bio_list" +.LASF1633: + .string "write_dquot" +.LASF2621: + .string "PGLAZYFREED" +.LASF1317: + .string "ioctx_lock" +.LASF311: + .string "current_stack_pointer" +.LASF2803: + .string "NR_KMALLOC_TYPES" +.LASF1177: + .string "dup_xol_addr" +.LASF2443: + .string "DOMAIN_BUS_WAKEUP" +.LASF1191: + .string "arm64_el2_vector_last_slot" +.LASF2304: + .string "online" +.LASF2166: + .string "runtime_resume" +.LASF1176: + .string "dup_xol_work" +.LASF3194: + .string "ebc_pmic_read_temp" +.LASF2846: + .string "EPD_FULL_GC16" +.LASF3012: + .string "dev_attr_ebc_state" +.LASF2130: + .string "kernel_kobj" +.LASF2556: + .string "funcs" +.LASF2987: + .string "overlay_enable" +.LASF1076: + .string "securebits" +.LASF2681: + .string "Elf64_Off" +.LASF1296: + .string "total_vm" +.LASF622: + .string "jobctl" +.LASF2844: + .string "EPD_AUTO" +.LASF332: + .string "__entry_tramp_text_start" +.LASF820: + .string "node_list" +.LASF2440: + .string "DOMAIN_BUS_NEXUS" +.LASF2007: + .string "sysctl_mount_point" +.LASF267: + .string "user_mask" +.LASF2711: + .string "kernel_param" +.LASF2250: + .string "deferred_resume" +.LASF1646: + .string "d_spc_softlimit" +.LASF54: + .string "gfp_t" +.LASF338: + .string "bps_disabled" +.LASF876: + .string "seccomp_filter" +.LASF779: + .string "timer_unstable_counter_workaround" +.LASF653: + .string "stime" +.LASF1198: + .string "i_mmap" +.LASF1121: + .string "phys_addr" +.LASF398: + .string "d_lru" +.LASF2377: + .string "sync_single_for_device" +.LASF1091: + .string "signal_struct" +.LASF718: + .string "perf_event_mutex" +.LASF1099: + .string "nr_batch_requests" +.LASF1428: + .string "NR_PAGETABLE" +.LASF1697: + .string "crcs" +.LASF2652: + .string "UNEVICTABLE_PGMLOCKED" +.LASF807: + .string "pgdval_t" +.LASF2889: + .string "page_link" +.LASF1828: + .string "setattr" +.LASF906: + .string "_pad" +.LASF1259: + .string "f_mapping" +.LASF2145: + .string "prepare" +.LASF2107: + .string "bin_attrs" +.LASF2899: + .string "HYPERVISOR_shared_info" +.LASF682: + .string "sas_ss_flags" +.LASF1249: + .string "f_mode" +.LASF1398: + .string "ki_complete" +.LASF3029: + .string "ebc_tcon_pdev" +.LASF1724: + .string "percpu" +.LASF583: + .string "wakee_flips" +.LASF1836: + .string "set_acl" +.LASF2029: + .string "keys" +.LASF299: + .string "__irqentry_text_start" +.LASF563: + .string "overflowuid" +.LASF800: + .string "system_power_efficient_wq" +.LASF3172: + .string "ebc_get_8pix_wf2" +.LASF2170: + .string "driver" +.LASF1513: + .string "ZONE_NORMAL" +.LASF3156: + .string "image_new_data" +.LASF426: + .string "i_op" +.LASF1655: + .string "d_rt_spc_hardlimit" +.LASF2994: + .string "ebc_task" +.LASF2095: + .string "kobj_ns_type_operations" +.LASF1361: + .string "percpu_rw_semaphore" +.LASF596: + .string "boost_period" +.LASF2425: + .string "of_node_ktype" +.LASF668: + .string "cred" +.LASF241: + .string "jump_entry" +.LASF2580: + .string "mmap_rnd_bits_min" +.LASF1412: + .string "migratetype_names" +.LASF1152: + .string "list_lru_node" +.LASF394: + .string "age_limit" +.LASF2851: + .string "EPD_PART_GC16" +.LASF237: + .string "spinlock_t" +.LASF2098: + .string "netlink_ns" +.LASF363: + .string "wait_queue_head" +.LASF791: + .string "work_func_t" +.LASF2191: + .string "fwnode" +.LASF1768: + .string "is_dirty_writeback" +.LASF302: + .string "__softirqentry_text_end" +.LASF1731: + .string "trace_bprintk_fmt_start" +.LASF665: + .string "cpu_timers" +.LASF2925: + .string "disable" +.LASF1269: + .string "huge_fault" +.LASF1977: + .string "kstatfs" +.LASF3197: + .string "ebc_pmic_power_off" +.LASF2603: + .string "PGPGOUTCLEAN" +.LASF580: + .string "ptrace" +.LASF2272: + .string "max_time" +.LASF1562: + .string "package_id" +.LASF104: + .string "iterate" +.LASF1153: + .string "memcg_lrus" +.LASF1804: + .string "i_dentry" +.LASF2097: + .string "grab_current_ns" +.LASF3049: + .string "fb_size" +.LASF854: + .string "offset" +.LASF1235: + .string "altmap" +.LASF1843: + .string "fsnotify_mark_connector" +.LASF912: + .string "_sigsys" +.LASF3105: + .string "ebc_lut_update" +.LASF1890: + .string "lm_setup" +.LASF427: + .string "i_sb" +.LASF348: + .string "fpsimd_cpu" +.LASF2759: + .string "MODULE_STATE_UNFORMED" +.LASF194: + .string "expires" +.LASF1349: + .string "rcuwait" +.LASF330: + .string "__mmuoff_data_start" +.LASF659: + .string "nivcsw" +.LASF2466: + .string "i2c_adapter" +.LASF1341: + .string "fe_reserved64" +.LASF2347: + .string "DL_DEV_UNBINDING" +.LASF355: + .string "signal_minsigstksz" +.LASF750: + .string "thread" +.LASF2317: + .string "subsys_private" +.LASF2530: + .string "idmap_pg_dir" +.LASF2487: + .string "i2c_bus_recovery_info" +.LASF2951: + .string "lut_buffer_size" +.LASF484: + .string "s_dev" +.LASF346: + .string "fpsimd_state" +.LASF1631: + .string "get_next_id" +.LASF238: + .string "rwlock_t" +.LASF3324: + .string "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" +.LASF811: + .string "pgprot" +.LASF17: + .string "false" +.LASF1943: + .string "show_path" +.LASF1221: + .string "_compound_pad_1" +.LASF1222: + .string "_compound_pad_2" +.LASF550: + .string "PIDTYPE_TGID" +.LASF1884: + .string "lm_get_owner" +.LASF2876: + .string "drvpar" +.LASF2600: + .string "vm_event_item" +.LASF2539: + .string "kthreadd_task" +.LASF1774: + .string "swap_info_struct" +.LASF88: + .string "__icache_flags" +.LASF148: + .string "crash_kexec_post_notifiers" +.LASF3182: + .string "eink_mode" +.LASF1666: + .string "rt_spc_warnlimit" +.LASF1159: + .string "exceptional" +.LASF3118: + .string "direct_mode_data_change_part2" +.LASF1964: + .string "fi_flags" +.LASF1548: + .string "blocking_notifier_head" +.LASF2316: + .string "coredump" +.LASF3081: + .string "need_type" +.LASF278: + .string "_data" +.LASF1502: + .string "vm_stat" +.LASF557: + .string "tasks" +.LASF884: + .string "_pid" +.LASF3150: + .string "data_buf_tmp1" +.LASF1125: + .string "init_stack" +.LASF3158: + .string "dmask" +.LASF1194: + .string "address_space" +.LASF1185: + .string "mm_context_t" +.LASF1280: + .string "startup" +.LASF1387: + .string "sysctl_nr_open" +.LASF82: + .string "reset_devices" +.LASF447: + .string "i_wb" +.LASF2055: + .string "idr_next" +.LASF3134: + .string "frame_count_data" +.LASF2930: + .string "frame_start" +.LASF1219: + .string "compound_order" +.LASF1223: + .string "deferred_list" +.LASF924: + .string "locked_shm" +.LASF1056: + .string "inactive_timer" +.LASF897: + .string "_pkey" +.LASF289: + .string "_end" +.LASF478: + .string "d_dname" +.LASF1699: + .string "param_lock" +.LASF943: + .string "vm_page_prot" +.LASF179: + .string "timespec64" +.LASF552: + .string "PIDTYPE_SID" +.LASF2374: + .string "map_resource" +.LASF476: + .string "d_prune" +.LASF83: + .string "rodata_enabled" +.LASF2036: + .string "printed" +.LASF318: + .string "__hibernate_exit_text_start" +.LASF2160: + .string "resume_noirq" +.LASF1519: + .string "lowmem_reserve" +.LASF815: + .string "page" +.LASF1642: + .string "get_inode_usage" +.LASF2388: + .string "device_node" +.LASF591: + .string "normal_prio" +.LASF1257: + .string "f_ep_links" +.LASF2263: + .string "last_busy" +.LASF1806: + .string "i_pipe" +.LASF845: + .string "base" +.LASF1195: + .string "host" +.LASF185: + .string "uaddr" +.LASF661: + .string "real_start_time" +.LASF28: + .string "__kernel_time_t" +.LASF1961: + .string "unicode_map" +.LASF2536: + .string "MEMREMAP_WC" +.LASF2413: + .string "graph_get_remote_endpoint" +.LASF1536: + .string "contiguous" +.LASF1299: + .string "exec_vm" +.LASF2535: + .string "MEMREMAP_WT" +.LASF2691: + .string "st_name" +.LASF228: + .string "wait_lock" +.LASF1778: + .string "bd_openers" +.LASF701: + .string "last_siginfo" +.LASF1921: + .string "alloc_inode" +.LASF2802: + .string "KMALLOC_RECLAIM" +.LASF410: + .string "d_iname" +.LASF2194: + .string "devres_head" +.LASF428: + .string "i_mapping" +.LASF3285: + .string "misc_register" +.LASF722: + .string "rseq_sig" +.LASF3216: + .string "platform_set_drvdata" +.LASF343: + .string "cpu_context" +.LASF2284: + .string "dev_pm_domain" +.LASF1482: + .string "nr_zones" +.LASF2942: + .string "DATA_CALC_LEFT" +.LASF3235: + .string "is_source" +.LASF1344: + .string "migrate_mode" +.LASF2657: + .string "SWAP_RA_HIT" +.LASF616: + .string "vmacache" +.LASF1414: + .string "free_area" +.LASF1492: + .string "kswapd_failures" +.LASF2157: + .string "poweroff_late" +.LASF847: + .string "is_soft" +.LASF176: + .string "timezone" +.LASF406: + .string "d_hash" +.LASF1046: + .string "dl_bw" +.LASF3209: + .string "limit" +.LASF2114: + .string "kobj" +.LASF3294: + .string "kstrtouint" +.LASF114: + .string "fsync" +.LASF1962: + .string "mtd_info" +.LASF423: + .string "i_flags" +.LASF2863: + .string "EPD_RESUME" +.LASF3280: + .string "sscanf" +.LASF3275: + .string "ebc_empty_buf_get" +.LASF1443: + .string "NR_ISOLATED_ANON" +.LASF3051: + .string "ebc_lut_table_init" +.LASF1182: + .string "uprobes_state" +.LASF1522: + .string "cma_alloc" +.LASF821: + .string "rb_node" +.LASF613: + .string "pushable_tasks" +.LASF2171: + .string "platform_data" +.LASF1365: + .string "readers_block" +.LASF676: + .string "sighand" +.LASF105: + .string "iterate_shared" +.LASF2104: + .string "is_visible" +.LASF675: + .string "signal" +.LASF2090: + .string "released" +.LASF2586: + .string "sysctl_max_map_count" +.LASF1634: + .string "alloc_dquot" +.LASF2142: + .string "pm_message" +.LASF525: + .string "cleancache_poolid" +.LASF817: + .string "mem_cgroup" +.LASF986: + .string "last_update_time" +.LASF1106: + .string "robust_list_head" +.LASF3273: + .string "init_timer_key" +.LASF1449: + .string "NR_ANON_MAPPED" +.LASF383: + .string "count" +.LASF3002: + .string "resume_count_start" +.LASF2998: + .string "ebc_auto_assist_task" +.LASF556: + .string "level" +.LASF532: + .string "s_user_ns" +.LASF1694: + .string "srcversion" +.LASF829: + .string "pcpu_unit_offsets" +.LASF3185: + .string "dma_sync_single_for_device" +.LASF2931: + .string "dsp_end_callback" +.LASF461: + .string "i_data" +.LASF1976: + .string "poll_event" +.LASF2525: + .string "softirq_to_name" +.LASF66: + .string "hlist_head" +.LASF506: + .string "s_encoding_flags" +.LASF1024: + .string "runnable_weight" +.LASF2415: + .string "graph_parse_endpoint" +.LASF1370: + .string "uuid_null" +.LASF1300: + .string "stack_vm" +.LASF2245: + .string "usage_count" +.LASF2046: + .string "show" +.LASF3009: + .string "dev_attr_pmic_temp" +.LASF7: + .string "unsigned char" +.LASF1938: + .string "umount_begin" +.LASF1184: + .string "vdso" +.LASF1284: + .string "mmap_legacy_base" +.LASF2633: + .string "PAGEOUTRUN" +.LASF953: + .string "task_rss_stat" +.LASF1110: + .string "pipe_inode_info" +.LASF2971: + .string "ebc_power_status" +.LASF931: + .string "ratelimit" +.LASF2457: + .string "word" +.LASF1982: + .string "state_initialized" +.LASF819: + .string "prio_list" +.LASF2511: + .string "nmi_contexts" +.LASF2115: + .string "uevent_ops" +.LASF545: + .string "rename_lock" +.LASF3084: + .string "__out" +.LASF680: + .string "sas_ss_sp" +.LASF1421: + .string "NR_ZONE_INACTIVE_ANON" +.LASF728: + .string "nr_dirtied" +.LASF3226: + .string "dev_get_drvdata" +.LASF2364: + .string "linear_revmap" +.LASF335: + .string "arm64_dma_phys_limit" +.LASF1419: + .string "NR_FREE_PAGES" +.LASF3144: + .string "frame_count_tmp1" +.LASF522: + .string "s_vfs_rename_mutex" +.LASF2153: + .string "suspend_late" +.LASF2234: + .string "wakeup" +.LASF712: + .string "cg_list" +.LASF1789: + .string "bd_partno" +.LASF1910: + .string "alloc_mnt_data" +.LASF2938: + .string "data_calc_mode" +.LASF1796: + .string "bd_list" +.LASF2233: + .string "driver_flags" +.LASF1166: + .string "rw_semaphore" +.LASF2154: + .string "resume_early" +.LASF1903: + .string "fa_rcu" +.LASF1835: + .string "tmpfile" +.LASF1742: + .string "info" +.LASF155: + .string "SYSTEM_HALT" +.LASF1832: + .string "fiemap" +.LASF2400: + .string "waiters" +.LASF2673: + .string "sysctl_memory_failure_early_kill" +.LASF2729: + .string "param_ops_bool_enable_only" +.LASF3166: + .string "power_status" +.LASF307: + .string "__start_opd" +.LASF3289: + .string "of_find_i2c_device_by_node" +.LASF154: + .string "SYSTEM_RUNNING" +.LASF2816: + .string "WF_TYPE_GLR16" +.LASF917: + .string "_sifields" +.LASF1993: + .string "page_symlink_inode_operations" +.LASF735: + .string "memcg_in_oom" +.LASF480: + .string "d_manage" +.LASF1102: + .string "icq_hint" +.LASF1963: + .string "fiemap_extent_info" +.LASF2885: + .string "DMA_TO_DEVICE" +.LASF2698: + .string "elf64_shdr" +.LASF298: + .string "__end_rodata" +.LASF770: + .string "match_type" +.LASF2716: + .string "elem" +.LASF863: + .string "nr_retries" +.LASF2627: + .string "PGSCAN_DIRECT_THROTTLE" +.LASF883: + .string "sigval_t" +.LASF1902: + .string "fa_file" +.LASF2992: + .string "panel" +.LASF2956: + .string "auto_need_refresh1" +.LASF2401: + .string "irq_data" +.LASF3092: + .string "old_buffer_temp" +.LASF2674: + .string "sysctl_memory_failure_recovery" +.LASF2661: + .string "vm_event_states" +.LASF407: + .string "d_parent" +.LASF2037: + .string "missed" +.LASF150: + .string "root_mountflags" +.LASF3149: + .string "get_overlay_image_area" +.LASF1945: + .string "quota_read" +.LASF3088: + .string "check_diff_percent" +.LASF2694: + .string "st_shndx" +.LASF2368: + .string "free" +.LASF3057: + .string "pmic_vcom_write" +.LASF2102: + .string "attribute" +.LASF449: + .string "i_wb_frn_avg_time" +.LASF2625: + .string "PGSCAN_KSWAPD" +.LASF1798: + .string "bd_fsfreeze_count" +.LASF193: + .string "type" +.LASF164: + .string "taint_flags" +.LASF1316: + .string "membarrier_state" +.LASF3176: + .string "pre_image_addr" +.LASF2147: + .string "suspend" +.LASF1711: + .string "init" +.LASF1090: + .string "files_struct" +.LASF103: + .string "write_iter" +.LASF500: + .string "s_security" +.LASF656: + .string "max_state" +.LASF530: + .string "s_dio_done_wq" +.LASF2636: + .string "DROP_SLAB" +.LASF893: + .string "_dummy_bnd" +.LASF681: + .string "sas_ss_size" +.LASF2437: + .string "DOMAIN_BUS_WIRED" +.LASF1020: + .string "nr_wakeups_passive" +.LASF1906: + .string "file_system_type" +.LASF1992: + .string "generic_ro_fops" +.LASF1134: + .string "mtime" +.LASF1325: + .string "vm_fault" +.LASF1351: + .string "RCU_SYNC" +.LASF1525: + .string "spanned_pages" +.LASF2121: + .string "kobj_uevent_env" +.LASF2066: + .string "deactivate_waitq" +.LASF981: + .string "inv_weight" +.LASF1923: + .string "dirty_inode" +.LASF1538: + .string "vm_numa_stat" +.LASF1481: + .string "node_zonelists" +.LASF542: + .string "path" +.LASF2696: + .string "st_size" +.LASF3013: + .string "dev_attr_ebc_buf_state" +.LASF189: + .string "rmtp" +.LASF2395: + .string "platform_notify_remove" +.LASF998: + .string "wait_sum" +.LASF1726: + .string "num_tracepoints" +.LASF619: + .string "exit_code" +.LASF1027: + .string "exec_start" +.LASF3321: + .string "printk" +.LASF2350: + .string "consumers" +.LASF2067: + .string "kernfs_elem_symlink" +.LASF1150: + .string "nr_items" +.LASF2474: + .string "userspace_clients_lock" +.LASF857: + .string "clock_was_set_seq" +.LASF1255: + .string "f_version" +.LASF141: + .string "panic_timeout" +.LASF1168: + .string "arch_uprobe_task" +.LASF459: + .string "i_fop" +.LASF2857: + .string "EPD_A2_DITHER" +.LASF1822: + .string "unlink" +.LASF2686: + .string "d_ptr" +.LASF3059: + .string "pmic_temp_read" +.LASF1621: + .string "dqstats" +.LASF990: + .string "period_contrib" +.LASF605: + .string "rcu_node_entry" +.LASF1637: + .string "release_dquot" +.LASF1383: + .string "max_files" +.LASF1075: + .string "fsgid" +.LASF2309: + .string "need_parent_lock" +.LASF1354: + .string "rcu_sync" +.LASF2582: + .string "mmap_rnd_bits" +.LASF2430: + .string "of_stdout" +.LASF947: + .string "vm_ops" +.LASF2905: + .string "ebc_panel" +.LASF1271: + .string "pagesize" +.LASF486: + .string "s_blocksize" +.LASF948: + .string "vm_pgoff" +.LASF2270: + .string "timer" +.LASF2431: + .string "devtree_lock" +.LASF3159: + .string "refresh_new_image_auto" +.LASF3082: + .string "__ret" +.LASF1833: + .string "update_time" +.LASF1948: + .string "bdev_try_to_free_page" +.LASF1547: + .string "priority" +.LASF903: + .string "_call_addr" +.LASF2021: + .string "check" +.LASF1385: + .string "nr_inodes" +.LASF2473: + .string "dev_released" +.LASF2025: + .string "expiry" +.LASF571: + .string "optimistic_spin_queue" +.LASF3133: + .string "get_one_auto_image2" +.LASF2947: + .string "ebc_buffer_size" +.LASF3295: + .string "ebc_pmic_set_vcom" +.LASF2610: + .string "ALLOCSTALL_NORMAL" +.LASF3126: + .string "data_buf_tmp" +.LASF326: + .string "__initdata_begin" +.LASF2879: + .string "pmic_pm_resume" +.LASF225: + .string "__lstate" +.LASF2127: + .string "uevent" +.LASF384: + .string "lock_count" +.LASF149: + .string "panic_cpu" +.LASF804: + .string "refcount_t" +.LASF696: + .string "plug" +.LASF1334: + .string "__cap_empty_set" +.LASF1313: + .string "saved_auxv" +.LASF1716: + .string "num_bugs" +.LASF1618: + .string "qf_ops" +.LASF2311: + .string "mod_name" +.LASF2407: + .string "property_read_string_array" +.LASF721: + .string "rseq_len" +.LASF2434: + .string "param" +.LASF2750: + .string "module_attribute" +.LASF1286: + .string "highest_vm_end" +.LASF244: + .string "pollfd" +.LASF1017: + .string "nr_wakeups_remote" +.LASF375: + .string "cpu_bit_bitmap" +.LASF1595: + .string "dq_data_lock" +.LASF2687: + .string "d_tag" +.LASF752: + .string "llist_node" +.LASF1593: + .string "projid" +.LASF1119: + .string "pages" +.LASF1156: + .string "memcg_aware" +.LASF1041: + .string "back" +.LASF2294: + .string "dev_name" +.LASF1332: + .string "kernel_cap_struct" +.LASF2709: + .string "_DYNAMIC" +.LASF972: + .string "rseq_cs" +.LASF2405: + .string "property_present" +.LASF868: + .string "softirq_expires_next" +.LASF1563: + .string "llc_id" +.LASF1819: + .string "readlink" +.LASF2468: + .string "algo_data" +.LASF1480: + .string "node_zones" +.LASF3010: + .string "dev_attr_pmic_vcom" +.LASF1528: + .string "initialized" +.LASF1786: + .string "bd_holder_disks" +.LASF63: + .string "list_head" +.LASF1499: + .string "lru_lock" +.LASF2735: + .string "mod_plt_sec" +.LASF636: + .string "tgid" +.LASF2869: + .string "epd_mode" +.LASF1107: + .string "compat_robust_list_head" +.LASF886: + .string "_tid" +.LASF540: + .string "s_inode_wblist_lock" +.LASF1973: + .string "from" +.LASF1783: + .string "bd_holder" +.LASF1304: + .string "end_code" +.LASF984: + .string "ewma" +.LASF222: + .string "qspinlock" +.LASF90: + .string "linux_banner_ptr" +.LASF1460: + .string "NR_VMSCAN_WRITE" +.LASF2770: + .string "insn" +.LASF1968: + .string "filldir_t" +.LASF1871: + .string "fl_file" +.LASF1187: + .string "bp_hardening_data" +.LASF1053: + .string "dl_non_contending" +.LASF2494: + .string "prepare_recovery" +.LASF1969: + .string "dir_context" +.LASF2509: + .string "irq_stat" +.LASF2615: + .string "PGFREE" +.LASF2557: + .string "tracepoint_ptr_t" +.LASF741: + .string "utask" +.LASF1440: + .string "NR_UNEVICTABLE" +.LASF1022: + .string "sched_entity" +.LASF1645: + .string "d_spc_hardlimit" +.LASF2707: + .string "sh_addralign" +.LASF773: + .string "read_cntv_tval_el0" +.LASF0: + .string "long unsigned int" +.LASF1002: + .string "sleep_max" +.LASF322: + .string "__hyp_text_start" +.LASF1283: + .string "mmap_base" +.LASF699: + .string "io_context" +.LASF3087: + .string "__cond" +.LASF210: + .string "compat_elf_hwcap2" +.LASF2959: + .string "frame_done" +.LASF2478: + .string "host_notify_domain" +.LASF1702: + .string "gpl_syms" +.LASF2074: + .string "seq_show" +.LASF766: + .string "ate_match_dt" +.LASF3224: + .string "of_node_put" +.LASF1329: + .string "cow_page" +.LASF1561: + .string "core_id" +.LASF2458: + .string "block" +.LASF2660: + .string "vm_event_state" +.LASF1673: + .string "i_spc_timelimit" +.LASF1116: + .string "return_instances" +.LASF1989: + .string "blockdev_superblock" +.LASF2168: + .string "device" +.LASF2721: + .string "param_ops_ushort" +.LASF526: + .string "s_shrink" +.LASF1494: + .string "kcompactd_classzone_idx" +.LASF3214: + .string "kmalloc_index" +.LASF840: + .string "hrtimer_restart" +.LASF2576: + .string "totalram_pages" +.LASF2455: + .string "i2c_smbus_data" +.LASF2974: + .string "curr_dsp_buf" +.LASF1039: + .string "time_slice" +.LASF2390: + .string "full_name" +.LASF2086: + .string "kernfs_open_file" +.LASF838: + .string "node" +.LASF1781: + .string "bd_mutex" +.LASF1348: + .string "MIGRATE_SYNC_NO_COPY" +.LASF2274: + .string "start_prevent_time" +.LASF2638: + .string "PGMIGRATE_SUCCESS" +.LASF633: + .string "no_cgroup_migration" +.LASF285: + .string "_sinittext" +.LASF2624: + .string "PGSTEAL_DIRECT" +.LASF374: + .string "cpu_all_bits" +.LASF2034: + .string "interval" +.LASF2692: + .string "st_info" +.LASF2187: + .string "cma_area" +.LASF590: + .string "static_prio" +.LASF2807: + .string "wake_lock" +.LASF2239: + .string "may_skip_resume" +.LASF2985: + .string "is_deep_sleep" +.LASF1143: + .string "shrinker" +.LASF1052: + .string "dl_yielded" +.LASF1607: + .string "dqi_format" +.LASF2641: + .string "COMPACTFREE_SCANNED" +.LASF2585: + .string "mmap_rnd_compat_bits" +.LASF594: + .string "last_sleep_ts" +.LASF454: + .string "i_version" +.LASF657: + .string "prev_cputime" +.LASF2176: + .string "msi_domain" +.LASF1985: + .string "state_remove_uevent_sent" +.LASF1407: + .string "ia_size" +.LASF859: + .string "in_hrtirq" +.LASF503: + .string "s_master_keys" +.LASF2976: + .string "curr_osd_buf" +.LASF767: + .string "ate_match_local_cap_id" +.LASF2422: + .string "property" +.LASF3052: + .string "ebc_sysfs_init" +.LASF962: + .string "wchar" +.LASF316: + .string "__exception_text_start" +.LASF2394: + .string "platform_notify" +.LASF62: + .string "kernel_symbol" +.LASF2897: + .string "dma_virt_ops" +.LASF2267: + .string "subsys_data" +.LASF2689: + .string "Elf64_Dyn" +.LASF2324: + .string "compatible" +.LASF174: + .string "tv_sec" +.LASF40: + .string "pid_t" +.LASF78: + .string "__security_initcall_start" +.LASF3130: + .string "get_auto_image2" +.LASF1025: + .string "run_node" +.LASF1009: + .string "nr_failed_migrations_affine" +.LASF3229: + .string "IS_ERR" +.LASF832: + .string "PCPU_FC_EMBED" +.LASF2065: + .string "supers" +.LASF2062: + .string "last_ino" +.LASF692: + .string "pi_top_task" +.LASF3152: + .string "gray_old_changed" +.LASF528: + .string "s_fsnotify_inode_refs" +.LASF416: + .string "d_child" +.LASF1970: + .string "actor" +.LASF1178: + .string "uprobe" +.LASF529: + .string "s_readonly_remount" +.LASF3253: + .string "kasan_check_write" +.LASF378: + .string "hlist_bl_node" +.LASF2693: + .string "st_other" +.LASF1918: + .string "i_mutex_key" +.LASF1979: + .string "kset" +.LASF848: + .string "hrtimer_clock_base" +.LASF1028: + .string "vruntime" +.LASF3097: + .string "diff_count" +.LASF2247: + .string "disable_depth" +.LASF432: + .string "i_size" +.LASF1044: + .string "dl_deadline" +.LASF564: + .string "overflowgid" +.LASF2665: + .string "min_free_kbytes" +.LASF1240: + .string "units" +.LASF3267: + .string "epd_lut_from_mem_init" +.LASF312: + .string "__nosave_begin" +.LASF163: + .string "module" +.LASF2616: + .string "PGACTIVATE" +.LASF2041: + .string "ngroups" +.LASF1627: + .string "free_file_info" +.LASF1174: + .string "autask" +.LASF2507: + .string "ipi_irqs" +.LASF567: + .string "user_namespace" +.LASF2725: + .string "param_ops_ulong" +.LASF3242: + .string "get_current" +.LASF232: + .string "raw_spinlock" +.LASF1487: + .string "kswapd_wait" +.LASF2256: + .string "timer_autosuspends" +.LASF2853: + .string "EPD_PART_GLR16" +.LASF2647: + .string "KCOMPACTD_MIGRATE_SCANNED" +.LASF1377: + .string "__rcu_head" +.LASF1721: + .string "sect_attrs" +.LASF2727: + .string "param_ops_charp" +.LASF1681: + .string "quota_off" +.LASF352: + .string "fault_address" +.LASF1575: + .string "dq_inuse" +.LASF3041: + .string "out_buffer" +.LASF3128: + .string "direct_mode_data_change_part" +.LASF1610: + .string "dqi_flags" +.LASF2622: + .string "PGREFILL" +.LASF2731: + .string "param_ops_bint" +.LASF3277: + .string "ebc_add_to_dsp_buf_list" +.LASF3282: + .string "kfree" +.LASF1771: + .string "swap_deactivate" +.LASF2913: + .string "gdck_sta" +.LASF1112: + .string "request_queue" +.LASF1445: + .string "WORKINGSET_REFAULT" +.LASF1609: + .string "dqi_dirty_list" +.LASF3054: + .string "ebc_buf_state_read" +.LASF230: + .string "prove_locking" +.LASF2760: + .string "mod_tree_node" +.LASF3053: + .string "auto_frame_state_read" +.LASF2554: + .string "regfunc" +.LASF2969: + .string "auto_wf_index" +.LASF242: + .string "code" +.LASF654: + .string "gtime" +.LASF572: + .string "debug_locks" +.LASF1752: + .string "readpage" +.LASF2640: + .string "COMPACTMIGRATE_SCANNED" +.LASF396: + .string "dummy" +.LASF2353: + .string "need_for_probe" +.LASF220: + .string "locked_pending" +.LASF1148: + .string "nr_deferred" +.LASF1846: + .string "fown_struct" +.LASF1956: + .string "perm" +.LASF714: + .string "compat_robust_list" +.LASF2944: + .string "ebc_buffer_phy" +.LASF2446: + .string "unmap" +.LASF1980: + .string "ktype" +.LASF385: + .string "lockref" +.LASF2225: + .string "in_dpm_list" +.LASF1792: + .string "bd_invalidated" +.LASF1065: + .string "mm_struct" +.LASF1400: + .string "ki_hint" +.LASF421: + .string "i_uid" +.LASF86: + .string "alternatives_applied" +.LASF2918: + .string "rearrange" +.LASF597: + .string "boost_expires" +.LASF2884: + .string "DMA_BIDIRECTIONAL" +.LASF3299: + .string "__arch_copy_to_user" +.LASF236: + .string "spinlock" +.LASF769: + .string "arch_timer_erratum_workaround" +.LASF555: + .string "pid_namespace" +.LASF904: + .string "_syscall" +.LASF2738: + .string "mod_arch_specific" +.LASF2501: + .string "max_write_len" +.LASF472: + .string "d_compare" +.LASF942: + .string "vm_mm" +.LASF3093: + .string "need_refresh" +.LASF2789: + .string "platform_bus_type" +.LASF3119: + .string "data_buf" +.LASF3038: + .string "ulogo_buf" +.LASF3313: + .string "__msecs_to_jiffies" +.LASF1606: + .string "mem_dqinfo" +.LASF18: + .string "true" +.LASF456: + .string "i_count" +.LASF841: + .string "HRTIMER_NORESTART" +.LASF370: + .string "__cpu_online_mask" +.LASF1793: + .string "bd_disk" +.LASF1874: + .string "fl_fasync" +.LASF3179: + .string "update_mode" +.LASF2911: + .string "direct_mode" +.LASF2380: + .string "cache_sync" +.LASF436: + .string "i_lock" +.LASF2963: + .string "ebc_dsp_buf_status" +.LASF408: + .string "d_name" +.LASF733: + .string "trace" +.LASF2120: + .string "get_ownership" +.LASF2653: + .string "UNEVICTABLE_PGMUNLOCKED" +.LASF195: + .string "ufds" +.LASF1319: + .string "exe_file" +.LASF1141: + .string "nr_scanned" +.LASF646: + .string "pid_links" +.LASF1175: + .string "vaddr" +.LASF2259: + .string "request" +.LASF1479: + .string "pglist_data" +.LASF3162: + .string "image_osd_data" +.LASF1743: + .string "rw_hint" +.LASF2519: + .string "IRQ_POLL_SOFTIRQ" +.LASF1037: + .string "timeout" +.LASF672: + .string "last_switch_time" +.LASF565: + .string "fs_overflowuid" +.LASF2900: + .string "start_info" +.LASF2662: + .string "vm_zone_stat" +.LASF2797: + .string "init_thread_union" +.LASF1643: + .string "qc_dqblk" +.LASF2089: + .string "mmapped" +.LASF2246: + .string "child_count" +.LASF1911: + .string "kill_sb" +.LASF412: + .string "d_op" +.LASF2486: + .string "unlock_bus" +.LASF1345: + .string "MIGRATE_ASYNC" +.LASF358: + .string "__sched_text_end" +.LASF439: + .string "i_write_hint" +.LASF1083: + .string "process_keyring" +.LASF2550: + .string "page_ext_operations" +.LASF2632: + .string "KSWAPD_HIGH_WMARK_HIT_QUICKLY" +.LASF3055: + .string "ebc_state_read" +.LASF3291: + .string "__stack_chk_fail" +.LASF2882: + .string "pmic_set_vcom" +.LASF2668: + .string "stack_guard_gap" +.LASF3234: + .string "bytes" +.LASF1707: + .string "gpl_future_crcs" +.LASF995: + .string "wait_start" +.LASF1416: + .string "nr_free" +.LASF272: + .string "cpu_hwcaps" +.LASF390: + .string "slash_name" +.LASF125: + .string "show_fdinfo" +.LASF2771: + .string "fixup" +.LASF386: + .string "hash" +.LASF1215: + .string "freelist" +.LASF1812: + .string "posix_acl" +.LASF245: + .string "static_key_mod" +.LASF168: + .string "bug_addr_disp" +.LASF1612: + .string "dqi_igrace" +.LASF2162: + .string "thaw_noirq" +.LASF940: + .string "vm_rb" +.LASF3022: + .string "kernel_read_file_str" +.LASF568: + .string "init_user_ns" +.LASF2416: + .string "add_links" +.LASF2143: + .string "pm_message_t" +.LASF2902: + .string "xen_dma_ops" +.LASF1413: + .string "page_group_by_mobility_disabled" +.LASF2342: + .string "secondary" +.LASF2340: + .string "segment_boundary_mask" +.LASF1436: + .string "NR_INACTIVE_ANON" +.LASF246: + .string "static_key" +.LASF938: + .string "vm_next" +.LASF2302: + .string "remove" +.LASF495: + .string "s_magic" +.LASF1054: + .string "dl_overrun" +.LASF2367: + .string "alloc" +.LASF295: + .string "__entry_text_start" +.LASF751: + .string "sys_tz" +.LASF2360: + .string "revmap_direct_max_irq" +.LASF782: + .string "jiffies_64" +.LASF2030: + .string "payload" +.LASF1358: + .string "cb_state" +.LASF2894: + .string "orig_nents" +.LASF3071: + .string "buf_addr" +.LASF413: + .string "d_sb" +.LASF669: + .string "comm" +.LASF294: + .string "__kprobes_text_end" +.LASF2273: + .string "last_time" +.LASF549: + .string "PIDTYPE_PID" +.LASF954: + .string "events" +.LASF2201: + .string "offline" +.LASF1834: + .string "atomic_open" +.LASF1542: + .string "_zonerefs" +.LASF143: + .string "panic_on_unrecovered_nmi" +.LASF1204: + .string "private_lock" +.LASF434: + .string "i_mtime" +.LASF2573: + .string "dev_page_fault_t" +.LASF3110: + .string "ebc_auto_tast_function" +.LASF24: + .string "__kernel_gid32_t" +.LASF1430: + .string "NR_BOUNCE" +.LASF1253: + .string "f_cred" +.LASF2757: + .string "MODULE_STATE_COMING" +.LASF2955: + .string "auto_need_refresh0" +.LASF2200: + .string "offline_disabled" +.LASF3164: + .string "refresh_new_image_area" +.LASF3222: + .string "of_property_read_u32_array" +.LASF2445: + .string "select" +.LASF89: + .string "linux_banner" +.LASF2356: + .string "host_data" +.LASF2730: + .string "param_ops_invbool" +.LASF2485: + .string "trylock_bus" +.LASF109: + .string "mmap" +.LASF282: + .string "__bss_stop" +.LASF1868: + .string "fl_pid" +.LASF2688: + .string "d_un" +.LASF1321: + .string "async_put_work" +.LASF2085: + .string "kernfs_syscall_ops" +.LASF2991: + .string "ebc_last_display" +.LASF1826: + .string "mknod" +.LASF152: + .string "SYSTEM_BOOTING" +.LASF1569: + .string "max_freq_scale" +.LASF2895: + .string "dma_direct_ops" +.LASF2221: + .string "dev_pm_info" +.LASF27: + .string "__kernel_loff_t" +.LASF2285: + .string "detach" +.LASF118: + .string "get_unmapped_area" +.LASF1232: + .string "dev_pagemap" +.LASF2617: + .string "PGDEACTIVATE" +.LASF3125: + .string "line_step" +.LASF1753: + .string "writepages" +.LASF994: + .string "sched_statistics" +.LASF136: + .string "head" +.LASF1475: + .string "reclaim_stat" +.LASF2810: + .string "epd_lut_type" +.LASF2510: + .string "nmi_ctx" +.LASF1113: + .string "uprobe_task" +.LASF3076: + .string "ebc_frame_control_timeout" +.LASF1772: + .string "writeback_control" +.LASF1873: + .string "fl_end" +.LASF3304: + .string "ebc_find_buf_by_phy_addr" +.LASF1920: + .string "super_operations" +.LASF395: + .string "want_pages" +.LASF2923: + .string "regmap_base" +.LASF339: + .string "wps_disabled" +.LASF2373: + .string "unmap_sg" +.LASF2830: + .string "buf_dsp" +.LASF2832: + .string "buf_error" +.LASF993: + .string "util_avg" +.LASF758: + .string "task" +.LASF598: + .string "sched_task_group" +.LASF2823: + .string "WF_TYPE_GRAY16" +.LASF2156: + .string "thaw_early" +.LASF677: + .string "blocked" +.LASF429: + .string "i_security" +.LASF2613: + .string "PGSCAN_SKIP_NORMAL" +.LASF2893: + .string "nents" +.LASF756: + .string "__smp_cross_call" +.LASF2739: + .string "core" +.LASF1784: + .string "bd_holders" +.LASF3116: + .string "reset_and_flip" +.LASF2924: + .string "enable" +.LASF926: + .string "pipe_bufs" +.LASF3239: + .string "to_user" +.LASF2093: + .string "KOBJ_NS_TYPE_NET" +.LASF296: + .string "__entry_text_end" +.LASF1340: + .string "fe_length" +.LASF1659: + .string "d_rt_spc_warns" +.LASF309: + .string "__noinstr_text_start" +.LASF467: + .string "i_verity_info" +.LASF181: + .string "timespec_type" +.LASF822: + .string "__rb_parent_color" +.LASF2193: + .string "devres_lock" +.LASF366: + .string "bits" +.LASF560: + .string "init_struct_pid" +.LASF2002: + .string "child" +.LASF1077: + .string "cap_inheritable" +.LASF1357: + .string "gp_wait" +.LASF1814: + .string "lookup" +.LASF1559: + .string "cpu_topology" +.LASF3243: + .string "sp_el0" +.LASF3315: + .string "ebc_dsp_buf_get" +.LASF2871: + .string "panel_color" +.LASF1865: + .string "fl_owner" +.LASF2817: + .string "WF_TYPE_GLD16" +.LASF2986: + .string "is_power_off" +.LASF950: + .string "vm_private_data" +.LASF1913: + .string "s_lock_key" +.LASF1169: + .string "uprobe_task_state" +.LASF207: + .string "ttbr0" +.LASF2116: + .string "kobj_type" +.LASF2591: + .string "sysctl_overcommit_kbytes" +.LASF2958: + .string "frame_left" +.LASF2448: + .string "deactivate" +.LASF2821: + .string "WF_TYPE_AUTO" +.LASF1196: + .string "i_pages" +.LASF3206: + .string "safe_ptr" +.LASF377: + .string "hlist_bl_head" +.LASF1665: + .string "ino_warnlimit" +.LASF1488: + .string "pfmemalloc_wait" +.LASF2977: + .string "waiting_new_buf_time" +.LASF115: + .string "fasync" +.LASF1678: + .string "i_rt_spc_warnlimit" +.LASF1338: + .string "fe_logical" +.LASF956: + .string "page_frag" +.LASF967: + .string "write_bytes" +.LASF1965: + .string "fi_extents_mapped" +.LASF1451: + .string "NR_FILE_PAGES" +.LASF2: + .string "char" +.LASF925: + .string "unix_inflight" +.LASF1695: + .string "holders_dir" +.LASF3085: + .string "__wq_entry" +.LASF3089: + .string "new_buffer" +.LASF464: + .string "i_fsnotify_mask" +.LASF2631: + .string "KSWAPD_LOW_WMARK_HIT_QUICKLY" +.LASF965: + .string "syscfs" +.LASF3199: + .string "wake_unlock" +.LASF2414: + .string "graph_get_port_parent" +.LASF2651: + .string "UNEVICTABLE_PGRESCUED" +.LASF2178: + .string "msi_list" +.LASF3244: + .string "__ilog2_u64" +.LASF547: + .string "compat_time_t" +.LASF2978: + .string "ebc_mode" +.LASF400: + .string "d_alias" +.LASF1455: + .string "NR_SHMEM" +.LASF365: + .string "cpumask" +.LASF2136: + .string "n_klist" +.LASF1279: + .string "dumper" +.LASF1708: + .string "num_gpl_future_syms" +.LASF2244: + .string "wakeirq" +.LASF818: + .string "plist_node" +.LASF1079: + .string "cap_effective" +.LASF1715: + .string "taints" +.LASF3263: + .string "of_address_to_resource" +.LASF983: + .string "enqueued" +.LASF974: + .string "sum_exec_runtime" +.LASF166: + .string "hex_asc_upper" +.LASF507: + .string "s_roots" +.LASF2883: + .string "dma_data_direction" +.LASF1658: + .string "d_rt_spc_timer" +.LASF1926: + .string "evict_inode" +.LASF1459: + .string "NR_UNSTABLE_NFS" +.LASF2423: + .string "length" +.LASF1552: + .string "sysctl_lowmem_reserve_ratio" +.LASF2125: + .string "buflen" +.LASF1797: + .string "bd_private" +.LASF1872: + .string "fl_start" +.LASF3221: + .string "out_value" +.LASF1930: + .string "freeze_fs" +.LASF880: + .string "sigset_t" +.LASF1886: + .string "lm_notify" +.LASF3108: + .string "normal_mode_lut_type" +.LASF3178: + .string "ebc_tcon_dsp_mode_set" +.LASF851: + .string "running" +.LASF723: + .string "rseq_event_mask" +.LASF496: + .string "s_root" +.LASF1851: + .string "ra_pages" +.LASF75: + .string "aarch32_opcode_cond_checks" +.LASF184: + .string "TT_COMPAT" +.LASF835: + .string "pcpu_fc_names" +.LASF2341: + .string "fwnode_handle" +.LASF2697: + .string "Elf64_Sym" +.LASF2064: + .string "syscall_ops" +.LASF479: + .string "d_automount" +.LASF1234: + .string "page_free" +.LASF3112: + .string "__val" +.LASF1450: + .string "NR_FILE_MAPPED" +.LASF639: + .string "parent" +.LASF1133: + .string "atime" +.LASF126: + .string "copy_file_range" +.LASF2654: + .string "UNEVICTABLE_PGCLEARED" +.LASF3296: + .string "epd_lut_get_wf_version" +.LASF2016: + .string "key_type" +.LASF3236: + .string "copy_overflow" +.LASF2410: + .string "get_named_child_node" +.LASF2227: + .string "is_suspended" +.LASF2891: + .string "dma_length" +.LASF2035: + .string "burst" +.LASF1936: + .string "clone_mnt_data" +.LASF2746: + .string "module_kobject" +.LASF3048: + .string "memory" +.LASF3213: + .string "order" +.LASF739: + .string "active_memcg" +.LASF1301: + .string "def_flags" +.LASF2993: + .string "global_ebc" +.LASF1442: + .string "NR_SLAB_UNRECLAIMABLE" +.LASF1095: + .string "refcount" +.LASF1759: + .string "invalidatepage" +.LASF3075: + .string "ebc_frame_timeout" +.LASF364: + .string "wait_queue_head_t" +.LASF1239: + .string "page_type" +.LASF2018: + .string "rcu_data0" +.LASF1080: + .string "cap_bset" +.LASF864: + .string "nr_hangs" +.LASF2222: + .string "power_state" +.LASF744: + .string "stack_vm_area" +.LASF2788: + .string "mfd_cell" +.LASF2856: + .string "EPD_A2" +.LASF2071: + .string "kernfs_elem_attr" +.LASF3091: + .string "new_buffer_temp" +.LASF2268: + .string "set_latency_tolerance" +.LASF573: + .string "debug_locks_silent" +.LASF1322: + .string "linux_binfmt" +.LASF142: + .string "panic_on_oops" +.LASF271: + .string "arm64_ftr_reg_ctrel0" +.LASF1213: + .string "counters" +.LASF3254: + .string "kasan_check_read" +.LASF2028: + .string "name_link" +.LASF543: + .string "d_canonical_path" +.LASF191: + .string "compat_timespec" +.LASF1458: + .string "NR_ANON_THPS" +.LASF731: + .string "timer_slack_ns" +.LASF1882: + .string "lm_compare_owner" +.LASF2293: + .string "bus_type" +.LASF3169: + .string "ebc_get_8pix_wf_part2" +.LASF599: + .string "policy" +.LASF1262: + .string "shared" +.LASF3016: + .string "ebc_match" +.LASF2922: + .string "dclk" +.LASF2186: + .string "dma_mem" +.LASF359: + .string "wait_queue_entry" +.LASF2288: + .string "dismiss" +.LASF1995: + .string "simple_dentry_operations" +.LASF902: + .string "_band" +.LASF595: + .string "boost" +.LASF2075: + .string "seq_start" +.LASF2779: + .string "module_sysfs_initialized" +.LASF973: + .string "task_cputime" +.LASF1165: + .string "rnode" +.LASF233: + .string "raw_lock" +.LASF76: + .string "__con_initcall_start" +.LASF1686: + .string "get_dqblk" +.LASF3028: + .string "ebc_tcon_node" +.LASF2786: + .string "id_entry" +.LASF1765: + .string "putback_page" +.LASF2505: + .string "nr_irqs" +.LASF3312: + .string "schedule_timeout" +.LASF865: + .string "max_hang_time" +.LASF3202: + .string "copy_from_user" +.LASF2436: + .string "DOMAIN_BUS_ANY" +.LASF2040: + .string "root_user" +.LASF2059: + .string "subdirs" +.LASF2858: + .string "EPD_DU" +.LASF1852: + .string "mmap_miss" +.LASF1623: + .string "quota_format_ops" +.LASF3314: + .string "ebc_osd_buf_get" +.LASF3068: + .string "argp" +.LASF1723: + .string "args" +.LASF34: + .string "__poll_t" +.LASF2402: + .string "fwnode_operations" +.LASF976: + .string "run_delay" +.LASF1967: + .string "fi_extents_start" +.LASF2903: + .string "dummy_dma_ops" +.LASF239: + .string "static_key_initialized" +.LASF2753: + .string "module_uevent" +.LASF3079: + .string "is_full_mode" +.LASF2566: + .string "base_pfn" +.LASF262: + .string "width" +.LASF900: + .string "_addr_pkey" +.LASF3062: + .string "waveform_buffer" +.LASF297: + .string "__start_rodata" +.LASF1437: + .string "NR_ACTIVE_ANON" +.LASF2906: + .string "tcon" +.LASF1084: + .string "thread_keyring" +.LASF2714: + .string "kparam_array" +.LASF3256: + .string "platform_driver_unregister" +.LASF652: + .string "utime" +.LASF1303: + .string "start_code" +.LASF3017: + .string "ebc_driver" +.LASF2574: + .string "dev_page_free_t" +.LASF3219: + .string "of_property_read_u32" +.LASF1367: + .string "guid_t" +.LASF147: + .string "sysctl_panic_on_stackoverflow" +.LASF1863: + .string "fl_link" +.LASF3103: + .string "check_black_percent" +.LASF2218: + .string "clock_list" +.LASF1556: + .string "section_mem_map" +.LASF310: + .string "__noinstr_text_end" +.LASF2106: + .string "attrs" +.LASF177: + .string "tz_minuteswest" +.LASF2428: + .string "of_chosen" +.LASF3114: + .string "ebc_frame_start" +.LASF349: + .string "sve_state" +.LASF1529: + .string "percpu_drift_mark" +.LASF367: + .string "cpumask_t" +.LASF134: + .string "kmsg_fops" +.LASF3305: + .string "ebc_buf_release" +.LASF1994: + .string "simple_symlink_inode_operations" +.LASF1602: + .string "dqb_isoftlimit" +.LASF2502: + .string "max_read_len" +.LASF601: + .string "cpus_allowed" +.LASF1258: + .string "f_tfile_llink" +.LASF1782: + .string "bd_claiming" +.LASF2146: + .string "complete" +.LASF2836: + .string "tid_name" +.LASF1035: + .string "sched_rt_entity" +.LASF117: + .string "sendpage" +.LASF3168: + .string "ret_val" +.LASF837: + .string "timerqueue_node" +.LASF258: + .string "sign" +.LASF1596: + .string "mem_dqblk" +.LASF2741: + .string "plt_entry" +.LASF3180: + .string "display_mode" +.LASF1949: + .string "nr_cached_objects" +.LASF1409: + .string "ia_mtime" +.LASF1138: + .string "shrink_control" +.LASF1381: + .string "nr_files" +.LASF2060: + .string "kernfs_root" +.LASF729: + .string "nr_dirtied_pause" +.LASF1466: + .string "NR_ION_HEAP" +.LASF2722: + .string "param_ops_int" +.LASF909: + .string "_sigchld" +.LASF1791: + .string "bd_part_count" +.LASF357: + .string "__sched_text_start" +.LASF2843: + .string "panel_refresh_mode" +.LASF91: + .string "linux_proc_banner" +.LASF2542: + .string "fops" +.LASF1242: + .string "f_path" +.LASF3269: + .string "kthread_create_on_node" +.LASF711: + .string "cgroups" +.LASF3205: + .string "__uaccess_mask_ptr" +.LASF2313: + .string "probe_type" +.LASF1779: + .string "bd_inode" +.LASF2215: + .string "RPM_REQ_AUTOSUSPEND" +.LASF268: + .string "sys_val" +.LASF303: + .string "__start_once" +.LASF96: + .string "kptr_restrict" +.LASF172: + .string "time64_t" +.LASF2475: + .string "userspace_clients" +.LASF2112: + .string "uevent_seqnum" +.LASF3276: + .string "memset" +.LASF3177: + .string "cur_image_addr" +.LASF2113: + .string "list_lock" +.LASF2175: + .string "pm_domain" +.LASF1066: + .string "cpu_bitmap" +.LASF828: + .string "pcpu_base_addr" +.LASF1931: + .string "thaw_super" +.LASF982: + .string "util_est" +.LASF1668: + .string "qc_state" +.LASF2195: + .string "knode_class" +.LASF1905: + .string "wait_unfrozen" +.LASF2012: + .string "key_perm_t" +.LASF2307: + .string "iommu_ops" +.LASF869: + .string "softirq_next_timer" +.LASF1790: + .string "bd_part" +.LASF119: + .string "check_flags" +.LASF1857: + .string "file_lock_operations" +.LASF344: + .string "tp_value" +.LASF3025: + .string "ebc_remove" +.LASF1862: + .string "fl_list" +.LASF1238: + .string "_mapcount" +.LASF860: + .string "hang_detected" +.LASF2118: + .string "child_ns_type" +.LASF1617: + .string "qf_fmt_id" +.LASF1021: + .string "nr_wakeups_idle" +.LASF1427: + .string "NR_MLOCK" +.LASF2795: + .string "tasklist_lock" +.LASF56: + .string "phys_addr_t" +.LASF1900: + .string "fa_fd" +.LASF2534: + .string "MEMREMAP_WB" +.LASF2671: + .string "sysctl_drop_caches" +.LASF1942: + .string "show_devname" +.LASF2915: + .string "panel_16bit" +.LASF1291: + .string "page_table_lock" +.LASF3015: + .string "ebc_pm" +.LASF2809: + .string "sched_priority" +.LASF1625: + .string "read_file_info" +.LASF2567: + .string "reserve" +.LASF1740: + .string "quota_info" +.LASF987: + .string "load_sum" +.LASF92: + .string "console_printk" +.LASF702: + .string "ioac" +.LASF1140: + .string "nr_to_scan" +.LASF2601: + .string "PGPGIN" +.LASF1583: + .string "dq_off" +.LASF1006: + .string "exec_max" +.LASF1372: + .string "uuid_index" +.LASF190: + .string "compat_rmtp" +.LASF437: + .string "i_bytes" +.LASF2814: + .string "WF_TYPE_GC16" +.LASF1895: + .string "nfs_fl" +.LASF403: + .string "dentry" +.LASF3246: + .string "__be32_to_cpup" +.LASF2135: + .string "klist_node" +.LASF1859: + .string "fl_release_private" +.LASF2854: + .string "EPD_PART_GLD16" +.LASF3148: + .string "wf_index_data" +.LASF107: + .string "unlocked_ioctl" +.LASF3080: + .string "force_full" +.LASF1117: + .string "vm_struct" +.LASF1278: + .string "nr_threads" +.LASF1803: + .string "__i_nlink" +.LASF145: + .string "panic_on_warn" +.LASF3073: + .string "ebc_panel_probe" +.LASF80: + .string "boot_command_line" +.LASF2463: + .string "adapter" +.LASF1420: + .string "NR_ZONE_LRU_BASE" +.LASF2173: + .string "links" +.LASF1837: + .string "bdi_writeback" +.LASF1654: + .string "d_spc_warns" +.LASF1011: + .string "nr_failed_migrations_hot" +.LASF2907: + .string "pmic" +.LASF1105: + .string "css_set" +.LASF1371: + .string "guid_index" +.LASF2513: + .string "force_irqthreads" +.LASF1294: + .string "hiwater_rss" +.LASF2133: + .string "power_kobj" +.LASF492: + .string "s_export_op" +.LASF1805: + .string "i_rcu" +.LASF2849: + .string "EPD_FULL_GLD16" +.LASF156: + .string "SYSTEM_POWER_OFF" +.LASF747: + .string "futex_exit_mutex" +.LASF2462: + .string "i2c_client" +.LASF1535: + .string "compact_blockskip_flush" +.LASF1649: + .string "d_space" +.LASF319: + .string "__hibernate_exit_text_end" +.LASF2140: + .string "pm_power_off_prepare" +.LASF2023: + .string "graveyard_link" +.LASF2791: + .string "platform_driver" +.LASF1115: + .string "xol_vaddr" +.LASF122: + .string "splice_read" +.LASF2679: + .string "Elf64_Addr" +.LASF1657: + .string "d_rt_space" +.LASF265: + .string "name" +.LASF3274: + .string "mod_timer" +.LASF151: + .string "early_boot_irqs_disabled" +.LASF658: + .string "nvcsw" +.LASF3046: + .string "ebc_task_init" +.LASF2801: + .string "KMALLOC_NORMAL" +.LASF1058: + .string "exp_need_qs" +.LASF250: + .string "__stop___jump_table" +.LASF1111: + .string "task_delay_info" +.LASF1330: + .string "prealloc_pte" +.LASF1424: + .string "NR_ZONE_ACTIVE_FILE" +.LASF2358: + .string "bus_token" +.LASF422: + .string "i_gid" +.LASF1588: + .string "quota_type" +.LASF3121: + .string "buffer_old" +.LASF1505: + .string "high" +.LASF431: + .string "i_rdev" +.LASF1997: + .string "simple_dir_inode_operations" +.LASF1891: + .string "nfs_lock_info" +.LASF1342: + .string "fe_flags" +.LASF687: + .string "self_exec_id" +.LASF1876: + .string "fl_downgrade_time" +.LASF2968: + .string "auto_frame_count" +.LASF2073: + .string "kernfs_ops" +.LASF2966: + .string "auto_image_new" +.LASF1860: + .string "file_lock" +.LASF2756: + .string "MODULE_STATE_LIVE" +.LASF1393: + .string "sysctl_protected_fifos" +.LASF1030: + .string "nr_migrations" +.LASF937: + .string "vm_end" +.LASF1935: + .string "remount_fs2" +.LASF2052: + .string "iomem_resource" +.LASF1866: + .string "fl_flags" +.LASF2149: + .string "freeze" +.LASF1426: + .string "NR_ZONE_WRITE_PENDING" +.LASF1265: + .string "close" +.LASF3157: + .string "image_fb_data" +.LASF3039: + .string "klogo_buf" +.LASF2864: + .string "EPD_POWER_OFF" +.LASF1470: + .string "zone_reclaim_stat" +.LASF736: + .string "memcg_oom_gfp_mask" +.LASF3232: + .string "_msecs_to_jiffies" +.LASF1652: + .string "d_spc_timer" +.LASF1728: + .string "jump_entries" +.LASF3240: + .string "test_ti_thread_flag" +.LASF2224: + .string "async_suspend" +.LASF2599: + .string "compound_page_dtors" +.LASF1975: + .string "read_pos" +.LASF482: + .string "super_block" +.LASF3207: + .string "__addr" +.LASF2291: + .string "dma_coherent" +.LASF1042: + .string "sched_dl_entity" +.LASF611: + .string "rcu_tasks_holdout_list" +.LASF1266: + .string "split" +.LASF709: + .string "cpuset_mem_spread_rotor" +.LASF2988: + .string "overlay_bg_update" +.LASF2008: + .string "assoc_array" +.LASF566: + .string "fs_overflowgid" +.LASF1585: + .string "dq_dqb" +.LASF2683: + .string "Elf64_Xword" +.LASF958: + .string "lock_class_key" +.LASF3311: + .string "ebc_get_dsp_list_enum_num" +.LASF1698: + .string "num_syms" +.LASF2773: + .string "module_notes_attrs" +.LASF2081: + .string "generation" +.LASF553: + .string "PIDTYPE_MAX" +.LASF2737: + .string "plt_max_entries" +.LASF2372: + .string "map_sg" +.LASF1128: + .string "nlink" +.LASF3034: + .string "ulogo_addr_valid" +.LASF2546: + .string "percpu_ref" +.LASF93: + .string "devkmsg_log_str" +.LASF255: + .string "FTR_HIGHER_SAFE" +.LASF3218: + .string "i2c_get_clientdata" +.LASF3203: + .string "_copy_to_user" +.LASF3249: + .string "test_bit" +.LASF249: + .string "__start___jump_table" +.LASF783: + .string "jiffies" +.LASF2243: + .string "wait_queue" +.LASF1615: + .string "dqi_priv" +.LASF617: + .string "rss_stat" +.LASF708: + .string "mems_allowed_seq" +.LASF1739: + .string "refcnt" +.LASF3095: + .string "pbuf_new" +.LASF2150: + .string "thaw" +.LASF1687: + .string "get_nextdqblk" +.LASF518: + .string "s_fs_info" +.LASF1471: + .string "recent_rotated" +.LASF2139: + .string "pm_power_off" +.LASF198: + .string "futex" +.LASF996: + .string "wait_max" +.LASF3272: + .string "wakeup_source_add" +.LASF3196: + .string "ebc_pmic_suspend" +.LASF1127: + .string "result_mask" +.LASF2203: + .string "state_synced" +.LASF2389: + .string "phandle" +.LASF1632: + .string "dquot_operations" +.LASF1193: + .string "mapping" +.LASF3228: + .string "resource_size" +.LASF3270: + .string "wake_up_process" +.LASF1323: + .string "kioctx_table" +.LASF823: + .string "rb_right" +.LASF3141: + .string "buffer_new_tmp" +.LASF949: + .string "vm_file" +.LASF2664: + .string "vmstat_text" +.LASF2054: + .string "idr_base" +.LASF745: + .string "stack_refcount" +.LASF440: + .string "i_blocks" +.LASF1490: + .string "kswapd_order" +.LASF2144: + .string "dev_pm_ops" +.LASF2749: + .string "module_param_attrs" +.LASF846: + .string "is_rel" +.LASF2010: + .string "assoc_array_ptr" +.LASF327: + .string "__initdata_end" +.LASF2470: + .string "bus_lock" +.LASF3215: + .string "kmalloc_type" +.LASF388: + .string "qstr" +.LASF3123: + .string "gray_new" +.LASF3040: + .string "in_buffer" +.LASF1062: + .string "futex_state" +.LASF1447: + .string "WORKINGSET_RESTORE" +.LASF628: + .string "sched_psi_wake_requeue" +.LASF3233: + .string "check_copy_size" +.LASF737: + .string "memcg_oom_order" +.LASF706: + .string "acct_timexpd" +.LASF1375: + .string "__rcu_icq_cache" +.LASF146: + .string "sysctl_panic_on_rcu_stall" +.LASF957: + .string "size" +.LASF1512: + .string "ZONE_DMA32" +.LASF2269: + .string "wakeup_source" +.LASF1251: + .string "f_pos" +.LASF1452: + .string "NR_FILE_DIRTY" +.LASF19: + .string "__kernel_long_t" +.LASF726: + .string "task_frag" +.LASF1958: + .string "datalen" +.LASF1019: + .string "nr_wakeups_affine_attempts" +.LASF1435: + .string "NR_LRU_BASE" +.LASF1710: + .string "extable" +.LASF1738: + .string "exit" +.LASF1532: + .string "compact_considered" +.LASF2710: + .string "kernel_param_ops" +.LASF443: + .string "dirtied_when" +.LASF2528: + .string "swapper_pg_dir" +.LASF337: + .string "suspended_step" +.LASF251: + .string "static_key_false" +.LASF1207: + .string "pobjects" +.LASF1767: + .string "is_partially_uptodate" +.LASF1202: + .string "writeback_index" +.LASF1277: + .string "core_state" +.LASF839: + .string "timerqueue_head" +.LASF3271: + .string "sched_setscheduler_nocheck" +.LASF1260: + .string "f_wb_err" +.LASF2399: + .string "rt_mutex" +.LASF961: + .string "rchar" +.LASF3188: + .string "valid_dma_direction" +.LASF1787: + .string "bd_contains" +.LASF1108: + .string "futex_pi_state" +.LASF1126: + .string "kstat" +.LASF23: + .string "__kernel_uid32_t" +.LASF2493: + .string "get_bus_free" +.LASF32: + .string "__le32" +.LASF433: + .string "i_atime" +.LASF808: + .string "pte_t" +.LASF1226: + .string "_pt_pad_1" +.LASF1228: + .string "_pt_pad_2" +.LASF2781: + .string "cpuhp_tasks_frozen" +.LASF1892: + .string "nlm_lockowner" +.LASF2310: + .string "device_driver" +.LASF667: + .string "real_cred" +.LASF3101: + .string "one_buffer_start" +.LASF2417: + .string "fwnode_endpoint" +.LASF3086: + .string "__int" +.LASF923: + .string "epoll_watches" +.LASF2646: + .string "KCOMPACTD_WAKE" +.LASF3160: + .string "refresh_new_image" +.LASF3140: + .string "wf_index" +.LASF2043: + .string "non_rcu" +.LASF3161: + .string "image_osd" +.LASF2607: + .string "PGALLOC_NORMAL" +.LASF369: + .string "__cpu_possible_mask" +.LASF786: + .string "timekeeping_suspended" +.LASF1495: + .string "kcompactd_wait" +.LASF1599: + .string "dqb_curspace" +.LASF1355: + .string "gp_state" +.LASF186: + .string "bitset" +.LASF991: + .string "load_avg" +.LASF1274: + .string "access" +.LASF2460: + .string "i2c_adapter_type" +.LASF1390: + .string "lease_break_time" +.LASF1033: + .string "cfs_rq" +.LASF885: + .string "_uid" +.LASF340: + .string "hbp_break" +.LASF3163: + .string "osd_data" +.LASF3030: + .string "pmic_node" +.LASF139: + .string "panic_blink" +.LASF2740: + .string "ftrace_trampoline" +.LASF895: + .string "_upper" +.LASF2643: + .string "COMPACTSTALL" +.LASF10: + .string "short unsigned int" +.LASF1190: + .string "__bp_harden_hyp_vecs_end" +.LASF780: + .string "tick_usec" +.LASF1795: + .string "bd_bdi" +.LASF2684: + .string "Elf64_Sxword" +.LASF1909: + .string "mount2" +.LASF1919: + .string "i_mutex_dir_key" +.LASF1374: + .string "q_node" +.LASF2480: + .string "master_xfer" +.LASF2295: + .string "dev_root" +.LASF1664: + .string "spc_warnlimit" +.LASF3147: + .string "get_one_overlay_image2" +.LASF1463: + .string "NR_WRITTEN" +.LASF2551: + .string "need" +.LASF505: + .string "s_encoding" +.LASF3111: + .string "data_calc_area" +.LASF1703: + .string "gpl_crcs" +.LASF1689: + .string "get_state" +.LASF3191: + .string "dma_handle" +.LASF1328: + .string "orig_pte" +.LASF2728: + .string "param_ops_bool" +.LASF2429: + .string "of_aliases" +.LASF1603: + .string "dqb_curinodes" +.LASF1433: + .string "NR_VM_ZONE_STAT_ITEMS" +.LASF1023: + .string "load" +.LASF5: + .string "__s8" +.LASF353: + .string "fault_code" +.LASF3007: + .string "dev_attr_waveform_version" +.LASF2180: + .string "dma_mask" +.LASF2087: + .string "prealloc_mutex" +.LASF2442: + .string "DOMAIN_BUS_FSL_MC_MSI" +.LASF1434: + .string "node_stat_item" +.LASF2464: + .string "init_irq" +.LASF1308: + .string "start_stack" +.LASF2042: + .string "init_groups" +.LASF1880: + .string "android_reserved1" +.LASF313: + .string "__nosave_end" +.LASF2006: + .string "event" +.LASF520: + .string "s_mode" +.LASF1579: + .string "dq_dqb_lock" +.LASF21: + .string "__kernel_ulong_t" +.LASF2575: + .string "max_mapnr" +.LASF2932: + .string "regmap" +.LASF2898: + .string "shared_info" +.LASF772: + .string "read_cntp_tval_el0" +.LASF2605: + .string "PSWPOUT" +.LASF1045: + .string "dl_period" +.LASF3083: + .string "one_buffer_end" +.LASF1454: + .string "NR_WRITEBACK_TEMP" +.LASF2482: + .string "functionality" +.LASF306: + .string "__ctors_end" +.LASF2235: + .string "wakeup_path" +.LASF3292: + .string "ebc_buf_state_show" +.LASF939: + .string "vm_prev" +.LASF274: + .string "arm64_const_caps_ready" +.LASF1136: + .string "btime" +.LASF1879: + .string "fl_u" +.LASF2004: + .string "extra2" +.LASF6: + .string "__u8" +.LASF116: + .string "lock" +.LASF3195: + .string "ebc_pmic_resume" +.LASF1531: + .string "compact_cached_migrate_pfn" +.LASF2606: + .string "PGALLOC_DMA32" +.LASF2724: + .string "param_ops_long" +.LASF2928: + .string "frame_addr_set" +.LASF1048: + .string "runtime" +.LASF399: + .string "d_wait" +.LASF2419: + .string "local_fwnode" +.LASF2717: + .string "__start___param" +.LASF1149: + .string "list_lru_one" +.LASF1887: + .string "lm_grant" +.LASF144: + .string "panic_on_io_nmi" +.LASF2545: + .string "percpu_ref_func_t" +.LASF2077: + .string "seq_stop" +.LASF1218: + .string "compound_dtor" +.LASF1952: + .string "xattr_handler" +.LASF1395: + .string "kiocb" +.LASF2872: + .string "width_mm" +.LASF1534: + .string "compact_order_failed" +.LASF1074: + .string "fsuid" +.LASF3241: + .string "flag" +.LASF1444: + .string "NR_ISOLATED_FILE" +.LASF485: + .string "s_blocksize_bits" +.LASF2264: + .string "active_jiffies" +.LASF1524: + .string "managed_pages" +.LASF2558: + .string "__tracepoint_page_ref_set" +.LASF3184: + .string "ebc_tcon_enable" +.LASF3323: + .ascii "GNU C89 6.3.1 20170404 -mlittle-endian -mgeneral-regs-only -" + .ascii "mabi=lp64 -march=armv8-a -g -O2 -std=gnu90 -fno-strict-alias" + .ascii "ing -fno-common -fshort-wchar -fno-PIE -fno-asynchronous-unw" + .ascii "ind-tables -fno-delete-n" + .string "ull-pointer-checks -fstack-protector-strong -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fstack-check=no -fconserve-stack --param allow-store-data-races=0" +.LASF2589: + .string "sysctl_overcommit_memory" +.LASF2504: + .string "max_comb_2nd_msg_len" +.LASF1570: + .string "gfp_allowed_mask" +.LASF1155: + .string "shrinker_id" +.LASF2538: + .string "MEMREMAP_DEC" +.LASF753: + .string "total_cpus" +.LASF1160: + .string "root" +.LASF35: + .string "value_offset" +.LASF743: + .string "oom_reaper_list" +.LASF354: + .string "debug" +.LASF1518: + .string "nr_reserved_highatomic" +.LASF2333: + .string "shutdown_pre" +.LASF2253: + .string "no_callbacks" +.LASF2793: + .string "prevent_deferred_probe" +.LASF9: + .string "__u16" +.LASF997: + .string "wait_count" +.LASF1456: + .string "NR_SHMEM_THPS" +.LASF1704: + .string "sig_ok" +.LASF2049: + .string "lpj_fine" +.LASF504: + .string "s_vop" +.LASF1619: + .string "qf_owner" +.LASF3255: + .string "__write_once_size" +.LASF2800: + .string "kmalloc_cache_type" +.LASF574: + .string "mutex" +.LASF3223: + .string "out_values" +.LASF810: + .string "pgd_t" +.LASF600: + .string "nr_cpus_allowed" +.LASF1429: + .string "NR_KERNEL_STACK_KB" +.LASF1469: + .string "NR_VM_NODE_STAT_ITEMS" +.LASF234: + .string "raw_spinlock_t" +.LASF2909: + .string "vir_width" +.LASF1907: + .string "fs_flags" +.LASF1761: + .string "freepage" +.LASF2242: + .string "work" +.LASF2022: + .string "keytype" +.LASF922: + .string "sigpending" +.LASF2183: + .string "dma_pfn_offset" +.LASF3001: + .string "resume_frame_count" +.LASF1158: + .string "radix_tree_node" +.LASF3245: + .string "sign_extend64" +.LASF2282: + .string "wake_irq" +.LASF3032: + .string "ulogo_addr" +.LASF830: + .string "pcpu_fc" +.LASF2266: + .string "accounting_timestamp" +.LASF509: + .string "s_bdev" +.LASF178: + .string "tz_dsttime" +.LASF12: + .string "__u32" +.LASF2628: + .string "PGINODESTEAL" +.LASF643: + .string "ptraced" +.LASF2720: + .string "param_ops_short" +.LASF3287: + .string "of_find_device_by_node" +.LASF2522: + .string "HRTIMER_SOFTIRQ" +.LASF2597: + .string "shmem_enabled_attr" +.LASF455: + .string "i_sequence" +.LASF1478: + .string "pgdat" +.LASF2578: + .string "page_cluster" +.LASF3014: + .string "dev_attr_auto_frame_state" +.LASF1601: + .string "dqb_ihardlimit" +.LASF411: + .string "d_lockref" +.LASF2211: + .string "rpm_request" +.LASF3067: + .string "ebc_io_ctl" +.LASF1118: + .string "addr" +.LASF2354: + .string "device_private" +.LASF3186: + .string "get_dma_ops" +.LASF2666: + .string "watermark_scale_factor" +.LASF1810: + .string "i_dir_seq" +.LASF2092: + .string "KOBJ_NS_TYPE_NONE" +.LASF1770: + .string "swap_activate" +.LASF955: + .string "mm_rss_stat" +.LASF1691: + .string "mkobj" +.LASF2949: + .string "direct_buf_real_size" +.LASF3320: + .string "__pm_relax" +.LASF473: + .string "d_delete" +.LASF1591: + .string "PRJQUOTA" +.LASF2038: + .string "begin" +.LASF2705: + .string "sh_link" +.LASF3023: + .string "ebc_suspend" +.LASF2326: + .string "cls_msk" +.LASF2634: + .string "PGROTATED" +.LASF1639: + .string "write_info" +.LASF2128: + .string "kobj_attribute" +.LASF2248: + .string "idle_notification" +.LASF1776: + .string "block_device" +.LASF2091: + .string "kobj_ns_type" +.LASF2587: + .string "sysctl_user_reserve_kbytes" +.LASF2785: + .string "num_resources" +.LASF1544: + .string "notifier_fn_t" +.LASF3031: + .string "pmic_client" +.LASF2540: + .string "miscdevice" +.LASF655: + .string "time_in_state" +.LASF3045: + .string "ebc_logo_init" +.LASF1237: + .string "kill" +.LASF1000: + .string "iowait_sum" +.LASF3154: + .string "image_new" +.LASF15: + .string "__u64" +.LASF694: + .string "journal_info" +.LASF2847: + .string "EPD_FULL_GL16" +.LASF625: + .string "sched_contributes_to_load" +.LASF980: + .string "weight" +.LASF468: + .string "i_private" +.LASF1954: + .string "serial" +.LASF112: + .string "flush" +.LASF2833: + .string "ebc_buf_s" +.LASF2165: + .string "runtime_suspend" +.LASF438: + .string "i_blkbits" +.LASF2424: + .string "value" +.LASF2983: + .string "frame_timer" +.LASF2842: + .string "needpic" +.LASF1003: + .string "sum_sleep_runtime" +.LASF3036: + .string "ulogo_addr_str" +.LASF3117: + .string "flip" +.LASF1049: + .string "deadline" +.LASF934: + .string "vmas" +.LASF1297: + .string "pinned_vm" +.LASF1483: + .string "node_start_pfn" +.LASF2516: + .string "NET_TX_SOFTIRQ" +.LASF703: + .string "psi_flags" +.LASF1327: + .string "address" +.LASF1799: + .string "bd_fsfreeze_mutex" +.LASF1203: + .string "a_ops" +.LASF2322: + .string "PROBE_FORCE_SYNCHRONOUS" +.LASF95: + .string "dmesg_restrict" +.LASF936: + .string "vm_start" +.LASF493: + .string "s_flags" +.LASF3145: + .string "wf_index_tmp" +.LASF373: + .string "cpumask_var_t" +.LASF1268: + .string "fault" +.LASF81: + .string "saved_command_line" +.LASF2867: + .string "EPD_AUTO_DU4" +.LASF1944: + .string "show_stats" +.LASF1047: + .string "dl_density" +.LASF1628: + .string "read_dqblk" +.LASF1584: + .string "dq_flags" +.LASF3317: + .string "ebc_get_osd_list_enum_num" +.LASF3120: + .string "buffer_new" +.LASF213: + .string "user_fpsimd_state" +.LASF3286: + .string "device_create_file" +.LASF521: + .string "s_time_gran" +.LASF2332: + .string "dev_release" +.LASF1333: + .string "kernel_cap_t" +.LASF575: + .string "wait_list" +.LASF2249: + .string "request_pending" +.LASF843: + .string "hrtimer" +.LASF494: + .string "s_iflags" +.LASF717: + .string "perf_event_ctxp" +.LASF457: + .string "i_dio_count" +.LASF510: + .string "s_bdi" +.LASF2826: + .string "wf_table" +.LASF1700: + .string "num_kp" +.LASF3322: + .string "__pm_stay_awake" +.LASF2533: + .string "vmap_area_list" +.LASF2997: + .string "ebc_auto_thread_sem" +.LASF629: + .string "in_execve" +.LASF2214: + .string "RPM_REQ_SUSPEND" +.LASF483: + .string "s_list" +.LASF1600: + .string "dqb_rsvspace" +.LASF1693: + .string "version" +.LASF2532: + .string "xen_start_flags" +.LASF2852: + .string "EPD_PART_GL16" +.LASF1507: + .string "stat_threshold" +.LASF2331: + .string "class_release" +.LASF1854: + .string "fu_llist" +.LASF688: + .string "alloc_lock" +.LASF514: + .string "s_dquot" +.LASF796: + .string "system_highpri_wq" +.LASF1162: + .string "tags" +.LASF1853: + .string "prev_pos" +.LASF2279: + .string "expire_count" +.LASF277: + .string "_etext" +.LASF497: + .string "s_umount" +.LASF2105: + .string "is_bin_visible" +.LASF1326: + .string "pgoff" +.LASF2190: + .string "of_node" +.LASF2855: + .string "EPD_PART_GCC16" +.LASF1988: + .string "names_cachep" +.LASF784: + .string "preset_lpj" +.LASF2189: + .string "archdata" +.LASF1405: + .string "ia_uid" +.LASF1335: + .string "__cap_init_eff_set" +.LASF727: + .string "delays" +.LASF640: + .string "children" +.LASF1261: + .string "rb_subtree_last" +.LASF2237: + .string "no_pm_callbacks" +.LASF1566: + .string "llc_sibling" +.LASF2639: + .string "PGMIGRATE_FAIL" +.LASF2404: + .string "device_get_match_data" +.LASF649: + .string "vfork_done" +.LASF199: + .string "nanosleep" +.LASF1384: + .string "inodes_stat_t" +.LASF813: + .string "pud_t" +.LASF2783: + .string "platform_device" +.LASF1663: + .string "rt_spc_timelimit" +.LASF221: + .string "tail" +.LASF1408: + .string "ia_atime" +.LASF2512: + .string "irq_default_affinity" +.LASF724: + .string "tlb_ubc" +.LASF2384: + .string "remap" +.LASF1616: + .string "quota_format_type" +.LASF2784: + .string "id_auto" +.LASF1147: + .string "seeks" +.LASF576: + .string "task_struct" +.LASF2873: + .string "height_mm" +.LASF2608: + .string "PGALLOC_MOVABLE" +.LASF2240: + .string "suspend_timer" +.LASF1957: + .string "quotalen" +.LASF3167: + .string "ebc_get_8pix_wf_part3" +.LASF2378: + .string "sync_sg_for_cpu" +.LASF1497: + .string "totalreserve_pages" +.LASF450: + .string "i_wb_frn_history" +.LASF585: + .string "last_wakee" +.LASF64: + .string "next" +.LASF223: + .string "arch_spinlock_t" +.LASF3306: + .string "ebc_drop_one_dsp_buf" +.LASF1214: + .string "slab_cache" +.LASF1097: + .string "nr_tasks" +.LASF2476: + .string "bus_recovery_info" +.LASF1293: + .string "mmlist" +.LASF1688: + .string "set_dqblk" +.LASF1212: + .string "s_mem" +.LASF2208: + .string "RPM_RESUMING" +.LASF471: + .string "d_weak_revalidate" +.LASF2973: + .string "prev_dsp_buf" +.LASF1461: + .string "NR_VMSCAN_IMMEDIATE" +.LASF513: + .string "s_quota_types" +.LASF1423: + .string "NR_ZONE_INACTIVE_FILE" +.LASF2441: + .string "DOMAIN_BUS_IPI" +.LASF1282: + .string "vmacache_seqnum" +.LASF761: + .string "setup_max_cpus" +.LASF1802: + .string "i_nlink" +.LASF2916: + .string "mirror" +.LASF1756: + .string "write_begin" +.LASF2197: + .string "groups" +.LASF3050: + .string "need_res_size" +.LASF693: + .string "pi_blocked_on" +.LASF3027: + .string "ebc_probe" +.LASF501: + .string "s_xattr" +.LASF3037: + .string "klogo_addr_str" +.LASF963: + .string "syscr" +.LASF1915: + .string "s_vfs_rename_key" +.LASF1401: + .string "ki_ioprio" +.LASF1131: + .string "attributes_mask" +.LASF200: + .string "restart_block" +.LASF39: + .string "umode_t" +.LASF201: + .string "memstart_addr" +.LASF2611: + .string "ALLOCSTALL_MOVABLE" +.LASF742: + .string "pagefault_disabled" +.LASF964: + .string "syscw" +.LASF1369: + .string "guid_null" +.LASF224: + .string "wlocked" +.LASF2658: + .string "NR_VM_EVENT_ITEMS" +.LASF1929: + .string "freeze_super" +.LASF538: + .string "s_inode_list_lock" +.LASF2568: + .string "align" +.LASF3124: + .string "frame_idx" +.LASF2935: + .string "FULL" +.LASF204: + .string "mm_segment_t" +.LASF2726: + .string "param_ops_ullong" +.LASF1878: + .string "fl_lmops" +.LASF2787: + .string "driver_override" +.LASF985: + .string "sched_avg" +.LASF1682: + .string "quota_enable" +.LASF1516: + .string "zone" +.LASF1764: + .string "isolate_page" +.LASF663: + .string "maj_flt" +.LASF229: + .string "arch_rwlock_t" +.LASF3301: + .string "ebc_osd_buf_clone" +.LASF162: + .string "c_false" +.LASF870: + .string "clock_base" +.LASF2880: + .string "pmic_read_temperature" +.LASF1766: + .string "launder_page" +.LASF1811: + .string "cdev" +.LASF1034: + .string "my_q" +.LASF642: + .string "group_leader" +.LASF1824: + .string "mkdir" +.LASF1541: + .string "zonelist" +.LASF253: + .string "FTR_EXACT" +.LASF2541: + .string "minor" +.LASF1667: + .string "nextents" +.LASF3189: + .string "dma_direction" +.LASF1: + .string "sizetype" +.LASF678: + .string "real_blocked" +.LASF1302: + .string "arg_lock" +.LASF1709: + .string "num_exentries" +.LASF3102: + .string "check_out" +.LASF2577: + .string "high_memory" +.LASF49: + .string "int32_t" +.LASF3019: + .string "__exitcall_ebc_exit" +.LASF1010: + .string "nr_failed_migrations_running" +.LASF867: + .string "next_timer" +.LASF740: + .string "throttle_queue" +.LASF3310: + .string "finish_wait" +.LASF1448: + .string "WORKINGSET_NODERECLAIM" +.LASF541: + .string "s_inodes_wb" +.LASF2216: + .string "RPM_REQ_RESUME" +.LASF2013: + .string "keyring_index_key" +.LASF3183: + .string "ebc_tcon_disable" +.LASF1389: + .string "leases_enable" +.LASF227: + .string "qrwlock" +.LASF2656: + .string "SWAP_RA" +.LASF799: + .string "system_freezable_wq" +.LASF1848: + .string "file_ra_state" +.LASF919: + .string "user_struct" +.LASF2334: + .string "ns_type" +.LASF2859: + .string "EPD_DU4" +.LASF588: + .string "on_rq" +.LASF2308: + .string "lock_key" +.LASF2531: + .string "tramp_pg_dir" +.LASF3011: + .string "dev_attr_ebc_version" +.LASF834: + .string "PCPU_FC_NR" +.LASF2088: + .string "prealloc_buf" +.LASF2346: + .string "DL_DEV_DRIVER_BOUND" +.LASF812: + .string "pgprot_t" +.LASF1925: + .string "drop_inode" +.LASF1735: + .string "num_trace_evals" +.LASF2305: + .string "num_vf" +.LASF1503: + .string "isolate_mode_t" +.LASF3190: + .string "debug_dma_sync_single_for_device" +.LASF99: + .string "llseek" +.LASF2345: + .string "DL_DEV_PROBING" +.LASF1754: + .string "set_page_dirty" +.LASF1788: + .string "bd_block_size" +.LASF1629: + .string "commit_dqblk" +.LASF2119: + .string "namespace" +.LASF1677: + .string "i_ino_warnlimit" +.LASF2758: + .string "MODULE_STATE_GOING" +.LASF1064: + .string "rcu_node" +.LASF2169: + .string "init_name" +.LASF84: + .string "late_time_init" +.LASF1932: + .string "unfreeze_fs" +.LASF877: + .string "nodemask_t" +.LASF2196: + .string "class" +.LASF325: + .string "__idmap_text_end" +.LASF2953: + .string "frame_total" +.LASF775: + .string "read_cntvct_el0" +.LASF243: + .string "target" +.LASF2514: + .string "HI_SOFTIRQ" +.LASF3192: + .string "direction" +.LASF928: + .string "session_keyring" +.LASF334: + .string "__boot_cpu_mode" +.LASF2019: + .string "key_restrict_link_func_t" +.LASF1453: + .string "NR_WRITEBACK" +.LASF3131: + .string "frame_count" +.LASF487: + .string "s_maxbytes" +.LASF2325: + .string "acpi_device_id" +.LASF1650: + .string "d_ino_count" +.LASF2655: + .string "UNEVICTABLE_PGSTRANDED" +.LASF2459: + .string "i2c_bus_type" +.LASF855: + .string "hrtimer_cpu_base" +.LASF3316: + .string "ebc_notify" +.LASF1359: + .string "cb_head" +.LASF1624: + .string "check_quota_file" +.LASF1893: + .string "nfs4_lock_info" +.LASF1959: + .string "restrict_link" +.LASF2289: + .string "dev_archdata" +.LASF1990: + .string "def_blk_fops" +.LASF462: + .string "i_devices" +.LASF329: + .string "__inittext_end" +.LASF716: + .string "pi_state_cache" +.LASF945: + .string "anon_vma_chain" +.LASF1701: + .string "num_gpl_syms" +.LASF602: + .string "cpus_requested" +.LASF2562: + .string "__tracepoint_page_ref_mod_unless" +.LASF3200: + .string "wake_lock_init" +.LASF1154: + .string "list_lru" +.LASF216: + .string "fpcr" +.LASF2068: + .string "target_kn" +.LASF882: + .string "sival_ptr" +.LASF420: + .string "i_opflags" +.LASF713: + .string "robust_list" +.LASF1683: + .string "quota_disable" +.LASF3063: + .string "waveform_open" +.LASF2024: + .string "serial_node" +.LASF1669: + .string "s_incoredqs" +.LASF477: + .string "d_iput" +.LASF108: + .string "compat_ioctl" +.LASF3208: + .string "__range_ok" +.LASF287: + .string "__start_ro_after_init" +.LASF2675: + .string "num_poisoned_pages" +.LASF875: + .string "filter" +.LASF3193: + .string "ebc_pmic_get_vcom" +.LASF2919: + .string "ebc_tcon" +.LASF2579: + .string "sysctl_legacy_va_layout" +.LASF2348: + .string "dev_links_info" +.LASF46: + .string "loff_t" +.LASF2685: + .string "d_val" +.LASF645: + .string "thread_pid" +.LASF1465: + .string "NR_UNRECLAIMABLE_PAGES" +.LASF2481: + .string "smbus_xfer" +.LASF2732: + .string "param_array_ops" +.LASF2645: + .string "COMPACTSUCCESS" +.LASF905: + .string "_arch" +.LASF2695: + .string "st_value" +.LASF2829: + .string "buf_user" +.LASF2094: + .string "KOBJ_NS_TYPES" +.LASF69: + .string "pprev" +.LASF425: + .string "i_default_acl" +.LASF1376: + .string "ioc_node" +.LASF2202: + .string "of_node_reused" +.LASF2082: + .string "kernfs_node_id" +.LASF2321: + .string "PROBE_PREFER_ASYNCHRONOUS" +.LASF1103: + .string "icq_list" +.LASF25: + .string "__kernel_size_t" +.LASF615: + .string "active_mm" +.LASF1404: + .string "ia_mode" +.LASF1051: + .string "dl_boosted" +.LASF1146: + .string "batch" +.LASF1850: + .string "async_size" +.LASF705: + .string "acct_vm_mem1" +.LASF2946: + .string "ebc_osd_vir" +.LASF2706: + .string "sh_info" +.LASF2117: + .string "default_attrs" +.LASF2569: + .string "memory_type" +.LASF825: + .string "rb_root" +.LASF1016: + .string "nr_wakeups_local" +.LASF2939: + .string "DATA_CALC_NONE" +.LASF1151: + .string "list_lru_memcg" +.LASF1745: + .string "WRITE_LIFE_NONE" +.LASF1744: + .string "WRITE_LIFE_NOT_SET" +.LASF2718: + .string "__stop___param" +.LASF2782: + .string "cpu_subsys" +.LASF679: + .string "saved_sigmask" +.LASF414: + .string "d_time" +.LASF2943: + .string "ebc_info" +.LASF240: + .string "entries" +.LASF971: + .string "cpu_id" +.LASF2926: + .string "dsp_mode_set" +.LASF2620: + .string "PGMAJFAULT" +.LASF1515: + .string "__MAX_NR_ZONES" +.LASF2432: + .string "irq_fwspec" +.LASF3005: + .string "waveform_ops" +.LASF1773: + .string "iov_iter" +.LASF511: + .string "s_mtd" +.LASF2712: + .string "kparam_string" +.LASF2174: + .string "power" +.LASF266: + .string "strict_mask" +.LASF3309: + .string "init_wait_entry" +.LASF2755: + .string "module_state" +.LASF3258: + .string "_dev_info" +.LASF417: + .string "d_subdirs" +.LASF1955: + .string "last_used_at" +.LASF1246: + .string "f_write_hint" +.LASF978: + .string "last_queued" +.LASF1087: + .string "user_ns" +.LASF2604: + .string "PSWPIN" +.LASF67: + .string "first" +.LASF2198: + .string "iommu_group" +.LASF558: + .string "wait_pidfd" +.LASF1914: + .string "s_umount_key" +.LASF2901: + .string "xen_start_info" +.LASF2426: + .string "of_fwnode_ops" +.LASF2837: + .string "buf_mode" +.LASF944: + .string "vm_flags" +.LASF1692: + .string "modinfo_attrs" +.LASF2471: + .string "mux_lock" +.LASF197: + .string "has_timeout" +.LASF2708: + .string "sh_entsize" +.LASF419: + .string "i_mode" +.LASF1998: + .string "proc_handler" +.LASF2188: + .string "removed_mem" +.LASF248: + .string "jump_label_t" +.LASF3288: + .string "of_get_property" +.LASF2680: + .string "Elf64_Half" +.LASF2255: + .string "use_autosuspend" +.LASF3020: + .string "ebc_init" +.LASF674: + .string "nsproxy" +.LASF2223: + .string "can_wakeup" +.LASF2515: + .string "TIMER_SOFTIRQ" +.LASF3136: + .string "temp_data" +.LASF1183: + .string "xol_area" +.LASF235: + .string "rlock" +.LASF1856: + .string "fl_owner_t" +.LASF2700: + .string "sh_type" +.LASF1072: + .string "euid" +.LASF1069: + .string "wait" +.LASF1718: + .string "bug_table" +.LASF933: + .string "seqnum" +.LASF444: + .string "dirtied_time_when" +.LASF1864: + .string "fl_block" +.LASF2670: + .string "init_on_free" +.LASF1120: + .string "nr_pages" +.LASF3165: + .string "ebc_power_set" +.LASF1730: + .string "num_trace_bprintk_fmt" +.LASF3252: + .string "__fls" +.LASF1098: + .string "ioprio" +.LASF2984: + .string "is_early_suspend" +.LASF1132: + .string "rdev" +.LASF1205: + .string "private_data" +.LASF1847: + .string "signum" +.LASF508: + .string "s_mounts" +.LASF634: + .string "use_memdelay" +.LASF1122: + .string "caller" +.LASF347: + .string "thread_struct" +.LASF2123: + .string "envp" +.LASF787: + .string "persistent_clock_is_local" +.LASF2382: + .string "dma_supported" +.LASF3225: + .string "dev_set_drvdata" +.LASF3318: + .string "epd_lut_get" +.LASF1504: + .string "per_cpu_pages" +.LASF1135: + .string "ctime" +.LASF2383: + .string "set_dma_mask" +.LASF113: + .string "release" +.LASF2339: + .string "max_segment_size" +.LASF37: + .string "__kernel_dev_t" +.LASF2078: + .string "atomic_write_len" +.LASF1604: + .string "dqb_btime" +.LASF2362: + .string "revmap_tree" +.LASF1287: + .string "mm_users" +.LASF1446: + .string "WORKINGSET_ACTIVATE" +.LASF516: + .string "s_id" +.LASF315: + .string "__alt_instructions_end" +.LASF1431: + .string "NR_ZSPAGES" +.LASF533: + .string "s_dentry_lru" +.LASF2518: + .string "BLOCK_SOFTIRQ" +.LASF1380: + .string "files_stat_struct" +.LASF3264: + .string "devm_memremap" +.LASF814: + .string "pgtable_t" +.LASF1004: + .string "block_start" +.LASF2544: + .string "nodename" +.LASF1823: + .string "symlink" +.LASF1543: + .string "mem_map" +.LASF3090: + .string "old_buffer" +.LASF2929: + .string "lut_data_set" +.LASF790: + .string "sysctl_timer_migration" +.LASF2887: + .string "DMA_NONE" +.LASF1867: + .string "fl_type" +.LASF59: + .string "counter" +.LASF2805: + .string "WAKE_LOCK_SUSPEND" +.LASF1746: + .string "WRITE_LIFE_SHORT" +.LASF3247: + .string "__swab32p" +.LASF286: + .string "_einittext" +.LASF2393: + .string "_flags" +.LASF402: + .string "d_rcu" +.LASF206: + .string "addr_limit" +.LASF2775: + .string "trace_eval_map" +.LASF1068: + .string "done" +.LASF211: + .string "elf_hwcap" +.LASF2719: + .string "param_ops_byte" +.LASF1953: + .string "fscrypt_operations" +.LASF2381: + .string "mapping_error" +.LASF1104: + .string "release_work" +.LASF1807: + .string "i_bdev" +.LASF2663: + .string "vm_node_stat" +.LASF1908: + .string "mount" +.LASF2804: + .string "kmalloc_caches" +.LASF1347: + .string "MIGRATE_SYNC" +.LASF1951: + .string "export_operations" +.LASF551: + .string "PIDTYPE_PGID" +.LASF1690: + .string "rm_xquota" +.LASF1055: + .string "dl_timer" +.LASF3297: + .string "remap_pfn_range" +.LASF2344: + .string "DL_DEV_NO_DRIVER" +.LASF341: + .string "hbp_watch" +.LASF2811: + .string "WF_TYPE_RESET" +.LASF2497: + .string "sda_gpiod" +.LASF1517: + .string "watermark" +.LASF2392: + .string "deadprops" +.LASF3260: + .string "devm_kmalloc" +.LASF16: + .string "long long unsigned int" +.LASF1263: + .string "anon_name" +.LASF1411: + .string "ia_file" +.LASF264: + .string "arm64_ftr_reg" +.LASF2453: + .string "irq_domain_simple_ops" +.LASF469: + .string "dentry_operations" +.LASF738: + .string "memcg_nr_pages_over_high" +.LASF2917: + .string "disable_logo" +.LASF1572: + .string "percpu_counter_batch" +.LASF43: + .string "_Bool" +.LASF1230: + .string "hmm_data" +.LASF1001: + .string "sleep_start" +.LASF662: + .string "min_flt" +.LASF1842: + .string "flc_lease" +.LASF2375: + .string "unmap_resource" +.LASF2980: + .string "wake_lock_is_set" +.LASF2327: + .string "driver_private" +.LASF1809: + .string "i_link" +.LASF1350: + .string "rcu_sync_type" +.LASF1831: + .string "listxattr" +.LASF894: + .string "_lower" +.LASF1705: + .string "async_probe_requested" +.LASF2277: + .string "active_count" +.LASF280: + .string "_edata" +.LASF79: + .string "__security_initcall_end" +.LASF2129: + .string "kobj_sysfs_ops" +.LASF2861: + .string "EPD_RESET" +.LASF2338: + .string "device_dma_parameters" +.LASF215: + .string "fpsr" +.LASF498: + .string "s_count" +.LASF470: + .string "d_revalidate" +.LASF2296: + .string "bus_groups" +.LASF809: + .string "pmd_t" +.LASF489: + .string "s_op" +.LASF1580: + .string "dq_count" +.LASF397: + .string "dentry_stat" +.LASF72: + .string "pstate_check_t" +.LASF801: + .string "system_freezable_power_efficient_wq" +.LASF3024: + .string "__func__" +.LASF57: + .string "resource_size_t" +.LASF581: + .string "wake_entry" +.LASF921: + .string "processes" +.LASF1070: + .string "suid" +.LASF2444: + .string "irq_domain_ops" +.LASF2989: + .string "overlay_bg_control" +.LASF930: + .string "locked_vm" +.LASF824: + .string "rb_left" +.LASF2076: + .string "seq_next" +.LASF276: + .string "_stext" +.LASF1679: + .string "quotactl_ops" +.LASF536: + .string "s_sync_lock" +.LASF2271: + .string "total_time" +.LASF29: + .string "__kernel_clock_t" +.LASF393: + .string "nr_unused" +.LASF2890: + .string "dma_address" +.LASF2584: + .string "mmap_rnd_compat_bits_max" +.LASF41: + .string "clockid_t" +.LASF1576: + .string "dq_free" +.LASF1550: + .string "reboot_notifier_list" +.LASF686: + .string "parent_exec_id" +.LASF2472: + .string "retries" +.LASF2058: + .string "kernfs_elem_dir" +.LASF214: + .string "vregs" +.LASF2593: + .string "page_entry_size" +.LASF2964: + .string "lut_data" +.LASF3044: + .string "ebc_other_init" +.LASF1415: + .string "free_list" +.LASF589: + .string "prio" +.LASF3217: + .string "platform_get_drvdata" +.LASF2524: + .string "NR_SOFTIRQS" +.LASF2281: + .string "autosleep_enabled" +.LASF2937: + .string "OVERLAY" +.LASF644: + .string "ptrace_entry" +.LASF2484: + .string "lock_bus" +.LASF1991: + .string "def_chr_fops" +.LASF586: + .string "recent_used_cpu" +.LASF1729: + .string "num_jump_entries" +.LASF491: + .string "s_qcop" +.LASF60: + .string "atomic_t" +.LASF3175: + .string "ebc_tcon_image_addr_set" +.LASF2500: + .string "max_num_msgs" +.LASF2072: + .string "notify_next" +.LASF2275: + .string "prevent_sleep_time" +.LASF2590: + .string "sysctl_overcommit_ratio" +.LASF203: + .string "kimage_voffset" +.LASF8: + .string "short int" +.LASF2323: + .string "of_device_id" +.LASF2888: + .string "scatterlist" +.LASF1236: + .string "altmap_valid" +.LASF3319: + .string "down" +.LASF102: + .string "read_iter" +.LASF336: + .string "debug_info" +.LASF1252: + .string "f_owner" +.LASF2451: + .string "irq_domain_chip_generic" +.LASF1352: + .string "RCU_SCHED_SYNC" +.LASF2940: + .string "DATA_CALC_FULL" +.LASF2553: + .string "tracepoint" +.LASF2752: + .string "test" +.LASF2543: + .string "this_device" +.LASF1974: + .string "pad_until" +.LASF458: + .string "i_writecount" +.LASF448: + .string "i_wb_frn_winner" +.LASF1916: + .string "s_writers_key" +.LASF977: + .string "last_arrival" +.LASF2357: + .string "mapcount" +.LASF762: + .string "__boot_cpu_id" +.LASF1553: + .string "numa_zonelist_order" +.LASF2220: + .string "pm_domain_data" +.LASF2456: + .string "byte" +.LASF3283: + .string "__wake_up_sync" +.LASF1971: + .string "poll_table_struct" +.LASF1762: + .string "direct_IO" +.LASF2096: + .string "current_may_mount" +.LASF382: + .string "seqlock_t" +.LASF3043: + .string "change_4bit_to_8bit" +.LASF2921: + .string "hclk" +.LASF2084: + .string "kernfs_iattrs" +.LASF2881: + .string "pmic_get_vcom" +.LASF626: + .string "sched_migrated" +.LASF1211: + .string "frozen" +.LASF2312: + .string "suppress_bind_attrs" +.LASF1233: + .string "page_fault" +.LASF1438: + .string "NR_INACTIVE_FILE" +.LASF3237: + .string "__ret_warn_on" +.LASF1594: + .string "kqid" +.LASF2450: + .string "irq_generic_chip_ops" +.LASF2027: + .string "index_key" +.LASF2257: + .string "memalloc_noio" +.LASF1590: + .string "GRPQUOTA" +.LASF1549: + .string "rwsem" +.LASF1403: + .string "ia_valid" +.LASF1379: + .string "__invalid_size_argument_for_IOC" +.LASF1209: + .string "inuse" +.LASF3174: + .string "ebc_tcon_frame_start" +.LASF1660: + .string "qc_type_state" +.LASF2011: + .string "key_serial_t" +.LASF1558: + .string "__highest_present_section_nr" +.LASF2330: + .string "dev_uevent" +.LASF2751: + .string "setup" +.LASF1245: + .string "f_lock" +.LASF2650: + .string "UNEVICTABLE_PGSCANNED" +.LASF852: + .string "active" +.LASF2447: + .string "xlate" +.LASF1605: + .string "dqb_itime" +.LASF1747: + .string "WRITE_LIFE_MEDIUM" +.LASF2439: + .string "DOMAIN_BUS_PLATFORM_MSI" +.LASF269: + .string "user_val" +.LASF453: + .string "i_wb_list" +.LASF1996: + .string "simple_dir_operations" +.LASF2352: + .string "defer_hook" +.LASF129: + .string "fadvise" +.LASF2583: + .string "mmap_rnd_compat_bits_min" +.LASF2565: + .string "vmem_altmap" +.LASF1310: + .string "arg_end" +.LASF2026: + .string "revoked_at" +.LASF1157: + .string "private_list" +.LASF261: + .string "shift" +.LASF1406: + .string "ia_gid" +.LASF3098: + .string "vaild_size" +.LASF36: + .string "name_offset" +.LASF2103: + .string "attribute_group" +.LASF300: + .string "__irqentry_text_end" +.LASF1315: + .string "context" +.LASF3153: + .string "get_overlay_image" +.LASF1509: + .string "per_cpu_nodestat" +.LASF2489: + .string "get_scl" +.LASF2570: + .string "MEMORY_DEVICE_PRIVATE" +.LASF1560: + .string "thread_id" +.LASF732: + .string "default_timer_slack_ns" +.LASF3061: + .string "waveform_version_read" +.LASF1736: + .string "source_list" +.LASF757: + .string "secondary_data" +.LASF2212: + .string "RPM_REQ_NONE" +.LASF951: + .string "swap_readahead_info" +.LASF1096: + .string "active_ref" +.LASF806: + .string "pmdval_t" +.LASF2491: + .string "get_sda" +.LASF1088: + .string "group_info" +.LASF765: + .string "arch_timer_erratum_match_type" +.LASF2467: + .string "algo" +.LASF1241: + .string "file" +.LASF2314: + .string "of_match_table" +.LASF2547: + .string "percpu_count_ptr" +.LASF2934: + .string "PART" +.LASF3298: + .string "ebc_phy_buf_base_get" +.LASF2048: + .string "loops_per_jiffy" +.LASF2479: + .string "i2c_algorithm" +.LASF3094: + .string "check_size" +.LASF3171: + .string "ebc_get_8pix_wf3" +.LASF2828: + .string "buf_idle" +.LASF1368: + .string "uuid_t" +.LASF2406: + .string "property_read_int_array" +.LASF2967: + .string "auto_image_old" +.LASF1829: + .string "setattr2" +.LASF3115: + .string "ebc_overlay_bg_frame_start" +.LASF1324: + .string "init_mm" +.LASF2630: + .string "KSWAPD_INODESTEAL" +.LASF1144: + .string "count_objects" +.LASF3251: + .string "fls64" +.LASF892: + .string "_stime" +.LASF2351: + .string "needs_suppliers" +.LASF2286: + .string "activate" +.LASF1493: + .string "kcompactd_max_order" +.LASF781: + .string "tick_nsec" +.LASF460: + .string "i_flctx" +.LASF135: + .string "atomic_notifier_head" +.LASF1031: + .string "statistics" +.LASF2908: + .string "current_buffer" +.LASF3129: + .string "direct_mode_data_change" +.LASF1587: + .string "kprojid_t" +.LASF666: + .string "ptracer_cred" +.LASF2110: + .string "store" +.LASF1272: + .string "page_mkwrite" +.LASF1978: + .string "kobject" +.LASF2379: + .string "sync_sg_for_device" +.LASF1933: + .string "statfs" +.LASF3278: + .string "__kmalloc" +.LASF3266: + .string "_dev_err" +.LASF3257: + .string "__platform_driver_register" +.LASF2948: + .string "ebc_buf_real_size" +.LASF2996: + .string "ebc_thread_wq" +.LASF1763: + .string "migratepage" +.LASF2635: + .string "DROP_PAGECACHE" +.LASF792: + .string "work_struct" +.LASF2870: + .string "height" +.LASF1063: + .string "task_group" +.LASF1040: + .string "on_list" +.LASF2736: + .string "plt_num_entries" +.LASF2649: + .string "UNEVICTABLE_PGCULLED" +.LASF570: + .string "kgid_t" +.LASF582: + .string "on_cpu" +.LASF2100: + .string "drop_ns" +.LASF1391: + .string "sysctl_protected_symlinks" +.LASF3072: + .string "buf_format" +.LASF2592: + .string "protection_map" +.LASF2733: + .string "param_ops_string" +.LASF2328: + .string "class_groups" +.LASF290: + .string "__per_cpu_load" +.LASF1894: + .string "nfs4_lock_state" +.LASF2774: + .string "trace_event_call" +.LASF1199: + .string "i_mmap_rwsem" +.LASF1373: + .string "errseq_t" +.LASF1318: + .string "ioctx_table" +.LASF1457: + .string "NR_SHMEM_PMDMAPPED" +.LASF2503: + .string "max_comb_1st_msg_len" +.LASF1514: + .string "ZONE_MOVABLE" +.LASF3004: + .string "ebc_misc" +.LASF2361: + .string "revmap_size" +.LASF1870: + .string "fl_wait" +.LASF684: + .string "audit_context" +.LASF291: + .string "__per_cpu_start" +.LASF283: + .string "__init_begin" +.LASF2109: + .string "sysfs_ops" +.LASF2834: + .string "phy_addr" +.LASF2134: + .string "firmware_kobj" +.LASF292: + .string "__per_cpu_end" +.LASF2609: + .string "ALLOCSTALL_DMA32" +.LASF2618: + .string "PGLAZYFREE" +.LASF1820: + .string "create" +.LASF1402: + .string "iattr" +.LASF2435: + .string "irq_domain_bus_token" +.LASF720: + .string "rseq" +.LASF3138: + .string "get_auto_image" +.LASF196: + .string "nfds" +.LASF1059: + .string "sigval" +.LASF719: + .string "perf_event_list" +.LASF1640: + .string "get_reserved_space" +.LASF424: + .string "i_acl" +.LASF1758: + .string "bmap" +.LASF3265: + .string "ebc_buf_init" +.LASF2017: + .string "key_payload" +.LASF481: + .string "d_real" +.LASF2529: + .string "swapper_pg_end" +.LASF3008: + .string "dev_attr_pmic_name" +.LASF631: + .string "in_user_fault" +.LASF1889: + .string "lm_change" +.LASF2508: + .string "irq_cpustat_t" +.LASF1613: + .string "dqi_max_spc_limit" +.LASF1227: + .string "pmd_huge_pte" +.LASF2769: + .string "exception_table_entry" +.LASF1527: + .string "nr_isolate_pageblock" +.LASF2276: + .string "event_count" +.LASF208: + .string "preempt_count" +.LASF1551: + .string "movable_zone" +.LASF74: + .string "initcall_entry_t" +.LASF124: + .string "fallocate" +.LASF1676: + .string "i_spc_warnlimit" +.LASF3238: + .string "check_object_size" +.LASF1484: + .string "node_present_pages" +.LASF1197: + .string "i_mmap_writable" +.LASF707: + .string "mems_allowed" +.LASF2228: + .string "is_noirq_suspended" +.LASF1727: + .string "tracepoints_ptrs" +.LASF187: + .string "time" +.LASF584: + .string "wakee_flip_decay_ts" +.LASF1523: + .string "zone_start_pfn" +.LASF519: + .string "s_max_links" +.LASF1014: + .string "nr_wakeups_sync" +.LASF1719: + .string "kallsyms" +.LASF1496: + .string "kcompactd" +.LASF65: + .string "prev" +.LASF2184: + .string "dma_parms" +.LASF1089: + .string "fs_struct" +.LASF192: + .string "clockid" +.LASF989: + .string "util_sum" +.LASF50: + .string "uint32_t" +.LASF1309: + .string "arg_start" +.LASF2385: + .string "unremap" +.LASF2957: + .string "auto_check" +.LASF2438: + .string "DOMAIN_BUS_PCI_MSI" +.LASF1137: + .string "blocks" +.LASF324: + .string "__idmap_text_start" +.LASF1685: + .string "set_info" +.LASF3066: + .string "ebc_mmap" +.LASF2588: + .string "sysctl_admin_reserve_kbytes" +.LASF788: + .string "timer_list" +.LASF2990: + .string "resume_count_enable" +.LASF1653: + .string "d_ino_warns" +.LASF2469: + .string "lock_ops" +.LASF1295: + .string "hiwater_vm" +.LASF3058: + .string "pmic_vcom_read" +.LASF3259: + .string "misc_deregister" +.LASF1217: + .string "compound_head" +.LASF2527: + .string "empty_zero_page" +.LASF1841: + .string "flc_posix" +.LASF293: + .string "__kprobes_text_start" +.LASF26: + .string "__kernel_ssize_t" +.LASF1180: + .string "orig_ret_vaddr" +.LASF435: + .string "i_ctime" +.LASF1785: + .string "bd_write_holder" +.LASF2163: + .string "poweroff_noirq" +.LASF3262: + .string "of_parse_phandle" +.LASF1827: + .string "rename" +.LASF935: + .string "vm_area_struct" +.LASF2206: + .string "rpm_status" +.LASF1904: + .string "sb_writers" +.LASF1662: + .string "ino_timelimit" +.LASF121: + .string "splice_write" +.LASF2820: + .string "PVI_WF_MAX" +.LASF2061: + .string "ino_idr" +.LASF1675: + .string "i_rt_spc_timelimit" +.LASF140: + .string "oops_in_progress" +.LASF3003: + .string "ebc_ops" +.LASF3033: + .string "klogo_addr" +.LASF1620: + .string "qf_next" +.LASF2376: + .string "sync_single_for_cpu" +.LASF793: + .string "data" +.LASF3210: + .string "kzalloc" +.LASF3231: + .string "msecs_to_jiffies" +.LASF1888: + .string "lm_break" +.LASF1188: + .string "hyp_vectors_slot" +.LASF1208: + .string "slab_list" +.LASF878: + .string "_unused_nodemask_arg_" +.LASF623: + .string "personality" +.LASF1794: + .string "bd_queue" +.LASF3021: + .string "ebc_resume" +.LASF2798: + .string "init_task" +.LASF389: + .string "empty_name" +.LASF1285: + .string "task_size" +.LASF539: + .string "s_inodes" +.LASF901: + .string "_addr" +.LASF1557: + .string "pageblock_flags" +.LASF1314: + .string "binfmt" +.LASF2207: + .string "RPM_ACTIVE" +.LASF4: + .string "signed char" +.LASF376: + .string "rcu_scheduler_active" +.LASF3220: + .string "propname" +.LASF2070: + .string "priv" +.LASF1830: + .string "getattr" +.LASF612: + .string "sched_info" +.LASF1644: + .string "d_fieldmask" +.LASF1972: + .string "seq_file" +.LASF2161: + .string "freeze_noirq" +.LASF1462: + .string "NR_DIRTIED" +.LASF2701: + .string "sh_flags" +.LASF610: + .string "rcu_tasks_idle_cpu" +.LASF1626: + .string "write_file_info" +.LASF1818: + .string "get_acl" +.LASF1928: + .string "sync_fs" +.LASF130: + .string "android_kabi_reserved1" +.LASF131: + .string "android_kabi_reserved2" +.LASF132: + .string "android_kabi_reserved3" +.LASF133: + .string "android_kabi_reserved4" +.LASF2204: + .string "android_kabi_reserved5" +.LASF2205: + .string "android_kabi_reserved6" +.LASF748: + .string "android_kabi_reserved7" +.LASF749: + .string "android_kabi_reserved8" +.LASF247: + .string "enabled" +.LASF562: + .string "init_pid_ns" +.LASF97: + .string "file_operations" +.LASF2831: + .string "buf_osd" +.LASF1714: + .string "arch" +.LASF2230: + .string "no_pm" +.LASF2868: + .string "ebc_buf_info" +.LASF907: + .string "_kill" +.LASF785: + .string "ktime_t" +.LASF1869: + .string "fl_link_cpu" +.LASF1696: + .string "syms" +.LASF1026: + .string "group_node" +.LASF2080: + .string "kernfs_open_node" +.LASF1651: + .string "d_ino_timer" +.LASF1439: + .string "NR_ACTIVE_FILE" +.LASF2032: + .string "key_sysctls" +.LASF1306: + .string "end_data" +.LASF350: + .string "sve_vl" +.LASF2623: + .string "PGSTEAL_KSWAPD" +.LASF3035: + .string "klogo_addr_valid" +.LASF2571: + .string "MEMORY_DEVICE_PUBLIC" +.LASF2301: + .string "sync_state" +.LASF1397: + .string "ki_pos" +.LASF988: + .string "runnable_load_sum" +.LASF2287: + .string "sync" +.LASF2629: + .string "SLABS_SCANNED" +.LASF1501: + .string "per_cpu_nodestats" +.LASF123: + .string "setlease" +.LASF2177: + .string "pins" +.LASF2763: + .string "ro_size" +.LASF2238: + .string "must_resume" +.LASF20: + .string "long int" +.LASF1526: + .string "present_pages" +.LASF1838: + .string "file_lock_context" +.LASF579: + .string "usage" +.LASF1506: + .string "per_cpu_pageset" +.LASF759: + .string "status" +.LASF914: + .string "si_signo" +.LASF929: + .string "uidhash_node" +.LASF279: + .string "_sdata" +.LASF2819: + .string "WF_TYPE_GCC16" +.LASF2483: + .string "i2c_lock_operations" +.LASF1589: + .string "USRQUOTA" +.LASF2014: + .string "description" +.LASF2766: + .string "symtab" +.LASF2892: + .string "sg_table" +.LASF1093: + .string "rt_mutex_waiter" +.LASF3142: + .string "buffer_old_tmp" +.LASF1934: + .string "remount_fs" +.LASF488: + .string "s_type" +.LASF2260: + .string "runtime_status" +.LASF630: + .string "in_iowait" +.LASF2555: + .string "unregfunc" +.LASF2878: + .string "pmic_pm_suspend" +.LASF1073: + .string "egid" +.LASF1574: + .string "dq_hash" +.LASF1441: + .string "NR_SLAB_RECLAIMABLE" +.LASF1844: + .string "fscrypt_info" +.LASF1927: + .string "put_super" +.LASF2965: + .string "curr_lut_type" +.LASF2398: + .string "max_lock_depth" +.LASF2420: + .string "fwnode_reference_args" +.LASF614: + .string "pushable_dl_tasks" +.LASF1248: + .string "f_flags" +.LASF2936: + .string "AUTO" +.LASF1243: + .string "f_inode" +.LASF2000: + .string "procname" +.LASF3135: + .string "point_data" +.LASF3268: + .string "epd_lut_from_file_init" +.LASF2999: + .string "ebc_auto_assist_thread_sem" +.LASF1638: + .string "mark_dirty" +.LASF760: + .string "__early_cpu_boot_status" +.LASF2315: + .string "acpi_match_table" +.LASF1713: + .string "init_layout" +.LASF1498: + .string "_pad1_" +.LASF2748: + .string "kobj_completion" +.LASF2838: + .string "win_x1" +.LASF2840: + .string "win_x2" +.LASF31: + .string "__kernel_clockid_t" +.LASF685: + .string "seccomp" +.LASF3077: + .string "ebc_rst_panel" +.LASF1760: + .string "releasepage" +.LASF1671: + .string "qc_info" +.LASF3078: + .string "ebc_thread" +.LASF3096: + .string "pbuf_old" +.LASF2860: + .string "EPD_A2_ENTER" +.LASF1472: + .string "recent_scanned" +.LASF2910: + .string "vir_height" +.LASF3173: + .string "ebc_get_8pix_wf" +.LASF1712: + .string "core_layout" +.LASF1500: + .string "_pad2_" +.LASF968: + .string "cancelled_write_bytes" +.LASF2839: + .string "win_y1" +.LASF2841: + .string "win_y2" +.LASF3100: + .string "buf_size" +.LASF2057: + .string "bitmap" +.LASF1555: + .string "mem_section" +.LASF1142: + .string "memcg" +.LASF888: + .string "_sigval" +.LASF2537: + .string "MEMREMAP_ENC" +.LASF2526: + .string "ksoftirqd" +.LASF670: + .string "nameidata" +.LASF1394: + .string "sysctl_protected_regular" +.LASF2765: + .string "mod_kallsyms" +.LASF356: + .string "sve_max_vl" +.LASF2835: + .string "virt_addr" +.LASF1565: + .string "core_sibling" +.LASF1032: + .string "depth" +.LASF1537: + .string "_pad3_" +.LASF362: + .string "wait_queue_func_t" +.LASF273: + .string "cpu_hwcap_keys" +.LASF1346: + .string "MIGRATE_SYNC_LIGHT" +.LASF1008: + .string "nr_migrations_cold" +.LASF3056: + .string "ebc_version_read" +.LASF304: + .string "__end_once" +.LASF2896: + .string "dma_noncoherent_ops" +.LASF1474: + .string "lists" +.LASF53: + .string "dma_addr_t" +.LASF48: + .string "ssize_t" +.LASF776: + .string "set_next_event_phys" +.LASF1476: + .string "inactive_age" +.LASF2572: + .string "MEMORY_DEVICE_FS_DAX" +.LASF2954: + .string "frame_bw_total" +.LASF2764: + .string "ro_after_init_size" +.LASF2015: + .string "desc_len" +.LASF120: + .string "flock" +.LASF960: + .string "task_io_accounting" +.LASF1267: + .string "mremap" +.LASF515: + .string "s_writers" +.LASF2813: + .string "WF_TYPE_GRAY4" +.LASF2552: + .string "tracepoint_func" +.LASF2122: + .string "argv" +.LASF361: + .string "entry" +.LASF1950: + .string "free_cached_objects" +.LASF794: + .string "workqueue_struct" +.LASF689: + .string "pi_lock" +.LASF2790: + .string "platform_bus" +.LASF853: + .string "get_time" +.LASF664: + .string "cputime_expires" +.LASF730: + .string "dirty_paused_when" +.LASF2001: + .string "maxlen" +.LASF1425: + .string "NR_ZONE_UNEVICTABLE" +.LASF1725: + .string "percpu_size" +.LASF1292: + .string "mmap_sem" +.LASF3307: + .string "schedule" +.LASF3151: + .string "get_overlay_image2" +.LASF2411: + .string "get_reference_args" +.LASF2254: + .string "irq_safe" +.LASF175: + .string "tv_nsec" +.LASF451: + .string "i_lru" +.LASF1755: + .string "readpages" +.LASF257: + .string "arm64_ftr_bits" +.LASF1540: + .string "zone_idx" +.LASF1139: + .string "gfp_mask" +.LASF715: + .string "pi_state_list" +.LASF1464: + .string "NR_KERNEL_MISC_RECLAIMABLE" +.LASF1586: + .string "projid_t" +.LASF1201: + .string "nrexceptional" +.LASF1086: + .string "user" +.LASF1749: + .string "WRITE_LIFE_EXTREME" +.LASF1015: + .string "nr_wakeups_migrate" +.LASF1614: + .string "dqi_max_ino_limit" +.LASF1608: + .string "dqi_fmt_id" +.LASF2365: + .string "dev_pin_info" +.LASF1343: + .string "fe_reserved" +.LASF1288: + .string "mm_count" +.LASF2298: + .string "drv_groups" +.LASF578: + .string "stack" +.LASF2386: + .string "dma_coherent_mem" +.LASF260: + .string "strict" +.LASF202: + .string "kimage_vaddr" +.LASF1339: + .string "fe_physical" +.LASF789: + .string "function" +.LASF1399: + .string "ki_flags" +.LASF1360: + .string "gp_type" +.LASF3113: + .string "ebc_auto_assist_tast_function" +.LASF2960: + .string "part_mode_count" +.LASF401: + .string "d_in_lookup_hash" +.LASF1071: + .string "sgid" +.LASF2099: + .string "initial_ns" +.LASF2780: + .string "node_devices" +.LASF827: + .string "rb_leftmost" +.LASF205: + .string "thread_info" +.LASF777: + .string "set_next_event_virt" +.LASF173: + .string "timespec" +.LASF2768: + .string "strtab" +.LASF2299: + .string "match" +.LASF231: + .string "lock_stat" +.LASF2363: + .string "revmap_tree_mutex" +.LASF3060: + .string "pmic_name_read" +.LASF1050: + .string "dl_throttled" +.LASF442: + .string "i_rwsem" +.LASF1641: + .string "get_projid" +.LASF624: + .string "sched_reset_on_fork" +.LASF1491: + .string "kswapd_classzone_idx" +.LASF212: + .string "__int128 unsigned" +.LASF975: + .string "pcount" +.LASF2164: + .string "restore_noirq" +.LASF1396: + .string "ki_filp" +.LASF1081: + .string "cap_ambient" +.LASF2306: + .string "dma_configure" +.LASF2261: + .string "runtime_error" +.LASF3070: + .string "temp_offset" +.LASF920: + .string "__count" +.LASF61: + .string "atomic64_t" +.LASF946: + .string "anon_vma" +.LASF2251: + .string "runtime_auto" +.LASF2320: + .string "PROBE_DEFAULT_STRATEGY" +.LASF3127: + .string "direct_mode_data_change2" +.LASF2715: + .string "elemsize" +.LASF862: + .string "nr_events" +.LASF2290: + .string "iommu" +.LASF360: + .string "private" +.LASF2561: + .string "__tracepoint_page_ref_mod_and_return" +.LASF2762: + .string "text_size" +.LASF1622: + .string "stat" +.LASF2972: + .string "lut_ddr_vir" +.LASF1290: + .string "map_count" +.LASF621: + .string "pdeath_signal" +.LASF620: + .string "exit_signal" +.LASF3302: + .string "ebc_add_to_osd_buf_list" +.LASF2825: + .string "frame_num" +.LASF927: + .string "uid_keyring" +.LASF725: + .string "splice_pipe" +.LASF3109: + .string "frame_done_callback" +.LASF1769: + .string "error_remove_page" +.LASF2292: + .string "pdev_archdata" +.LASF1489: + .string "kswapd" +.LASF111: + .string "open" +.LASF874: + .string "mode" +.LASF592: + .string "rt_priority" +.LASF1161: + .string "slots" +.LASF499: + .string "s_active" +.LASF969: + .string "ptr64" +.LASF1410: + .string "ia_ctime" +.LASF45: + .string "gid_t" +.LASF587: + .string "wake_cpu" +.LASF1181: + .string "chained" +.LASF1337: + .string "fiemap_extent" +.LASF683: + .string "task_works" +.LASF1858: + .string "fl_copy_lock" +.LASF826: + .string "rb_root_cached" +.LASF33: + .string "__be32" +.LASF502: + .string "s_cop" +.LASF992: + .string "runnable_load_avg" +.LASF1220: + .string "compound_mapcount" +.LASF1418: + .string "zone_stat_item" +.LASF3212: + .string "kmalloc_large" +.LASF2595: + .string "PE_SIZE_PMD" +.LASF858: + .string "hres_active" +.LASF1577: + .string "dq_dirty" +.LASF1717: + .string "bug_list" +.LASF2232: + .string "direct_complete" +.LASF754: + .string "__per_cpu_offset" +.LASF2053: + .string "idr_rt" +.LASF2477: + .string "quirks" +.LASF1164: + .string "xa_lock" +.LASF1896: + .string "nfs4_fl" +.LASF1477: + .string "refaults" +.LASF979: + .string "load_weight" +.LASF2822: + .string "WF_TYPE_MAX" +.LASF569: + .string "kuid_t" +.LASF1005: + .string "block_max" +.LASF606: + .string "rcu_blocked_node" +.LASF1356: + .string "gp_count" +.LASF2020: + .string "key_restriction" +.LASF3099: + .string "check_part_mode" +.LASF618: + .string "exit_state" +.LASF153: + .string "SYSTEM_SCHEDULING" +.LASF2229: + .string "is_late_suspended" +.LASF308: + .string "__end_opd" +.LASF1386: + .string "files_stat" +.LASF1883: + .string "lm_owner_key" +.LASF1508: + .string "vm_stat_diff" +.LASF2815: + .string "WF_TYPE_GL16" +.LASF2252: + .string "ignore_children" +.LASF2050: + .string "resource" +.LASF2158: + .string "restore_early" +.LASF2063: + .string "next_generation" +.LASF2560: + .string "__tracepoint_page_ref_mod_and_test" +.LASF1912: + .string "fs_supers" +.LASF1100: + .string "last_waited" +.LASF3065: + .string "ebc_open" +.LASF3181: + .string "three_win_mode" +.LASF2845: + .string "EPD_OVERLAY" +.LASF1598: + .string "dqb_bsoftlimit" +.LASF219: + .string "pending" +.LASF2970: + .string "direct_buffer" +.LASF2461: + .string "i2c_client_type" +.LASF999: + .string "iowait_count" +.LASF2523: + .string "RCU_SOFTIRQ" +.LASF2776: + .string "module_mutex" +.LASF2619: + .string "PGFAULT" +.LASF1545: + .string "notifier_block" +.LASF2265: + .string "suspended_jiffies" +.LASF2131: + .string "mm_kobj" +.LASF2713: + .string "string" +.LASF1362: + .string "read_count" +.LASF1224: + .string "pt_mm" +.LASF1473: + .string "lruvec" +.LASF2874: + .string "ebc_pmic" +.LASF14: + .string "long long int" +.LASF314: + .string "__alt_instructions" +.LASF2355: + .string "irq_domain" +.LASF635: + .string "atomic_flags" +.LASF2506: + .string "__softirq_pending" +.LASF1568: + .string "freq_scale" +.LASF2241: + .string "timer_expires" +.LASF2796: + .string "mmlist_lock" +.LASF3198: + .string "ebc_pmic_power_on" +.LASF1734: + .string "trace_evals" +.LASF856: + .string "active_bases" +.LASF2703: + .string "sh_offset" +.LASF2231: + .string "early_init" +.LASF2699: + .string "sh_name" +.LASF746: + .string "security" +.LASF3139: + .string "get_overlay_image_area2" +.LASF263: + .string "safe_val" +.LASF368: + .string "nr_cpu_ids" +.LASF1250: + .string "f_pos_lock" +.LASF180: + .string "system_states" +.LASF2159: + .string "suspend_noirq" +.LASF1672: + .string "i_fieldmask" +.LASF98: + .string "owner" +.LASF704: + .string "acct_rss_mem1" +.LASF802: + .string "refcount_struct" +.LASF1231: + .string "_zd_pad_1" +.LASF2219: + .string "domain_data" +.LASF331: + .string "__mmuoff_data_end" +.LASF2278: + .string "relax_count" +.LASF1382: + .string "nr_free_files" +.LASF3211: + .string "kmalloc" + .ident "GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404" + .section .note.GNU-stack,"",@progbits diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c index e094205..a970192 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c @@ -16,7 +16,7 @@ #include "../ebc_dev.h" #include "epd_lut.h" -static int (*lut_get)(struct epd_lut_data *, enum epd_lut_type, int); +static int (*lut_get)(struct epd_lut_data *, enum epd_lut_type, int, int); int epd_lut_from_mem_init(void *waveform) { @@ -66,9 +66,9 @@ return NULL; } -int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture) +int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture, int pic) { - return lut_get(output, lut_type, temperture); + return lut_get(output, lut_type, temperture, pic); } //you can change overlay lut mode here diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h index b6c535d..15fe6ea 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h @@ -8,6 +8,9 @@ #ifndef EPD_LUT_H #define EPD_LUT_H +#define WF_4BIT 16 +#define WF_5BIT 32 + // same to pvi_wf_mode enum epd_lut_type { WF_TYPE_RESET = 0, @@ -38,7 +41,7 @@ int epd_lut_from_mem_init(void *waveform); int epd_lut_from_file_init(struct device *dev, void *waveform, int size); const char *epd_lut_get_wf_version(void); -int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture); +int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture, int pic); //you can change overlay lut mode here int epd_overlay_lut(void); @@ -48,12 +51,12 @@ */ int pvi_wf_input(void *waveform_file); const char *pvi_wf_get_version(void); -int pvi_wf_get_lut(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture); +int pvi_wf_get_lut(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture, int pic); /* * RKF Waveform Interfaces */ int rkf_wf_input(void *waveform_file); const char *rkf_wf_get_version(void); -int rkf_wf_get_lut(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture); +int rkf_wf_get_lut(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture, int pic); #endif diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S index 23d54df..d005a38 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S @@ -16,224 +16,249 @@ get_wf_frm_num: .LFB1552: .file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c" - .loc 1 208 0 + .loc 1 219 0 .cfi_startproc .LVL0: stp x29, x30, [sp, -48]! .cfi_def_cfa_offset 48 .cfi_offset 29, -48 .cfi_offset 30, -40 - .loc 1 213 0 + .loc 1 224 0 lsl w0, w0, 2 .LVL1: - .loc 1 208 0 + .loc 1 219 0 add x29, sp, 0 .cfi_def_cfa_register 29 stp x19, x20, [sp, 16] .cfi_offset 19, -32 .cfi_offset 20, -24 - .loc 1 209 0 + .loc 1 220 0 adrp x20, .LANCHOR0 - .loc 1 208 0 + .loc 1 219 0 str x21, [sp, 32] .cfi_offset 21, -16 - .loc 1 209 0 - ldr x15, [x20, #:lo12:.LANCHOR0] + .loc 1 220 0 + ldr x17, [x20, #:lo12:.LANCHOR0] .LVL2: - .loc 1 213 0 - ldrb w2, [x15, 32] + .loc 1 224 0 + ldrb w2, [x17, 32] add x0, x2, x0, sxtw - add x3, x15, x0 - .loc 1 214 0 - ldrb w2, [x15, x0] + add x3, x17, x0 + .loc 1 225 0 + ldrb w2, [x17, x0] ldrb w6, [x3, 1] ldrb w5, [x3, 3] ldrb w3, [x3, 2] add w2, w2, w6 add w2, w2, w3 cmp w5, w2, uxtb - bne .L40 - .loc 1 218 0 - ldr w2, [x15, x0] - .loc 1 220 0 + bne .L48 + .loc 1 229 0 + ldr w2, [x17, x0] + .loc 1 231 0 lsl w0, w1, 2 and x1, x2, 16777215 .LVL3: add x0, x1, x0, sxtw - add x2, x15, x0 - .loc 1 221 0 - ldrb w1, [x15, x0] + add x2, x17, x0 + .loc 1 232 0 + ldrb w1, [x17, x0] ldrb w5, [x2, 1] ldrb w3, [x2, 3] ldrb w2, [x2, 2] add w1, w1, w5 add w1, w1, w2 cmp w3, w1, uxtb - bne .L41 + bne .L49 add x4, x20, :lo12:.LANCHOR0 - .loc 1 225 0 - ldr w0, [x15, x0] - .loc 1 227 0 + .loc 1 236 0 + ldr w0, [x17, x0] + .loc 1 238 0 and x0, x0, 16777215 .LBB8: .LBB9: .loc 1 55 0 - ldr x3, [x4, 8] + ldr x7, [x4, 8] .LBE9: .LBE8: - .loc 1 227 0 - add x15, x15, x0 + .loc 1 238 0 + add x17, x17, x0 .LVL4: .LBB13: .LBB10: .loc 1 55 0 - cbz x3, .L42 - .loc 1 117 0 + cbz x7, .L50 + .loc 1 60 0 adrp x21, .LANCHOR2 - mov w4, 0 + mov w12, 0 + add x0, x21, :lo12:.LANCHOR2 + ldr w11, [x21, #:lo12:.LANCHOR2] + cmp w11, 16 + beq .L51 +.L6: + .loc 1 114 0 + add w8, w12, 5 + .loc 1 121 0 + mov w9, 0 mov w1, 0 - mov w5, 1 + mov w6, 1 .LVL5: - ldr w12, [x21, #:lo12:.LANCHOR2] - mov w14, 0 + mov w16, 0 mov w19, 0 .LVL6: .p2align 2 -.L6: - .loc 1 66 0 - ldrb w0, [x15, w14, uxtw] - cmp w0, 255 - beq .L9 - .loc 1 71 0 - cmp w0, 252 - beq .L43 -.L10: - .loc 1 78 0 - lsl w2, w19, 10 - .loc 1 76 0 - cbz w5, .L11 - .loc 1 78 0 - add w8, w2, w1, lsl 5 - add w7, w1, 1 - add w2, w2, w4 - add w8, w8, w4 - .loc 1 79 0 - add w6, w1, 2 - add w7, w2, w7, lsl 5 - .loc 1 80 0 - add w5, w1, 3 -.LVL7: - add w6, w2, w6, lsl 5 - .loc 1 78 0 - and w13, w0, 3 +.L7: + .loc 1 69 0 + ldrb w10, [x17, w16, uxtw] + cmp w10, 255 + beq .L8 + .loc 1 74 0 + cmp w10, 252 + beq .L52 +.L9: .loc 1 81 0 - add w2, w2, w5, lsl 5 - .loc 1 78 0 - strb w13, [x3, w8, uxtw] - .loc 1 79 0 - ubfx x9, x0, 2, 2 - strb w9, [x3, w7, uxtw] - .loc 1 80 0 - ubfx x10, x0, 4, 2 - strb w10, [x3, w6, uxtw] - .loc 1 81 0 - lsr w11, w0, 6 - strb w11, [x3, w2, uxtw] - add w1, w1, 4 - .loc 1 82 0 - add w0, w14, 1 - .loc 1 84 0 - cmp w1, w12 - bcc .L12 - .loc 1 86 0 - add w4, w4, 1 - .loc 1 85 0 - mov w1, 0 - .loc 1 86 0 - cmp w4, w12 - bcc .L12 - .loc 1 88 0 - add w19, w19, 1 - .loc 1 87 0 - mov w4, 0 -.L12: - .loc 1 92 0 - ldrb w2, [x15, w0, uxtw] - .loc 1 93 0 - cbz w2, .L13 - .p2align 2 -.L15: - .loc 1 94 0 lsl w0, w19, 10 - add w7, w1, 1 - add w8, w0, w1, lsl 5 - add w0, w0, w4 - add w8, w8, w4 - .loc 1 95 0 - add w6, w1, 2 - add w7, w0, w7, lsl 5 - .loc 1 96 0 - add w5, w1, 3 - add w6, w0, w6, lsl 5 - .loc 1 97 0 - add w0, w0, w5, lsl 5 - .loc 1 94 0 - strb w13, [x3, w8, uxtw] - .loc 1 97 0 + lsl w5, w1, w8 + add w2, w5, w0 + lsl w5, w9, w12 + add w0, w0, w5 + add w5, w2, w5 + add w4, w1, 1 + .loc 1 82 0 + add w3, w1, 2 + .loc 1 83 0 + add w2, w1, 3 + .loc 1 81 0 + and w13, w10, 3 + strb w13, [x7, w5, uxtw] + .loc 1 82 0 + lsl w4, w4, w8 + .loc 1 83 0 + lsl w3, w3, w8 + .loc 1 82 0 + add w4, w4, w0 + .loc 1 83 0 + add w3, w3, w0 + .loc 1 84 0 + lsl w2, w2, w8 + add w0, w2, w0 + .loc 1 79 0 + cbz w6, .L10 + .loc 1 82 0 + ubfx x14, x10, 2, 2 + strb w14, [x7, w4, uxtw] + .loc 1 83 0 + ubfx x15, x10, 4, 2 + strb w15, [x7, w3, uxtw] + .loc 1 84 0 + lsr w10, w10, 6 + strb w10, [x7, w0, uxtw] add w1, w1, 4 - .loc 1 95 0 - strb w9, [x3, w7, uxtw] - .loc 1 93 0 - sub w2, w2, #1 - .loc 1 96 0 - strb w10, [x3, w6, uxtw] - .loc 1 98 0 - cmp w1, w12 - .loc 1 97 0 - strb w11, [x3, w0, uxtw] - .loc 1 98 0 - bcc .L14 - .loc 1 100 0 - add w4, w4, 1 - .loc 1 99 0 + .loc 1 85 0 + add w0, w16, 1 + .loc 1 87 0 + cmp w1, w11 + bcc .L11 + .loc 1 89 0 + add w9, w9, 1 + .loc 1 88 0 mov w1, 0 - .loc 1 100 0 - cmp w4, w12 - bcc .L14 - .loc 1 102 0 + .loc 1 89 0 + cmp w11, w9 + bhi .L11 + .loc 1 91 0 add w19, w19, 1 - .loc 1 101 0 - mov w4, 0 + .loc 1 90 0 + mov w9, 0 +.L11: + .loc 1 95 0 + ldrb w6, [x17, w0, uxtw] +.LVL7: + .loc 1 96 0 + cbz w6, .L12 + .p2align 2 .L14: - .loc 1 93 0 - ands w2, w2, 255 - bne .L15 + .loc 1 97 0 + lsl w0, w19, 10 + lsl w5, w1, w8 + add w4, w1, 1 + add w2, w5, w0 + .loc 1 98 0 + add w3, w1, 2 + .loc 1 97 0 + lsl w5, w9, w12 + add w0, w0, w5 + add w5, w2, w5 + .loc 1 98 0 + lsl w4, w4, w8 + .loc 1 99 0 + add w2, w1, 3 + .loc 1 98 0 + add w4, w4, w0 + .loc 1 99 0 + lsl w3, w3, w8 + add w3, w3, w0 + .loc 1 97 0 + strb w13, [x7, w5, uxtw] + .loc 1 100 0 + lsl w2, w2, w8 + add w0, w2, w0 + .loc 1 98 0 + strb w14, [x7, w4, uxtw] + .loc 1 100 0 + add w1, w1, 4 + .loc 1 99 0 + strb w15, [x7, w3, uxtw] + .loc 1 96 0 + sub w6, w6, #1 + .loc 1 100 0 + strb w10, [x7, w0, uxtw] + .loc 1 101 0 + cmp w11, w1 + bhi .L13 + .loc 1 103 0 + add w9, w9, 1 + .loc 1 102 0 + mov w1, 0 + .loc 1 103 0 + cmp w11, w9 + bhi .L13 + .loc 1 105 0 + add w19, w19, 1 + .loc 1 104 0 + mov w9, 0 .L13: - .loc 1 107 0 - add w14, w14, 2 - mov w5, 1 + .loc 1 96 0 + ands w6, w6, 255 + bne .L14 +.L12: + .loc 1 110 0 + add w16, w16, 2 + mov w6, 1 .LVL8: -.L16: - .loc 1 61 0 +.L15: + .loc 1 64 0 cmp w19, 254 - bls .L6 - .loc 1 62 0 + bls .L7 + .loc 1 65 0 adrp x0, .LC2 add x0, x0, :lo12:.LC2 bl printk .LVL9: - .loc 1 127 0 - ldr w0, [x21, #:lo12:.LANCHOR2] - cmp w0, 32 - beq .L7 -.LVL10: .L8: - .loc 1 139 0 + .loc 1 130 0 + ldr w0, [x21, #:lo12:.LANCHOR2] + add x21, x21, :lo12:.LANCHOR2 + cmp w0, 32 + beq .L53 +.LVL10: +.L16: + .loc 1 149 0 mov w0, w19 .L1: .LBE10: .LBE13: - .loc 1 229 0 + .loc 1 240 0 ldp x19, x20, [sp, 16] .LVL11: ldr x21, [sp, 32] @@ -248,144 +273,149 @@ ret .LVL12: .p2align 3 -.L11: +.L10: .cfi_restore_state .LBB14: .LBB11: - .loc 1 111 0 - add w9, w2, w1, lsl 5 - add w8, w1, 1 - add w2, w2, w4 - add w9, w9, w4 - .loc 1 112 0 - add w7, w1, 2 - add w8, w2, w8, lsl 5 - .loc 1 113 0 - add w6, w1, 3 - add w7, w2, w7, lsl 5 - .loc 1 111 0 - and w10, w0, 3 - .loc 1 114 0 - add w2, w2, w6, lsl 5 - .loc 1 111 0 - strb w10, [x3, w9, uxtw] - .loc 1 112 0 - ubfx x6, x0, 2, 2 - strb w6, [x3, w8, uxtw] - .loc 1 113 0 - ubfx x6, x0, 4, 2 - strb w6, [x3, w7, uxtw] - .loc 1 114 0 - lsr w0, w0, 6 - strb w0, [x3, w2, uxtw] - add w1, w1, 4 .loc 1 115 0 - add w14, w14, 1 + ubfx x2, x10, 2, 2 + strb w2, [x7, w4, uxtw] + .loc 1 116 0 + ubfx x2, x10, 4, 2 + strb w2, [x7, w3, uxtw] .loc 1 117 0 - cmp w1, w12 - bcc .L16 - .loc 1 119 0 - add w4, w4, 1 + lsr w10, w10, 6 + strb w10, [x7, w0, uxtw] + add w1, w1, 4 .loc 1 118 0 - mov w1, 0 - .loc 1 119 0 - cmp w12, w4 - bhi .L16 - .loc 1 121 0 - add w19, w19, 1 + add w16, w16, 1 .loc 1 120 0 - mov w4, 0 - .loc 1 118 0 - mov w1, w5 - b .L16 -.L43: - .loc 1 73 0 - add w14, w14, 1 - .loc 1 72 0 - eor w5, w5, 1 - ldrb w0, [x15, w14, uxtw] - b .L10 -.L9: - .loc 1 127 0 - ldr w0, [x21, #:lo12:.LANCHOR2] + cmp w1, w11 + bcc .L15 + .loc 1 122 0 + add w9, w9, 1 + .loc 1 121 0 + mov w1, 0 + .loc 1 122 0 + cmp w11, w9 + bhi .L15 + .loc 1 124 0 + add w19, w19, 1 + .loc 1 123 0 + mov w9, 0 + .loc 1 121 0 + mov w1, w6 + b .L15 + .p2align 3 +.L52: + .loc 1 76 0 + add w16, w16, 1 + .loc 1 75 0 + eor w6, w6, 1 + ldrb w10, [x17, w16, uxtw] + b .L9 +.L53: + .loc 1 130 0 + ldr w0, [x21, 4] + cmp w0, 16 + beq .L54 + .loc 1 142 0 cmp w0, 32 - bne .L8 - .loc 1 129 0 - cbz w19, .L8 -.L7: + bne .L16 + .loc 1 144 0 + cbz w19, .L16 add x20, x20, :lo12:.LANCHOR0 - .loc 1 99 0 + mov w0, 0 + ldr x2, [x20, 8] +.L24: + .loc 1 145 0 + lsl w1, w0, 10 + .loc 1 144 0 + add w0, w0, 1 + .loc 1 145 0 + add w1, w1, 960 + .loc 1 144 0 + and w0, w0, 255 + .loc 1 145 0 + add x1, x2, x1, sxtw + .loc 1 144 0 + cmp w0, w19 + .loc 1 145 0 + strb wzr, [x1, 29] + .loc 1 144 0 + bcc .L24 + b .L16 +.LVL13: +.L51: + .loc 1 60 0 + ldr w0, [x0, 4] + cmp w0, 32 + cset w12, eq + b .L6 +.LVL14: +.L54: + .loc 1 132 0 + cbz w19, .L16 + add x20, x20, :lo12:.LANCHOR0 mov w8, 0 ldr x1, [x20, 8] -.LVL13: -.L21: +.LVL15: +.L23: lsl w7, w8, 10 mov w6, 0 +.LVL16: mov w5, w7 -.LVL14: .p2align 2 -.L19: +.L21: lsr w4, w6, 1 + .loc 1 102 0 mov w0, 0 add w4, w7, w4, lsl 5 .p2align 2 -.L18: - .loc 1 132 0 +.L20: + .loc 1 135 0 add w3, w0, w5 -.LVL15: - .loc 1 133 0 +.LVL17: + .loc 1 136 0 add w2, w4, w0, lsr 1 - .loc 1 131 0 + .loc 1 134 0 add w0, w0, 2 cmp w0, 32 - .loc 1 132 0 + .loc 1 135 0 ldrb w3, [x1, w3, uxtw] -.LVL16: - .loc 1 133 0 +.LVL18: + .loc 1 136 0 strb w3, [x1, w2, uxtw] - .loc 1 131 0 - bne .L18 - .loc 1 130 0 + .loc 1 134 0 + bne .L20 + .loc 1 133 0 add w6, w6, 2 add w5, w5, 64 cmp w6, 32 - bne .L19 - .loc 1 129 0 + bne .L21 + .loc 1 132 0 add w8, w8, 1 and w8, w8, 255 cmp w8, w19 - bcc .L21 - b .L8 -.LVL17: -.L40: + bcc .L23 + b .L16 +.LVL19: +.L48: .LBE11: .LBE14: - .loc 1 215 0 + .loc 1 226 0 adrp x1, .LANCHOR1 -.LVL18: - adrp x0, .LC0 - mov w2, 215 - add x1, x1, :lo12:.LANCHOR1 - add x0, x0, :lo12:.LC0 - bl printk -.LVL19: - .loc 1 216 0 - mov w0, -22 - b .L1 .LVL20: -.L41: - .loc 1 222 0 - adrp x1, .LANCHOR1 adrp x0, .LC0 - mov w2, 222 + mov w2, 226 add x1, x1, :lo12:.LANCHOR1 add x0, x0, :lo12:.LC0 bl printk .LVL21: - .loc 1 223 0 + .loc 1 227 0 mov w0, -22 b .L1 -.L42: +.L50: .LBB15: .LBB12: .loc 1 56 0 @@ -396,8 +426,21 @@ .loc 1 57 0 mov w0, -22 b .L1 +.LVL23: +.L49: .LBE12: .LBE15: + .loc 1 233 0 + adrp x1, .LANCHOR1 + adrp x0, .LC0 + mov w2, 233 + add x1, x1, :lo12:.LANCHOR1 + add x0, x0, :lo12:.LC0 + bl printk +.LVL24: + .loc 1 234 0 + mov w0, -22 + b .L1 .cfi_endproc .LFE1552: .size get_wf_frm_num, .-get_wf_frm_num @@ -406,179 +449,179 @@ .type get_wf_mode_index, %function get_wf_mode_index: .LFB1550: - .loc 1 171 0 + .loc 1 182 0 .cfi_startproc -.LVL23: - .loc 1 175 0 +.LVL25: + .loc 1 186 0 cmp w0, 10 - bhi .L70 - .loc 1 183 0 + bhi .L81 + .loc 1 194 0 adrp x1, .LANCHOR0 - .loc 1 178 0 + .loc 1 189 0 mov w2, 3 csel w0, w0, w2, ne -.LVL24: +.LVL26: .LBB18: .LBB19: - .loc 1 156 0 + .loc 1 167 0 ldr x1, [x1, #:lo12:.LANCHOR0] ldrb w1, [x1, 16] cmp w1, 25 - beq .L49 - bls .L71 + beq .L60 + bls .L82 cmp w1, 67 - beq .L49 - bls .L72 + beq .L60 + bls .L83 cmp w1, 72 - beq .L56 + beq .L67 cmp w1, 84 - bne .L48 - .loc 1 163 0 + bne .L59 + .loc 1 174 0 adrp x1, .LANCHOR1 add x1, x1, :lo12:.LANCHOR1 add x1, x1, 76 -.LVL25: +.LVL27: .LBE19: .LBE18: - .loc 1 185 0 - ldrb w0, [x1, x0] - ret -.LVL26: - .p2align 3 -.L71: -.LBB27: -.LBB20: - .loc 1 156 0 - cmp w1, 18 - beq .L58 - cmp w1, 22 - beq .L52 - cmp w1, 9 - beq .L73 -.L48: - .loc 1 164 0 - adrp x1, .LANCHOR1 - add x1, x1, :lo12:.LANCHOR1 - add x1, x1, 86 -.LVL27: -.LBE20: -.LBE27: - .loc 1 185 0 + .loc 1 196 0 ldrb w0, [x1, x0] ret .LVL28: .p2align 3 -.L52: -.LBB28: -.LBB21: - .loc 1 159 0 +.L82: +.LBB27: +.LBB20: + .loc 1 167 0 + cmp w1, 18 + beq .L69 + cmp w1, 22 + beq .L63 + cmp w1, 9 + beq .L84 +.L59: + .loc 1 175 0 adrp x1, .LANCHOR1 add x1, x1, :lo12:.LANCHOR1 - add x1, x1, 36 + add x1, x1, 86 .LVL29: -.LBE21: -.LBE28: - .loc 1 185 0 +.LBE20: +.LBE27: + .loc 1 196 0 ldrb w0, [x1, x0] ret .LVL30: .p2align 3 -.L56: -.LBB29: -.LBB22: - .loc 1 162 0 +.L63: +.LBB28: +.LBB21: + .loc 1 170 0 adrp x1, .LANCHOR1 add x1, x1, :lo12:.LANCHOR1 - add x1, x1, 66 + add x1, x1, 36 .LVL31: -.LBE22: -.LBE29: - .loc 1 185 0 +.LBE21: +.LBE28: + .loc 1 196 0 ldrb w0, [x1, x0] ret .LVL32: .p2align 3 -.L72: -.LBB30: -.LBB23: - .loc 1 156 0 - cmp w1, 35 - bne .L48 - .loc 1 161 0 +.L67: +.LBB29: +.LBB22: + .loc 1 173 0 adrp x1, .LANCHOR1 add x1, x1, :lo12:.LANCHOR1 - add x1, x1, 56 + add x1, x1, 66 .LVL33: -.LBE23: -.LBE30: - .loc 1 185 0 +.LBE22: +.LBE29: + .loc 1 196 0 ldrb w0, [x1, x0] ret .LVL34: .p2align 3 -.L58: -.LBB31: -.LBB24: - .loc 1 158 0 +.L83: +.LBB30: +.LBB23: + .loc 1 167 0 + cmp w1, 35 + bne .L59 + .loc 1 172 0 adrp x1, .LANCHOR1 add x1, x1, :lo12:.LANCHOR1 - add x1, x1, 26 + add x1, x1, 56 .LVL35: -.LBE24: -.LBE31: - .loc 1 185 0 +.LBE23: +.LBE30: + .loc 1 196 0 ldrb w0, [x1, x0] ret .LVL36: .p2align 3 -.L73: -.LBB32: -.LBB25: - .loc 1 157 0 +.L69: +.LBB31: +.LBB24: + .loc 1 169 0 adrp x1, .LANCHOR1 add x1, x1, :lo12:.LANCHOR1 - add x1, x1, 16 + add x1, x1, 26 .LVL37: -.LBE25: -.LBE32: - .loc 1 185 0 +.LBE24: +.LBE31: + .loc 1 196 0 ldrb w0, [x1, x0] ret .LVL38: .p2align 3 -.L49: -.LBB33: -.LBB26: - .loc 1 160 0 +.L84: +.LBB32: +.LBB25: + .loc 1 168 0 adrp x1, .LANCHOR1 add x1, x1, :lo12:.LANCHOR1 - add x1, x1, 46 + add x1, x1, 16 .LVL39: -.LBE26: -.LBE33: - .loc 1 185 0 +.LBE25: +.LBE32: + .loc 1 196 0 ldrb w0, [x1, x0] ret .LVL40: -.L70: + .p2align 3 +.L60: +.LBB33: +.LBB26: .loc 1 171 0 + adrp x1, .LANCHOR1 + add x1, x1, :lo12:.LANCHOR1 + add x1, x1, 46 +.LVL41: +.LBE26: +.LBE33: + .loc 1 196 0 + ldrb w0, [x1, x0] + ret +.LVL42: +.L81: + .loc 1 182 0 stp x29, x30, [sp, -16]! .cfi_def_cfa_offset 16 .cfi_offset 29, -16 .cfi_offset 30, -8 - .loc 1 176 0 + .loc 1 187 0 adrp x0, .LC3 -.LVL41: +.LVL43: add x0, x0, :lo12:.LC3 - .loc 1 171 0 + .loc 1 182 0 add x29, sp, 0 .cfi_def_cfa_register 29 - .loc 1 176 0 + .loc 1 187 0 bl printk -.LVL42: - .loc 1 177 0 +.LVL44: + .loc 1 188 0 mov w0, 255 - .loc 1 186 0 + .loc 1 197 0 ldp x29, x30, [sp], 16 .cfi_restore 30 .cfi_restore 29 @@ -593,9 +636,9 @@ .type pvi_wf_get_lut, %function pvi_wf_get_lut: .LFB1553: - .loc 1 232 0 + .loc 1 243 0 .cfi_startproc -.LVL43: +.LVL45: stp x29, x30, [sp, -80]! .cfi_def_cfa_offset 80 .cfi_offset 29, -80 @@ -604,13 +647,13 @@ .cfi_def_cfa_register 29 str x25, [sp, 64] .cfi_offset 25, -16 - .loc 1 240 0 + .loc 1 251 0 adrp x25, .LANCHOR0 - .loc 1 232 0 + .loc 1 243 0 stp x19, x20, [sp, 16] - .loc 1 240 0 - ldr x3, [x25, #:lo12:.LANCHOR0] - .loc 1 232 0 + .loc 1 251 0 + ldr x4, [x25, #:lo12:.LANCHOR0] + .loc 1 243 0 stp x21, x22, [sp, 32] stp x23, x24, [sp, 48] .cfi_offset 19, -64 @@ -619,20 +662,20 @@ .cfi_offset 22, -40 .cfi_offset 23, -32 .cfi_offset 24, -24 - .loc 1 240 0 - cbz x3, .L94 + .loc 1 251 0 + cbz x4, .L105 mov w24, w1 - .loc 1 248 0 + .loc 1 259 0 adrp x21, .LANCHOR2 add x1, x21, :lo12:.LANCHOR2 -.LVL44: +.LVL46: mov x22, x0 mov w20, w2 mov w2, 21846 -.LVL45: +.LVL47: movk w2, 0x5555, lsl 16 - ldr w0, [x1, 4] -.LVL46: + ldr w0, [x1, 8] +.LVL48: smull x23, w20, w2 smull x2, w0, w2 lsr x23, x23, 32 @@ -640,196 +683,203 @@ lsr x2, x2, 32 sub w2, w2, w0, asr 31 cmp w23, w2 - beq .L104 - .loc 1 251 0 + beq .L115 + .loc 1 262 0 + str w3, [x1, 4] + .loc 1 264 0 cmp w24, 10 - beq .L91 -.L90: - .loc 1 253 0 + beq .L102 +.L101: + .loc 1 266 0 add x0, x25, :lo12:.LANCHOR0 .LBB34: .LBB35: - .loc 1 190 0 - ldrb w4, [x3, 38] -.LVL47: + .loc 1 201 0 + ldrb w5, [x4, 38] +.LVL49: .LBE35: .LBE34: - .loc 1 253 0 + .loc 1 266 0 ldr x1, [x22, 16] str x1, [x0, 8] .LBB38: .LBB36: - .loc 1 194 0 - cbz w4, .L79 - .loc 1 195 0 - ldrb w0, [x3, 48] + .loc 1 205 0 + cbz w5, .L90 + .loc 1 206 0 + ldrb w0, [x4, 48] cmp w20, w0 - ble .L95 - add x2, x3, 49 + ble .L106 + add x2, x4, 49 mov w19, 0 -.LVL48: - b .L81 +.LVL50: + b .L92 .p2align 3 -.L82: +.L93: ldrb w3, [x2], 1 +.LVL51: cmp w20, w3 - ble .L92 -.L81: - .loc 1 194 0 - add w19, w19, 1 - cmp w4, w19 - bne .L82 -.L79: - .loc 1 202 0 - sub w19, w4, #1 + ble .L103 +.LVL52: .L92: + .loc 1 205 0 + add w19, w19, 1 + cmp w5, w19 + bne .L93 +.L90: + .loc 1 213 0 + sub w19, w5, #1 +.L103: .LBE36: .LBE38: - .loc 1 255 0 + .loc 1 268 0 mov w0, w24 bl get_wf_mode_index -.LVL49: - .loc 1 256 0 +.LVL53: + .loc 1 269 0 mov w1, w19 and w0, w0, 255 bl get_wf_frm_num -.LVL50: - .loc 1 257 0 - tbnz w0, #31, .L89 - .loc 1 263 0 +.LVL54: + .loc 1 270 0 + tbnz w0, #31, .L100 + .loc 1 276 0 add x3, x21, :lo12:.LANCHOR2 - .loc 1 261 0 + .loc 1 274 0 ldr w2, [x22] - .loc 1 266 0 + .loc 1 279 0 mov w1, 21846 movk w1, 0x5555, lsl 16 - .loc 1 261 0 + .loc 1 274 0 and w2, w2, 65280 - .loc 1 263 0 - str w24, [x3, 8] - .loc 1 262 0 + .loc 1 276 0 + str w24, [x3, 12] + .loc 1 275 0 orr w0, w2, w0 - .loc 1 266 0 - ldr w3, [x3, 4] - .loc 1 262 0 + .loc 1 279 0 + ldr w3, [x3, 8] + .loc 1 275 0 str w0, [x22] - .loc 1 266 0 + .loc 1 279 0 smull x0, w3, w1 lsr x0, x0, 32 sub w0, w0, w3, asr 31 cmp w23, w0 - beq .L84 -.L91: - .loc 1 268 0 + beq .L95 +.LVL55: +.L102: + .loc 1 281 0 ldr x1, [x22, 24] add x0, x25, :lo12:.LANCHOR0 str x1, [x0, 8] - .loc 1 269 0 + .loc 1 282 0 bl epd_overlay_lut -.LVL51: +.LVL56: .LBB39: .LBB40: - .loc 1 190 0 + .loc 1 201 0 ldr x1, [x25, #:lo12:.LANCHOR0] ldrb w3, [x1, 38] -.LVL52: - .loc 1 194 0 - cbz w3, .L85 - .loc 1 195 0 +.LVL57: + .loc 1 205 0 + cbz w3, .L96 + .loc 1 206 0 ldrb w2, [x1, 48] cmp w20, w2 - ble .L96 + ble .L107 add x1, x1, 49 mov w19, 0 -.LVL53: - b .L87 +.LVL58: + b .L98 .p2align 3 -.L88: +.L99: ldrb w2, [x1], 1 cmp w20, w2 - ble .L93 -.L87: - .loc 1 194 0 + ble .L104 +.L98: + .loc 1 205 0 add w19, w19, 1 cmp w3, w19 - bne .L88 -.LVL54: -.L85: - .loc 1 202 0 + bne .L99 +.LVL59: +.L96: + .loc 1 213 0 sub w19, w3, #1 -.LVL55: -.L93: +.LVL60: +.L104: .LBE40: .LBE39: - .loc 1 271 0 + .loc 1 284 0 bl get_wf_mode_index -.LVL56: - .loc 1 272 0 +.LVL61: + .loc 1 285 0 and w0, w0, 255 mov w1, w19 bl get_wf_frm_num -.LVL57: - mov w1, w0 - .loc 1 273 0 - tbnz w0, #31, .L89 - .loc 1 277 0 - ldrb w2, [x22] - .loc 1 279 0 - add x21, x21, :lo12:.LANCHOR2 - .loc 1 282 0 - mov w0, 0 - .loc 1 278 0 - orr w1, w2, w1, lsl 8 - .loc 1 279 0 - str w20, [x21, 4] - .loc 1 278 0 - str w1, [x22] -.LVL58: -.L74: - .loc 1 283 0 - ldp x19, x20, [sp, 16] -.LVL59: - ldp x21, x22, [sp, 32] -.LVL60: - ldp x23, x24, [sp, 48] -.LVL61: - 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 .LVL62: - .p2align 3 -.L104: - .cfi_restore_state - .loc 1 248 0 discriminator 1 - ldr w0, [x1, 8] - cmp w0, w24 - beq .L84 - .loc 1 251 0 - cmp w24, 10 - bne .L90 -.LVL63: -.L84: - .loc 1 249 0 + mov w1, w0 + .loc 1 286 0 + tbnz w0, #31, .L100 + .loc 1 290 0 + ldrb w2, [x22] + .loc 1 292 0 + add x21, x21, :lo12:.LANCHOR2 + .loc 1 295 0 mov w0, 0 - .loc 1 283 0 - ldr x25, [sp, 64] + .loc 1 291 0 + orr w1, w2, w1, lsl 8 + .loc 1 292 0 + str w20, [x21, 8] + .loc 1 291 0 + str w1, [x22] +.LVL63: +.L85: + .loc 1 296 0 ldp x19, x20, [sp, 16] .LVL64: ldp x21, x22, [sp, 32] .LVL65: ldp x23, x24, [sp, 48] .LVL66: + 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 +.LVL67: + .p2align 3 +.L115: + .cfi_restore_state + .loc 1 259 0 discriminator 1 + ldr w0, [x1, 12] + cmp w0, w24 + beq .L95 + .loc 1 262 0 + str w3, [x1, 4] + .loc 1 264 0 + cmp w24, 10 + bne .L101 +.LVL68: +.L95: + .loc 1 260 0 + mov w0, 0 + .loc 1 296 0 + ldr x25, [sp, 64] + ldp x19, x20, [sp, 16] +.LVL69: + ldp x21, x22, [sp, 32] +.LVL70: + ldp x23, x24, [sp, 48] +.LVL71: ldp x29, x30, [sp], 80 .cfi_remember_state .cfi_restore 20 @@ -843,42 +893,42 @@ .cfi_restore 30 .cfi_def_cfa 31, 0 ret -.LVL67: -.L95: +.LVL72: +.L106: .cfi_restore_state .LBB42: .LBB37: - .loc 1 194 0 + .loc 1 205 0 mov w19, 0 -.LVL68: - b .L92 -.LVL69: -.L96: +.LVL73: + b .L103 +.LVL74: +.L107: .LBE37: .LBE42: .LBB43: .LBB41: mov w19, 0 -.LVL70: - b .L93 -.LVL71: -.L94: +.LVL75: + b .L104 +.LVL76: +.L105: .LBE41: .LBE43: - .loc 1 241 0 + .loc 1 252 0 mov w0, -19 -.LVL72: - b .L74 -.LVL73: -.L89: - .loc 1 258 0 +.LVL77: + b .L85 +.LVL78: +.L100: + .loc 1 271 0 adrp x0, .LC4 add x0, x0, :lo12:.LC4 bl printk -.LVL74: - .loc 1 259 0 +.LVL79: + .loc 1 272 0 mov w0, -5 - b .L74 + b .L85 .cfi_endproc .LFE1553: .size pvi_wf_get_lut, .-pvi_wf_get_lut @@ -888,9 +938,9 @@ .type pvi_wf_input, %function pvi_wf_input: .LFB1554: - .loc 1 292 0 + .loc 1 305 0 .cfi_startproc -.LVL75: +.LVL80: stp x29, x30, [sp, -32]! .cfi_def_cfa_offset 32 .cfi_offset 29, -32 @@ -900,17 +950,17 @@ stp x19, x20, [sp, 16] .cfi_offset 19, -16 .cfi_offset 20, -8 - .loc 1 295 0 + .loc 1 308 0 adrp x19, .LANCHOR0 ldr x1, [x19, #:lo12:.LANCHOR0] - cbz x1, .L138 - .loc 1 296 0 + cbz x1, .L149 + .loc 1 309 0 mov w0, -16 -.LVL76: -.L105: - .loc 1 323 0 +.LVL81: +.L116: + .loc 1 336 0 ldp x19, x20, [sp, 16] -.LVL77: +.LVL82: ldp x29, x30, [sp], 32 .cfi_remember_state .cfi_restore 30 @@ -919,66 +969,66 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL78: -.L138: +.LVL83: +.L149: .cfi_restore_state - .loc 1 298 0 + .loc 1 311 0 ldrb w1, [x0, 16] mov x20, x0 adrp x0, .LC5 -.LVL79: +.LVL84: add x0, x0, :lo12:.LC5 bl printk -.LVL80: - .loc 1 301 0 +.LVL85: + .loc 1 314 0 ldrb w1, [x20, 16] cmp w1, 25 - bls .L139 + bls .L150 cmp w1, 67 - beq .L109 - bhi .L111 + beq .L120 + bhi .L122 cmp w1, 32 - beq .L109 + beq .L120 cmp w1, 35 - beq .L110 -.L107: - .loc 1 315 0 + beq .L121 +.L118: + .loc 1 328 0 ldrb w2, [x20, 22] adrp x0, .LC6 add x0, x0, :lo12:.LC6 bl printk -.LVL81: - .loc 1 317 0 +.LVL86: + .loc 1 330 0 mov w0, -8 - b .L105 -.L109: - .loc 1 308 0 + b .L116 +.L120: + .loc 1 321 0 adrp x0, .LANCHOR2 mov w1, 32 str w1, [x0, #:lo12:.LANCHOR2] -.L110: - .loc 1 320 0 +.L121: + .loc 1 333 0 str x20, [x19, #:lo12:.LANCHOR0] - .loc 1 322 0 + .loc 1 335 0 mov w0, 0 - b .L105 -.L139: - .loc 1 301 0 + b .L116 +.L150: + .loc 1 314 0 cmp w1, 24 - bcs .L109 + bcs .L120 cmp w1, 18 - beq .L110 + beq .L121 cmp w1, 22 - beq .L109 + beq .L120 cmp w1, 9 - bne .L107 - b .L110 -.L111: + bne .L118 + b .L121 +.L122: cmp w1, 72 - beq .L109 + beq .L120 cmp w1, 84 - beq .L110 - b .L107 + beq .L121 + b .L118 .cfi_endproc .LFE1554: .size pvi_wf_input, .-pvi_wf_input @@ -988,38 +1038,38 @@ .type pvi_wf_get_version, %function pvi_wf_get_version: .LFB1555: - .loc 1 332 0 + .loc 1 345 0 .cfi_startproc - .loc 1 333 0 + .loc 1 346 0 adrp x0, .LANCHOR0 add x3, x0, :lo12:.LANCHOR0 ldr x1, [x0, #:lo12:.LANCHOR0] -.LVL82: - .loc 1 336 0 - cbz x1, .L142 - .loc 1 339 0 +.LVL87: + .loc 1 349 0 + cbz x1, .L153 + .loc 1 352 0 add x1, x1, 65 -.LVL83: +.LVL88: add x2, x3, 16 - .loc 1 342 0 + .loc 1 355 0 mov x0, x2 - .loc 1 339 0 + .loc 1 352 0 ldp x4, x5, [x1] stp x4, x5, [x3, 16] ldr x3, [x1, 16] str x3, [x2, 16] ldr x1, [x1, 23] str x1, [x2, 23] - .loc 1 340 0 + .loc 1 353 0 strb wzr, [x2, 31] - .loc 1 342 0 + .loc 1 355 0 ret -.LVL84: +.LVL89: .p2align 3 -.L142: - .loc 1 337 0 +.L153: + .loc 1 350 0 mov x0, 0 - .loc 1 343 0 + .loc 1 356 0 ret .cfi_endproc .LFE1555: @@ -1028,9 +1078,9 @@ .section .rodata .align 3 .set .LANCHOR1,. + 0 - .type __func__.16856, %object - .size __func__.16856, 15 -__func__.16856: + .type __func__.16864, %object + .size __func__.16864, 15 +__func__.16864: .string "get_wf_frm_num" .zero 1 .type pvi_mode_table, %object @@ -1123,13 +1173,17 @@ .size maxpic, 4 maxpic: .word 16 - .type sftemp.16863, %object - .size sftemp.16863, 4 -sftemp.16863: + .type need_pic, %object + .size need_pic, 4 +need_pic: + .word 16 + .type sftemp.16872, %object + .size sftemp.16872, 4 +sftemp.16872: .word -1 - .type stype.16862, %object - .size stype.16862, 4 -stype.16862: + .type stype.16871, %object + .size stype.16871, 4 +stype.16871: .word 11 .bss .align 3 @@ -1142,9 +1196,9 @@ .size waveformdata, 8 waveformdata: .zero 8 - .type spi_id_buffer.16888, %object - .size spi_id_buffer.16888, 32 -spi_id_buffer.16888: + .type spi_id_buffer.16897, %object + .size spi_id_buffer.16897, 32 +spi_id_buffer.16897: .zero 32 .section .rodata.str1.8,"aMS",@progbits,1 .align 3 @@ -1265,15 +1319,15 @@ .file 96 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h" .section .debug_info,"",@progbits .Ldebug_info0: - .4byte 0x66da + .4byte 0x670f .2byte 0x4 .4byte .Ldebug_abbrev0 .byte 0x8 .uleb128 0x1 - .4byte .LASF1492 - .byte 0x1 - .4byte .LASF1493 .4byte .LASF1494 + .byte 0x1 + .4byte .LASF1495 + .4byte .LASF1496 .8byte .Ltext0 .8byte .Letext0-.Ltext0 .4byte .Ldebug_line0 @@ -9743,7 +9797,7 @@ .2byte 0x510 .4byte 0x4615 .uleb128 0x40 - .4byte .LASF1495 + .4byte .LASF1497 .byte 0x21 .2byte 0x510 .4byte 0x6c @@ -12892,7 +12946,7 @@ .byte 0x4 .4byte 0x6c .byte 0x60 - .byte 0xc + .byte 0xf .4byte 0x602c .uleb128 0xc .4byte .LASF1419 @@ -12938,24 +12992,24 @@ .4byte .LASF1432 .byte 0x20 .byte 0x60 - .byte 0x1d + .byte 0x20 .4byte 0x605d .uleb128 0xe .4byte .LASF1433 .byte 0x60 - .byte 0x1e + .byte 0x21 .4byte 0x6c .byte 0 .uleb128 0xe .4byte .LASF741 .byte 0x60 - .byte 0x1f + .byte 0x22 .4byte 0x2d7f .byte 0x8 .uleb128 0xe .4byte .LASF1434 .byte 0x60 - .byte 0x20 + .byte 0x23 .4byte 0x605d .byte 0x10 .byte 0 @@ -13138,7 +13192,7 @@ .uleb128 0x45 .4byte .LASF1458 .byte 0x1 - .byte 0x2a + .byte 0x28 .4byte 0x606d .uleb128 0x9 .byte 0x3 @@ -13146,7 +13200,7 @@ .uleb128 0x45 .4byte .LASF1459 .byte 0x1 - .byte 0x2b + .byte 0x29 .4byte 0xbb .uleb128 0x9 .byte 0x3 @@ -13154,7 +13208,7 @@ .uleb128 0x45 .4byte .LASF1460 .byte 0x1 - .byte 0x2c + .byte 0x2a .4byte 0x6203 .uleb128 0x9 .byte 0x3 @@ -13162,9 +13216,17 @@ .uleb128 0x7 .byte 0x8 .4byte 0x6073 + .uleb128 0x45 + .4byte .LASF1461 + .byte 0x1 + .byte 0x2b + .4byte 0xbb + .uleb128 0x9 + .byte 0x3 + .8byte need_pic .uleb128 0x5 .4byte 0x105 - .4byte 0x621f + .4byte 0x6234 .uleb128 0x6 .4byte 0x4e .byte 0x7 @@ -13173,461 +13235,474 @@ .byte 0x9 .byte 0 .uleb128 0x3 - .4byte 0x6209 + .4byte 0x621e .uleb128 0x46 - .4byte .LASF1461 + .4byte .LASF1462 .byte 0x1 - .byte 0x8e - .4byte 0x621f + .byte 0x99 + .4byte 0x6234 .uleb128 0x9 .byte 0x3 .8byte pvi_mode_table .uleb128 0x47 - .4byte .LASF1464 + .4byte .LASF1465 .byte 0x1 - .2byte 0x14b + .2byte 0x158 .4byte 0x55 .8byte .LFB1555 .8byte .LFE1555-.LFB1555 .uleb128 0x1 .byte 0x9c - .4byte 0x6282 + .4byte 0x6297 .uleb128 0x48 - .4byte .LASF1462 - .byte 0x1 - .2byte 0x14d - .4byte 0x55 - .4byte .LLST16 - .uleb128 0x49 .4byte .LASF1463 .byte 0x1 - .2byte 0x14e - .4byte 0x6282 + .2byte 0x15a + .4byte 0x55 + .4byte .LLST17 + .uleb128 0x49 + .4byte .LASF1464 + .byte 0x1 + .2byte 0x15b + .4byte 0x6297 .uleb128 0x9 .byte 0x3 - .8byte spi_id_buffer.16888 + .8byte spi_id_buffer.16897 .byte 0 .uleb128 0x5 .4byte 0x60 - .4byte 0x6292 + .4byte 0x62a7 .uleb128 0x6 .4byte 0x4e .byte 0x1f .byte 0 .uleb128 0x47 - .4byte .LASF1465 + .4byte .LASF1466 .byte 0x1 - .2byte 0x123 + .2byte 0x130 .4byte 0xbb .8byte .LFB1554 .8byte .LFE1554-.LFB1554 .uleb128 0x1 .byte 0x9c - .4byte 0x62eb + .4byte 0x6300 .uleb128 0x4a - .4byte .LASF1467 + .4byte .LASF1468 .byte 0x1 - .2byte 0x123 + .2byte 0x130 .4byte 0x45b - .4byte .LLST15 + .4byte .LLST16 .uleb128 0x4b - .4byte .LASF1472 + .4byte .LASF1473 .byte 0x1 - .2byte 0x125 + .2byte 0x132 .4byte 0x6203 .uleb128 0x4c - .8byte .LVL80 - .4byte 0x66c7 + .8byte .LVL85 + .4byte 0x66fc .uleb128 0x4c - .8byte .LVL81 - .4byte 0x66c7 + .8byte .LVL86 + .4byte 0x66fc .byte 0 .uleb128 0x4d - .4byte .LASF1466 + .4byte .LASF1467 .byte 0x1 - .byte 0xe7 + .byte 0xf2 .4byte 0xbb .8byte .LFB1553 .8byte .LFE1553-.LFB1553 .uleb128 0x1 .byte 0x9c - .4byte 0x6459 - .uleb128 0x4e - .4byte .LASF1468 - .byte 0x1 - .byte 0xe7 - .4byte 0x6459 - .4byte .LLST8 + .4byte 0x647e .uleb128 0x4e .4byte .LASF1469 .byte 0x1 - .byte 0xe7 + .byte 0xf2 + .4byte 0x647e + .4byte .LLST8 + .uleb128 0x4e + .4byte .LASF1470 + .byte 0x1 + .byte 0xf2 .4byte 0x5fcd .4byte .LLST9 .uleb128 0x4e .4byte .LASF1457 .byte 0x1 - .byte 0xe7 + .byte 0xf2 .4byte 0xbb .4byte .LLST10 - .uleb128 0x45 - .4byte .LASF1470 + .uleb128 0x4f + .string "pic" .byte 0x1 - .byte 0xe9 - .4byte 0x5fcd - .uleb128 0x9 - .byte 0x3 - .8byte stype.16862 + .byte 0xf2 + .4byte 0xbb + .4byte .LLST11 .uleb128 0x45 .4byte .LASF1471 .byte 0x1 - .byte 0xea + .byte 0xf4 + .4byte 0x5fcd + .uleb128 0x9 + .byte 0x3 + .8byte stype.16871 + .uleb128 0x45 + .4byte .LASF1472 + .byte 0x1 + .byte 0xf5 .4byte 0xbb .uleb128 0x9 .byte 0x3 - .8byte sftemp.16863 - .uleb128 0x4f - .4byte .LASF1473 - .byte 0x1 - .byte 0xeb - .4byte 0xbb - .uleb128 0x4f + .8byte sftemp.16872 + .uleb128 0x50 .4byte .LASF1474 .byte 0x1 - .byte 0xec + .byte 0xf6 .4byte 0xbb - .uleb128 0x4f - .4byte .LASF1433 - .byte 0x1 - .byte 0xed - .4byte 0xbb - .uleb128 0x45 + .uleb128 0x50 .4byte .LASF1475 .byte 0x1 - .byte 0xee + .byte 0xf7 + .4byte 0xbb + .uleb128 0x50 + .4byte .LASF1433 + .byte 0x1 + .byte 0xf8 + .4byte 0xbb + .uleb128 0x45 + .4byte .LASF1476 + .byte 0x1 + .byte 0xf9 .4byte 0x5fcd .uleb128 0x1 .byte 0x50 - .uleb128 0x50 - .4byte 0x6578 + .uleb128 0x51 + .4byte 0x65a2 .8byte .LBB34 .4byte .Ldebug_ranges0+0xe0 .byte 0x1 - .byte 0xfe - .4byte 0x63cd - .uleb128 0x51 - .4byte 0x6588 + .2byte 0x10b + .4byte 0x63f2 .uleb128 0x52 + .4byte 0x65b2 + .uleb128 0x53 .4byte .Ldebug_ranges0+0xe0 - .uleb128 0x53 - .4byte 0x6593 - .4byte .LLST11 - .uleb128 0x53 - .4byte 0x659e + .uleb128 0x54 + .4byte 0x65bd .4byte .LLST12 .uleb128 0x54 - .4byte 0x65a9 + .4byte 0x65c8 + .4byte .LLST13 + .uleb128 0x55 + .4byte 0x65d3 .uleb128 0x1 .byte 0x63 .byte 0 .byte 0 - .uleb128 0x55 - .4byte 0x6578 + .uleb128 0x51 + .4byte 0x65a2 .8byte .LBB39 .4byte .Ldebug_ranges0+0x120 .byte 0x1 - .2byte 0x10e - .4byte 0x640a - .uleb128 0x51 - .4byte 0x6588 + .2byte 0x11b + .4byte 0x642f .uleb128 0x52 + .4byte 0x65b2 + .uleb128 0x53 .4byte .Ldebug_ranges0+0x120 - .uleb128 0x53 - .4byte 0x6593 - .4byte .LLST13 - .uleb128 0x53 - .4byte 0x659e + .uleb128 0x54 + .4byte 0x65bd .4byte .LLST14 .uleb128 0x54 - .4byte 0x65a9 + .4byte 0x65c8 + .4byte .LLST15 + .uleb128 0x55 + .4byte 0x65d3 .uleb128 0x1 .byte 0x63 .byte 0 .byte 0 .uleb128 0x4c - .8byte .LVL49 - .4byte 0x65b3 + .8byte .LVL53 + .4byte 0x65dd .uleb128 0x4c - .8byte .LVL50 - .4byte 0x645f - .uleb128 0x4c - .8byte .LVL51 - .4byte 0x66d2 + .8byte .LVL54 + .4byte 0x6484 .uleb128 0x4c .8byte .LVL56 - .4byte 0x65b3 + .4byte 0x6707 .uleb128 0x4c - .8byte .LVL57 - .4byte 0x645f + .8byte .LVL61 + .4byte 0x65dd .uleb128 0x4c - .8byte .LVL74 - .4byte 0x66c7 + .8byte .LVL62 + .4byte 0x6484 + .uleb128 0x4c + .8byte .LVL79 + .4byte 0x66fc .byte 0 .uleb128 0x7 .byte 0x8 .4byte 0x602c .uleb128 0x56 - .4byte .LASF1479 + .4byte .LASF1480 .byte 0x1 - .byte 0xcf + .byte 0xda .4byte 0xbb .8byte .LFB1552 .8byte .LFE1552-.LFB1552 .uleb128 0x1 .byte 0x9c - .4byte 0x655d + .4byte 0x6587 .uleb128 0x4e .4byte .LASF824 .byte 0x1 - .byte 0xcf + .byte 0xda .4byte 0xbb .4byte .LLST0 .uleb128 0x4e - .4byte .LASF1473 + .4byte .LASF1474 .byte 0x1 - .byte 0xcf + .byte 0xda .4byte 0xbb .4byte .LLST1 .uleb128 0x57 - .4byte .LASF1462 + .4byte .LASF1463 .byte 0x1 - .byte 0xd1 - .4byte 0x655d + .byte 0xdc + .4byte 0x6587 .4byte .LLST2 - .uleb128 0x4f - .4byte .LASF1476 + .uleb128 0x50 + .4byte .LASF1477 .byte 0x1 - .byte 0xd2 - .4byte 0x655d - .uleb128 0x4f + .byte 0xdd + .4byte 0x6587 + .uleb128 0x50 .4byte .LASF503 .byte 0x1 - .byte 0xd3 + .byte 0xde .4byte 0xbb .uleb128 0x58 - .4byte .LASF1477 - .4byte 0x6573 + .4byte .LASF1478 + .4byte 0x659d .uleb128 0x9 .byte 0x3 - .8byte __func__.16856 - .uleb128 0x50 - .4byte 0x6660 + .8byte __func__.16864 + .uleb128 0x59 + .4byte 0x668a .8byte .LBB8 .4byte .Ldebug_ranges0+0 .byte 0x1 - .byte 0xe4 - .4byte 0x6542 - .uleb128 0x51 - .4byte 0x6670 + .byte 0xef + .4byte 0x656c .uleb128 0x52 + .4byte 0x669a + .uleb128 0x53 .4byte .Ldebug_ranges0+0 - .uleb128 0x59 - .4byte 0x667b - .uleb128 0x59 - .4byte 0x6686 - .uleb128 0x53 - .4byte 0x6691 - .4byte .LLST3 - .uleb128 0x59 - .4byte 0x669c - .uleb128 0x53 - .4byte 0x66a7 - .4byte .LLST4 - .uleb128 0x59 - .4byte 0x66b2 - .uleb128 0x53 + .uleb128 0x5a + .4byte 0x66a5 + .uleb128 0x5a + .4byte 0x66b0 + .uleb128 0x54 .4byte 0x66bb + .4byte .LLST3 + .uleb128 0x5a + .4byte 0x66c6 + .uleb128 0x54 + .4byte 0x66d1 + .4byte .LLST4 + .uleb128 0x5a + .4byte 0x66dc + .uleb128 0x54 + .4byte 0x66e5 .4byte .LLST5 + .uleb128 0x5a + .4byte 0x66f0 .uleb128 0x4c .8byte .LVL9 - .4byte 0x66c7 + .4byte 0x66fc .uleb128 0x4c .8byte .LVL22 - .4byte 0x66c7 + .4byte 0x66fc .byte 0 .byte 0 - .uleb128 0x4c - .8byte .LVL19 - .4byte 0x66c7 .uleb128 0x4c .8byte .LVL21 - .4byte 0x66c7 + .4byte 0x66fc + .uleb128 0x4c + .8byte .LVL24 + .4byte 0x66fc .byte 0 .uleb128 0x7 .byte 0x8 .4byte 0x90 .uleb128 0x5 .4byte 0x67 - .4byte 0x6573 + .4byte 0x659d .uleb128 0x6 .4byte 0x4e .byte 0xe .byte 0 .uleb128 0x3 - .4byte 0x6563 - .uleb128 0x5a - .4byte .LASF1482 + .4byte 0x658d + .uleb128 0x5b + .4byte .LASF1483 .byte 0x1 - .byte 0xbc + .byte 0xc7 .4byte 0xbb .byte 0x1 - .4byte 0x65b3 - .uleb128 0x5b + .4byte 0x65dd + .uleb128 0x5c .4byte .LASF1457 .byte 0x1 - .byte 0xbc + .byte 0xc7 .4byte 0xbb - .uleb128 0x4f - .4byte .LASF1478 + .uleb128 0x50 + .4byte .LASF1479 .byte 0x1 - .byte 0xbe + .byte 0xc9 .4byte 0xbb - .uleb128 0x4f + .uleb128 0x50 .4byte .LASF886 .byte 0x1 - .byte 0xbf + .byte 0xca .4byte 0xbb - .uleb128 0x5c + .uleb128 0x5d .string "i" .byte 0x1 - .byte 0xc0 + .byte 0xcb .4byte 0xbb .byte 0 .uleb128 0x56 - .4byte .LASF1480 + .4byte .LASF1481 .byte 0x1 - .byte 0xaa + .byte 0xb5 .4byte 0xfb .8byte .LFB1550 .8byte .LFE1550-.LFB1550 .uleb128 0x1 .byte 0x9c - .4byte 0x6633 + .4byte 0x665d .uleb128 0x4e - .4byte .LASF1469 + .4byte .LASF1470 .byte 0x1 - .byte 0xaa + .byte 0xb5 .4byte 0x5fcd .4byte .LLST6 - .uleb128 0x4f - .4byte .LASF1481 + .uleb128 0x50 + .4byte .LASF1482 .byte 0x1 - .byte 0xac - .4byte 0x6633 - .uleb128 0x4f + .byte 0xb7 + .4byte 0x665d + .uleb128 0x50 .4byte .LASF824 .byte 0x1 - .byte 0xad + .byte 0xb8 .4byte 0xbb - .uleb128 0x50 - .4byte 0x6639 + .uleb128 0x59 + .4byte 0x6663 .8byte .LBB18 .4byte .Ldebug_ranges0+0x50 .byte 0x1 - .byte 0xb7 - .4byte 0x6625 - .uleb128 0x51 - .4byte 0x6649 + .byte 0xc2 + .4byte 0x664f .uleb128 0x52 - .4byte .Ldebug_ranges0+0x50 + .4byte 0x6673 .uleb128 0x53 - .4byte 0x6654 + .4byte .Ldebug_ranges0+0x50 + .uleb128 0x54 + .4byte 0x667e .4byte .LLST7 .byte 0 .byte 0 .uleb128 0x4c - .8byte .LVL42 - .4byte 0x66c7 + .8byte .LVL44 + .4byte 0x66fc .byte 0 .uleb128 0x7 .byte 0x8 .4byte 0x105 - .uleb128 0x5a - .4byte .LASF1483 - .byte 0x1 - .byte 0x99 - .4byte 0x6633 - .byte 0x1 - .4byte 0x6660 .uleb128 0x5b - .4byte .LASF1462 - .byte 0x1 - .byte 0x99 - .4byte 0x6203 - .uleb128 0x4f - .4byte .LASF1481 - .byte 0x1 - .byte 0x9b - .4byte 0x6633 - .byte 0 - .uleb128 0x5a .4byte .LASF1484 .byte 0x1 - .byte 0x2e - .4byte 0xbb + .byte 0xa4 + .4byte 0x665d .byte 0x1 - .4byte 0x66c7 + .4byte 0x668a + .uleb128 0x5c + .4byte .LASF1463 + .byte 0x1 + .byte 0xa4 + .4byte 0x6203 + .uleb128 0x50 + .4byte .LASF1482 + .byte 0x1 + .byte 0xa6 + .4byte 0x665d + .byte 0 .uleb128 0x5b - .4byte .LASF741 - .byte 0x1 - .byte 0x2e - .4byte 0x655d - .uleb128 0x4f .4byte .LASF1485 .byte 0x1 - .byte 0x30 - .4byte 0x6c - .uleb128 0x4f + .byte 0x2d + .4byte 0xbb + .byte 0x1 + .4byte 0x66fc + .uleb128 0x5c + .4byte .LASF741 + .byte 0x1 + .byte 0x2d + .4byte 0x6587 + .uleb128 0x50 .4byte .LASF1486 + .byte 0x1 + .byte 0x2f + .4byte 0x6c + .uleb128 0x50 + .4byte .LASF1487 + .byte 0x1 + .byte 0x2f + .4byte 0x6c + .uleb128 0x50 + .4byte .LASF1488 .byte 0x1 .byte 0x30 .4byte 0x6c - .uleb128 0x4f - .4byte .LASF1487 + .uleb128 0x50 + .4byte .LASF503 .byte 0x1 .byte 0x31 .4byte 0x6c - .uleb128 0x4f - .4byte .LASF503 + .uleb128 0x50 + .4byte .LASF1489 .byte 0x1 .byte 0x32 - .4byte 0x6c - .uleb128 0x4f - .4byte .LASF1488 + .4byte 0x90 + .uleb128 0x5d + .string "i" .byte 0x1 .byte 0x33 .4byte 0x90 - .uleb128 0x5c - .string "i" + .uleb128 0x50 + .4byte .LASF1490 .byte 0x1 .byte 0x34 - .4byte 0x90 - .uleb128 0x4f - .4byte .LASF1489 + .4byte 0x247 + .uleb128 0x50 + .4byte .LASF1491 .byte 0x1 .byte 0x35 - .4byte 0x247 + .4byte 0xbb .byte 0 - .uleb128 0x5d - .4byte .LASF1490 - .4byte .LASF1490 + .uleb128 0x5e + .4byte .LASF1492 + .4byte .LASF1492 .byte 0xd .byte 0xb0 - .uleb128 0x5d - .4byte .LASF1491 - .4byte .LASF1491 + .uleb128 0x5e + .4byte .LASF1493 + .4byte .LASF1493 .byte 0x60 - .byte 0x2c + .byte 0x2f .byte 0 .section .debug_abbrev,"",@progbits .Ldebug_abbrev0: @@ -14656,6 +14731,21 @@ .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 @@ -14668,7 +14758,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x50 + .uleb128 0x51 .uleb128 0x1d .byte 0x1 .uleb128 0x31 @@ -14680,31 +14770,22 @@ .uleb128 0x58 .uleb128 0xb .uleb128 0x59 - .uleb128 0xb + .uleb128 0x5 .uleb128 0x1 .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x51 + .uleb128 0x52 .uleb128 0x5 .byte 0 .uleb128 0x31 .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x52 + .uleb128 0x53 .uleb128 0xb .byte 0x1 .uleb128 0x55 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x53 - .uleb128 0x34 - .byte 0 - .uleb128 0x31 - .uleb128 0x13 - .uleb128 0x2 .uleb128 0x17 .byte 0 .byte 0 @@ -14714,24 +14795,16 @@ .uleb128 0x31 .uleb128 0x13 .uleb128 0x2 - .uleb128 0x18 + .uleb128 0x17 .byte 0 .byte 0 .uleb128 0x55 - .uleb128 0x1d - .byte 0x1 + .uleb128 0x34 + .byte 0 .uleb128 0x31 .uleb128 0x13 - .uleb128 0x52 - .uleb128 0x1 - .uleb128 0x55 - .uleb128 0x17 - .uleb128 0x58 - .uleb128 0xb - .uleb128 0x59 - .uleb128 0x5 - .uleb128 0x1 - .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 .byte 0 .byte 0 .uleb128 0x56 @@ -14788,13 +14861,30 @@ .byte 0 .byte 0 .uleb128 0x59 + .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 0x5a .uleb128 0x34 .byte 0 .uleb128 0x31 .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .uleb128 0x2e .byte 0x1 .uleb128 0x3 @@ -14813,7 +14903,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x5b + .uleb128 0x5c .uleb128 0x5 .byte 0 .uleb128 0x3 @@ -14826,7 +14916,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x5c + .uleb128 0x5d .uleb128 0x34 .byte 0 .uleb128 0x3 @@ -14839,7 +14929,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x5d + .uleb128 0x5e .uleb128 0x2e .byte 0 .uleb128 0x3f @@ -14859,147 +14949,166 @@ .byte 0 .section .debug_loc,"",@progbits .Ldebug_loc0: -.LLST16: - .8byte .LVL82-.Ltext0 - .8byte .LVL83-.Ltext0 +.LLST17: + .8byte .LVL87-.Ltext0 + .8byte .LVL88-.Ltext0 .2byte 0x1 .byte 0x51 - .8byte .LVL84-.Ltext0 + .8byte .LVL89-.Ltext0 .8byte .LFE1555-.Ltext0 .2byte 0x1 .byte 0x51 .8byte 0 .8byte 0 -.LLST15: - .8byte .LVL75-.Ltext0 - .8byte .LVL76-.Ltext0 +.LLST16: + .8byte .LVL80-.Ltext0 + .8byte .LVL81-.Ltext0 .2byte 0x1 .byte 0x50 - .8byte .LVL76-.Ltext0 - .8byte .LVL77-.Ltext0 + .8byte .LVL81-.Ltext0 + .8byte .LVL82-.Ltext0 .2byte 0x1 .byte 0x64 - .8byte .LVL78-.Ltext0 - .8byte .LVL79-.Ltext0 + .8byte .LVL83-.Ltext0 + .8byte .LVL84-.Ltext0 .2byte 0x1 .byte 0x50 - .8byte .LVL79-.Ltext0 + .8byte .LVL84-.Ltext0 .8byte .LFE1554-.Ltext0 .2byte 0x1 .byte 0x64 .8byte 0 .8byte 0 .LLST8: - .8byte .LVL43-.Ltext0 - .8byte .LVL46-.Ltext0 + .8byte .LVL45-.Ltext0 + .8byte .LVL48-.Ltext0 .2byte 0x1 .byte 0x50 - .8byte .LVL46-.Ltext0 - .8byte .LVL60-.Ltext0 - .2byte 0x1 - .byte 0x66 - .8byte .LVL62-.Ltext0 + .8byte .LVL48-.Ltext0 .8byte .LVL65-.Ltext0 .2byte 0x1 .byte 0x66 .8byte .LVL67-.Ltext0 - .8byte .LVL71-.Ltext0 + .8byte .LVL70-.Ltext0 .2byte 0x1 .byte 0x66 - .8byte .LVL71-.Ltext0 .8byte .LVL72-.Ltext0 + .8byte .LVL76-.Ltext0 + .2byte 0x1 + .byte 0x66 + .8byte .LVL76-.Ltext0 + .8byte .LVL77-.Ltext0 .2byte 0x1 .byte 0x50 - .8byte .LVL73-.Ltext0 + .8byte .LVL78-.Ltext0 .8byte .LFE1553-.Ltext0 .2byte 0x1 .byte 0x66 .8byte 0 .8byte 0 .LLST9: - .8byte .LVL43-.Ltext0 - .8byte .LVL44-.Ltext0 + .8byte .LVL45-.Ltext0 + .8byte .LVL46-.Ltext0 .2byte 0x1 .byte 0x51 - .8byte .LVL44-.Ltext0 - .8byte .LVL61-.Ltext0 - .2byte 0x1 - .byte 0x68 - .8byte .LVL61-.Ltext0 - .8byte .LVL62-.Ltext0 - .2byte 0x1 - .byte 0x51 - .8byte .LVL62-.Ltext0 + .8byte .LVL46-.Ltext0 .8byte .LVL66-.Ltext0 .2byte 0x1 .byte 0x68 + .8byte .LVL66-.Ltext0 + .8byte .LVL67-.Ltext0 + .2byte 0x1 + .byte 0x51 .8byte .LVL67-.Ltext0 .8byte .LVL71-.Ltext0 .2byte 0x1 .byte 0x68 - .8byte .LVL71-.Ltext0 - .8byte .LVL73-.Ltext0 + .8byte .LVL72-.Ltext0 + .8byte .LVL76-.Ltext0 + .2byte 0x1 + .byte 0x68 + .8byte .LVL76-.Ltext0 + .8byte .LVL78-.Ltext0 .2byte 0x1 .byte 0x51 - .8byte .LVL73-.Ltext0 + .8byte .LVL78-.Ltext0 .8byte .LFE1553-.Ltext0 .2byte 0x1 .byte 0x68 .8byte 0 .8byte 0 .LLST10: - .8byte .LVL43-.Ltext0 .8byte .LVL45-.Ltext0 + .8byte .LVL47-.Ltext0 .2byte 0x1 .byte 0x52 - .8byte .LVL45-.Ltext0 - .8byte .LVL59-.Ltext0 - .2byte 0x1 - .byte 0x64 - .8byte .LVL59-.Ltext0 - .8byte .LVL62-.Ltext0 - .2byte 0x1 - .byte 0x52 - .8byte .LVL62-.Ltext0 + .8byte .LVL47-.Ltext0 .8byte .LVL64-.Ltext0 .2byte 0x1 .byte 0x64 + .8byte .LVL64-.Ltext0 .8byte .LVL67-.Ltext0 - .8byte .LVL71-.Ltext0 - .2byte 0x1 - .byte 0x64 - .8byte .LVL71-.Ltext0 - .8byte .LVL73-.Ltext0 .2byte 0x1 .byte 0x52 - .8byte .LVL73-.Ltext0 + .8byte .LVL67-.Ltext0 + .8byte .LVL69-.Ltext0 + .2byte 0x1 + .byte 0x64 + .8byte .LVL72-.Ltext0 + .8byte .LVL76-.Ltext0 + .2byte 0x1 + .byte 0x64 + .8byte .LVL76-.Ltext0 + .8byte .LVL78-.Ltext0 + .2byte 0x1 + .byte 0x52 + .8byte .LVL78-.Ltext0 .8byte .LFE1553-.Ltext0 .2byte 0x1 .byte 0x64 .8byte 0 .8byte 0 .LLST11: - .8byte .LVL47-.Ltext0 - .8byte .LVL49-1-.Ltext0 + .8byte .LVL45-.Ltext0 + .8byte .LVL51-.Ltext0 .2byte 0x1 - .byte 0x54 - .8byte .LVL67-.Ltext0 - .8byte .LVL69-.Ltext0 + .byte 0x53 + .8byte .LVL52-.Ltext0 + .8byte .LVL53-1-.Ltext0 .2byte 0x1 - .byte 0x54 + .byte 0x53 + .8byte .LVL55-.Ltext0 + .8byte .LVL56-1-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte .LVL63-.Ltext0 + .8byte .LVL74-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte .LVL76-.Ltext0 + .8byte .LVL78-.Ltext0 + .2byte 0x1 + .byte 0x53 .8byte 0 .8byte 0 .LLST12: - .8byte .LVL48-.Ltext0 - .8byte .LVL53-.Ltext0 + .8byte .LVL49-.Ltext0 + .8byte .LVL53-1-.Ltext0 .2byte 0x1 - .byte 0x63 - .8byte .LVL54-.Ltext0 - .8byte .LVL55-.Ltext0 + .byte 0x55 + .8byte .LVL72-.Ltext0 + .8byte .LVL74-.Ltext0 .2byte 0x1 - .byte 0x63 + .byte 0x55 + .8byte 0 + .8byte 0 +.LLST13: + .8byte .LVL50-.Ltext0 .8byte .LVL58-.Ltext0 + .2byte 0x1 + .byte 0x63 .8byte .LVL59-.Ltext0 + .8byte .LVL60-.Ltext0 .2byte 0x1 .byte 0x63 .8byte .LVL63-.Ltext0 @@ -15007,36 +15116,40 @@ .2byte 0x1 .byte 0x63 .8byte .LVL68-.Ltext0 - .8byte .LVL70-.Ltext0 + .8byte .LVL69-.Ltext0 .2byte 0x1 .byte 0x63 .8byte .LVL73-.Ltext0 + .8byte .LVL75-.Ltext0 + .2byte 0x1 + .byte 0x63 + .8byte .LVL78-.Ltext0 .8byte .LFE1553-.Ltext0 .2byte 0x1 .byte 0x63 .8byte 0 .8byte 0 -.LLST13: - .8byte .LVL52-.Ltext0 - .8byte .LVL56-1-.Ltext0 - .2byte 0x1 - .byte 0x53 - .8byte .LVL69-.Ltext0 - .8byte .LVL71-.Ltext0 - .2byte 0x1 - .byte 0x53 - .8byte 0 - .8byte 0 .LLST14: - .8byte .LVL53-.Ltext0 - .8byte .LVL59-.Ltext0 + .8byte .LVL57-.Ltext0 + .8byte .LVL61-1-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte .LVL74-.Ltext0 + .8byte .LVL76-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST15: + .8byte .LVL58-.Ltext0 + .8byte .LVL64-.Ltext0 .2byte 0x1 .byte 0x63 - .8byte .LVL70-.Ltext0 - .8byte .LVL71-.Ltext0 + .8byte .LVL75-.Ltext0 + .8byte .LVL76-.Ltext0 .2byte 0x1 .byte 0x63 - .8byte .LVL73-.Ltext0 + .8byte .LVL78-.Ltext0 .8byte .LFE1553-.Ltext0 .2byte 0x1 .byte 0x63 @@ -15054,8 +15167,8 @@ .8byte .LVL3-.Ltext0 .2byte 0x1 .byte 0x51 - .8byte .LVL17-.Ltext0 - .8byte .LVL18-.Ltext0 + .8byte .LVL19-.Ltext0 + .8byte .LVL20-.Ltext0 .2byte 0x1 .byte 0x51 .8byte 0 @@ -15064,15 +15177,15 @@ .8byte .LVL2-.Ltext0 .8byte .LVL4-.Ltext0 .2byte 0x1 - .byte 0x5f - .8byte .LVL17-.Ltext0 - .8byte .LVL19-1-.Ltext0 - .2byte 0x1 - .byte 0x5f - .8byte .LVL20-.Ltext0 + .byte 0x61 + .8byte .LVL19-.Ltext0 .8byte .LVL21-1-.Ltext0 .2byte 0x1 - .byte 0x5f + .byte 0x61 + .8byte .LVL23-.Ltext0 + .8byte .LVL24-1-.Ltext0 + .2byte 0x1 + .byte 0x61 .8byte 0 .8byte 0 .LLST3: @@ -15081,7 +15194,11 @@ .2byte 0x1 .byte 0x63 .8byte .LVL12-.Ltext0 - .8byte .LVL17-.Ltext0 + .8byte .LVL13-.Ltext0 + .2byte 0x1 + .byte 0x63 + .8byte .LVL14-.Ltext0 + .8byte .LVL19-.Ltext0 .2byte 0x1 .byte 0x63 .8byte 0 @@ -15091,12 +15208,12 @@ .8byte .LVL12-.Ltext0 .2byte 0x1 .byte 0x53 - .8byte .LVL13-.Ltext0 .8byte .LVL15-.Ltext0 + .8byte .LVL17-.Ltext0 .2byte 0x1 .byte 0x53 - .8byte .LVL16-.Ltext0 - .8byte .LVL17-.Ltext0 + .8byte .LVL18-.Ltext0 + .8byte .LVL19-.Ltext0 .2byte 0x1 .byte 0x53 .8byte 0 @@ -15105,33 +15222,33 @@ .8byte .LVL5-.Ltext0 .8byte .LVL7-.Ltext0 .2byte 0x1 - .byte 0x55 + .byte 0x56 .8byte .LVL8-.Ltext0 .8byte .LVL9-1-.Ltext0 .2byte 0x1 - .byte 0x55 - .8byte .LVL10-.Ltext0 - .8byte .LVL14-.Ltext0 + .byte 0x56 + .8byte .LVL9-.Ltext0 + .8byte .LVL13-.Ltext0 .2byte 0x1 - .byte 0x55 + .byte 0x56 + .8byte .LVL14-.Ltext0 + .8byte .LVL16-.Ltext0 + .2byte 0x1 + .byte 0x56 .8byte 0 .8byte 0 .LLST6: - .8byte .LVL23-.Ltext0 - .8byte .LVL24-.Ltext0 + .8byte .LVL25-.Ltext0 + .8byte .LVL26-.Ltext0 .2byte 0x1 .byte 0x50 - .8byte .LVL40-.Ltext0 - .8byte .LVL41-.Ltext0 + .8byte .LVL42-.Ltext0 + .8byte .LVL43-.Ltext0 .2byte 0x1 .byte 0x50 .8byte 0 .8byte 0 .LLST7: - .8byte .LVL25-.Ltext0 - .8byte .LVL26-.Ltext0 - .2byte 0x1 - .byte 0x51 .8byte .LVL27-.Ltext0 .8byte .LVL28-.Ltext0 .2byte 0x1 @@ -15158,6 +15275,10 @@ .byte 0x51 .8byte .LVL39-.Ltext0 .8byte .LVL40-.Ltext0 + .2byte 0x1 + .byte 0x51 + .8byte .LVL41-.Ltext0 + .8byte .LVL42-.Ltext0 .2byte 0x1 .byte 0x51 .8byte 0 @@ -15259,7 +15380,7 @@ .string "runnable_weight" .LASF323: .string "pushable_dl_tasks" -.LASF1477: +.LASF1478: .string "__func__" .LASF703: .string "cpu_number" @@ -15289,7 +15410,7 @@ .string "entry" .LASF1435: .string "pvi_waveform" -.LASF1485: +.LASF1486: .string "oldpic" .LASF547: .string "MIGRATE_PCPTYPES" @@ -15487,7 +15608,7 @@ .string "perf_event_mutex" .LASF1380: .string "dev_uevent" -.LASF1478: +.LASF1479: .string "temp_num" .LASF1008: .string "cancelled_write_bytes" @@ -15497,13 +15618,13 @@ .string "sve_vl" .LASF383: .string "signal" -.LASF1466: +.LASF1467: .string "pvi_wf_get_lut" .LASF202: .string "_sinittext" .LASF969: .string "_band" -.LASF1484: +.LASF1485: .string "decodewaveform" .LASF728: .string "tick_nsec" @@ -15879,7 +16000,7 @@ .string "nr_wakeups" .LASF289: .string "wake_entry" -.LASF1464: +.LASF1465: .string "pvi_wf_get_version" .LASF394: .string "parent_exec_id" @@ -16025,7 +16146,7 @@ .string "start_prevent_time" .LASF602: .string "NR_WRITTEN" -.LASF1469: +.LASF1470: .string "lut_type" .LASF1347: .string "dev_root" @@ -16079,7 +16200,7 @@ .string "timeout" .LASF589: .string "NR_FILE_MAPPED" -.LASF1476: +.LASF1477: .string "wf_data" .LASF337: .string "sched_psi_wake_requeue" @@ -16099,11 +16220,11 @@ .string "rb_leftmost" .LASF658: .string "stat_threshold" -.LASF1463: +.LASF1464: .string "spi_id_buffer" .LASF1118: .string "rt_mutex_waiter" -.LASF1494: +.LASF1496: .string "/home/lyx/rk3566-11-eink/kernel" .LASF705: .string "secondary_data" @@ -16217,7 +16338,7 @@ .string "dl_density" .LASF1262: .string "RPM_REQ_RESUME" -.LASF1495: +.LASF1497: .string "frozen" .LASF192: .string "_text" @@ -16357,6 +16478,8 @@ .string "HRTIMER_BASE_REALTIME" .LASF452: .string "stack_vm_area" +.LASF1461: + .string "need_pic" .LASF912: .string "running" .LASF223: @@ -16401,7 +16524,7 @@ .string "init_user_ns" .LASF1104: .string "perf_event_task_context" -.LASF1467: +.LASF1468: .string "waveform_file" .LASF1389: .string "segment_boundary_mask" @@ -16493,6 +16616,8 @@ .string "refcount" .LASF1204: .string "restore_early" +.LASF1491: + .string "shift_n" .LASF1188: .string "pm_message" .LASF948: @@ -16609,7 +16734,7 @@ .string "epd_lut_data" .LASF694: .string "zonelist" -.LASF1493: +.LASF1495: .string "drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c" .LASF672: .string "pageset" @@ -16729,7 +16854,7 @@ .string "deferred_resume" .LASF454: .string "security" -.LASF1475: +.LASF1476: .string "overlay_lut" .LASF166: .string "FTR_LOWER_SAFE" @@ -16753,7 +16878,7 @@ .string "dev_pm_info" .LASF630: .string "node_present_pages" -.LASF1479: +.LASF1480: .string "get_wf_frm_num" .LASF327: .string "exit_state" @@ -16881,7 +17006,7 @@ .string "pcount" .LASF1146: .string "kref" -.LASF1486: +.LASF1487: .string "newpic" .LASF436: .string "nr_dirtied" @@ -16975,7 +17100,7 @@ .string "active_memcg" .LASF1006: .string "read_bytes" -.LASF1461: +.LASF1462: .string "pvi_mode_table" .LASF176: .string "arm64_ftr_reg" @@ -17021,7 +17146,7 @@ .string "pm_message_t" .LASF1424: .string "WF_TYPE_GLR16" -.LASF1488: +.LASF1489: .string "tempdata" .LASF230: .string "__alt_instructions" @@ -17117,7 +17242,7 @@ .string "next_timer" .LASF313: .string "rcu_node_entry" -.LASF1472: +.LASF1473: .string "pvi_wf" .LASF858: .string "list" @@ -17251,7 +17376,7 @@ .string "zoneref" .LASF825: .string "iattr" -.LASF1487: +.LASF1488: .string "frame_tmp" .LASF1051: .string "slice_max" @@ -17269,7 +17394,7 @@ .string "self_exec_id" .LASF1041: .string "wait_count" -.LASF1480: +.LASF1481: .string "get_wf_mode_index" .LASF1333: .string "sync" @@ -17429,7 +17554,7 @@ .string "bps_disabled" .LASF755: .string "notifier_call" -.LASF1468: +.LASF1469: .string "output" .LASF402: .string "journal_info" @@ -17477,7 +17602,7 @@ .string "NR_UNEVICTABLE" .LASF861: .string "released" -.LASF1471: +.LASF1472: .string "sftemp" .LASF819: .string "target_kn" @@ -17571,7 +17696,7 @@ .string "argv" .LASF666: .string "__MAX_NR_ZONES" -.LASF1474: +.LASF1475: .string "mode_index" .LASF438: .string "dirty_paused_when" @@ -17589,7 +17714,7 @@ .string "device_node" .LASF732: .string "ktime_t" -.LASF1490: +.LASF1492: .string "printk" .LASF741: .string "data" @@ -17647,7 +17772,7 @@ .string "dl_throttled" .LASF1184: .string "n_ref" -.LASF1465: +.LASF1466: .string "pvi_wf_input" .LASF391: .string "task_works" @@ -17679,7 +17804,7 @@ .string "wf_subversion" .LASF256: .string "suspended_step" -.LASF1491: +.LASF1493: .string "epd_overlay_lut" .LASF840: .string "mmap" @@ -17689,7 +17814,7 @@ .string "nodemask_t" .LASF1327: .string "autosleep_enabled" -.LASF1470: +.LASF1471: .string "stype" .LASF772: .string "PCPU_FC_EMBED" @@ -17761,7 +17886,7 @@ .string "load_avg" .LASF532: .string "FDPIC_FUNCPTRS" -.LASF1462: +.LASF1463: .string "waveform" .LASF778: .string "thread_id" @@ -17785,7 +17910,7 @@ .string "fpsimd_cpu" .LASF1260: .string "RPM_REQ_SUSPEND" -.LASF1489: +.LASF1490: .string "israr" .LASF360: .string "utime" @@ -17793,7 +17918,7 @@ .string "__nosave_begin" .LASF967: .string "_addr_pkey" -.LASF1492: +.LASF1494: .ascii "GNU C89 6.3.1 20170404 -mlittle-endian -mgeneral-regs-only -" .ascii "mabi=lp64 -march=armv8-a -g -O2 -std=gnu90 -fno-strict-alias" .ascii "ing -fno-common -fshort-wchar -fno-PIE -fno-asynchronous-unw" @@ -17821,7 +17946,7 @@ .string "static_key_mod" .LASF543: .string "MIGRATE_UNMOVABLE" -.LASF1481: +.LASF1482: .string "pvi_modes" .LASF959: .string "_stime" @@ -17901,7 +18026,7 @@ .string "namespace" .LASF1276: .string "no_pm" -.LASF1482: +.LASF1483: .string "get_wf_temp_index" .LASF14: .string "long long int" @@ -18187,7 +18312,7 @@ .string "serial" .LASF398: .string "wake_q" -.LASF1483: +.LASF1484: .string "parse_mode_version" .LASF598: .string "NR_UNSTABLE_NFS" @@ -18215,7 +18340,7 @@ .string "total_time" .LASF211: .string "__kprobes_text_end" -.LASF1473: +.LASF1474: .string "temp_index" .ident "GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404" .section .note.GNU-stack,"",@progbits diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S index 4edd027..dbf7613 100644 --- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S +++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S @@ -1155,7 +1155,7 @@ .cfi_offset 29, -64 .cfi_offset 30, -56 .loc 1 549 0 - adrp x3, .LANCHOR0 + adrp x4, .LANCHOR0 .loc 1 543 0 add x29, sp, 0 .cfi_def_cfa_register 29 @@ -1164,7 +1164,7 @@ .cfi_offset 20, -40 mov x19, x0 .loc 1 549 0 - ldr x0, [x3, #:lo12:.LANCHOR0] + ldr x0, [x4, #:lo12:.LANCHOR0] .LVL105: .loc 1 543 0 stp x21, x22, [sp, 32] @@ -1173,10 +1173,13 @@ .cfi_offset 22, -24 .cfi_offset 23, -16 .loc 1 549 0 - cbz x0, .L138 + cbz x0, .L139 .loc 1 552 0 - cbz x19, .L139 - .loc 1 561 0 + cbz x19, .L140 + .loc 1 555 0 + cmp w3, 32 + beq .L152 + .loc 1 566 0 mov w0, 26215 mov w21, w2 adrp x22, .LANCHOR1 @@ -1184,10 +1187,10 @@ movk w0, 0x6666, lsl 16 add x2, x22, :lo12:.LANCHOR1 .LVL106: - .loc 1 555 0 + .loc 1 560 0 cmp w1, 8 - beq .L128 - .loc 1 561 0 + beq .L129 + .loc 1 566 0 ldr w1, [x22, #:lo12:.LANCHOR1] smull x20, w21, w0 asr x20, x20, 33 @@ -1196,104 +1199,57 @@ asr x0, x0, 33 sub w0, w0, w1, asr 31 cmp w20, w0 - beq .L152 - .loc 1 564 0 + beq .L153 + .loc 1 569 0 cmp w23, 10 - beq .L137 -.L136: - .loc 1 566 0 + bne .L137 +.L138: + .loc 1 589 0 ldr x0, [x19, 8] - cbz x0, .L131 - .loc 1 567 0 + cbz x0, .L135 + .loc 1 590 0 bl kfree .LVL107: - .loc 1 568 0 + .loc 1 591 0 str xzr, [x19, 8] -.L131: - .loc 1 571 0 - mov w2, w21 - mov w1, w23 - mov x0, x19 - bl parse_wf_data .LVL108: - mov w10, w0 - .loc 1 572 0 - tbnz w0, #31, .L135 - .loc 1 576 0 - ldr x1, [x19, 16] - mov w2, w0 - add x0, x19, 8 - bl rkf_lut_init_wf_table.isra.1 -.LVL109: - .loc 1 582 0 - ldr w1, [x22, #:lo12:.LANCHOR1] - mov w0, 26215 - movk w0, 0x6666, lsl 16 - .loc 1 577 0 - ldr w2, [x19] - .loc 1 579 0 - add x3, x22, :lo12:.LANCHOR1 - .loc 1 577 0 - and w2, w2, 65280 - .loc 1 582 0 - smull x0, w1, w0 - .loc 1 578 0 - orr w2, w2, w10 - .loc 1 579 0 - str w23, [x3, 4] - .loc 1 578 0 - str w2, [x19] - .loc 1 582 0 - asr x0, x0, 33 - sub w0, w0, w1, asr 31 - cmp w0, w20 - beq .L133 -.L137: - .loc 1 584 0 - ldr x0, [x19, 8] - cbz x0, .L134 - .loc 1 585 0 - bl kfree -.LVL110: - .loc 1 586 0 - str xzr, [x19, 8] -.L134: - .loc 1 588 0 +.L135: + .loc 1 593 0 bl epd_overlay_lut -.LVL111: - .loc 1 589 0 +.LVL109: + .loc 1 594 0 mov w1, w0 mov w2, w21 mov x0, x19 bl parse_wf_data -.LVL112: +.LVL110: mov w10, w0 - .loc 1 590 0 - tbnz w0, #31, .L135 - .loc 1 594 0 + .loc 1 595 0 + tbnz w0, #31, .L136 + .loc 1 599 0 ldr x1, [x19, 24] mov w2, w0 add x0, x19, 8 bl rkf_lut_init_wf_table.isra.1 -.LVL113: - .loc 1 598 0 +.LVL111: + .loc 1 603 0 str w21, [x22, #:lo12:.LANCHOR1] - .loc 1 596 0 - ldrb w1, [x19] .loc 1 601 0 + ldrb w1, [x19] + .loc 1 606 0 mov w0, 0 - .loc 1 597 0 + .loc 1 602 0 orr w10, w1, w10, lsl 8 str w10, [x19] -.LVL114: +.LVL112: .L126: - .loc 1 602 0 + .loc 1 607 0 ldp x19, x20, [sp, 16] -.LVL115: +.LVL113: ldp x21, x22, [sp, 32] -.LVL116: +.LVL114: ldr x23, [sp, 48] -.LVL117: +.LVL115: ldp x29, x30, [sp], 64 .cfi_remember_state .cfi_restore 30 @@ -1305,39 +1261,76 @@ .cfi_restore 20 .cfi_def_cfa 31, 0 ret -.LVL118: +.LVL116: .p2align 3 -.L128: +.L153: .cfi_restore_state - .loc 1 561 0 - ldr w1, [x22, #:lo12:.LANCHOR1] + .loc 1 566 0 discriminator 1 + ldr w0, [x2, 4] + cmp w23, w0 + beq .L134 + .loc 1 569 0 + cmp w23, 10 + beq .L134 +.L137: + .loc 1 571 0 + ldr x0, [x19, 8] + cbz x0, .L132 + .loc 1 572 0 + bl kfree +.LVL117: + .loc 1 573 0 + str xzr, [x19, 8] +.LVL118: +.L132: + .loc 1 576 0 + mov w2, w21 + mov w1, w23 + mov x0, x19 + bl parse_wf_data .LVL119: - smull x20, w21, w0 - .loc 1 556 0 - mov w23, 5 - .loc 1 561 0 - asr x20, x20, 33 + mov w10, w0 + .loc 1 577 0 + tbnz w0, #31, .L136 + .loc 1 581 0 + ldr x1, [x19, 16] + mov w2, w0 + add x0, x19, 8 + bl rkf_lut_init_wf_table.isra.1 +.LVL120: + .loc 1 587 0 + ldr w1, [x22, #:lo12:.LANCHOR1] + mov w0, 26215 + movk w0, 0x6666, lsl 16 + .loc 1 582 0 + ldr w2, [x19] + .loc 1 584 0 + add x3, x22, :lo12:.LANCHOR1 + .loc 1 582 0 + and w2, w2, 65280 + .loc 1 587 0 smull x0, w1, w0 - sub w20, w20, w21, asr 31 + .loc 1 583 0 + orr w2, w2, w10 + .loc 1 584 0 + str w23, [x3, 4] + .loc 1 583 0 + str w2, [x19] + .loc 1 587 0 asr x0, x0, 33 sub w0, w0, w1, asr 31 - cmp w20, w0 - bne .L136 - ldr w0, [x2, 4] - cmp w0, w23 -.LVL120: - bne .L136 + cmp w0, w20 + bne .L138 .LVL121: -.L133: - .loc 1 562 0 +.L134: + .loc 1 567 0 mov w0, 0 -.L153: - .loc 1 602 0 - ldp x19, x20, [sp, 16] -.LVL122: - ldp x21, x22, [sp, 32] -.LVL123: + .loc 1 607 0 ldr x23, [sp, 48] +.LVL122: + ldp x19, x20, [sp, 16] +.LVL123: + ldp x21, x22, [sp, 32] .LVL124: ldp x29, x30, [sp], 64 .cfi_remember_state @@ -1352,36 +1345,55 @@ ret .LVL125: .p2align 3 -.L152: +.L129: .cfi_restore_state - .loc 1 561 0 discriminator 1 - ldr w0, [x2, 4] - cmp w23, w0 - beq .L133 - .loc 1 564 0 - cmp w23, 10 - bne .L136 - .loc 1 562 0 - mov w0, 0 - b .L153 + .loc 1 566 0 + ldr w1, [x22, #:lo12:.LANCHOR1] .LVL126: -.L138: + smull x20, w21, w0 + .loc 1 561 0 + mov w23, 5 + .loc 1 566 0 + asr x20, x20, 33 + smull x0, w1, w0 + sub w20, w20, w21, asr 31 + asr x0, x0, 33 + sub w0, w0, w1, asr 31 + cmp w20, w0 + bne .L137 + ldr w0, [x2, 4] + cmp w0, w23 +.LVL127: + bne .L137 + b .L134 +.LVL128: +.L139: .loc 1 550 0 mov w0, -19 b .L126 -.L139: +.L140: .loc 1 553 0 mov w0, -22 b .L126 -.LVL127: -.L135: - .loc 1 573 0 +.LVL129: +.L136: + .loc 1 578 0 + adrp x0, .LC7 + add x0, x0, :lo12:.LC7 + bl printk +.LVL130: + .loc 1 579 0 + mov w0, -5 + b .L126 +.LVL131: +.L152: + .loc 1 556 0 adrp x0, .LC6 add x0, x0, :lo12:.LC6 bl printk -.LVL128: - .loc 1 574 0 - mov w0, -5 +.LVL132: + .loc 1 557 0 + mov w0, -22 b .L126 .cfi_endproc .LFE1565: @@ -1389,13 +1401,13 @@ .data .align 2 .set .LANCHOR1,. + 0 - .type sftemp.16977, %object - .size sftemp.16977, 4 -sftemp.16977: + .type sftemp.16981, %object + .size sftemp.16981, 4 +sftemp.16981: .word -1 - .type stype.16976, %object - .size stype.16976, 4 -stype.16976: + .type stype.16980, %object + .size stype.16980, 4 +stype.16980: .word 11 .bss .align 3 @@ -1429,6 +1441,8 @@ .string "rkf file version: %s\n" .zero 2 .LC6: + .string "rkf: not support 5bit waveform\n" +.LC7: .string "rkf waveform get frame number failed\n" .text .Letext0: @@ -1532,7 +1546,7 @@ .file 100 "./arch/arm64/include/asm/string.h" .section .debug_info,"",@progbits .Ldebug_info0: - .4byte 0x7144 + .4byte 0x7161 .2byte 0x4 .4byte .Ldebug_abbrev0 .byte 0x8 @@ -13139,7 +13153,7 @@ .byte 0x4 .4byte 0x6c .byte 0x5f - .byte 0xc + .byte 0xf .4byte 0x6003 .uleb128 0x1b .4byte .LASF1417 @@ -13185,24 +13199,24 @@ .4byte .LASF1430 .byte 0x20 .byte 0x5f - .byte 0x1d + .byte 0x20 .4byte 0x6034 .uleb128 0xc .4byte .LASF1431 .byte 0x5f - .byte 0x1e + .byte 0x21 .4byte 0x6c .byte 0 .uleb128 0xc .4byte .LASF739 .byte 0x5f - .byte 0x1f + .byte 0x22 .4byte 0x2d56 .byte 0x8 .uleb128 0xc .4byte .LASF1432 .byte 0x5f - .byte 0x20 + .byte 0x23 .4byte 0x6034 .byte 0x10 .byte 0 @@ -13427,12 +13441,12 @@ .8byte .LFE1565-.LFB1565 .uleb128 0x1 .byte 0x9c - .4byte 0x62fa + .4byte 0x6317 .uleb128 0x47 .4byte .LASF1465 .byte 0x1 .2byte 0x21e - .4byte 0x62fa + .4byte 0x6317 .4byte .LLST28 .uleb128 0x47 .4byte .LASF1466 @@ -13447,60 +13461,69 @@ .4byte 0xc0 .4byte .LLST30 .uleb128 0x48 + .string "pic" + .byte 0x1 + .2byte 0x21e + .4byte 0xc0 + .4byte .LLST31 + .uleb128 0x49 .4byte .LASF1468 .byte 0x1 .2byte 0x220 .4byte 0x5fa4 .uleb128 0x9 .byte 0x3 - .8byte stype.16976 - .uleb128 0x48 + .8byte stype.16980 + .uleb128 0x49 .4byte .LASF1469 .byte 0x1 .2byte 0x221 .4byte 0xc0 .uleb128 0x9 .byte 0x3 - .8byte sftemp.16977 - .uleb128 0x49 + .8byte sftemp.16981 + .uleb128 0x4a .4byte .LASF1470 .byte 0x1 .2byte 0x222 .4byte 0xc0 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1431 .byte 0x1 .2byte 0x223 .4byte 0xc0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL107 - .4byte 0x70fd - .uleb128 0x4a - .8byte .LVL108 - .4byte 0x6300 - .uleb128 0x4a + .4byte 0x711a + .uleb128 0x4b .8byte .LVL109 - .4byte 0x6f79 - .uleb128 0x4a + .4byte 0x7125 + .uleb128 0x4b .8byte .LVL110 - .4byte 0x70fd - .uleb128 0x4a + .4byte 0x631d + .uleb128 0x4b .8byte .LVL111 - .4byte 0x7108 - .uleb128 0x4a - .8byte .LVL112 - .4byte 0x6300 - .uleb128 0x4a - .8byte .LVL113 - .4byte 0x6f79 - .uleb128 0x4a - .8byte .LVL128 - .4byte 0x7113 + .4byte 0x6f96 + .uleb128 0x4b + .8byte .LVL117 + .4byte 0x711a + .uleb128 0x4b + .8byte .LVL119 + .4byte 0x631d + .uleb128 0x4b + .8byte .LVL120 + .4byte 0x6f96 + .uleb128 0x4b + .8byte .LVL130 + .4byte 0x7130 + .uleb128 0x4b + .8byte .LVL132 + .4byte 0x7130 .byte 0 .uleb128 0x7 .byte 0x8 .4byte 0x6003 - .uleb128 0x4b + .uleb128 0x4c .4byte .LASF1488 .byte 0x1 .2byte 0x1d1 @@ -13509,12 +13532,12 @@ .8byte .LFE1564-.LFB1564 .uleb128 0x1 .byte 0x9c - .4byte 0x67cc + .4byte 0x67e9 .uleb128 0x47 .4byte .LASF1465 .byte 0x1 .2byte 0x1d1 - .4byte 0x62fa + .4byte 0x6317 .4byte .LLST8 .uleb128 0x47 .4byte .LASF1466 @@ -13528,365 +13551,365 @@ .2byte 0x1d1 .4byte 0xc0 .4byte .LLST10 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1431 .byte 0x1 .2byte 0x1d3 .4byte 0xc0 - .uleb128 0x4c - .4byte 0x6840 + .uleb128 0x4d + .4byte 0x685d .8byte .LBB268 .4byte .Ldebug_ranges0+0x110 .byte 0x1 .2byte 0x208 - .4byte 0x6476 - .uleb128 0x4d - .4byte 0x6851 - .uleb128 0x4d - .4byte 0x685d + .4byte 0x6493 .uleb128 0x4e + .4byte 0x686e + .uleb128 0x4e + .4byte 0x687a + .uleb128 0x4f .4byte .Ldebug_ranges0+0x110 - .uleb128 0x4f - .4byte 0x6869 - .uleb128 0x4f - .4byte 0x6875 - .uleb128 0x4f - .4byte 0x6881 - .uleb128 0x4c - .4byte 0x6af8 + .uleb128 0x50 + .4byte 0x6886 + .uleb128 0x50 + .4byte 0x6892 + .uleb128 0x50 + .4byte 0x689e + .uleb128 0x4d + .4byte 0x6b15 .8byte .LBB270 .4byte .Ldebug_ranges0+0x140 .byte 0x1 .2byte 0x1b3 - .4byte 0x6445 - .uleb128 0x4d - .4byte 0x6b13 - .uleb128 0x4d - .4byte 0x6b08 + .4byte 0x6462 .uleb128 0x4e + .4byte 0x6b30 + .uleb128 0x4e + .4byte 0x6b25 + .uleb128 0x4f .4byte .Ldebug_ranges0+0x140 - .uleb128 0x50 - .4byte 0x6b1e - .4byte .LLST11 - .uleb128 0x50 - .4byte 0x6b29 - .4byte .LLST12 - .uleb128 0x50 - .4byte 0x6b34 - .4byte .LLST13 - .uleb128 0x4f - .4byte 0x6b3f - .uleb128 0x4f - .4byte 0x6b4a - .uleb128 0x4f - .4byte 0x6b54 .uleb128 0x51 - .4byte 0x6b60 + .4byte 0x6b3b + .4byte .LLST11 + .uleb128 0x51 + .4byte 0x6b46 + .4byte .LLST12 + .uleb128 0x51 + .4byte 0x6b51 + .4byte .LLST13 + .uleb128 0x50 + .4byte 0x6b5c + .uleb128 0x50 + .4byte 0x6b67 + .uleb128 0x50 + .4byte 0x6b71 + .uleb128 0x52 + .4byte 0x6b7d .8byte .LBB272 .4byte .Ldebug_ranges0+0x170 .byte 0x1 .byte 0xe4 - .uleb128 0x4d - .4byte 0x6b7b - .uleb128 0x4d - .4byte 0x6b70 .uleb128 0x4e + .4byte 0x6b98 + .uleb128 0x4e + .4byte 0x6b8d + .uleb128 0x4f .4byte .Ldebug_ranges0+0x170 - .uleb128 0x4f - .4byte 0x6b86 - .uleb128 0x4f - .4byte 0x6b91 - .uleb128 0x52 + .uleb128 0x50 + .4byte 0x6ba3 + .uleb128 0x50 + .4byte 0x6bae + .uleb128 0x53 .8byte .LBB274 .8byte .LBE274-.LBB274 - .4byte 0x6431 - .uleb128 0x4f - .4byte 0x6b9f - .uleb128 0x4f - .4byte 0x6baa + .4byte 0x644e + .uleb128 0x50 + .4byte 0x6bbc + .uleb128 0x50 + .4byte 0x6bc7 .byte 0 - .uleb128 0x4e + .uleb128 0x4f .4byte .Ldebug_ranges0+0x1c0 - .uleb128 0x4f - .4byte 0x6bb7 - .uleb128 0x4f - .4byte 0x6bc2 + .uleb128 0x50 + .4byte 0x6bd4 + .uleb128 0x50 + .4byte 0x6bdf .byte 0 .byte 0 .byte 0 .byte 0 .byte 0 - .uleb128 0x53 - .4byte 0x6adc + .uleb128 0x54 + .4byte 0x6af9 .8byte .LBB284 .8byte .LBE284-.LBB284 .byte 0x1 .2byte 0x1b4 - .4byte 0x6467 - .uleb128 0x4d - .4byte 0x6aec + .4byte 0x6484 + .uleb128 0x4e + .4byte 0x6b09 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL42 - .4byte 0x6a30 + .4byte 0x6a4d .byte 0 .byte 0 - .uleb128 0x4c - .4byte 0x693c + .uleb128 0x4d + .4byte 0x6959 .8byte .LBB288 .4byte .Ldebug_ranges0+0x1f0 .byte 0x1 .2byte 0x1d8 - .4byte 0x6692 - .uleb128 0x4d - .4byte 0x694d - .uleb128 0x4d - .4byte 0x6959 + .4byte 0x66af .uleb128 0x4e + .4byte 0x696a + .uleb128 0x4e + .4byte 0x6976 + .uleb128 0x4f .4byte .Ldebug_ranges0+0x1f0 - .uleb128 0x4f - .4byte 0x6965 - .uleb128 0x4f - .4byte 0x6971 - .uleb128 0x4f - .4byte 0x697d - .uleb128 0x4f - .4byte 0x6989 - .uleb128 0x4c - .4byte 0x6af8 + .uleb128 0x50 + .4byte 0x6982 + .uleb128 0x50 + .4byte 0x698e + .uleb128 0x50 + .4byte 0x699a + .uleb128 0x50 + .4byte 0x69a6 + .uleb128 0x4d + .4byte 0x6b15 .8byte .LBB290 .4byte .Ldebug_ranges0+0x240 .byte 0x1 .2byte 0x149 - .4byte 0x6562 - .uleb128 0x4d - .4byte 0x6b13 - .uleb128 0x4d - .4byte 0x6b08 + .4byte 0x657f .uleb128 0x4e + .4byte 0x6b30 + .uleb128 0x4e + .4byte 0x6b25 + .uleb128 0x4f .4byte .Ldebug_ranges0+0x240 - .uleb128 0x50 - .4byte 0x6b1e - .4byte .LLST14 - .uleb128 0x50 - .4byte 0x6b29 - .4byte .LLST15 - .uleb128 0x50 - .4byte 0x6b34 - .4byte .LLST16 - .uleb128 0x4f - .4byte 0x6b3f - .uleb128 0x4f - .4byte 0x6b4a - .uleb128 0x4f - .4byte 0x6b54 .uleb128 0x51 - .4byte 0x6b60 + .4byte 0x6b3b + .4byte .LLST14 + .uleb128 0x51 + .4byte 0x6b46 + .4byte .LLST15 + .uleb128 0x51 + .4byte 0x6b51 + .4byte .LLST16 + .uleb128 0x50 + .4byte 0x6b5c + .uleb128 0x50 + .4byte 0x6b67 + .uleb128 0x50 + .4byte 0x6b71 + .uleb128 0x52 + .4byte 0x6b7d .8byte .LBB292 .4byte .Ldebug_ranges0+0x270 .byte 0x1 .byte 0xe4 - .uleb128 0x4d - .4byte 0x6b7b - .uleb128 0x4d - .4byte 0x6b70 .uleb128 0x4e + .4byte 0x6b98 + .uleb128 0x4e + .4byte 0x6b8d + .uleb128 0x4f .4byte .Ldebug_ranges0+0x270 - .uleb128 0x4f - .4byte 0x6b86 - .uleb128 0x4f - .4byte 0x6b91 - .uleb128 0x52 + .uleb128 0x50 + .4byte 0x6ba3 + .uleb128 0x50 + .4byte 0x6bae + .uleb128 0x53 .8byte .LBB294 .8byte .LBE294-.LBB294 - .4byte 0x654e - .uleb128 0x4f - .4byte 0x6b9f - .uleb128 0x4f - .4byte 0x6baa + .4byte 0x656b + .uleb128 0x50 + .4byte 0x6bbc + .uleb128 0x50 + .4byte 0x6bc7 .byte 0 - .uleb128 0x4e + .uleb128 0x4f .4byte .Ldebug_ranges0+0x2c0 - .uleb128 0x4f - .4byte 0x6bb7 - .uleb128 0x4f - .4byte 0x6bc2 + .uleb128 0x50 + .4byte 0x6bd4 + .uleb128 0x50 + .4byte 0x6bdf .byte 0 .byte 0 .byte 0 .byte 0 .byte 0 - .uleb128 0x53 - .4byte 0x6adc + .uleb128 0x54 + .4byte 0x6af9 .8byte .LBB304 .8byte .LBE304-.LBB304 .byte 0x1 .2byte 0x14a - .4byte 0x6584 - .uleb128 0x4d - .4byte 0x6aec + .4byte 0x65a1 + .uleb128 0x4e + .4byte 0x6b09 .byte 0 - .uleb128 0x53 - .4byte 0x6996 + .uleb128 0x54 + .4byte 0x69b3 .8byte .LBB306 .8byte .LBE306-.LBB306 .byte 0x1 .2byte 0x155 - .4byte 0x6669 - .uleb128 0x4d - .4byte 0x69a6 - .uleb128 0x4d - .4byte 0x69a6 - .uleb128 0x54 + .4byte 0x6686 + .uleb128 0x4e + .4byte 0x69c3 + .uleb128 0x4e + .4byte 0x69c3 + .uleb128 0x55 .8byte .LBB307 .8byte .LBE307-.LBB307 - .uleb128 0x4f - .4byte 0x69b1 - .uleb128 0x4f - .4byte 0x69bd - .uleb128 0x4f - .4byte 0x69c9 - .uleb128 0x4f - .4byte 0x69d3 - .uleb128 0x4f - .4byte 0x69dd - .uleb128 0x4f - .4byte 0x69e7 .uleb128 0x50 - .4byte 0x69f1 + .4byte 0x69ce + .uleb128 0x50 + .4byte 0x69da + .uleb128 0x50 + .4byte 0x69e6 + .uleb128 0x50 + .4byte 0x69f0 + .uleb128 0x50 + .4byte 0x69fa + .uleb128 0x50 + .4byte 0x6a04 + .uleb128 0x51 + .4byte 0x6a0e .4byte .LLST17 - .uleb128 0x4f - .4byte 0x69fd - .uleb128 0x4f - .4byte 0x6a09 - .uleb128 0x53 - .4byte 0x6e39 + .uleb128 0x50 + .4byte 0x6a1a + .uleb128 0x50 + .4byte 0x6a26 + .uleb128 0x54 + .4byte 0x6e56 .8byte .LBB308 .8byte .LBE308-.LBB308 .byte 0x1 .2byte 0x109 - .4byte 0x6643 - .uleb128 0x4d - .4byte 0x6e56 - .uleb128 0x4d - .4byte 0x6e4a - .uleb128 0x55 - .4byte 0x6e63 + .4byte 0x6660 + .uleb128 0x4e + .4byte 0x6e73 + .uleb128 0x4e + .4byte 0x6e67 + .uleb128 0x56 + .4byte 0x6e80 .8byte .LBB309 .8byte .LBE309-.LBB309 .byte 0x2 .2byte 0x2e7 - .uleb128 0x4d - .4byte 0x6e80 - .uleb128 0x4d - .4byte 0x6e74 - .uleb128 0x4a + .uleb128 0x4e + .4byte 0x6e9d + .uleb128 0x4e + .4byte 0x6e91 + .uleb128 0x4b .8byte .LVL50 - .4byte 0x711e + .4byte 0x713b .byte 0 .byte 0 - .uleb128 0x54 + .uleb128 0x55 .8byte .LBB311 .8byte .LBE311-.LBB311 - .uleb128 0x50 - .4byte 0x6a16 + .uleb128 0x51 + .4byte 0x6a33 .4byte .LLST18 - .uleb128 0x50 - .4byte 0x6a22 + .uleb128 0x51 + .4byte 0x6a3f .4byte .LLST19 .byte 0 .byte 0 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL49 - .4byte 0x6a30 - .uleb128 0x4a + .4byte 0x6a4d + .uleb128 0x4b .8byte .LVL56 - .4byte 0x70fd - .uleb128 0x4a + .4byte 0x711a + .uleb128 0x4b .8byte .LVL72 - .4byte 0x70fd + .4byte 0x711a .byte 0 .byte 0 - .uleb128 0x53 - .4byte 0x6894 + .uleb128 0x54 + .4byte 0x68b1 .8byte .LBB317 .8byte .LBE317-.LBB317 .byte 0x1 .2byte 0x1fc - .4byte 0x6797 - .uleb128 0x4d - .4byte 0x68a5 - .uleb128 0x4d - .4byte 0x68b1 - .uleb128 0x54 + .4byte 0x67b4 + .uleb128 0x4e + .4byte 0x68c2 + .uleb128 0x4e + .4byte 0x68ce + .uleb128 0x55 .8byte .LBB318 .8byte .LBE318-.LBB318 - .uleb128 0x4f - .4byte 0x68bd - .uleb128 0x4f - .4byte 0x68c9 - .uleb128 0x4f - .4byte 0x68d5 - .uleb128 0x55 - .4byte 0x6af8 + .uleb128 0x50 + .4byte 0x68da + .uleb128 0x50 + .4byte 0x68e6 + .uleb128 0x50 + .4byte 0x68f2 + .uleb128 0x56 + .4byte 0x6b15 .8byte .LBB319 .8byte .LBE319-.LBB319 .byte 0x1 .2byte 0x179 - .uleb128 0x4d - .4byte 0x6b13 - .uleb128 0x4d - .4byte 0x6b08 - .uleb128 0x54 + .uleb128 0x4e + .4byte 0x6b30 + .uleb128 0x4e + .4byte 0x6b25 + .uleb128 0x55 .8byte .LBB320 .8byte .LBE320-.LBB320 - .uleb128 0x50 - .4byte 0x6b1e - .4byte .LLST20 - .uleb128 0x50 - .4byte 0x6b29 - .4byte .LLST21 - .uleb128 0x50 - .4byte 0x6b34 - .4byte .LLST22 - .uleb128 0x4f - .4byte 0x6b3f - .uleb128 0x4f - .4byte 0x6b4a - .uleb128 0x4f - .4byte 0x6b54 .uleb128 0x51 - .4byte 0x6b60 + .4byte 0x6b3b + .4byte .LLST20 + .uleb128 0x51 + .4byte 0x6b46 + .4byte .LLST21 + .uleb128 0x51 + .4byte 0x6b51 + .4byte .LLST22 + .uleb128 0x50 + .4byte 0x6b5c + .uleb128 0x50 + .4byte 0x6b67 + .uleb128 0x50 + .4byte 0x6b71 + .uleb128 0x52 + .4byte 0x6b7d .8byte .LBB321 .4byte .Ldebug_ranges0+0x2f0 .byte 0x1 .byte 0xe4 - .uleb128 0x4d - .4byte 0x6b7b - .uleb128 0x4d - .4byte 0x6b70 .uleb128 0x4e + .4byte 0x6b98 + .uleb128 0x4e + .4byte 0x6b8d + .uleb128 0x4f .4byte .Ldebug_ranges0+0x2f0 - .uleb128 0x4f - .4byte 0x6b86 - .uleb128 0x4f - .4byte 0x6b91 - .uleb128 0x52 + .uleb128 0x50 + .4byte 0x6ba3 + .uleb128 0x50 + .4byte 0x6bae + .uleb128 0x53 .8byte .LBB323 .8byte .LBE323-.LBB323 - .4byte 0x6781 - .uleb128 0x4f - .4byte 0x6b9f - .uleb128 0x4f - .4byte 0x6baa + .4byte 0x679e + .uleb128 0x50 + .4byte 0x6bbc + .uleb128 0x50 + .4byte 0x6bc7 .byte 0 - .uleb128 0x4e + .uleb128 0x4f .4byte .Ldebug_ranges0+0x330 - .uleb128 0x4f - .4byte 0x6bb7 - .uleb128 0x4f - .4byte 0x6bc2 + .uleb128 0x50 + .4byte 0x6bd4 + .uleb128 0x50 + .4byte 0x6bdf .byte 0 .byte 0 .byte 0 @@ -13894,64 +13917,64 @@ .byte 0 .byte 0 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL58 - .4byte 0x6fe7 - .uleb128 0x4a + .4byte 0x7004 + .uleb128 0x4b .8byte .LVL61 - .4byte 0x6fe7 - .uleb128 0x4a + .4byte 0x7004 + .uleb128 0x4b .8byte .LVL64 - .4byte 0x6fe7 - .uleb128 0x4a + .4byte 0x7004 + .uleb128 0x4b .8byte .LVL75 - .4byte 0x6fe7 + .4byte 0x7004 .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1475 .byte 0x1 .2byte 0x1bf .4byte 0xc0 .byte 0x1 - .4byte 0x6840 - .uleb128 0x57 + .4byte 0x685d + .uleb128 0x58 .4byte .LASF739 .byte 0x1 .2byte 0x1bf - .4byte 0x62fa - .uleb128 0x57 + .4byte 0x6317 + .uleb128 0x58 .4byte .LASF1432 .byte 0x1 .2byte 0x1bf .4byte 0x6044 - .uleb128 0x57 + .uleb128 0x58 .4byte .LASF1431 .byte 0x1 .2byte 0x1bf .4byte 0xc0 - .uleb128 0x58 + .uleb128 0x59 .string "i" .byte 0x1 .2byte 0x1c1 .4byte 0xc0 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1471 .byte 0x1 .2byte 0x1c2 .4byte 0x120 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1472 .byte 0x1 .2byte 0x1c2 .4byte 0x120 - .uleb128 0x59 - .uleb128 0x49 + .uleb128 0x5a + .uleb128 0x4a .4byte .LASF1473 .byte 0x1 .2byte 0x1c5 .4byte 0x2d56 - .uleb128 0x59 - .uleb128 0x49 + .uleb128 0x5a + .uleb128 0x4a .4byte .LASF1474 .byte 0x1 .2byte 0x1c8 @@ -13959,34 +13982,34 @@ .byte 0 .byte 0 .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1476 .byte 0x1 .2byte 0x1ad .4byte 0xc0 .byte 0x1 - .4byte 0x688e - .uleb128 0x57 + .4byte 0x68ab + .uleb128 0x58 .4byte .LASF1465 .byte 0x1 .2byte 0x1ad - .4byte 0x62fa - .uleb128 0x57 + .4byte 0x6317 + .uleb128 0x58 .4byte .LASF1477 .byte 0x1 .2byte 0x1ad .4byte 0xc0 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1478 .byte 0x1 .2byte 0x1af - .4byte 0x688e - .uleb128 0x49 + .4byte 0x68ab + .uleb128 0x4a .4byte .LASF1431 .byte 0x1 .2byte 0x1b0 .4byte 0x6c - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1442 .byte 0x1 .2byte 0x1b1 @@ -13995,186 +14018,186 @@ .uleb128 0x7 .byte 0x8 .4byte 0x97 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1479 .byte 0x1 .2byte 0x172 .4byte 0xc0 .byte 0x1 - .4byte 0x68e2 - .uleb128 0x57 + .4byte 0x68ff + .uleb128 0x58 .4byte .LASF1465 .byte 0x1 .2byte 0x172 - .4byte 0x62fa - .uleb128 0x57 + .4byte 0x6317 + .uleb128 0x58 .4byte .LASF1477 .byte 0x1 .2byte 0x172 .4byte 0xc0 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1478 .byte 0x1 .2byte 0x174 - .4byte 0x688e - .uleb128 0x49 + .4byte 0x68ab + .uleb128 0x4a .4byte .LASF1431 .byte 0x1 .2byte 0x175 .4byte 0x6c - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1442 .byte 0x1 .2byte 0x176 .4byte 0x6c .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1480 .byte 0x1 .2byte 0x15f .4byte 0xc0 .byte 0x1 - .4byte 0x693c - .uleb128 0x57 + .4byte 0x6959 + .uleb128 0x58 .4byte .LASF1465 .byte 0x1 .2byte 0x15f - .4byte 0x62fa - .uleb128 0x57 + .4byte 0x6317 + .uleb128 0x58 .4byte .LASF1477 .byte 0x1 .2byte 0x15f .4byte 0xc0 - .uleb128 0x57 + .uleb128 0x58 .4byte .LASF1466 .byte 0x1 .2byte 0x15f .4byte 0x604a - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1478 .byte 0x1 .2byte 0x161 - .4byte 0x688e - .uleb128 0x49 + .4byte 0x68ab + .uleb128 0x4a .4byte .LASF1431 .byte 0x1 .2byte 0x162 .4byte 0x6c - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1442 .byte 0x1 .2byte 0x163 .4byte 0x6c .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1481 .byte 0x1 .2byte 0x141 .4byte 0xc0 .byte 0x1 - .4byte 0x6996 - .uleb128 0x57 + .4byte 0x69b3 + .uleb128 0x58 .4byte .LASF1465 .byte 0x1 .2byte 0x141 - .4byte 0x62fa - .uleb128 0x57 + .4byte 0x6317 + .uleb128 0x58 .4byte .LASF1477 .byte 0x1 .2byte 0x141 .4byte 0xc0 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1482 .byte 0x1 .2byte 0x143 .4byte 0x6003 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1478 .byte 0x1 .2byte 0x144 - .4byte 0x688e - .uleb128 0x49 + .4byte 0x68ab + .uleb128 0x4a .4byte .LASF1431 .byte 0x1 .2byte 0x145 .4byte 0x6c - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1442 .byte 0x1 .2byte 0x146 .4byte 0x6c .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1483 .byte 0x1 .byte 0xfe .4byte 0x2d56 .byte 0x1 - .4byte 0x6a30 - .uleb128 0x5b + .4byte 0x6a4d + .uleb128 0x5c .4byte .LASF1482 .byte 0x1 .byte 0xfe - .4byte 0x62fa - .uleb128 0x49 + .4byte 0x6317 + .uleb128 0x4a .4byte .LASF1484 .byte 0x1 .2byte 0x100 .4byte 0x2d56 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1485 .byte 0x1 .2byte 0x100 .4byte 0x2d56 - .uleb128 0x58 + .uleb128 0x59 .string "i" .byte 0x1 .2byte 0x101 .4byte 0xc0 - .uleb128 0x58 + .uleb128 0x59 .string "j" .byte 0x1 .2byte 0x101 .4byte 0xc0 - .uleb128 0x58 + .uleb128 0x59 .string "k" .byte 0x1 .2byte 0x101 .4byte 0xc0 - .uleb128 0x58 + .uleb128 0x59 .string "h" .byte 0x1 .2byte 0x101 .4byte 0xc0 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1486 .byte 0x1 .2byte 0x102 .4byte 0xc0 - .uleb128 0x58 + .uleb128 0x59 .string "num" .byte 0x1 .2byte 0x103 .4byte 0xc0 - .uleb128 0x58 + .uleb128 0x59 .string "len" .byte 0x1 .2byte 0x104 .4byte 0xc0 - .uleb128 0x59 - .uleb128 0x49 + .uleb128 0x5a + .uleb128 0x4a .4byte .LASF1477 .byte 0x1 .2byte 0x110 .4byte 0xc0 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1487 .byte 0x1 .2byte 0x111 .4byte 0xc0 .byte 0 .byte 0 - .uleb128 0x5c + .uleb128 0x5d .4byte .LASF1489 .byte 0x1 .byte 0xf0 @@ -14183,172 +14206,172 @@ .8byte .LFE1557-.LFB1557 .uleb128 0x1 .byte 0x9c - .4byte 0x6ad6 - .uleb128 0x5d + .4byte 0x6af3 + .uleb128 0x5e .4byte .LASF1478 .byte 0x1 .byte 0xf0 - .4byte 0x688e + .4byte 0x68ab .4byte .LLST0 - .uleb128 0x5d + .uleb128 0x5e .4byte .LASF1442 .byte 0x1 .byte 0xf1 .4byte 0x6c .4byte .LLST1 - .uleb128 0x5e + .uleb128 0x5f .string "out" .byte 0x1 .byte 0xf3 - .4byte 0x6ad6 - .uleb128 0x5f - .4byte 0x6e39 + .4byte 0x6af3 + .uleb128 0x60 + .4byte 0x6e56 .8byte .LBB185 .4byte .Ldebug_ranges0+0 .byte 0x1 .byte 0xf5 - .4byte 0x6ac8 - .uleb128 0x4d - .4byte 0x6e56 - .uleb128 0x4d - .4byte 0x6e4a - .uleb128 0x60 - .4byte 0x6e63 + .4byte 0x6ae5 + .uleb128 0x4e + .4byte 0x6e73 + .uleb128 0x4e + .4byte 0x6e67 + .uleb128 0x61 + .4byte 0x6e80 .8byte .LBB186 .4byte .Ldebug_ranges0+0 .byte 0x2 .2byte 0x2e7 - .uleb128 0x4d - .4byte 0x6e80 - .uleb128 0x4d - .4byte 0x6e74 - .uleb128 0x4a + .uleb128 0x4e + .4byte 0x6e9d + .uleb128 0x4e + .4byte 0x6e91 + .uleb128 0x4b .8byte .LVL3 - .4byte 0x711e + .4byte 0x713b .byte 0 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL4 - .4byte 0x712a + .4byte 0x7147 .byte 0 .uleb128 0x7 .byte 0x8 .4byte 0x90 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1490 .byte 0x1 .byte 0xeb .4byte 0x90 .byte 0x3 - .4byte 0x6af8 - .uleb128 0x5b + .4byte 0x6b15 + .uleb128 0x5c .4byte .LASF1478 .byte 0x1 .byte 0xeb - .4byte 0x688e + .4byte 0x68ab .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1491 .byte 0x1 .byte 0xba - .4byte 0x688e + .4byte 0x68ab .byte 0x1 - .4byte 0x6b60 - .uleb128 0x5b + .4byte 0x6b7d + .uleb128 0x5c .4byte .LASF1477 .byte 0x1 .byte 0xba .4byte 0xc0 - .uleb128 0x5b + .uleb128 0x5c .4byte .LASF822 .byte 0x1 .byte 0xba .4byte 0xc0 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1492 .byte 0x1 .byte 0xbc .4byte 0x61d0 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF856 .byte 0x1 .byte 0xbd .4byte 0x2d56 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1493 .byte 0x1 .byte 0xbe .4byte 0x1e1 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1494 .byte 0x1 .byte 0xbf .4byte 0x6c - .uleb128 0x5e + .uleb128 0x5f .string "pt" .byte 0x1 .byte 0xc0 .4byte 0x6c - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1478 .byte 0x1 .byte 0xc1 .4byte 0x442 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1495 .byte 0x1 .byte 0xa8 .4byte 0xc0 .byte 0x1 - .4byte 0x6bcf - .uleb128 0x5b + .4byte 0x6bec + .uleb128 0x5c .4byte .LASF856 .byte 0x1 .byte 0xa8 .4byte 0x1e1 - .uleb128 0x5b + .uleb128 0x5c .4byte .LASF1477 .byte 0x1 .byte 0xa8 .4byte 0xc0 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF884 .byte 0x1 .byte 0xaa .4byte 0xc0 - .uleb128 0x5e + .uleb128 0x5f .string "i" .byte 0x1 .byte 0xab .4byte 0xc0 + .uleb128 0x63 + .4byte 0x6bd3 .uleb128 0x62 - .4byte 0x6bb6 - .uleb128 0x61 .4byte .LASF1496 .byte 0x1 .byte 0xad .4byte 0xc0 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1497 .byte 0x1 .byte 0xad .4byte 0xc0 .byte 0 - .uleb128 0x59 - .uleb128 0x61 + .uleb128 0x5a + .uleb128 0x62 .4byte .LASF1498 .byte 0x1 .byte 0xae .4byte 0xc0 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1499 .byte 0x1 .byte 0xae .4byte 0xc0 .byte 0 .byte 0 - .uleb128 0x63 + .uleb128 0x64 .4byte .LASF1536 .byte 0x1 .byte 0xa0 @@ -14357,7 +14380,7 @@ .8byte .LFE1553-.LFB1553 .uleb128 0x1 .byte 0x9c - .uleb128 0x64 + .uleb128 0x65 .4byte .LASF1501 .byte 0x1 .byte 0x7f @@ -14366,526 +14389,526 @@ .8byte .LFE1552-.LFB1552 .uleb128 0x1 .byte 0x9c - .4byte 0x6d65 - .uleb128 0x5d + .4byte 0x6d82 + .uleb128 0x5e .4byte .LASF1502 .byte 0x1 .byte 0x7f .4byte 0x442 .4byte .LLST23 - .uleb128 0x5e + .uleb128 0x5f .string "ret" .byte 0x1 .byte 0x81 .4byte 0xc0 - .uleb128 0x5e + .uleb128 0x5f .string "wf" .byte 0x1 .byte 0x82 .4byte 0x61d0 - .uleb128 0x5f - .4byte 0x6d97 + .uleb128 0x60 + .4byte 0x6db4 .8byte .LBB341 .4byte .Ldebug_ranges0+0x360 .byte 0x1 .byte 0x87 - .4byte 0x6c68 - .uleb128 0x4d - .4byte 0x6da7 - .uleb128 0x4a + .4byte 0x6c85 + .uleb128 0x4e + .4byte 0x6dc4 + .uleb128 0x4b .8byte .LVL81 - .4byte 0x7133 - .uleb128 0x4a + .4byte 0x7150 + .uleb128 0x4b .8byte .LVL102 - .4byte 0x7113 + .4byte 0x7130 .byte 0 - .uleb128 0x5f - .4byte 0x6d65 + .uleb128 0x60 + .4byte 0x6d82 .8byte .LBB344 .4byte .Ldebug_ranges0+0x390 .byte 0x1 .byte 0x8d - .4byte 0x6d3d - .uleb128 0x4d - .4byte 0x6d75 + .4byte 0x6d5a .uleb128 0x4e - .4byte .Ldebug_ranges0+0x390 + .4byte 0x6d92 .uleb128 0x4f - .4byte 0x6d80 + .4byte .Ldebug_ranges0+0x390 .uleb128 0x50 - .4byte 0x6d8b + .4byte 0x6d9d + .uleb128 0x51 + .4byte 0x6da8 .4byte .LLST24 - .uleb128 0x65 - .4byte 0x6db3 + .uleb128 0x66 + .4byte 0x6dd0 .8byte .LBB346 .8byte .LBE346-.LBB346 .byte 0x1 .byte 0x6e - .4byte 0x6d2e - .uleb128 0x4d - .4byte 0x6dce - .uleb128 0x4d - .4byte 0x6dc3 - .uleb128 0x54 + .4byte 0x6d4b + .uleb128 0x4e + .4byte 0x6deb + .uleb128 0x4e + .4byte 0x6de0 + .uleb128 0x55 .8byte .LBB347 .8byte .LBE347-.LBB347 - .uleb128 0x4f - .4byte 0x6dd9 .uleb128 0x50 - .4byte 0x6de2 + .4byte 0x6df6 + .uleb128 0x51 + .4byte 0x6dff .4byte .LLST25 - .uleb128 0x5f - .4byte 0x6dee + .uleb128 0x60 + .4byte 0x6e0b .8byte .LBB348 .4byte .Ldebug_ranges0+0x3c0 .byte 0x1 .byte 0x54 - .4byte 0x6d1f - .uleb128 0x4d - .4byte 0x6e05 - .uleb128 0x4d - .4byte 0x6dfa + .4byte 0x6d3c .uleb128 0x4e - .4byte .Ldebug_ranges0+0x3c0 - .uleb128 0x4f - .4byte 0x6e10 - .uleb128 0x4f - .4byte 0x6e19 - .uleb128 0x50 .4byte 0x6e22 - .4byte .LLST26 + .uleb128 0x4e + .4byte 0x6e17 + .uleb128 0x4f + .4byte .Ldebug_ranges0+0x3c0 .uleb128 0x50 .4byte 0x6e2d + .uleb128 0x50 + .4byte 0x6e36 + .uleb128 0x51 + .4byte 0x6e3f + .4byte .LLST26 + .uleb128 0x51 + .4byte 0x6e4a .4byte .LLST27 .byte 0 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL82 - .4byte 0x713e + .4byte 0x715b .byte 0 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL97 - .4byte 0x7113 + .4byte 0x7130 .byte 0 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL91 - .4byte 0x7113 - .uleb128 0x4a + .4byte 0x7130 + .uleb128 0x4b .8byte .LVL98 - .4byte 0x7113 - .uleb128 0x4a + .4byte 0x7130 + .uleb128 0x4b .8byte .LVL103 - .4byte 0x7113 + .4byte 0x7130 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1503 .byte 0x1 .byte 0x65 .4byte 0xc0 .byte 0x1 - .4byte 0x6d97 - .uleb128 0x5b + .4byte 0x6db4 + .uleb128 0x5c .4byte .LASF1492 .byte 0x1 .byte 0x65 .4byte 0x61d0 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1504 .byte 0x1 .byte 0x67 .4byte 0x120 - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1505 .byte 0x1 .byte 0x68 .4byte 0x120 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1506 .byte 0x1 .byte 0x5b .4byte 0xc0 .byte 0x1 - .4byte 0x6db3 - .uleb128 0x66 + .4byte 0x6dd0 + .uleb128 0x67 .string "buf" .byte 0x1 .byte 0x5b .4byte 0x6044 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1507 .byte 0x1 .byte 0x4e .4byte 0x6c .byte 0x1 - .4byte 0x6dee - .uleb128 0x5b + .4byte 0x6e0b + .uleb128 0x5c .4byte .LASF1508 .byte 0x1 .byte 0x4e - .4byte 0x6ad6 - .uleb128 0x5b + .4byte 0x6af3 + .uleb128 0x5c .4byte .LASF1509 .byte 0x1 .byte 0x4e .4byte 0x6c - .uleb128 0x5e + .uleb128 0x5f .string "i" .byte 0x1 .byte 0x50 .4byte 0x6c - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1510 .byte 0x1 .byte 0x51 .4byte 0x6c .byte 0 - .uleb128 0x67 + .uleb128 0x68 .4byte .LASF1537 .byte 0x1 .byte 0x3a .byte 0x1 - .4byte 0x6e39 - .uleb128 0x5b + .4byte 0x6e56 + .uleb128 0x5c .4byte .LASF1511 .byte 0x1 .byte 0x3a .4byte 0x6c - .uleb128 0x5b + .uleb128 0x5c .4byte .LASF1512 .byte 0x1 .byte 0x3a .4byte 0x2d56 - .uleb128 0x5e + .uleb128 0x5f .string "i" .byte 0x1 .byte 0x3c .4byte 0x6c - .uleb128 0x5e + .uleb128 0x5f .string "j" .byte 0x1 .byte 0x3c .4byte 0x6c - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1513 .byte 0x1 .byte 0x3d .4byte 0x6c - .uleb128 0x61 + .uleb128 0x62 .4byte .LASF1510 .byte 0x1 .byte 0x3e .4byte 0x6c .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1514 .byte 0x2 .2byte 0x2e5 .4byte 0x442 .byte 0x3 - .4byte 0x6e63 - .uleb128 0x57 + .4byte 0x6e80 + .uleb128 0x58 .4byte .LASF826 .byte 0x2 .2byte 0x2e5 .4byte 0x261 - .uleb128 0x57 + .uleb128 0x58 .4byte .LASF61 .byte 0x2 .2byte 0x2e5 .4byte 0x277 .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1515 .byte 0x2 .2byte 0x216 .4byte 0x442 .byte 0x3 - .4byte 0x6e9b - .uleb128 0x57 + .4byte 0x6eb8 + .uleb128 0x58 .4byte .LASF826 .byte 0x2 .2byte 0x216 .4byte 0x261 - .uleb128 0x57 + .uleb128 0x58 .4byte .LASF61 .byte 0x2 .2byte 0x216 .4byte 0x277 - .uleb128 0x59 - .uleb128 0x49 + .uleb128 0x5a + .uleb128 0x4a .4byte .LASF909 .byte 0x2 .2byte 0x21a .4byte 0x6c .byte 0 .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1516 .byte 0x2 .2byte 0x1dd .4byte 0x442 .byte 0x3 - .4byte 0x6ed1 - .uleb128 0x57 + .4byte 0x6eee + .uleb128 0x58 .4byte .LASF826 .byte 0x2 .2byte 0x1dd .4byte 0x261 - .uleb128 0x57 + .uleb128 0x58 .4byte .LASF61 .byte 0x2 .2byte 0x1dd .4byte 0x277 - .uleb128 0x49 + .uleb128 0x4a .4byte .LASF1517 .byte 0x2 .2byte 0x1df .4byte 0x6c .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1518 .byte 0x2 .2byte 0x159 .4byte 0x6c .byte 0x3 - .4byte 0x6eef - .uleb128 0x57 + .4byte 0x6f0c + .uleb128 0x58 .4byte .LASF826 .byte 0x2 .2byte 0x159 .4byte 0x261 .byte 0 - .uleb128 0x56 + .uleb128 0x57 .4byte .LASF1519 .byte 0x2 .2byte 0x13d .4byte 0x5f53 .byte 0x3 - .4byte 0x6f0d - .uleb128 0x57 + .4byte 0x6f2a + .uleb128 0x58 .4byte .LASF61 .byte 0x2 .2byte 0x13d .4byte 0x277 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1520 .byte 0x60 .byte 0x1d .4byte 0xc0 .byte 0x3 - .4byte 0x6f29 - .uleb128 0x5b + .4byte 0x6f46 + .uleb128 0x5c .4byte .LASF826 .byte 0x60 .byte 0x1d .4byte 0x2d .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1521 .byte 0x61 .byte 0x22 .4byte 0xc0 .byte 0x3 - .4byte 0x6f43 - .uleb128 0x66 + .4byte 0x6f60 + .uleb128 0x67 .string "n" .byte 0x61 .byte 0x22 .4byte 0x136 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1522 .byte 0x62 .byte 0x1b .4byte 0xc0 .byte 0x3 - .4byte 0x6f5d - .uleb128 0x66 + .4byte 0x6f7a + .uleb128 0x67 .string "x" .byte 0x62 .byte 0x1b .4byte 0xe4 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .4byte .LASF1523 .byte 0x63 .byte 0xb .4byte 0x2d .byte 0x3 - .4byte 0x6f79 - .uleb128 0x5b + .4byte 0x6f96 + .uleb128 0x5c .4byte .LASF1524 .byte 0x63 .byte 0xb .4byte 0x2d .byte 0 - .uleb128 0x68 - .4byte 0x67cc + .uleb128 0x69 + .4byte 0x67e9 .8byte .LFB1567 .8byte .LFE1567-.LFB1567 .uleb128 0x1 .byte 0x9c - .4byte 0x6fe7 - .uleb128 0x69 - .4byte 0x67e9 + .4byte 0x7004 + .uleb128 0x6a + .4byte 0x6806 .uleb128 0x1 .byte 0x51 - .uleb128 0x6a - .4byte 0x67f5 + .uleb128 0x6b + .4byte 0x6812 .4byte .LLST2 - .uleb128 0x4d - .4byte 0x67dd - .uleb128 0x4f - .4byte 0x6801 - .uleb128 0x4f - .4byte 0x680b - .uleb128 0x4f - .4byte 0x6817 - .uleb128 0x54 + .uleb128 0x4e + .4byte 0x67fa + .uleb128 0x50 + .4byte 0x681e + .uleb128 0x50 + .4byte 0x6828 + .uleb128 0x50 + .4byte 0x6834 + .uleb128 0x55 .8byte .LBB194 .8byte .LBE194-.LBB194 - .uleb128 0x4f - .4byte 0x6824 - .uleb128 0x54 + .uleb128 0x50 + .4byte 0x6841 + .uleb128 0x55 .8byte .LBB195 .8byte .LBE195-.LBB195 - .uleb128 0x4f - .4byte 0x6831 + .uleb128 0x50 + .4byte 0x684e .byte 0 .byte 0 .byte 0 - .uleb128 0x68 - .4byte 0x68e2 + .uleb128 0x69 + .4byte 0x68ff .8byte .LFB1569 .8byte .LFE1569-.LFB1569 .uleb128 0x1 .byte 0x9c - .4byte 0x70fd - .uleb128 0x6a - .4byte 0x68ff + .4byte 0x711a + .uleb128 0x6b + .4byte 0x691c .4byte .LLST3 - .uleb128 0x6a - .4byte 0x690b + .uleb128 0x6b + .4byte 0x6928 .4byte .LLST4 + .uleb128 0x4e + .4byte 0x6910 + .uleb128 0x50 + .4byte 0x6934 + .uleb128 0x50 + .4byte 0x6940 + .uleb128 0x50 + .4byte 0x694c .uleb128 0x4d - .4byte 0x68f3 - .uleb128 0x4f - .4byte 0x6917 - .uleb128 0x4f - .4byte 0x6923 - .uleb128 0x4f - .4byte 0x692f - .uleb128 0x4c - .4byte 0x6af8 + .4byte 0x6b15 .8byte .LBB204 .4byte .Ldebug_ranges0+0x40 .byte 0x1 .2byte 0x166 - .4byte 0x70cd - .uleb128 0x4d - .4byte 0x6b13 - .uleb128 0x4d - .4byte 0x6b08 + .4byte 0x70ea .uleb128 0x4e + .4byte 0x6b30 + .uleb128 0x4e + .4byte 0x6b25 + .uleb128 0x4f .4byte .Ldebug_ranges0+0x40 - .uleb128 0x50 - .4byte 0x6b1e - .4byte .LLST5 - .uleb128 0x50 - .4byte 0x6b29 - .4byte .LLST6 - .uleb128 0x50 - .4byte 0x6b34 - .4byte .LLST7 - .uleb128 0x4f - .4byte 0x6b3f - .uleb128 0x4f - .4byte 0x6b4a - .uleb128 0x4f - .4byte 0x6b54 .uleb128 0x51 - .4byte 0x6b60 + .4byte 0x6b3b + .4byte .LLST5 + .uleb128 0x51 + .4byte 0x6b46 + .4byte .LLST6 + .uleb128 0x51 + .4byte 0x6b51 + .4byte .LLST7 + .uleb128 0x50 + .4byte 0x6b5c + .uleb128 0x50 + .4byte 0x6b67 + .uleb128 0x50 + .4byte 0x6b71 + .uleb128 0x52 + .4byte 0x6b7d .8byte .LBB206 .4byte .Ldebug_ranges0+0x80 .byte 0x1 .byte 0xe4 - .uleb128 0x4d - .4byte 0x6b7b - .uleb128 0x4d - .4byte 0x6b70 .uleb128 0x4e + .4byte 0x6b98 + .uleb128 0x4e + .4byte 0x6b8d + .uleb128 0x4f .4byte .Ldebug_ranges0+0x80 - .uleb128 0x4f - .4byte 0x6b86 - .uleb128 0x4f - .4byte 0x6b91 - .uleb128 0x6b + .uleb128 0x50 + .4byte 0x6ba3 + .uleb128 0x50 + .4byte 0x6bae + .uleb128 0x6c .4byte .Ldebug_ranges0+0xb0 - .4byte 0x70b9 - .uleb128 0x4f - .4byte 0x6b9f - .uleb128 0x4f - .4byte 0x6baa + .4byte 0x70d6 + .uleb128 0x50 + .4byte 0x6bbc + .uleb128 0x50 + .4byte 0x6bc7 .byte 0 - .uleb128 0x4e + .uleb128 0x4f .4byte .Ldebug_ranges0+0xe0 - .uleb128 0x4f - .4byte 0x6bb7 - .uleb128 0x4f - .4byte 0x6bc2 + .uleb128 0x50 + .4byte 0x6bd4 + .uleb128 0x50 + .4byte 0x6bdf .byte 0 .byte 0 .byte 0 .byte 0 .byte 0 - .uleb128 0x53 - .4byte 0x6adc + .uleb128 0x54 + .4byte 0x6af9 .8byte .LBB217 .8byte .LBE217-.LBB217 .byte 0x1 .2byte 0x167 - .4byte 0x70ef - .uleb128 0x4d - .4byte 0x6aec + .4byte 0x710c + .uleb128 0x4e + .4byte 0x6b09 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .8byte .LVL21 - .4byte 0x6a30 + .4byte 0x6a4d .byte 0 - .uleb128 0x6c + .uleb128 0x6d .4byte .LASF1525 .4byte .LASF1525 .byte 0x2 .byte 0xb9 - .uleb128 0x6c + .uleb128 0x6d .4byte .LASF1526 .4byte .LASF1526 .byte 0x5f - .byte 0x2c - .uleb128 0x6c + .byte 0x2f + .uleb128 0x6d .4byte .LASF1527 .4byte .LASF1527 .byte 0xe .byte 0xb0 - .uleb128 0x6d + .uleb128 0x6e .4byte .LASF1528 .4byte .LASF1528 .byte 0x2 .2byte 0x184 - .uleb128 0x6e + .uleb128 0x6f .4byte .LASF1530 .4byte .LASF1530 - .uleb128 0x6c + .uleb128 0x6d .4byte .LASF1529 .4byte .LASF1529 .byte 0x64 .byte 0x1e - .uleb128 0x6e + .uleb128 0x6f .4byte .LASF1531 .4byte .LASF1531 .byte 0 @@ -15805,6 +15828,21 @@ .byte 0 .byte 0 .uleb128 0x48 + .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 0x49 .uleb128 0x34 .byte 0 .uleb128 0x3 @@ -15819,7 +15857,7 @@ .uleb128 0x18 .byte 0 .byte 0 - .uleb128 0x49 + .uleb128 0x4a .uleb128 0x34 .byte 0 .uleb128 0x3 @@ -15832,7 +15870,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x4a + .uleb128 0x4b .uleb128 0x4109 .byte 0 .uleb128 0x11 @@ -15841,7 +15879,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x4b + .uleb128 0x4c .uleb128 0x2e .byte 0x1 .uleb128 0x3 @@ -15866,7 +15904,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x4c + .uleb128 0x4d .uleb128 0x1d .byte 0x1 .uleb128 0x31 @@ -15883,25 +15921,18 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x4d + .uleb128 0x4e .uleb128 0x5 .byte 0 .uleb128 0x31 .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x4e + .uleb128 0x4f .uleb128 0xb .byte 0x1 .uleb128 0x55 .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x4f - .uleb128 0x34 - .byte 0 - .uleb128 0x31 - .uleb128 0x13 .byte 0 .byte 0 .uleb128 0x50 @@ -15909,11 +15940,18 @@ .byte 0 .uleb128 0x31 .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x51 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 .uleb128 0x2 .uleb128 0x17 .byte 0 .byte 0 - .uleb128 0x51 + .uleb128 0x52 .uleb128 0x1d .byte 0x1 .uleb128 0x31 @@ -15928,35 +15966,35 @@ .uleb128 0xb .byte 0 .byte 0 - .uleb128 0x52 - .uleb128 0xb - .byte 0x1 - .uleb128 0x11 - .uleb128 0x1 - .uleb128 0x12 - .uleb128 0x7 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 .uleb128 0x53 - .uleb128 0x1d + .uleb128 0xb .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 0x54 + .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 0x55 .uleb128 0xb .byte 0x1 .uleb128 0x11 @@ -15965,7 +16003,7 @@ .uleb128 0x7 .byte 0 .byte 0 - .uleb128 0x55 + .uleb128 0x56 .uleb128 0x1d .byte 0x1 .uleb128 0x31 @@ -15980,7 +16018,7 @@ .uleb128 0x5 .byte 0 .byte 0 - .uleb128 0x56 + .uleb128 0x57 .uleb128 0x2e .byte 0x1 .uleb128 0x3 @@ -15999,7 +16037,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x57 + .uleb128 0x58 .uleb128 0x5 .byte 0 .uleb128 0x3 @@ -16012,7 +16050,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x58 + .uleb128 0x59 .uleb128 0x34 .byte 0 .uleb128 0x3 @@ -16025,12 +16063,12 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x59 + .uleb128 0x5a .uleb128 0xb .byte 0x1 .byte 0 .byte 0 - .uleb128 0x5a + .uleb128 0x5b .uleb128 0x2e .byte 0x1 .uleb128 0x3 @@ -16049,7 +16087,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x5b + .uleb128 0x5c .uleb128 0x5 .byte 0 .uleb128 0x3 @@ -16062,7 +16100,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x5c + .uleb128 0x5d .uleb128 0x2e .byte 0x1 .uleb128 0x3 @@ -16087,7 +16125,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x5d + .uleb128 0x5e .uleb128 0x5 .byte 0 .uleb128 0x3 @@ -16102,7 +16140,7 @@ .uleb128 0x17 .byte 0 .byte 0 - .uleb128 0x5e + .uleb128 0x5f .uleb128 0x34 .byte 0 .uleb128 0x3 @@ -16112,23 +16150,6 @@ .uleb128 0x3b .uleb128 0xb .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x5f - .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 @@ -16144,10 +16165,27 @@ .uleb128 0x58 .uleb128 0xb .uleb128 0x59 - .uleb128 0x5 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 .byte 0 .byte 0 .uleb128 0x61 + .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 0x62 .uleb128 0x34 .byte 0 .uleb128 0x3 @@ -16160,40 +16198,40 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x62 + .uleb128 0x63 .uleb128 0xb .byte 0x1 .uleb128 0x1 .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x63 - .uleb128 0x2e - .byte 0 - .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 .byte 0 .byte 0 .uleb128 0x64 .uleb128 0x2e + .byte 0 + .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 + .byte 0 + .byte 0 + .uleb128 0x65 + .uleb128 0x2e .byte 0x1 .uleb128 0x3f .uleb128 0x19 @@ -16219,7 +16257,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x65 + .uleb128 0x66 .uleb128 0x1d .byte 0x1 .uleb128 0x31 @@ -16236,7 +16274,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x66 + .uleb128 0x67 .uleb128 0x5 .byte 0 .uleb128 0x3 @@ -16249,7 +16287,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x67 + .uleb128 0x68 .uleb128 0x2e .byte 0x1 .uleb128 0x3 @@ -16266,7 +16304,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x68 + .uleb128 0x69 .uleb128 0x2e .byte 0x1 .uleb128 0x31 @@ -16283,7 +16321,7 @@ .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0x69 + .uleb128 0x6a .uleb128 0x5 .byte 0 .uleb128 0x31 @@ -16292,7 +16330,7 @@ .uleb128 0x18 .byte 0 .byte 0 - .uleb128 0x6a + .uleb128 0x6b .uleb128 0x5 .byte 0 .uleb128 0x31 @@ -16301,30 +16339,13 @@ .uleb128 0x17 .byte 0 .byte 0 - .uleb128 0x6b + .uleb128 0x6c .uleb128 0xb .byte 0x1 .uleb128 0x55 .uleb128 0x17 .uleb128 0x1 .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x6c - .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 0x6d @@ -16341,10 +16362,27 @@ .uleb128 0x3a .uleb128 0xb .uleb128 0x3b - .uleb128 0x5 + .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 @@ -16366,11 +16404,11 @@ .2byte 0x1 .byte 0x50 .8byte .LVL105-.Ltext0 - .8byte .LVL115-.Ltext0 + .8byte .LVL113-.Ltext0 .2byte 0x1 .byte 0x63 - .8byte .LVL118-.Ltext0 - .8byte .LVL122-.Ltext0 + .8byte .LVL116-.Ltext0 + .8byte .LVL123-.Ltext0 .2byte 0x1 .byte 0x63 .8byte .LVL125-.Ltext0 @@ -16381,37 +16419,41 @@ .8byte 0 .LLST29: .8byte .LVL104-.Ltext0 - .8byte .LVL114-.Ltext0 + .8byte .LVL112-.Ltext0 .2byte 0x1 .byte 0x51 - .8byte .LVL114-.Ltext0 - .8byte .LVL117-.Ltext0 + .8byte .LVL112-.Ltext0 + .8byte .LVL115-.Ltext0 .2byte 0x1 .byte 0x67 - .8byte .LVL117-.Ltext0 - .8byte .LVL119-.Ltext0 + .8byte .LVL115-.Ltext0 + .8byte .LVL116-.Ltext0 .2byte 0x1 .byte 0x51 - .8byte .LVL119-.Ltext0 - .8byte .LVL120-.Ltext0 - .2byte 0x1 - .byte 0x67 - .8byte .LVL121-.Ltext0 - .8byte .LVL124-.Ltext0 + .8byte .LVL116-.Ltext0 + .8byte .LVL122-.Ltext0 .2byte 0x1 .byte 0x67 .8byte .LVL125-.Ltext0 .8byte .LVL126-.Ltext0 .2byte 0x1 - .byte 0x67 + .byte 0x51 .8byte .LVL126-.Ltext0 .8byte .LVL127-.Ltext0 .2byte 0x1 + .byte 0x67 + .8byte .LVL128-.Ltext0 + .8byte .LVL129-.Ltext0 + .2byte 0x1 .byte 0x51 - .8byte .LVL127-.Ltext0 - .8byte .LFE1565-.Ltext0 + .8byte .LVL129-.Ltext0 + .8byte .LVL131-.Ltext0 .2byte 0x1 .byte 0x67 + .8byte .LVL131-.Ltext0 + .8byte .LVL132-1-.Ltext0 + .2byte 0x1 + .byte 0x51 .8byte 0 .8byte 0 .LLST30: @@ -16420,29 +16462,60 @@ .2byte 0x1 .byte 0x52 .8byte .LVL106-.Ltext0 - .8byte .LVL116-.Ltext0 + .8byte .LVL114-.Ltext0 .2byte 0x1 .byte 0x65 + .8byte .LVL114-.Ltext0 .8byte .LVL116-.Ltext0 - .8byte .LVL118-.Ltext0 .2byte 0x1 .byte 0x52 - .8byte .LVL118-.Ltext0 - .8byte .LVL123-.Ltext0 + .8byte .LVL116-.Ltext0 + .8byte .LVL124-.Ltext0 .2byte 0x1 .byte 0x65 .8byte .LVL125-.Ltext0 - .8byte .LVL126-.Ltext0 + .8byte .LVL128-.Ltext0 .2byte 0x1 .byte 0x65 - .8byte .LVL126-.Ltext0 - .8byte .LVL127-.Ltext0 + .8byte .LVL128-.Ltext0 + .8byte .LVL129-.Ltext0 .2byte 0x1 .byte 0x52 - .8byte .LVL127-.Ltext0 - .8byte .LFE1565-.Ltext0 + .8byte .LVL129-.Ltext0 + .8byte .LVL131-.Ltext0 .2byte 0x1 .byte 0x65 + .8byte .LVL131-.Ltext0 + .8byte .LVL132-1-.Ltext0 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST31: + .8byte .LVL104-.Ltext0 + .8byte .LVL107-1-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte .LVL108-.Ltext0 + .8byte .LVL109-1-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte .LVL112-.Ltext0 + .8byte .LVL117-1-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte .LVL118-.Ltext0 + .8byte .LVL119-1-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte .LVL121-.Ltext0 + .8byte .LVL129-.Ltext0 + .2byte 0x1 + .byte 0x53 + .8byte .LVL131-.Ltext0 + .8byte .LVL132-1-.Ltext0 + .2byte 0x1 + .byte 0x53 .8byte 0 .8byte 0 .LLST8: diff --git a/kernel/drivers/gpu/drm/rockchip/inno_hdmi.c b/kernel/drivers/gpu/drm/rockchip/inno_hdmi.c index c9a51ae..87eebd7 100644 --- a/kernel/drivers/gpu/drm/rockchip/inno_hdmi.c +++ b/kernel/drivers/gpu/drm/rockchip/inno_hdmi.c @@ -55,11 +55,28 @@ struct completion cmp; }; +enum inno_hdmi_dev_type { + RK3036_HDMI, + RK3128_HDMI, +}; + +struct inno_hdmi_phy_config { + unsigned long mpixelclock; + u8 pre_emphasis; /* pre-emphasis value */ + u8 vlev_ctr; /* voltage level control */ +}; + +struct inno_hdmi_plat_data { + enum inno_hdmi_dev_type dev_type; + struct inno_hdmi_phy_config *phy_config; +}; + struct inno_hdmi { struct device *dev; struct drm_device *drm_dev; int irq; + struct clk *aclk; struct clk *pclk; void __iomem *regs; @@ -70,6 +87,7 @@ struct i2c_adapter *ddc; unsigned int tmds_rate; + const struct inno_hdmi_plat_data *plat_data; struct hdmi_data_info hdmi_data; struct drm_display_mode previous_mode; @@ -197,12 +215,20 @@ static void inno_hdmi_set_pwr_mode(struct inno_hdmi *hdmi, int mode) { + const struct inno_hdmi_phy_config *phy_config = + hdmi->plat_data->phy_config; + switch (mode) { case NORMAL: inno_hdmi_sys_power(hdmi, false); - - hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, 0x6f); - hdmi_writeb(hdmi, HDMI_PHY_DRIVER, 0xbb); + for (; phy_config->mpixelclock != ~0UL; phy_config++) + if (hdmi->tmds_rate <= phy_config->mpixelclock) + break; + if (!phy_config->mpixelclock) + return; + hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, + phy_config->pre_emphasis); + hdmi_writeb(hdmi, HDMI_PHY_DRIVER, phy_config->vlev_ctr); hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x15); hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x14); @@ -389,6 +415,12 @@ { int value; + if (hdmi->plat_data->dev_type == RK3036_HDMI) { + value = BIT(20) | BIT(21); + value |= mode->flags & DRM_MODE_FLAG_PHSYNC ? BIT(4) : 0; + value |= mode->flags & DRM_MODE_FLAG_PVSYNC ? BIT(5) : 0; + hdmi_writeb(hdmi, 0x148, value); + } /* Set detail external video timing polarity and interlace mode */ value = v_EXTERANL_VIDEO(1); value |= mode->flags & DRM_MODE_FLAG_PHSYNC ? @@ -823,6 +855,41 @@ return adap; } +static struct inno_hdmi_phy_config rk3036_hdmi_phy_config[] = { + /* pixelclk pre-emp vlev */ + { 74250000, 0x3f, 0xbb }, + { 165000000, 0x6f, 0xbb }, + { ~0UL, 0x00, 0x00 } +}; + +static struct inno_hdmi_phy_config rk3128_hdmi_phy_config[] = { + /* pixelclk pre-emp vlev */ + { 74250000, 0x3f, 0xaa }, + { 165000000, 0x5f, 0xaa }, + { ~0UL, 0x00, 0x00 } +}; + +static const struct inno_hdmi_plat_data rk3036_hdmi_drv_data = { + .dev_type = RK3036_HDMI, + .phy_config = rk3036_hdmi_phy_config, +}; + +static const struct inno_hdmi_plat_data rk3128_hdmi_drv_data = { + .dev_type = RK3128_HDMI, + .phy_config = rk3128_hdmi_phy_config, +}; + +static const struct of_device_id inno_hdmi_dt_ids[] = { + { .compatible = "rockchip,rk3036-inno-hdmi", + .data = &rk3036_hdmi_drv_data, + }, + { .compatible = "rockchip,rk3128-inno-hdmi", + .data = &rk3128_hdmi_drv_data, + }, + {}, +}; +MODULE_DEVICE_TABLE(of, inno_hdmi_dt_ids); + static int inno_hdmi_bind(struct device *dev, struct device *master, void *data) { @@ -839,11 +906,22 @@ hdmi->dev = dev; hdmi->drm_dev = drm; + hdmi->plat_data = device_get_match_data(hdmi->dev); iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); hdmi->regs = devm_ioremap_resource(dev, iores); if (IS_ERR(hdmi->regs)) return PTR_ERR(hdmi->regs); + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + hdmi->aclk = devm_clk_get(hdmi->dev, "aclk"); + if (IS_ERR(hdmi->aclk)) { + dev_err(hdmi->dev, "Unable to get HDMI aclk clk\n"); + return PTR_ERR(hdmi->aclk); + } hdmi->pclk = devm_clk_get(hdmi->dev, "pclk"); if (IS_ERR(hdmi->pclk)) { @@ -851,17 +929,17 @@ return PTR_ERR(hdmi->pclk); } - ret = clk_prepare_enable(hdmi->pclk); + ret = clk_prepare_enable(hdmi->aclk); if (ret) { DRM_DEV_ERROR(hdmi->dev, - "Cannot enable HDMI pclk clock: %d\n", ret); + "Cannot enable HDMI aclk clock: %d\n", ret); return ret; } - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - ret = irq; - goto err_disable_clk; + ret = clk_prepare_enable(hdmi->pclk); + if (ret) { + dev_err(hdmi->dev, "Cannot enable HDMI pclk clock: %d\n", ret); + goto err_disable_aclk; } inno_hdmi_reset(hdmi); @@ -870,7 +948,7 @@ if (IS_ERR(hdmi->ddc)) { ret = PTR_ERR(hdmi->ddc); hdmi->ddc = NULL; - goto err_disable_clk; + goto err_disable_pclk; } /* @@ -894,17 +972,23 @@ ret = devm_request_threaded_irq(dev, irq, inno_hdmi_hardirq, inno_hdmi_irq, IRQF_SHARED, dev_name(dev), hdmi); - if (ret < 0) + if (ret) { + dev_err(hdmi->dev, + "failed to request hdmi irq: %d\n", ret); goto err_cleanup_hdmi; + } return 0; + err_cleanup_hdmi: hdmi->connector.funcs->destroy(&hdmi->connector); hdmi->encoder.funcs->destroy(&hdmi->encoder); err_put_adapter: i2c_put_adapter(hdmi->ddc); -err_disable_clk: +err_disable_pclk: clk_disable_unprepare(hdmi->pclk); +err_disable_aclk: + clk_disable_unprepare(hdmi->aclk); return ret; } @@ -918,6 +1002,7 @@ i2c_put_adapter(hdmi->ddc); clk_disable_unprepare(hdmi->pclk); + clk_disable_unprepare(hdmi->aclk); } static const struct component_ops inno_hdmi_ops = { @@ -936,13 +1021,6 @@ return 0; } - -static const struct of_device_id inno_hdmi_dt_ids[] = { - { .compatible = "rockchip,rk3036-inno-hdmi", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, inno_hdmi_dt_ids); struct platform_driver inno_hdmi_driver = { .probe = inno_hdmi_probe, diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 294547b..0ae26f7 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -63,6 +63,7 @@ #else static bool is_support_iommu = true; #endif +static bool iommu_reserve_map; static struct drm_driver rockchip_drm_driver; struct rockchip_drm_mode_set { @@ -1320,6 +1321,7 @@ struct rockchip_drm_private *private = drm_dev->dev_private; struct iommu_domain_geometry *geometry; u64 start, end; + int ret = 0; if (!is_support_iommu) return 0; @@ -1340,7 +1342,23 @@ iommu_set_fault_handler(private->domain, rockchip_drm_fault_handler, drm_dev); - return 0; + if (iommu_reserve_map) { + /* + * At 32 bit platform size_t maximum value is 0xffffffff, SZ_4G(0x100000000) will be + * cliped to 0, so we split into two mapping + */ + ret = iommu_map(private->domain, 0, 0, (size_t)SZ_2G, + IOMMU_WRITE | IOMMU_READ | IOMMU_PRIV); + if (ret) + dev_err(drm_dev->dev, "failed to create 0-2G pre mapping\n"); + + ret = iommu_map(private->domain, SZ_2G, SZ_2G, (size_t)SZ_2G, + IOMMU_WRITE | IOMMU_READ | IOMMU_PRIV); + if (ret) + dev_err(drm_dev->dev, "failed to create 2G-4G pre mapping\n"); + } + + return ret; } static void rockchip_iommu_cleanup(struct drm_device *drm_dev) @@ -1350,6 +1368,10 @@ if (!is_support_iommu) return; + if (iommu_reserve_map) { + iommu_unmap(private->domain, 0, (size_t)SZ_2G); + iommu_unmap(private->domain, SZ_2G, (size_t)SZ_2G); + } drm_mm_takedown(&private->mm); iommu_domain_free(private->domain); } @@ -1765,16 +1787,14 @@ if (ret) goto err_kms_helper_poll_fini; - drm_for_each_crtc(crtc, drm_dev) { - struct drm_fb_helper *helper = private->fbdev_helper; - struct rockchip_crtc_state *s = NULL; + if (private->fbdev_helper && private->fbdev_helper->fb) { + drm_for_each_crtc(crtc, drm_dev) { + struct rockchip_crtc_state *s = NULL; - if (!helper) - break; - - s = to_rockchip_crtc_state(crtc->state); - if (is_support_hotplug(s->output_type)) - drm_framebuffer_get(helper->fb); + s = to_rockchip_crtc_state(crtc->state); + if (is_support_hotplug(s->output_type)) + drm_framebuffer_get(private->fbdev_helper->fb); + } } drm_dev->mode_config.allow_fb_modifiers = true; @@ -2303,6 +2323,7 @@ } found = true; + iommu_reserve_map |= of_property_read_bool(iommu, "rockchip,reserve-map"); of_node_put(iommu); of_node_put(port); diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h index 4958885..cda2e5e 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h @@ -115,6 +115,37 @@ int cos_hue; }; +#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 post_acm { + 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 post_csc { + 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 VOP_OUTPUT_IF_RGB BIT(0) #define VOP_OUTPUT_IF_BT1120 BIT(1) #define VOP_OUTPUT_IF_BT656 BIT(2) @@ -128,6 +159,7 @@ #define VOP_OUTPUT_IF_DP1 BIT(10) #define VOP_OUTPUT_IF_HDMI0 BIT(11) #define VOP_OUTPUT_IF_HDMI1 BIT(12) +#define VOP_OUTPUT_IF_TV BIT(13) struct rockchip_crtc_state { struct drm_crtc_state base; @@ -181,6 +213,9 @@ u32 line_flag; u8 mode_update; struct rockchip_hdr_state hdr; + struct drm_property_blob *hdr_ext_data; + struct drm_property_blob *acm_lut_data; + struct drm_property_blob *post_csc_data; }; #define to_rockchip_crtc_state(s) \ container_of(s, struct rockchip_crtc_state, base) diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index c653900..5563d5e 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c @@ -114,8 +114,6 @@ { struct rockchip_drm_fb *rockchip_fb; struct rockchip_gem_object *rk_obj; - struct rockchip_drm_private *private = dev->dev_private; - struct drm_fb_helper *fb_helper = private->fbdev_helper; int ret = 0; int i; @@ -141,9 +139,6 @@ rk_obj = to_rockchip_obj(obj[i]); rockchip_fb->dma_addr[i] = rk_obj->dma_addr; rockchip_fb->kvaddr[i] = rk_obj->kvaddr; - private->fbdev_bo = &rk_obj->base; - if (fb_helper && fb_helper->fbdev && rk_obj->kvaddr) - fb_helper->fbdev->screen_base = rk_obj->kvaddr; } #ifndef MODULE } else if (logo) { @@ -366,6 +361,24 @@ } } +static void drm_atomic_helper_connector_commit(struct drm_device *dev, + struct drm_atomic_state *old_state) +{ + struct drm_connector *connector; + struct drm_connector_state *new_conn_state; + int i; + + for_each_new_connector_in_state(old_state, connector, new_conn_state, i) { + const struct drm_connector_helper_funcs *funcs; + + funcs = connector->helper_private; + if (!funcs->atomic_commit) + continue; + + funcs->atomic_commit(connector, new_conn_state); + } +} + static void rockchip_atomic_helper_commit_tail_rpm(struct drm_atomic_state *old_state) { @@ -381,6 +394,8 @@ DRM_PLANE_COMMIT_ACTIVE_ONLY); rockchip_drm_psr_inhibit_put_state(old_state); + + drm_atomic_helper_connector_commit(dev, old_state); drm_atomic_helper_commit_hw_done(old_state); @@ -445,6 +460,8 @@ rockchip_drm_psr_inhibit_put_state(state); + drm_atomic_helper_connector_commit(dev, state); + drm_atomic_helper_commit_hw_done(state); rockchip_drm_atomic_helper_wait_for_vblanks(dev, state); diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c index 67a21fd1..e824264 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c @@ -56,8 +56,6 @@ .fb_fillrect = drm_fb_helper_cfb_fillrect, .fb_copyarea = drm_fb_helper_cfb_copyarea, .fb_imageblit = drm_fb_helper_cfb_imageblit, - .fb_read = drm_fb_helper_sys_read, - .fb_write = drm_fb_helper_sys_write, .fb_mmap = rockchip_fbdev_mmap, .fb_dmabuf_export = rockchip_fbdev_get_dma_buf, }; diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index 946d8e3..ce31e32 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -38,7 +38,7 @@ { struct drm_device *drm = rk_obj->base.dev; struct rockchip_drm_private *private = drm->dev_private; - int prot = IOMMU_READ | IOMMU_WRITE | IOMMU_TLB_SHOT_ENTIRE; + int prot = IOMMU_READ | IOMMU_WRITE; ssize_t ret; mutex_lock(&private->mm_lock); @@ -62,6 +62,11 @@ ret = -ENOMEM; goto err_remove_node; } + +#ifdef CONFIG_IOMMU_API + if (private->domain->ops->flush_iotlb_all) + private->domain->ops->flush_iotlb_all(private->domain); +#endif rk_obj->size = ret; @@ -459,6 +464,11 @@ rk_obj->base.size); } +static inline bool is_vop_enabled(void) +{ + return (IS_ENABLED(CONFIG_ROCKCHIP_VOP) || IS_ENABLED(CONFIG_ROCKCHIP_VOP2)); +} + static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, bool alloc_kmap) { @@ -467,7 +477,7 @@ struct rockchip_drm_private *private = drm->dev_private; int ret = 0; - if (!private->domain) + if (!private->domain && is_vop_enabled()) rk_obj->flags |= ROCKCHIP_BO_CONTIG; if (rk_obj->flags & ROCKCHIP_BO_SECURE) { @@ -507,7 +517,7 @@ ret = rockchip_gem_iommu_map(rk_obj); if (ret < 0) goto err_free; - } else { + } else if (is_vop_enabled()) { WARN_ON(!rk_obj->dma_handle); rk_obj->dma_addr = rk_obj->dma_handle; } @@ -819,7 +829,7 @@ struct drm_mode_create_dumb *args) { struct rockchip_gem_object *rk_obj; - int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8); + u32 min_pitch = args->width * DIV_ROUND_UP(args->bpp, 8); /* * align to 64 bytes since Mali requires it. diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c index 0a223dd..990b9cf 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c @@ -38,6 +38,76 @@ .vrefresh = 60, 0, }, }; +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_relaxed(v, tve->regbase + (offset)) #define tve_readl(offset) readl_relaxed(tve->regbase + (offset)) @@ -54,6 +124,14 @@ int input_format; int soc_type; }; + +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 int rockchip_tve_get_modes(struct drm_connector *connector) @@ -107,61 +185,106 @@ static void tve_set_mode(struct rockchip_tve *tve) { + struct env_config *bt656_cfg, *tve_cfg; int mode = tve->tv_format; - dev_dbg(tve->dev, "tve set mode:%d\n", mode); - 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)); + 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 { + dev_dbg(tve->dev, "tve set mode:%d\n", mode); + 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); + 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) { dev_dbg(tve->dev, "NTSC MODE\n"); - 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)); + 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) { dev_dbg(tve->dev, "PAL MODE\n"); - 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); + if (tve->soc_type == SOC_RK3528) { + bt656_cfg = pal_bt656_config; + tve_cfg = pal_tve_config; - 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_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_ADJ_TIMING, tve->adjtiming); - tve_writel(TV_ACT_TIMING, 0x0694011D | - (1 << 12) | (2 << 28)); + 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_dac_grf_writel(RK3528_VO_GRF_CVBS_CON, (mask << 16) | val); } } @@ -178,36 +301,57 @@ u32 mask = 0; u32 val = 0; u32 grfreg = 0; + u32 offset = 0; if (enable) { dev_dbg(tve->dev, "dac enable\n"); - mask = m_VBG_EN | m_DAC_EN | m_DAC_GAIN; 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); + offset = VDAC_VDAC1; + } else if (tve->soc_type == SOC_RK3528) { + /* + * Reset the vdac + */ + tve_dac_writel(VDAC_CLK_RST, v_ANALOG_RST(0) | v_DIGITAL_RST(0)); + msleep(20); + tve_dac_writel(VDAC_CLK_RST, v_ANALOG_RST(1) | v_DIGITAL_RST(1)); + + tve_dac_writel(VDAC_CURRENT_CTRL, v_OUT_CURRENT(tve->vdac_out_current)); + + val = v_REF_VOLTAGE(7) | v_DAC_PWN(1) | v_BIAS_PWN(1); + offset = VDAC_PWM_REF_CTRL; } } else { dev_dbg(tve->dev, "dac disable\n"); - mask = m_VBG_EN | m_DAC_EN; - if (tve->soc_type == SOC_RK312X) + 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) + } 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) + } 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_dac_grf_writel(grfreg, (mask << 16) | val); else if (tve->vdacbase) - tve_dac_writel(VDAC_VDAC1, val); + tve_dac_writel(offset, val); } static int cvbs_set_disable(struct rockchip_tve *tve) @@ -229,6 +373,18 @@ return 0; } +/* + * RK3528 supports bt656 to cvbs, and the others support rgb to cvbs. + * + * ┌──────────┐ + * │ rgb data ├─────────────────────────────────────┐ + * └──────────┘ │ + * ▼ + * ┌────────────┐ ┌───────────────┐ ┌───────────────────┐ ┌──────┐ ┌────────┐ + * │ bt656 data ├───►│ bt656 decoder ├───►│ cvbs(tve) encoder ├───►│ vdac ├───►│ screen │ + * └────────────┘ └───────────────┘ └───────────────────┘ └──────┘ └────────┘ + * + */ static int cvbs_set_enable(struct rockchip_tve *tve) { int ret = 0; @@ -242,8 +398,9 @@ dev_err(tve->dev, "failed to get pm runtime: %d\n", ret); return ret; } - dac_enable(tve, true); tve_set_mode(tve); + msleep(1000); + dac_enable(tve, true); tve->enable = 1; return 0; @@ -264,6 +421,8 @@ static void rockchip_tve_encoder_disable(struct drm_encoder *encoder) { struct rockchip_tve *tve = encoder_to_tve(encoder); + struct drm_crtc *crtc = encoder->crtc; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); mutex_lock(&tve->suspend_lock); @@ -271,6 +430,8 @@ cvbs_set_disable(tve); mutex_unlock(&tve->suspend_lock); + + s->output_if &= ~VOP_OUTPUT_IF_TV; } static void rockchip_tve_encoder_mode_set(struct drm_encoder *encoder, @@ -309,6 +470,7 @@ struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); + struct rockchip_tve *tve = encoder_to_tve(encoder); struct drm_connector *connector = conn_state->connector; struct drm_display_info *info = &connector->display_info; @@ -319,6 +481,14 @@ else s->bus_format = MEDIA_BUS_FMT_YUV8_1X24; + /* + * For RK3528: + * VOP -> BT656 output -> BT656 decoder -> TVE encoder -> CVBS output + */ + if (tve->soc_type == SOC_RK3528) + s->output_if |= VOP_OUTPUT_IF_BT656; + else + s->output_if |= VOP_OUTPUT_IF_TV; s->color_space = V4L2_COLORSPACE_SMPTE170M; s->tv_state = &conn_state->tv; @@ -354,8 +524,118 @@ .atomic_check = rockchip_tve_encoder_atomic_check, }; -static int tve_parse_dt(struct device_node *np, - struct rockchip_tve *tve) +static int tve_read_otp_by_name(struct rockchip_tve *tve, char *name, u8 *val, u8 default_val) +{ + struct nvmem_cell *cell; + size_t len; + unsigned char *efuse_buf; + int ret = -EINVAL; + + *val = default_val; + cell = nvmem_cell_get(tve->dev, name); + if (!IS_ERR(cell)) { + efuse_buf = nvmem_cell_read(cell, &len); + nvmem_cell_put(cell); + if (!IS_ERR(efuse_buf)) { + *val = efuse_buf[0]; + kfree(efuse_buf); + return 0; + } + } + + dev_err(tve->dev, "failed to read %s from otp, use default\n", name); + + return ret; +} + +static int tve_parse_dt(struct device_node *np, struct rockchip_tve *tve) +{ + int ret, val; + u8 out_current, version; + + ret = of_property_read_u32(np, "rockchip,tvemode", &val); + if (ret < 0) { + tve->preferred_mode = 0; + } else if (val > 1) { + dev_err(tve->dev, "tve mode value invalid\n"); + return -EINVAL; + } + tve->preferred_mode = val; + + ret = of_property_read_u32(np, "rockchip,lumafilter0", &val); + if (val == 0 || ret < 0) + return -EINVAL; + tve->lumafilter0 = val; + + ret = of_property_read_u32(np, "rockchip,lumafilter1", &val); + if (val == 0 || ret < 0) + return -EINVAL; + tve->lumafilter1 = val; + + ret = of_property_read_u32(np, "rockchip,lumafilter2", &val); + if (val == 0 || ret < 0) + return -EINVAL; + tve->lumafilter2 = val; + + ret = of_property_read_u32(np, "rockchip,lumafilter3", &val); + if (val == 0 || ret < 0) + return -EINVAL; + tve->lumafilter3 = val; + + ret = of_property_read_u32(np, "rockchip,lumafilter4", &val); + if (val == 0 || ret < 0) + return -EINVAL; + tve->lumafilter4 = val; + + ret = of_property_read_u32(np, "rockchip,lumafilter5", &val); + if (val == 0 || ret < 0) + return -EINVAL; + tve->lumafilter5 = val; + + ret = of_property_read_u32(np, "rockchip,lumafilter6", &val); + if (val == 0 || ret < 0) + return -EINVAL; + tve->lumafilter6 = val; + + ret = of_property_read_u32(np, "rockchip,lumafilter7", &val); + if (val == 0 || ret < 0) + return -EINVAL; + tve->lumafilter7 = val; + + ret = of_property_read_u32(np, "rockchip,tve-upsample", &val); + if (val > DCLK_UPSAMPLEx4 || ret < 0) + return -EINVAL; + tve->upsample_mode = val; + + /* + * Read vdac output current from OTP if exists, and the default + * current val is 0xd2. + */ + ret = tve_read_otp_by_name(tve, "out-current", &out_current, 0xd2); + if (!ret) { + if (out_current) { + /* + * If test version is 0x0, the value of vdac out current + * needs to be reduced by one. + */ + ret = tve_read_otp_by_name(tve, "version", &version, 0x0); + if (!ret) { + if (version == 0x0) + out_current -= 1; + } + } else { + /* + * If the current value read from OTP is 0, set it to default. + */ + out_current = 0xd2; + } + } + tve->vdac_out_current = out_current; + + return 0; +} + +static int tve_parse_dt_legacy(struct device_node *np, struct rockchip_tve *tve) { int ret, val; u32 getdac = 0; @@ -441,9 +721,52 @@ return 0; } +static bool tve_check_lumafilter(struct rockchip_tve *tve) +{ + int lumafilter[8] = {INT_MAX}; + + /* + * The default lumafilter value is 0. If lumafilter value + * is equal to the dts value, uboot logo is enabled. + */ + if (tve->soc_type == SOC_RK3528) { + lumafilter[0] = tve_readl(TVE_LUMA_FILTER1); + lumafilter[1] = tve_readl(TVE_LUMA_FILTER2); + lumafilter[2] = tve_readl(TVE_LUMA_FILTER3); + lumafilter[3] = tve_readl(TVE_LUMA_FILTER4); + lumafilter[4] = tve_readl(TVE_LUMA_FILTER5); + lumafilter[5] = tve_readl(TVE_LUMA_FILTER6); + lumafilter[6] = tve_readl(TVE_LUMA_FILTER7); + lumafilter[7] = tve_readl(TVE_LUMA_FILTER8); + + if (lumafilter[0] == tve->lumafilter0 && + lumafilter[1] == tve->lumafilter1 && + lumafilter[2] == tve->lumafilter2 && + lumafilter[3] == tve->lumafilter3 && + lumafilter[4] == tve->lumafilter4 && + lumafilter[5] == tve->lumafilter5 && + lumafilter[6] == tve->lumafilter6 && + lumafilter[7] == tve->lumafilter7) { + return true; + } + } else { + lumafilter[0] = tve_readl(TV_LUMA_FILTER0); + lumafilter[1] = tve_readl(TV_LUMA_FILTER1); + lumafilter[2] = tve_readl(TV_LUMA_FILTER2); + + if (lumafilter[0] == tve->lumafilter0 && + lumafilter[1] == tve->lumafilter1 && + lumafilter[2] == tve->lumafilter2) { + return true; + } + } + + return false; +} + static void check_uboot_logo(struct rockchip_tve *tve) { - int lumafilter0, lumafilter1, lumafilter2, vdac; + int vdac; if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) { vdac = tve_dac_readl(VDAC_VDAC1); @@ -454,17 +777,7 @@ } } - lumafilter0 = tve_readl(TV_LUMA_FILTER0); - lumafilter1 = tve_readl(TV_LUMA_FILTER1); - lumafilter2 = tve_readl(TV_LUMA_FILTER2); - - /* - * The default lumafilter value is 0. If lumafilter value - * is equal to the dts value, uboot logo is enabled. - */ - if (lumafilter0 == tve->lumafilter0 && - lumafilter1 == tve->lumafilter1 && - lumafilter2 == tve->lumafilter2) { + if (tve_check_lumafilter(tve)) { tve->connector.dpms = DRM_MODE_DPMS_ON; return; } @@ -495,11 +808,17 @@ .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 of_device_id rockchip_tve_dt_ids[] = { { .compatible = "rockchip,rk3036-tve", .data = &rk3036_tve }, { .compatible = "rockchip,rk312x-tve", .data = &rk312x_tve }, { .compatible = "rockchip,rk322x-tve", .data = &rk322x_tve }, { .compatible = "rockchip,rk3328-tve", .data = &rk3328_tve }, + { .compatible = "rockchip,rk3528-tve", .data = &rk3528_tve }, {} }; @@ -536,14 +855,16 @@ tve->input_format = tve_data->input_format; } - ret = tve_parse_dt(np, tve); + if (tve->soc_type == SOC_RK3528) + ret = tve_parse_dt(np, tve); + else + ret = tve_parse_dt_legacy(np, tve); if (ret) { dev_err(tve->dev, "TVE parse dts error!"); return -EINVAL; } tve->enable = 0; - platform_set_drvdata(pdev, tve); tve->drm_dev = drm_dev; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); tve->reg_phy_base = res->start; @@ -555,7 +876,8 @@ return PTR_ERR(tve->regbase); } - if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) { + if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328 || + tve->soc_type == SOC_RK3528) { res = platform_get_resource(pdev, IORESOURCE_MEM, 1); tve->len = resource_size(res); tve->vdacbase = devm_ioremap(tve->dev, res->start, tve->len); @@ -576,6 +898,56 @@ if (ret) { dev_err(tve->dev, "Cannot enable tve aclk: %d\n", ret); return ret; + } + } else if (tve->soc_type == SOC_RK3528) { + tve->hclk = devm_clk_get(tve->dev, "hclk"); + if (IS_ERR(tve->hclk)) { + dev_err(tve->dev, "Unable to get tve hclk\n"); + return PTR_ERR(tve->hclk); + } + + ret = clk_prepare_enable(tve->hclk); + if (ret) { + dev_err(tve->dev, "Cannot enable tve hclk: %d\n", ret); + return ret; + } + + tve->pclk_vdac = devm_clk_get(tve->dev, "pclk_vdac"); + if (IS_ERR(tve->pclk_vdac)) { + dev_err(tve->dev, "Unable to get vdac pclk\n"); + return PTR_ERR(tve->pclk_vdac); + } + + ret = clk_prepare_enable(tve->pclk_vdac); + if (ret) { + dev_err(tve->dev, "Cannot enable vdac pclk: %d\n", ret); + return ret; + } + + tve->dclk = devm_clk_get(tve->dev, "dclk"); + if (IS_ERR(tve->dclk)) { + dev_err(tve->dev, "Unable to get tve dclk\n"); + return PTR_ERR(tve->dclk); + } + + ret = clk_prepare_enable(tve->dclk); + if (ret) { + dev_err(tve->dev, "Cannot enable tve dclk: %d\n", ret); + return ret; + } + + if (tve->upsample_mode == DCLK_UPSAMPLEx4) { + tve->dclk_4x = devm_clk_get(tve->dev, "dclk_4x"); + if (IS_ERR(tve->dclk_4x)) { + dev_err(tve->dev, "Unable to get tve dclk_4x\n"); + return PTR_ERR(tve->dclk_4x); + } + + ret = clk_prepare_enable(tve->dclk_4x); + if (ret) { + dev_err(tve->dev, "Cannot enable tve dclk_4x: %d\n", ret); + return ret; + } } } @@ -621,6 +993,7 @@ rockchip_drm_register_sub_dev(&tve->sub_dev); pm_runtime_enable(dev); + dev_set_drvdata(dev, tve); dev_dbg(tve->dev, "%s tv encoder probe ok\n", match->compatible); return 0; @@ -648,6 +1021,7 @@ drm_encoder_cleanup(&tve->encoder); pm_runtime_disable(dev); + dev_set_drvdata(dev, NULL); } static const struct component_ops rockchip_tve_component_ops = { @@ -666,6 +1040,9 @@ { struct rockchip_tve *tve = dev_get_drvdata(&pdev->dev); + if (!tve) + return; + mutex_lock(&tve->suspend_lock); dev_dbg(tve->dev, "tve shutdown\n"); diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h index e7d3acc..376b2ff 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h @@ -17,6 +17,13 @@ #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) @@ -87,40 +94,123 @@ #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 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_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_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_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) - #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_CVBS_CON 0x60010 + #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_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 BT656 +#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) + +// RK3528 CVBS TVE +#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, @@ -136,7 +226,14 @@ SOC_RK3036 = 0, SOC_RK312X, SOC_RK322X, - SOC_RK3328 + SOC_RK3328, + SOC_RK3528 +}; + +enum { + DCLK_UPSAMPLEx1 = 0, + DCLK_UPSAMPLEx2, + DCLK_UPSAMPLEx4 }; #define grf_writel(offset, v) do { \ @@ -154,12 +251,16 @@ void __iomem *regbase; void __iomem *vdacbase; struct clk *aclk; - struct clk *dac_clk; + struct clk *hclk; + struct clk *pclk_vdac; + struct clk *dclk; + struct clk *dclk_4x; struct regmap *dac_grf; u32 reg_phy_base; u32 len; int input_format; int soc_type; + int upsample_mode; bool enable; u32 test_mode; u32 saturation; @@ -168,9 +269,15 @@ u32 lumafilter0; u32 lumafilter1; u32 lumafilter2; + u32 lumafilter3; + u32 lumafilter4; + u32 lumafilter5; + u32 lumafilter6; + u32 lumafilter7; u32 daclevel; u32 dac1level; u32 preferred_mode; + u8 vdac_out_current; struct mutex suspend_lock; /* mutex for tve resume operation*/ struct rockchip_drm_sub_dev sub_dev; }; diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 5eb9265..7bb333f 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1670,6 +1670,12 @@ vop = to_vop(crtc); vop_data = vop->data; + if (VOP_MAJOR(vop->version) == 2 && is_alpha_support(fb->format->format) && + vop_plane_state->global_alpha != 0xff) { + DRM_ERROR("Pixel alpha and global alpha can't be enabled at the same time\n"); + return -EINVAL; + } + if (state->src_w >> 16 < 4 || state->src_h >> 16 < 4 || state->crtc_w < 4 || state->crtc_h < 4) { DRM_ERROR("Invalid size: %dx%d->%dx%d, min size is 4x4\n", diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index ae92b87..a0677dd 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -24,6 +24,7 @@ #define VOP_MAJOR(version) ((version) >> 8) #define VOP_MINOR(version) ((version) & 0xff) +#define VOP_VERSION_RK3528 VOP_VERSION(0x50, 0x17) #define VOP_VERSION_RK3568 VOP_VERSION(0x40, 0x15) #define VOP_VERSION_RK3588 VOP_VERSION(0x40, 0x17) @@ -42,6 +43,9 @@ /* 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) @@ -92,10 +96,10 @@ }; enum vop3_esmart_lb_mode { - VOP3_ESMART_ONE_8K_MODE, - VOP3_ESMART_TWO_4K_MODE, - VOP3_ESMART_ONE_4K_AND_TWO_2K_MODE, - VOP3_ESMART_FOUR_2K_MODE, + VOP3_ESMART_8K_MODE, + VOP3_ESMART_4K_4K_MODE, + VOP3_ESMART_4K_2K_2K_MODE, + VOP3_ESMART_2K_2K_2K_2K_MODE, }; #define DSP_BG_SWAP 0x1 @@ -439,6 +443,104 @@ const uint32_t *sdr2hdr_st2084oetf_xn; }; +#define RK_HDRVIVID_TONE_SCA_TAB_LENGTH 257 +#define RK_HDRVIVID_GAMMA_CURVE_LENGTH 81 +#define RK_HDRVIVID_GAMMA_MDFVALUE_LENGTH 9 +#define RK_SDR2HDR_INVGAMMA_CURVE_LENGTH 69 +#define RK_SDR2HDR_INVGAMMA_S_IDX_LENGTH 6 +#define RK_SDR2HDR_INVGAMMA_C_IDX_LENGTH 6 +#define RK_SDR2HDR_SMGAIN_LENGTH 64 +#define RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH 264 + +struct hdrvivid_regs { + uint32_t sdr2hdr_ctrl; + uint32_t sdr2hdr_coe0; + uint32_t sdr2hdr_coe1; + uint32_t sdr2hdr_csc_coe00_01; + uint32_t sdr2hdr_csc_coe02_10; + uint32_t sdr2hdr_csc_coe11_12; + uint32_t sdr2hdr_csc_coe20_21; + uint32_t sdr2hdr_csc_coe22; + uint32_t hdrvivid_ctrl; + uint32_t hdr_pq_gamma; + uint32_t hlg_rfix_scalefac; + uint32_t hlg_maxluma; + uint32_t hlg_r_tm_lin2non; + uint32_t hdr_csc_coe00_01; + uint32_t hdr_csc_coe02_10; + uint32_t hdr_csc_coe11_12; + uint32_t hdr_csc_coe20_21; + uint32_t hdr_csc_coe22; + uint32_t hdr_tone_sca[RK_HDRVIVID_TONE_SCA_TAB_LENGTH]; + uint32_t hdrgamma_curve[RK_HDRVIVID_GAMMA_CURVE_LENGTH]; + uint32_t hdrgamma_mdfvalue[RK_HDRVIVID_GAMMA_MDFVALUE_LENGTH]; + uint32_t sdrinvgamma_curve[RK_SDR2HDR_INVGAMMA_CURVE_LENGTH]; + uint32_t sdrinvgamma_startidx[RK_SDR2HDR_INVGAMMA_S_IDX_LENGTH]; + uint32_t sdrinvgamma_changeidx[RK_SDR2HDR_INVGAMMA_C_IDX_LENGTH]; + uint32_t sdr_smgain[RK_SDR2HDR_SMGAIN_LENGTH]; + uint32_t hdr_mode; + uint32_t tone_sca_axi_tab[RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH]; +}; + +struct hdr_extend { + uint32_t hdr_type; + uint32_t length; + union { + struct hdrvivid_regs hdrvivid_data; + }; +}; + +enum _vop_hdrvivid_mode { + PQHDR2HDR_WITH_DYNAMIC = 0, + PQHDR2SDR_WITH_DYNAMIC, + HLG2PQHDR_WITH_DYNAMIC, + HLG2SDR_WITH_DYNAMIC, + HLG2PQHDR_WITHOUT_DYNAMIC, + HLG2SDR_WITHOUT_DYNAMIC, + HDR_BYPASS, + HDR102SDR, + SDR2HDR10, + SDR2HLG, + SDR2HDR10_USERSPACE = 100, + SDR2HLG_USERSPACE = 101, +}; + +enum vop_hdr_format { + HDR_NONE = 0, + HDR_HDR10 = 1, + HDR_HLGSTATIC = 2, + RESERVED3 = 3, /* reserved for more future static hdr format */ + RESERVED4 = 4, /* reserved for more future static hdr format */ + HDR_HDRVIVID = 5, + RESERVED6 = 6, /* reserved for hdr vivid */ + RESERVED7 = 7, /* reserved for hdr vivid */ + HDR_HDR10PLUS = 8, + RESERVED9 = 9, /* reserved for hdr hdr10+ */ + RESERVED10 = 10, /* reserved for hdr hdr10+ */ + HDR_NEXT = 11, + RESERVED12 = 12, /* reserved for other dynamic hdr format */ + RESERVED13 = 13, /* reserved for other dynamic hdr format */ + HDR_FORMAT_MAX, +}; + +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; +}; + enum { VOP_CSC_Y2R_BT601, VOP_CSC_Y2R_BT709, @@ -509,6 +611,8 @@ struct vop_reg enable; struct vop_reg afbc_enable; struct vop_reg lb_mode; + struct vop_reg scl_lb_mode; + struct vop_reg frm_reset_en; struct vop_reg src_color_ctrl; struct vop_reg dst_color_ctrl; @@ -626,6 +730,13 @@ struct vop_reg hdr_lut_update_en; struct vop_reg hdr_lut_mode; struct vop_reg hdr_lut_mst; + struct vop_reg hdr_lut_fetch_done; + struct vop_reg hdr_vivid_en; + struct vop_reg hdr_vivid_bypass_en; + struct vop_reg hdr_vivid_path_mode; + struct vop_reg hdr_vivid_dstgamut; + struct vop_reg sdr2hdr_en; + struct vop_reg sdr2hdr_dstmode; struct vop_reg sdr2hdr_eotf_en; struct vop_reg sdr2hdr_r2r_en; struct vop_reg sdr2hdr_r2r_mode; @@ -677,6 +788,25 @@ struct vop_reg edpi_wms_fs; struct vop_reg gamma_update_en; struct vop_reg lut_dma_rid; + + /* CSC */ + struct vop_reg acm_bypass_en; + struct vop_reg csc_en; + struct vop_reg acm_r2y_en; + struct vop_reg csc_mode; + struct vop_reg acm_r2y_mode; + struct vop_reg csc_coe00; + struct vop_reg csc_coe01; + struct vop_reg csc_coe02; + struct vop_reg csc_coe10; + struct vop_reg csc_coe11; + struct vop_reg csc_coe12; + struct vop_reg csc_coe20; + struct vop_reg csc_coe21; + struct vop_reg csc_coe22; + struct vop_reg csc_offset0; + struct vop_reg csc_offset1; + struct vop_reg csc_offset2; }; struct vop2_wb_regs { @@ -711,7 +841,6 @@ uint8_t axi_id; uint8_t axi_yrgb_id; uint8_t axi_uv_id; - uint8_t scale_engine_num; uint8_t possible_crtcs; uint32_t base; @@ -775,6 +904,11 @@ uint16_t cubic_lut_len; struct vop_rect max_output; const u8 pre_scan_max_dly[4]; + const u8 hdrvivid_dly[10]; + const u8 sdr2hdr_dly; + const u8 layer_mix_dly; + const u8 hdr_mix_dly; + const u8 win_dly; const struct vop_intr *intr; const struct vop_hdr_table *hdr_table; const struct vop2_video_port_regs *regs; @@ -849,6 +983,7 @@ struct vop_reg version; struct vop_reg standby; struct vop_reg dma_stop; + struct vop_reg dsp_vs_t_sel; struct vop_reg lut_dma_en; struct vop_reg axi_outstanding_max_num; struct vop_reg axi_max_outstanding_en; diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 35128d4..7757b07 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -35,6 +35,8 @@ #include <linux/swab.h> #include <linux/sort.h> #include <linux/rockchip/cpu.h> +#include <linux/workqueue.h> +#include <linux/types.h> #include <soc/rockchip/rockchip_dmc.h> #include <soc/rockchip/rockchip-system-status.h> #include <uapi/linux/videodev2.h> @@ -47,6 +49,7 @@ #include "rockchip_drm_psr.h" #include "rockchip_drm_vop.h" #include "rockchip_vop_reg.h" +#include "rockchip_post_csc.h" #define _REG_SET(vop2, name, off, reg, mask, v, relaxed) \ vop2_mask_write(vop2, off + reg.offset, mask, reg.shift, v, reg.write_mask, relaxed) @@ -78,6 +81,8 @@ #define VOP_CTRL_SET(x, name, v) \ REG_SET(x, name, 0, (x)->data->ctrl->name, v, false) + +#define VOP_CTRL_GET(x, name) vop2_read_reg(x, 0, &(x)->data->ctrl->name) #define VOP_INTR_GET(vop2, name) \ vop2_read_reg(vop2, 0, &vop2->data->ctrl->name) @@ -477,6 +482,8 @@ uint8_t id; bool layer_sel_update; bool xmirror_en; + bool need_reset_p2i_flag; + atomic_t post_buf_empty_flag; const struct vop2_video_port_regs *regs; struct completion dsp_hold_completion; @@ -555,6 +562,11 @@ bool gamma_lut_active; /** + * @lut_dma_rid: lut dma id + */ + u16 lut_dma_rid; + + /** * @gamma_lut: atomic gamma look up table */ struct drm_color_lut *gamma_lut; @@ -568,6 +580,11 @@ * @cubic_lut_gem_obj: gem obj to store cubic lut */ struct rockchip_gem_object *cubic_lut_gem_obj; + + /** + * @hdr_lut_gem_obj: gem obj to store hdr lut + */ + struct rockchip_gem_object *hdr_lut_gem_obj; /** * @cubic_lut: cubic look up table @@ -591,10 +608,29 @@ struct drm_property *plane_mask_prop; /** + * @hdr_ext_data_prop: hdr extend data interaction with userspace + */ + struct drm_property *hdr_ext_data_prop; + + int hdrvivid_mode; + + /** + * @acm_lut_data_prop: acm lut data interaction with userspace + */ + struct drm_property *acm_lut_data_prop; + /** + * @post_csc_data_prop: post csc data interaction with userspace + */ + struct drm_property *post_csc_data_prop; + + /** * @primary_plane_phy_id: vp primary plane phy id, the primary plane * will be used to show uboot logo and kernel logo */ enum vop2_layer_phy_id primary_plane_phy_id; + + struct post_acm acm_info; + struct post_csc csc_info; }; struct vop2 { @@ -652,6 +688,7 @@ */ uint32_t registered_num_wins; uint8_t used_mixers; + uint8_t esmart_lb_mode; /** * @active_vp_mask: Bitmask of active video ports; */ @@ -684,6 +721,8 @@ unsigned int enable_count; struct clk *hclk; struct clk *aclk; + struct work_struct post_buf_empty_work; + struct workqueue_struct *workqueue; struct vop2_layer layers[ROCKCHIP_MAX_LAYER]; /* must put at the end of the struct */ @@ -717,6 +756,7 @@ { MEDIA_BUS_FMT_UYVY8_2X8, "UYVY8_2X8" }, { MEDIA_BUS_FMT_YUYV8_1X16, "YUYV8_1X16" }, { MEDIA_BUS_FMT_UYVY8_1X16, "UYVY8_1X16" }, + { MEDIA_BUS_FMT_RGB101010_1X30, "RGB101010_1x30" }, }; static DRM_ENUM_NAME_FN(drm_get_bus_format_name, drm_bus_format_enum_list) @@ -991,8 +1031,23 @@ static uint32_t vop2_read_vcnt(struct vop2_video_port *vp) { uint32_t offset = RK3568_SYS_STATUS0 + (vp->id << 2); + uint32_t vcnt0, vcnt1; + int i = 0; - return vop2_readl(vp->vop2, offset) >> 16; + for (i = 0; i < 10; i++) { + vcnt0 = vop2_readl(vp->vop2, offset) >> 16; + vcnt1 = vop2_readl(vp->vop2, offset) >> 16; + + if ((vcnt1 - vcnt0) <= 1) + break; + } + + if (i == 10) { + DRM_DEV_ERROR(vp->vop2->dev, "read VP%d vcnt error: %d %d\n", vp->id, vcnt0, vcnt1); + vcnt1 = vop2_readl(vp->vop2, offset) >> 16; + } + + return vcnt1; } static void vop2_wait_for_irq_handler(struct drm_crtc *crtc) @@ -1864,7 +1919,7 @@ #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)) + (fac * (dst - 1) >> 16 < (src - 1)) static uint16_t vop2_scale_factor(enum scale_mode mode, int32_t filter_mode, @@ -1983,12 +2038,30 @@ } } - if (src_h >= (4 * dst_h)) { - ygt4 = 1; - src_h >>= 2; - } else if (src_h >= (2 * dst_h)) { - ygt2 = 1; - src_h >>= 1; + /** + * The rk3528 is processed as 2 pixel/cycle, + * so ygt2/ygt4 needs to be triggered in advance to improve performance + * when src_w is bigger than 1920. + * dst_h / src_h is at [1, 0.65) ygt2=0; ygt4=0; + * dst_h / src_h is at [0.65, 0.35) ygt2=1; ygt4=0; + * dst_h / src_h is at [0.35, 0) ygt2=0; ygt4=1; + */ + if (vop2->version == VOP_VERSION_RK3528 && src_w > 1920) { + if (src_h >= (100 * dst_h / 35)) { + ygt4 = 1; + src_h >>= 2; + } else if ((src_h >= 100 * dst_h / 65) && (src_h < 100 * dst_h / 35)) { + ygt2 = 1; + src_h >>= 1; + } + } else { + if (src_h >= (4 * dst_h)) { + ygt4 = 1; + src_h >>= 2; + } else if (src_h >= (2 * dst_h)) { + ygt2 = 1; + src_h >>= 1; + } } yrgb_hor_scl_mode = scl_get_scl_mode(src_w, dst_w); @@ -2065,10 +2138,17 @@ if (!is_vop3(vop2) || (!vpstate->afbc_en && !vpstate->tiled_en) || win_data->vsd_pre_filter_mode == VOP3_PRE_SCALE_DOWN_GT) { - if (cbcr_src_h >= (4 * dst_h)) - ygt4 = 1; - else if (cbcr_src_h >= (2 * dst_h)) - ygt2 = 1; + if (vop2->version == VOP_VERSION_RK3528 && src_w > 1920) { + if (cbcr_src_h >= (100 * dst_h / 35)) + ygt4 = 1; + else if ((cbcr_src_h >= 100 * dst_h / 65) && (cbcr_src_h < 100 * dst_h / 35)) + ygt2 = 1; + } else { + if (cbcr_src_h >= (4 * dst_h)) + ygt4 = 1; + else if (cbcr_src_h >= (2 * dst_h)) + ygt2 = 1; + } if (ygt4) cbcr_src_h >>= 2; @@ -2230,29 +2310,49 @@ vpstate->r2y_en = 0; vpstate->csc_mode = 0; - /* hdr2sdr and sdr2hdr will do csc itself */ - if (vpstate->hdr2sdr_en) { - /* - * This is hdr2sdr enabled plane - * If it's RGB layer do hdr2sdr, we need to do r2y before send to hdr2sdr, - * because hdr2sdr only support yuv input. - */ - if (!is_input_yuv) { - vpstate->r2y_en = 1; - vpstate->csc_mode = vop2_convert_csc_mode(output_csc, CSC_10BIT_DEPTH); + if (is_vop3(vp->vop2)) { + if (vpstate->hdr_in) { + if (is_input_yuv) { + vpstate->y2r_en = 1; + vpstate->csc_mode = vop2_convert_csc_mode(input_csc, + CSC_13BIT_DEPTH); + } + return; + } else if (vp->sdr2hdr_en) { + if (is_input_yuv) { + vpstate->y2r_en = 1; + vpstate->csc_mode = vop2_convert_csc_mode(input_csc, + csc_y2r_bit_depth); + } + return; } - return; - } else if (!vpstate->hdr_in && vp->sdr2hdr_en) { - /* - * This is sdr2hdr enabled plane - * If it's YUV layer do sdr2hdr, we need to do y2r before send to sdr2hdr, - * because sdr2hdr only support rgb input. - */ - if (is_input_yuv) { - vpstate->y2r_en = 1; - vpstate->csc_mode = vop2_convert_csc_mode(input_csc, csc_y2r_bit_depth); + } else { + /* hdr2sdr and sdr2hdr will do csc itself */ + if (vpstate->hdr2sdr_en) { + /* + * This is hdr2sdr enabled plane + * If it's RGB layer do hdr2sdr, we need to do r2y before send to hdr2sdr, + * because hdr2sdr only support yuv input. + */ + if (!is_input_yuv) { + vpstate->r2y_en = 1; + vpstate->csc_mode = vop2_convert_csc_mode(output_csc, + CSC_10BIT_DEPTH); + } + return; + } else if (!vpstate->hdr_in && vp->sdr2hdr_en) { + /* + * This is sdr2hdr enabled plane + * If it's YUV layer do sdr2hdr, we need to do y2r before send to sdr2hdr, + * because sdr2hdr only support rgb input. + */ + if (is_input_yuv) { + vpstate->y2r_en = 1; + vpstate->csc_mode = vop2_convert_csc_mode(input_csc, + csc_y2r_bit_depth); + } + return; } - return; } if (is_input_yuv && !is_output_yuv) { @@ -2657,7 +2757,7 @@ fifo_throd = fb->pitches[0] >> 4; if (fifo_throd >= vop2->data->wb->fifo_depth) fifo_throd = vop2->data->wb->fifo_depth; - r2y = fb->format->is_yuv && (!is_yuv_output(vcstate->bus_format)); + r2y = !vcstate->yuv_overlay && fb->format->is_yuv; /* * the vp_id register config done immediately @@ -2963,25 +3063,16 @@ */ static void vop3_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id) { - struct vop2_video_port *vp; - struct vop2_win *win; - unsigned long win_mask; uint16_t vp_id; - int phys_id; - int i; + struct drm_plane *plane = NULL; - for (i = 0; i < vop2->data->nr_vps; i++) { - vp_id = i; - vp = &vop2->vps[vp_id]; - vp->win_mask = vp->plane_mask; - win_mask = vp->win_mask; - for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) { - win = vop2_find_win_by_phys_id(vop2, phys_id); - VOP_CTRL_SET(vop2, win_vp_id[phys_id], vp_id); - win->vp_mask = BIT(vp_id); - win->old_vp_mask = win->vp_mask; - DRM_DEV_DEBUG(vop2->dev, "%s attach to vp%d\n", win->name, vp_id); - } + drm_for_each_plane(plane, vop2->drm_dev) { + struct vop2_win *win = to_vop2_win(plane); + + vp_id = VOP_CTRL_GET(vop2, win_vp_id[win->phys_id]); + win->vp_mask = BIT(vp_id); + win->old_vp_mask = win->vp_mask; + vop2->vps[vp_id].win_mask |= BIT(win->phys_id); } } @@ -3081,8 +3172,17 @@ VOP_MODULE_SET(vop2, wb, axi_uv_id, 0xe); vop2_wb_cfg_done(vp); - if (is_vop3(vop2)) - VOP_CTRL_SET(vop2, esmart_lb_mode, vop2->data->esmart_lb_mode); + if (is_vop3(vop2)) { + VOP_CTRL_SET(vop2, dsp_vs_t_sel, 0); + VOP_CTRL_SET(vop2, esmart_lb_mode, vop2->esmart_lb_mode); + } + + /* + * This is unused and error init value for rk3528 vp1, if less of this config, + * vp1 can't display normally. + */ + if (vop2->version == VOP_VERSION_RK3528) + vop2_mask_write(vop2, 0x700, 0x3, 4, 0, 0, true); VOP_CTRL_SET(vop2, cfg_done_en, 1); /* @@ -3151,6 +3251,7 @@ { struct vop2_video_port *vp = to_vop2_video_port(crtc); struct vop2 *vop2 = vp->vop2; + const struct vop2_video_port_data *vp_data = &vop2->data->vp[vp->id]; int ret; WARN_ON(vp->event); @@ -3163,6 +3264,8 @@ VOP_MODULE_SET(vop2, vp, cubic_lut_en, 0); } + if (vp_data->feature & VOP_FEATURE_VIVID_HDR) + VOP_MODULE_SET(vop2, vp, hdr_lut_update_en, 0); vop2_disable_all_planes_for_crtc(crtc); /* @@ -3188,6 +3291,7 @@ vop2_dsp_hold_valid_irq_disable(crtc); vop2_disable(crtc); + memset(&vp->active_tv_state, 0, sizeof(vp->active_tv_state)); vop2_unlock(vop2); vop2->active_vp_mask &= ~BIT(vp->id); @@ -3500,7 +3604,7 @@ uint32_t actual_w, actual_h, dsp_w, dsp_h; uint32_t dsp_stx, dsp_sty; uint32_t act_info, dsp_info, dsp_st; - uint32_t format; + uint32_t format, check_size; uint32_t afbc_format; uint32_t rb_swap; uint32_t uv_swap; @@ -3569,18 +3673,19 @@ actual_w = drm_rect_width(src) >> 16; actual_h = drm_rect_height(src) >> 16; dsp_w = drm_rect_width(dest); - if (dest->x1 + dsp_w > adjusted_mode->hdisplay) { + if (dest->x1 + dsp_w > adjusted_mode->crtc_hdisplay) { DRM_ERROR("vp%d %s dest->x1[%d] + dsp_w[%d] exceed mode hdisplay[%d]\n", - vp->id, win->name, dest->x1, dsp_w, adjusted_mode->hdisplay); + vp->id, win->name, dest->x1, dsp_w, adjusted_mode->crtc_hdisplay); dsp_w = adjusted_mode->hdisplay - dest->x1; if (dsp_w < 4) dsp_w = 4; actual_w = dsp_w * actual_w / drm_rect_width(dest); } dsp_h = drm_rect_height(dest); - if (dest->y1 + dsp_h > adjusted_mode->vdisplay) { + check_size = adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE ? adjusted_mode->vdisplay : adjusted_mode->crtc_vdisplay; + if (dest->y1 + dsp_h > check_size) { DRM_ERROR("vp%d %s dest->y1[%d] + dsp_h[%d] exceed mode vdisplay[%d]\n", - vp->id, win->name, dest->y1, dsp_h, adjusted_mode->vdisplay); + vp->id, win->name, dest->y1, dsp_h, adjusted_mode->crtc_vdisplay); dsp_h = adjusted_mode->vdisplay - dest->y1; if (dsp_h < 4) dsp_h = 4; @@ -3588,20 +3693,25 @@ } /* - * This is workaround solution for IC design: - * esmart can't support scale down when actual_w % 16 == 1. + * Workaround only for rk3568 vop */ - if (!(win->feature & WIN_FEATURE_AFBDC)) { - if (actual_w > dsp_w && (actual_w & 0xf) == 1) { - DRM_WARN("vp%d %s act_w[%d] MODE 16 == 1\n", vp->id, win->name, actual_w); - actual_w -= 1; + if (vop2->version == VOP_VERSION_RK3568) { + /* + * This is workaround solution for IC design: + * esmart can't support scale down when actual_w % 16 == 1. + */ + if (!(win->feature & WIN_FEATURE_AFBDC)) { + if (actual_w > dsp_w && (actual_w & 0xf) == 1) { + DRM_WARN("vp%d %s act_w[%d] MODE 16 == 1\n", vp->id, win->name, actual_w); + actual_w -= 1; + } } - } - if (vpstate->afbc_en && actual_w % 4) { - DRM_ERROR("vp%d %s actual_w[%d] should align as 4 pixel when enable afbc\n", - vp->id, win->name, actual_w); - actual_w = ALIGN_DOWN(actual_w, 4); + if (vpstate->afbc_en && actual_w % 4) { + DRM_ERROR("vp%d %s actual_w[%d] should align as 4 pixel when enable afbc\n", + vp->id, win->name, actual_w); + actual_w = ALIGN_DOWN(actual_w, 4); + } } act_info = (actual_h - 1) << 16 | ((actual_w - 1) & 0xffff); @@ -3633,7 +3743,7 @@ if (vop2->version != VOP_VERSION_RK3568) rk3588_vop2_win_cfg_axi(win); - if (is_vop3(vop2) && !vop2_cluster_window(win)) + if (is_vop3(vop2) && !vop2_cluster_window(win) && !win->parent) VOP_WIN_SET(vop2, win, scale_engine_num, win->scale_engine_num); if (vpstate->afbc_en) { @@ -3765,7 +3875,9 @@ if (vop2_cluster_window(win)) { lb_mode = vop2_get_cluster_lb_mode(win, vpstate); VOP_CLUSTER_SET(vop2, win, lb_mode, lb_mode); + VOP_CLUSTER_SET(vop2, win, scl_lb_mode, lb_mode == 1 ? 3 : 0); VOP_CLUSTER_SET(vop2, win, enable, 1); + VOP_CLUSTER_SET(vop2, win, frm_reset_en, 1); } if (vcstate->output_if & VOP_OUTPUT_IF_BT1120 || vcstate->output_if & VOP_OUTPUT_IF_BT656) @@ -4736,6 +4848,27 @@ struct drm_display_mode *adj_mode) { struct vop2_video_port *vp = to_vop2_video_port(crtc); + struct vop2 *vop2 = vp->vop2; + + /* + * For RK3568 and RK3588, the hactive of video timing must + * be 4-pixel aligned. + */ + if (vop2->version == VOP_VERSION_RK3568 || vop2->version == VOP_VERSION_RK3588) { + if (adj_mode->hdisplay % 4) { + u16 old_hdisplay = adj_mode->hdisplay; + u16 align; + + align = 4 - (adj_mode->hdisplay % 4); + adj_mode->hdisplay += align; + adj_mode->hsync_start += align; + adj_mode->hsync_end += align; + adj_mode->htotal += align; + + DRM_WARN("VP%d: hactive need to be aligned with 4-pixel, %d -> %d\n", + vp->id, old_hdisplay, adj_mode->hdisplay); + } + } drm_mode_set_crtcinfo(adj_mode, CRTC_INTERLACE_HALVE_V | CRTC_STEREO_DOUBLE); @@ -4799,6 +4932,8 @@ to_rockchip_crtc_state(crtc->state); struct vop2_video_port *vp = to_vop2_video_port(crtc); struct vop2 *vop2 = vp->vop2; + const struct vop2_data *vop2_data = vop2->data; + const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id]; struct drm_display_mode *mode = &crtc->state->adjusted_mode; u16 vtotal = mode->crtc_vtotal; u16 hdisplay = mode->crtc_hdisplay; @@ -4838,8 +4973,16 @@ val = vact_st_f1 << 16 | vact_end_f1; VOP_MODULE_SET(vop2, vp, vpost_st_end_f1, val); } - VOP_MODULE_SET(vop2, vp, post_dsp_out_r2y, - is_yuv_output(vcstate->bus_format)); + + /* + * BCSH[R2Y] -> POST Linebuffer[post scale] -> the background R2Y will be deal by post_dsp_out_r2y + * + * POST Linebuffer[post scale] -> ACM[R2Y] -> the background R2Y will be deal by ACM[R2Y] + */ + if (vp_data->feature & VOP_FEATURE_POST_ACM) + VOP_MODULE_SET(vop2, vp, post_dsp_out_r2y, vcstate->yuv_overlay); + else + VOP_MODULE_SET(vop2, vp, post_dsp_out_r2y, is_yuv_output(vcstate->bus_format)); } /* @@ -4880,6 +5023,107 @@ return false; } +/* + * For vop3 video port0, if hdr_vivid is not enable, the pipe delay time as follow: + * win_dly + config_win_dly + layer_mix_dly + sdr2hdr_dly + * hdr_mix_dly = config_bg_dly + * + * if hdr_vivid is enable, the hdr layer's pipe delay time as follow: + * win_dly + config_win_dly +hdrvivid_dly + hdr_mix_dly = config_bg_dly + * + * If hdrvivid and sdr2hdr bot enable, the time arrivr hdr_mix should be the same: + * win_dly + config_win_dly0 + hdrvivid_dly = win_dly + config_win_dly1 + laer_mix_dly + + * sdr2hdr_dly + * + * For vop3 video port1, the pipe delay time as follow: + * win_dly + config_win_dly + layer_mix_dly = config_bg_dly + * + * Here, win_dly, layer_mix_dly, sdr2hdr_dly, hdr_mix_dly, hdrvivid_dly is the hardware + * delay cycles. Config_win_dly and config_bg_dly is the register value that we can config. + * Different hdr vivid mode have different hdrvivid_dly. For sdr2hdr_dly, only sde2hdr + * enable, it will delay, otherwise, the sdr2hdr_dly is 0. + * + * For default, the config_win_dly will be 0, it just user to make the pipe to arrive + * hdr_mix at the same time. + */ +static void vop3_setup_pipe_dly(struct vop2_video_port *vp, const struct vop2_zpos *vop2_zpos) +{ + struct vop2 *vop2 = vp->vop2; + struct drm_crtc *crtc = &vp->crtc; + const struct vop2_zpos *zpos; + struct drm_plane *plane; + struct vop2_plane_state *vpstate; + struct vop2_win *win; + const struct vop2_data *vop2_data = vop2->data; + const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id]; + struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode; + u16 hsync_len = adjusted_mode->crtc_hsync_end - adjusted_mode->crtc_hsync_start; + u16 hdisplay = adjusted_mode->crtc_hdisplay; + int bg_dly = 0x0; + int dly = 0x0; + int hdr_win_dly; + int sdr_win_dly; + int sdr2hdr_dly; + int pre_scan_dly; + int i; + + /** + * config bg dly, select the max delay num of hdrvivid and sdr2hdr module + * as the increase value of bg delay num. If hdrvivid and sdr2hdr is not + * work, the default bg_dly is 0x10. and the default win delay num is 0. + */ + if ((vp->hdr_en || vp->sdr2hdr_en) && + (vp->hdrvivid_mode >= 0 && vp->hdrvivid_mode <= SDR2HLG)) { + /* set sdr2hdr_dly to 0 if sdr2hdr is disable */ + sdr2hdr_dly = vp->sdr2hdr_en ? vp_data->sdr2hdr_dly : 0; + + /* set the max delay pipe's config_win_dly as 0 */ + if (vp_data->hdrvivid_dly[vp->hdrvivid_mode] >= + sdr2hdr_dly + vp_data->layer_mix_dly) { + bg_dly = vp_data->win_dly + vp_data->hdrvivid_dly[vp->hdrvivid_mode] + + vp_data->hdr_mix_dly; + hdr_win_dly = 0; + sdr_win_dly = vp_data->hdrvivid_dly[vp->hdrvivid_mode] - + vp_data->layer_mix_dly - sdr2hdr_dly; + } else { + bg_dly = vp_data->win_dly + vp_data->layer_mix_dly + sdr2hdr_dly + + vp_data->hdr_mix_dly; + hdr_win_dly = sdr2hdr_dly + vp_data->layer_mix_dly - + vp_data->hdrvivid_dly[vp->hdrvivid_mode]; + sdr_win_dly = 0; + } + } else { + bg_dly = vp_data->win_dly + vp_data->layer_mix_dly + vp_data->hdr_mix_dly; + sdr_win_dly = 0; + } + + pre_scan_dly = bg_dly + (hdisplay >> 1) - 1; + pre_scan_dly = (pre_scan_dly << 16) | hsync_len; + VOP_MODULE_SET(vop2, vp, bg_dly, bg_dly); + VOP_MODULE_SET(vop2, vp, pre_scan_htiming, pre_scan_dly); + + /** + * config win dly + */ + if (!vop2_zpos) + return; + + for (i = 0; i < vp->nr_layers; i++) { + zpos = &vop2_zpos[i]; + win = vop2_find_win_by_phys_id(vop2, zpos->win_phys_id); + plane = &win->base; + vpstate = to_vop2_plane_state(plane->state); + + if ((vp->hdr_en || vp->sdr2hdr_en) && + (vp->hdrvivid_mode >= 0 && vp->hdrvivid_mode <= SDR2HLG)) { + dly = vpstate->hdr_in ? hdr_win_dly : sdr_win_dly; + } + if (vop2_cluster_window(win)) + dly |= dly << 8; + + VOP_CTRL_SET(vop2, win_dly[win->phys_id], dly); + } +} + static void vop2_crtc_atomic_enable(struct drm_crtc *crtc, struct drm_crtc_state *old_state) { struct vop2_video_port *vp = to_vop2_video_port(crtc); @@ -4900,7 +5144,6 @@ u16 vact_st = adjusted_mode->crtc_vtotal - adjusted_mode->crtc_vsync_start; u16 vact_end = vact_st + vdisplay; bool interlaced = !!(adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE); - uint8_t out_mode; bool dclk_inv, yc_swap = false; int act_end; uint32_t val; @@ -4925,6 +5168,7 @@ if (vcstate->output_if & VOP_OUTPUT_IF_RGB) { VOP_CTRL_SET(vop2, rgb_en, 1); VOP_CTRL_SET(vop2, rgb_mux, vp_data->id); + VOP_CTRL_SET(vop2, rgb_pin_pol, val); VOP_GRF_SET(vop2, grf_dclk_inv, dclk_inv); } @@ -5038,21 +5282,6 @@ VOP_CTRL_SET(vop2, hdmi_dclk_pol, 1); } - if ((vcstate->output_mode == ROCKCHIP_OUT_MODE_AAAA && - !(vp_data->feature & VOP_FEATURE_OUTPUT_10BIT)) || - vcstate->output_if & VOP_OUTPUT_IF_BT656) - out_mode = ROCKCHIP_OUT_MODE_P888; - else - out_mode = vcstate->output_mode; - VOP_MODULE_SET(vop2, vp, out_mode, out_mode); - - if (vop2_output_uv_swap(vcstate->bus_format, vcstate->output_mode)) - VOP_MODULE_SET(vop2, vp, dsp_data_swap, DSP_RB_SWAP); - else - VOP_MODULE_SET(vop2, vp, dsp_data_swap, 0); - - vop2_dither_setup(crtc); - VOP_MODULE_SET(vop2, vp, htotal_pw, (htotal << 16) | hsync_len); val = hact_st << 16; val |= hact_end; @@ -5105,9 +5334,20 @@ VOP_MODULE_SET(vop2, vp, dclk_div2_phase_lock, 0); } - clk_set_rate(vp->dclk, adjusted_mode->crtc_clock * 1000); + /* + * 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 && vcstate->output_if & VOP_OUTPUT_IF_BT656) + clk_set_rate(vp->dclk, 4 * adjusted_mode->crtc_clock * 1000); + else + clk_set_rate(vp->dclk, adjusted_mode->crtc_clock * 1000); vop2_post_config(crtc); + + if (is_vop3(vop2)) + vop3_setup_pipe_dly(vp, NULL); vop2_cfg_done(crtc); @@ -5154,6 +5394,224 @@ struct drm_crtc_state *crtc_state) { return 0; +} + +static void vop3_disable_dynamic_hdr(struct vop2_video_port *vp, uint8_t win_phys_id) +{ + struct vop2 *vop2 = vp->vop2; + struct vop2_win *win = vop2_find_win_by_phys_id(vop2, win_phys_id); + struct drm_plane *plane = &win->base; + struct drm_plane_state *pstate = plane->state; + struct vop2_plane_state *vpstate = to_vop2_plane_state(pstate); + + VOP_MODULE_SET(vop2, vp, hdr10_en, 0); + VOP_MODULE_SET(vop2, vp, hdr_vivid_en, 0); + VOP_MODULE_SET(vop2, vp, hdr_vivid_bypass_en, 0); + VOP_MODULE_SET(vop2, vp, hdr_lut_update_en, 0); + VOP_MODULE_SET(vop2, vp, sdr2hdr_en, 0); + VOP_MODULE_SET(vop2, vp, sdr2hdr_path_en, 0); + VOP_MODULE_SET(vop2, vp, sdr2hdr_auto_gating_en, 1); + + vp->hdr_en = false; + vp->hdr_in = false; + vp->hdr_out = false; + vp->sdr2hdr_en = false; + vpstate->hdr_in = false; + vpstate->hdr2sdr_en = false; +} + +static void vop3_setup_hdrvivid(struct vop2_video_port *vp, uint8_t win_phys_id) +{ + struct vop2 *vop2 = vp->vop2; + struct vop2_win *win = vop2_find_win_by_phys_id(vop2, win_phys_id); + struct drm_plane *plane = &win->base; + struct drm_plane_state *pstate = plane->state; + struct vop2_plane_state *vpstate = to_vop2_plane_state(pstate); + struct drm_crtc_state *cstate = vp->crtc.state; + struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(cstate); + unsigned long win_mask = vp->win_mask; + int phys_id; + struct hdrvivid_regs *hdrvivid_data; + struct hdr_extend *hdr_data; + bool have_sdr_layer = false; + uint32_t hdr_mode; + int i; + u32 *tone_lut_kvaddr; + dma_addr_t tone_lut_mst; + + vp->hdr_en = false; + vp->hdr_in = false; + vp->hdr_out = false; + vp->sdr2hdr_en = false; + vpstate->hdr_in = false; + vpstate->hdr2sdr_en = false; + + hdr_data = (struct hdr_extend *)vcstate->hdr_ext_data->data; + hdrvivid_data = &hdr_data->hdrvivid_data; + + hdr_mode = hdrvivid_data->hdr_mode; + + if (hdr_mode > SDR2HLG && hdr_mode != SDR2HDR10_USERSPACE && + hdr_mode != SDR2HLG_USERSPACE) { + DRM_ERROR("Invalid HDR mode:%d, beyond the mode range\n", hdr_mode); + return; + } + + /* adjust userspace hdr mode value to kernel value */ + if (hdr_mode == SDR2HDR10_USERSPACE) + hdr_mode = SDR2HDR10; + if (hdr_mode == SDR2HLG_USERSPACE) + hdr_mode = SDR2HLG; + + if (hdr_mode <= HDR102SDR && vpstate->eotf != SMPTE_ST2084 && vpstate->eotf != HLG) { + DRM_ERROR("Invalid HDR mode:%d, mismatch plane eotf:%d\n", hdr_mode, + vpstate->eotf); + return; + } + + vp->hdrvivid_mode = hdr_mode; + vcstate->yuv_overlay = false; + + if (hdr_mode <= HDR102SDR) { + vp->hdr_en = true; + vp->hdr_in = true; + vpstate->hdr_in = true; + } else { + vp->sdr2hdr_en = true; + } + + /* + * To confirm whether need to enable sdr2hdr. + */ + for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) { + win = vop2_find_win_by_phys_id(vop2, phys_id); + plane = &win->base; + pstate = plane->state; + vpstate = to_vop2_plane_state(pstate); + + /* skip inactive plane */ + if (!vop2_plane_active(pstate)) + continue; + + if (vpstate->eotf != SMPTE_ST2084 && vpstate->eotf != HLG) { + have_sdr_layer = true; + break; + } + } + + if (hdr_mode == PQHDR2SDR_WITH_DYNAMIC || hdr_mode == HLG2SDR_WITH_DYNAMIC || + hdr_mode == HLG2SDR_WITHOUT_DYNAMIC || hdr_mode == HDR102SDR) { + vpstate->hdr2sdr_en = true; + } else { + vp->hdr_out = true; + if (have_sdr_layer) + vp->sdr2hdr_en = true; + } + + /** + * Config hdr ctrl registers + */ + vop2_writel(vop2, RK3528_SDR2HDR_CTRL, hdrvivid_data->sdr2hdr_ctrl); + vop2_writel(vop2, RK3528_HDRVIVID_CTRL, hdrvivid_data->hdrvivid_ctrl); + + VOP_MODULE_SET(vop2, vp, hdr10_en, vp->hdr_en); + if (vp->hdr_en) { + VOP_MODULE_SET(vop2, vp, hdr_vivid_en, (hdr_mode == HDR_BYPASS) ? 0 : 1); + VOP_MODULE_SET(vop2, vp, hdr_vivid_path_mode, + (hdr_mode == HDR102SDR) ? PQHDR2SDR_WITH_DYNAMIC : hdr_mode); + VOP_MODULE_SET(vop2, vp, hdr_vivid_bypass_en, (hdr_mode == HDR_BYPASS) ? 1 : 0); + } else { + VOP_MODULE_SET(vop2, vp, hdr_vivid_en, 0); + } + VOP_MODULE_SET(vop2, vp, sdr2hdr_en, vp->sdr2hdr_en); + VOP_MODULE_SET(vop2, vp, sdr2hdr_path_en, vp->sdr2hdr_en); + VOP_MODULE_SET(vop2, vp, sdr2hdr_auto_gating_en, vp->sdr2hdr_en ? 0 : 1); + + vop2_writel(vop2, RK3528_SDR_CFG_COE0, hdrvivid_data->sdr2hdr_coe0); + vop2_writel(vop2, RK3528_SDR_CFG_COE1, hdrvivid_data->sdr2hdr_coe1); + vop2_writel(vop2, RK3528_SDR_CSC_COE00_01, hdrvivid_data->sdr2hdr_csc_coe00_01); + vop2_writel(vop2, RK3528_SDR_CSC_COE02_10, hdrvivid_data->sdr2hdr_csc_coe02_10); + vop2_writel(vop2, RK3528_SDR_CSC_COE11_12, hdrvivid_data->sdr2hdr_csc_coe11_12); + vop2_writel(vop2, RK3528_SDR_CSC_COE20_21, hdrvivid_data->sdr2hdr_csc_coe20_21); + vop2_writel(vop2, RK3528_SDR_CSC_COE22, hdrvivid_data->sdr2hdr_csc_coe22); + + vop2_writel(vop2, RK3528_HDR_PQ_GAMMA, hdrvivid_data->hdr_pq_gamma); + vop2_writel(vop2, RK3528_HLG_RFIX_SCALEFAC, hdrvivid_data->hlg_rfix_scalefac); + vop2_writel(vop2, RK3528_HLG_MAXLUMA, hdrvivid_data->hlg_maxluma); + vop2_writel(vop2, RK3528_HLG_R_TM_LIN2NON, hdrvivid_data->hlg_r_tm_lin2non); + + vop2_writel(vop2, RK3528_HDR_CSC_COE00_01, hdrvivid_data->hdr_csc_coe00_01); + vop2_writel(vop2, RK3528_HDR_CSC_COE02_10, hdrvivid_data->hdr_csc_coe02_10); + vop2_writel(vop2, RK3528_HDR_CSC_COE11_12, hdrvivid_data->hdr_csc_coe11_12); + vop2_writel(vop2, RK3528_HDR_CSC_COE20_21, hdrvivid_data->hdr_csc_coe20_21); + vop2_writel(vop2, RK3528_HDR_CSC_COE22, hdrvivid_data->hdr_csc_coe22); + + tone_lut_kvaddr = (u32 *)vp->hdr_lut_gem_obj->kvaddr; + tone_lut_mst = vp->hdr_lut_gem_obj->dma_addr; + + for (i = 0; i < RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH; i++) + *tone_lut_kvaddr++ = hdrvivid_data->tone_sca_axi_tab[i]; + + VOP_MODULE_SET(vop2, vp, lut_dma_rid, vp->lut_dma_rid - vp->id); + VOP_MODULE_SET(vop2, vp, hdr_lut_mode, 1); + VOP_MODULE_SET(vop2, vp, hdr_lut_mst, tone_lut_mst); + VOP_MODULE_SET(vop2, vp, hdr_lut_update_en, 1); + VOP_CTRL_SET(vop2, lut_dma_en, 1); + + for (i = 0; i < RK_HDRVIVID_GAMMA_CURVE_LENGTH; i++) + vop2_writel(vop2, RK3528_HDRGAMMA_CURVE + i * 4, hdrvivid_data->hdrgamma_curve[i]); + + for (i = 0; i < RK_HDRVIVID_GAMMA_MDFVALUE_LENGTH; i++) + vop2_writel(vop2, RK3528_HDRGAMMA_MDFVALUE + i * 4, + hdrvivid_data->hdrgamma_mdfvalue[i]); + + for (i = 0; i < RK_SDR2HDR_INVGAMMA_CURVE_LENGTH; i++) + vop2_writel(vop2, RK3528_SDRINVGAMMA_CURVE + i * 4, + hdrvivid_data->sdrinvgamma_curve[i]); + + for (i = 0; i < RK_SDR2HDR_INVGAMMA_S_IDX_LENGTH; i++) + vop2_writel(vop2, RK3528_SDRINVGAMMA_STARTIDX + i * 4, + hdrvivid_data->sdrinvgamma_startidx[i]); + + for (i = 0; i < RK_SDR2HDR_INVGAMMA_C_IDX_LENGTH; i++) + vop2_writel(vop2, RK3528_SDRINVGAMMA_CHANGEIDX + i * 4, + hdrvivid_data->sdrinvgamma_changeidx[i]); + + for (i = 0; i < RK_SDR2HDR_SMGAIN_LENGTH; i++) + vop2_writel(vop2, RK3528_SDR_SMGAIN + i * 4, hdrvivid_data->sdr_smgain[i]); +} + +static void vop3_setup_dynamic_hdr(struct vop2_video_port *vp, uint8_t win_phys_id) +{ + struct drm_crtc_state *cstate = vp->crtc.state; + struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(cstate); + struct hdr_extend *hdr_data; + uint32_t hdr_format; + + /* If hdr extend data is null, exit hdr mode */ + if (!vcstate->hdr_ext_data) { + vop3_disable_dynamic_hdr(vp, win_phys_id); + return; + } + + hdr_data = (struct hdr_extend *)vcstate->hdr_ext_data->data; + hdr_format = hdr_data->hdr_type; + + switch (hdr_format) { + case HDR_NONE: + case HDR_HDR10: + case HDR_HLGSTATIC: + case HDR_HDRVIVID: + /* + * hdr module support hdr10, hlg, vividhdr + * sdr2hdr module support hdrnone for sdr2hdr + */ + vop3_setup_hdrvivid(vp, win_phys_id); + break; + default: + DRM_DEBUG("unsupprot hdr format:%u\n", hdr_format); + break; + } } static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id) @@ -5648,7 +6106,7 @@ vop2_writel(vop2, dst_alpha_ctrl_offset + offset, alpha.dst_alpha_ctrl.val); } - if (vp_data->feature & VOP_FEATURE_HDR10) { + if (vp_data->feature & (VOP_FEATURE_HDR10 | VOP_FEATURE_VIVID_HDR)) { src_color_ctrl_offset = ovl_regs->hdr_mix_regs->src_color_ctrl.offset; dst_color_ctrl_offset = ovl_regs->hdr_mix_regs->dst_color_ctrl.offset; src_alpha_ctrl_offset = ovl_regs->hdr_mix_regs->src_alpha_ctrl.offset; @@ -5923,6 +6381,7 @@ struct vop2_cluster cluster; uint8_t nr_layers = 0; struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state); + const struct vop2_video_port_data *vp_data = &vop2->data->vp[vp->id]; vcstate->yuv_overlay = is_yuv_output(vcstate->bus_format); vop2_zpos = kmalloc_array(vop2->data->win_size, sizeof(*vop2_zpos), GFP_KERNEL); @@ -5982,21 +6441,26 @@ sort(vop2_zpos, nr_layers, sizeof(vop2_zpos[0]), vop2_zpos_cmp, NULL); - if (is_vop3(vop2)) + if (is_vop3(vop2)) { vop3_setup_layer_sel_for_vp(vp, vop2_zpos); - else - vop2_setup_layer_mixer_for_vp(vp, vop2_zpos); - vop2_setup_hdr10(vp, vop2_zpos[0].win_phys_id); - if (is_vop3(vop2)) + if (vp_data->feature & VOP_FEATURE_VIVID_HDR) + vop3_setup_dynamic_hdr(vp, vop2_zpos[0].win_phys_id); vop3_setup_alpha(vp, vop2_zpos); - else + vop3_setup_pipe_dly(vp, vop2_zpos); + } else { + vop2_setup_layer_mixer_for_vp(vp, vop2_zpos); + vop2_setup_hdr10(vp, vop2_zpos[0].win_phys_id); vop2_setup_alpha(vp, vop2_zpos); - vop2_setup_dly_for_vp(vp); - vop2_setup_dly_for_window(vp, vop2_zpos); + vop2_setup_dly_for_vp(vp); + vop2_setup_dly_for_window(vp, vop2_zpos); + } } else { - if (!is_vop3(vop2)) + if (!is_vop3(vop2)) { vop2_calc_bg_ovl_and_port_mux(vp); - vop2_setup_dly_for_vp(vp); + vop2_setup_dly_for_vp(vp); + } else { + vop3_setup_pipe_dly(vp, NULL); + } } /* The pre alpha overlay of Cluster still need process in one win mode. */ @@ -6124,16 +6588,193 @@ vop2_bcsh_reg_update(vcstate, vp, &bcsh_state); } +static void vop3_post_csc_config(struct drm_crtc *crtc, struct post_acm *acm, struct post_csc *csc) +{ + struct vop2_video_port *vp = to_vop2_video_port(crtc); + struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state); + struct vop2 *vop2 = vp->vop2; + struct post_csc_coef csc_coef; + bool acm_enable; + bool is_input_yuv = false; + bool is_output_yuv = false; + bool post_r2y_en = false; + bool post_csc_en = false; + int range_type; + + if (!acm) + acm_enable = false; + else + acm_enable = acm->acm_enable; + + if (acm_enable) { + if (!vcstate->yuv_overlay) + post_r2y_en = true; + + /* do y2r in csc module */ + if (!is_yuv_output(vcstate->bus_format)) + post_csc_en = true; + } else { + if (!vcstate->yuv_overlay && is_yuv_output(vcstate->bus_format)) + post_r2y_en = true; + + /* do y2r in csc module */ + if (vcstate->yuv_overlay && !is_yuv_output(vcstate->bus_format)) + post_csc_en = true; + } + + if (csc && csc->csc_enable) + post_csc_en = true; + + if (vcstate->yuv_overlay || post_r2y_en) + is_input_yuv = true; + + if (is_yuv_output(vcstate->bus_format)) + is_output_yuv = true; + + vcstate->post_csc_mode = vop2_convert_csc_mode(vcstate->color_space, CSC_13BIT_DEPTH); + + if (post_csc_en) { + rockchip_calc_post_csc(csc, &csc_coef, vcstate->post_csc_mode, is_input_yuv, + is_output_yuv); + + VOP_MODULE_SET(vop2, vp, csc_coe00, csc_coef.csc_coef00); + VOP_MODULE_SET(vop2, vp, csc_coe01, csc_coef.csc_coef01); + VOP_MODULE_SET(vop2, vp, csc_coe02, csc_coef.csc_coef02); + VOP_MODULE_SET(vop2, vp, csc_coe10, csc_coef.csc_coef10); + VOP_MODULE_SET(vop2, vp, csc_coe11, csc_coef.csc_coef11); + VOP_MODULE_SET(vop2, vp, csc_coe12, csc_coef.csc_coef12); + VOP_MODULE_SET(vop2, vp, csc_coe20, csc_coef.csc_coef20); + VOP_MODULE_SET(vop2, vp, csc_coe21, csc_coef.csc_coef21); + VOP_MODULE_SET(vop2, vp, csc_coe22, csc_coef.csc_coef22); + VOP_MODULE_SET(vop2, vp, csc_offset0, csc_coef.csc_dc0); + VOP_MODULE_SET(vop2, vp, csc_offset1, csc_coef.csc_dc1); + VOP_MODULE_SET(vop2, vp, csc_offset2, csc_coef.csc_dc2); + + range_type = csc_coef.range_type ? 0 : 1; + range_type <<= is_input_yuv ? 0 : 1; + VOP_MODULE_SET(vop2, vp, csc_mode, range_type); + } + + VOP_MODULE_SET(vop2, vp, acm_r2y_en, post_r2y_en ? 1 : 0); + VOP_MODULE_SET(vop2, vp, csc_en, post_csc_en ? 1 : 0); + VOP_MODULE_SET(vop2, vp, acm_r2y_mode, vcstate->post_csc_mode); +} + +static void vop3_post_acm_config(struct drm_crtc *crtc, struct post_acm *acm) +{ + struct vop2_video_port *vp = to_vop2_video_port(crtc); + struct vop2 *vop2 = vp->vop2; + struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode; + s16 *lut_y; + s16 *lut_h; + s16 *lut_s; + u32 value; + int i; + + writel(0, vop2->acm_regs + RK3528_ACM_CTRL); + VOP_MODULE_SET(vop2, vp, acm_bypass_en, 0); + + if (!acm || !acm->acm_enable) + return; + + /* + * If acm update parameters, it need disable acm in the first frame, + * then update parameters and enable acm in second frame. + */ + vop2_cfg_done(crtc); + readx_poll_timeout(readl, vop2->acm_regs + RK3528_ACM_CTRL, value, !value, 200, 50000); + + value = RK3528_ACM_ENABLE + ((adjusted_mode->hdisplay & 0xfff) << 8) + + ((adjusted_mode->vdisplay & 0xfff) << 20); + writel(value, vop2->acm_regs + RK3528_ACM_CTRL); + + + writel(1, vop2->acm_regs + RK3528_ACM_FETCH_START); + + value = (acm->y_gain & 0x3ff) + ((acm->h_gain << 10) & 0xffc00) + + ((acm->s_gain << 20) & 0x3ff00000); + writel(value, vop2->acm_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->acm_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->acm_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->acm_regs + RK3528_ACM_YHS_DEL_HGAIN_SEG0 + (i << 2)); + } + + writel(1, vop2->acm_regs + RK3528_ACM_FETCH_DONE); +} + +static void vop3_post_config(struct drm_crtc *crtc) +{ + struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state); + struct vop2_video_port *vp = to_vop2_video_port(crtc); + struct post_acm *acm; + struct post_csc *csc; + + csc = vcstate->post_csc_data ? (struct post_csc *)vcstate->post_csc_data->data : NULL; + if (csc && memcmp(&vp->csc_info, csc, sizeof(struct post_csc))) + memcpy(&vp->csc_info, csc, sizeof(struct post_csc)); + vop3_post_csc_config(crtc, &vp->acm_info, &vp->csc_info); + + acm = vcstate->acm_lut_data ? (struct post_acm *)vcstate->acm_lut_data->data : NULL; + + if (acm && memcmp(&vp->acm_info, acm, sizeof(struct post_acm))) { + memcpy(&vp->acm_info, acm, sizeof(struct post_acm)); + vop3_post_acm_config(crtc, &vp->acm_info); + } else if (crtc->state->active_changed) { + vop3_post_acm_config(crtc, &vp->acm_info); + } +} + static void vop2_cfg_update(struct drm_crtc *crtc, struct drm_crtc_state *old_crtc_state) { struct vop2_video_port *vp = to_vop2_video_port(crtc); struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state); struct vop2 *vop2 = vp->vop2; + const struct vop2_data *vop2_data = vop2->data; + const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id]; uint32_t val; uint32_t r, g, b; + uint8_t out_mode; spin_lock(&vop2->reg_lock); + + if ((vcstate->output_mode == ROCKCHIP_OUT_MODE_AAAA && + !(vp_data->feature & VOP_FEATURE_OUTPUT_10BIT)) || + vcstate->output_if & VOP_OUTPUT_IF_BT656) + out_mode = ROCKCHIP_OUT_MODE_P888; + else + out_mode = vcstate->output_mode; + VOP_MODULE_SET(vop2, vp, out_mode, out_mode); + + if (vop2_output_uv_swap(vcstate->bus_format, vcstate->output_mode)) + VOP_MODULE_SET(vop2, vp, dsp_data_swap, DSP_RB_SWAP); + else + VOP_MODULE_SET(vop2, vp, dsp_data_swap, 0); + + vop2_dither_setup(crtc); VOP_MODULE_SET(vop2, vp, overlay_mode, vcstate->yuv_overlay); @@ -6162,6 +6803,9 @@ vop2_post_config(crtc); spin_unlock(&vop2->reg_lock); + + if (vp_data->feature & (VOP_FEATURE_POST_ACM | VOP_FEATURE_POST_CSC)) + vop3_post_config(crtc); } static void vop2_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *old_cstate) @@ -6304,6 +6948,13 @@ return NULL; vcstate->vp_id = vp->id; + if (vcstate->hdr_ext_data) + drm_property_blob_get(vcstate->hdr_ext_data); + if (vcstate->acm_lut_data) + drm_property_blob_get(vcstate->acm_lut_data); + if (vcstate->post_csc_data) + drm_property_blob_get(vcstate->post_csc_data); + __drm_atomic_helper_crtc_duplicate_state(crtc, &vcstate->base); return &vcstate->base; } @@ -6314,6 +6965,9 @@ struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(state); __drm_atomic_helper_crtc_destroy_state(&vcstate->base); + drm_property_blob_put(vcstate->hdr_ext_data); + drm_property_blob_put(vcstate->acm_lut_data); + drm_property_blob_put(vcstate->post_csc_data); kfree(vcstate); } @@ -6436,9 +7090,52 @@ return 0; } + if (property == vp->hdr_ext_data_prop) + return 0; + + if (property == vp->acm_lut_data_prop) + return 0; + + if (property == vp->post_csc_data_prop) + return 0; + DRM_ERROR("failed to get vop2 crtc property: %s\n", property->name); return -EINVAL; +} + +/* copied from drm_atomic.c */ +static int +vop2_atomic_replace_property_blob_from_id(struct drm_device *dev, + struct drm_property_blob **blob, + uint64_t blob_id, + ssize_t expected_size, + ssize_t expected_elem_size, + bool *replaced) +{ + struct drm_property_blob *new_blob = NULL; + + if (blob_id != 0) { + new_blob = drm_property_lookup_blob(dev, blob_id); + if (new_blob == NULL) + return -EINVAL; + + if (expected_size > 0 && + new_blob->length != expected_size) { + drm_property_blob_put(new_blob); + return -EINVAL; + } + if (expected_elem_size > 0 && + new_blob->length % expected_elem_size != 0) { + drm_property_blob_put(new_blob); + return -EINVAL; + } + } + + *replaced |= drm_property_replace_blob(blob, new_blob); + drm_property_blob_put(new_blob); + + return 0; } static int vop2_crtc_atomic_set_property(struct drm_crtc *crtc, @@ -6451,6 +7148,8 @@ struct drm_mode_config *mode_config = &drm_dev->mode_config; struct vop2_video_port *vp = to_vop2_video_port(crtc); struct vop2 *vop2 = vp->vop2; + bool replaced = false; + int ret; if (property == mode_config->tv_left_margin_property) { vcstate->left_margin = val; @@ -6481,6 +7180,33 @@ if (property == vop2->line_flag_prop) { vcstate->line_flag = val; return 0; + } + + if (property == vp->hdr_ext_data_prop) { + ret = vop2_atomic_replace_property_blob_from_id(drm_dev, + &vcstate->hdr_ext_data, + val, + -1, -1, + &replaced); + return ret; + } + + if (property == vp->acm_lut_data_prop) { + ret = vop2_atomic_replace_property_blob_from_id(drm_dev, + &vcstate->acm_lut_data, + val, + sizeof(struct post_acm), -1, + &replaced); + return ret; + } + + if (property == vp->post_csc_data_prop) { + ret = vop2_atomic_replace_property_blob_from_id(drm_dev, + &vcstate->post_csc_data, + val, + sizeof(struct post_csc), -1, + &replaced); + return ret; } DRM_ERROR("failed to set vop2 crtc property %s\n", property->name); @@ -6694,6 +7420,16 @@ ret = IRQ_HANDLED; } + if (vop2->version == VOP_VERSION_RK3528 && vp->id == 1) { + if (active_irqs & POST_BUF_EMPTY_INTR) + atomic_inc(&vp->post_buf_empty_flag); + + if (active_irqs & FS_FIELD_INTR && + (atomic_read(&vp->post_buf_empty_flag) > 0 || + vp->need_reset_p2i_flag == true)) + queue_work(vop2->workqueue, &vop2->post_buf_empty_work); + } + if (active_irqs & FS_FIELD_INTR) { vop2_wb_handler(vp); if (likely(!vp->skip_vsync) || (vp->layer_sel_update == false)) { @@ -6784,6 +7520,51 @@ return 0; } +static bool vop3_ignore_plane(struct vop2 *vop2, struct vop2_win *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 u32 vop3_esmart_linebuffer_size(struct vop2 *vop2, struct vop2_win *win) +{ + if (!is_vop3(vop2) || vop2_cluster_window(win)) + return vop2->data->max_output.width; + + if (vop2->esmart_lb_mode == VOP3_ESMART_2K_2K_2K_2K_MODE || + (vop2->esmart_lb_mode == VOP3_ESMART_4K_2K_2K_MODE && win->phys_id != ROCKCHIP_VOP2_ESMART0)) + return vop2->data->max_output.width / 2; + else + return vop2->data->max_output.width; +} + +static void vop3_init_esmart_scale_engine(struct vop2 *vop2) +{ + u8 scale_engine_num = 0; + struct drm_plane *plane = NULL; + + drm_for_each_plane(plane, vop2->drm_dev) { + struct vop2_win *win = to_vop2_win(plane); + + if (win->parent || vop2_cluster_window(win)) + continue; + + win->scale_engine_num = scale_engine_num++; + } +} + static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, unsigned long possible_crtcs) { struct rockchip_drm_private *private = vop2->drm_dev->dev_private; @@ -6807,6 +7588,10 @@ if (win->feature & WIN_FEATURE_CLUSTER_SUB) return -EACCES; } + + /* ignore some plane register according vop3 esmart lb mode */ + if (vop3_ignore_plane(vop2, win)) + return -EACCES; ret = drm_universal_plane_init(vop2->drm_dev, &win->base, possible_crtcs, &vop2_plane_funcs, win->formats, win->nformats, @@ -6847,7 +7632,7 @@ "INPUT_WIDTH", 0, max_width); win->input_height_prop = drm_property_create_range(vop2->drm_dev, DRM_MODE_PROP_IMMUTABLE, "INPUT_HEIGHT", 0, max_height); - max_width = vop2->data->max_output.width; + max_width = vop3_esmart_linebuffer_size(vop2, win); max_height = vop2->data->max_output.height; if (win->feature & WIN_FEATURE_CLUSTER_SUB) max_width >>= 1; @@ -6883,15 +7668,27 @@ return 0; } -static struct drm_plane *vop2_cursor_plane_init(struct vop2_video_port *vp, - unsigned long possible_crtcs) +static struct drm_plane *vop2_cursor_plane_init(struct vop2_video_port *vp) { struct vop2 *vop2 = vp->vop2; struct drm_plane *cursor = NULL; struct vop2_win *win; + unsigned long possible_crtcs = 0; win = vop2_find_win_by_phys_id(vop2, vp->cursor_win_id); if (win) { + if (vop2->disable_win_move) { + const struct vop2_data *vop2_data = vop2->data; + struct drm_crtc *crtc = vop2_find_crtc_by_plane_mask(vop2, win->phys_id); + + if (crtc) + possible_crtcs = drm_crtc_mask(crtc); + else + possible_crtcs = (1 << vop2_data->nr_vps) - 1; + } + + if (win->possible_crtcs) + possible_crtcs = win->possible_crtcs; win->type = DRM_PLANE_TYPE_CURSOR; win->zpos = vop2->registered_num_wins - 1; if (!vop2_plane_init(vop2, win, possible_crtcs)) @@ -6925,6 +7722,7 @@ if (!lut_len) continue; vp->gamma_lut_len = vp_data->gamma_lut_len; + vp->lut_dma_rid = vp_data->lut_dma_rid; vp->lut = devm_kmalloc_array(dev, lut_len, sizeof(*vp->lut), GFP_KERNEL); if (!vp->lut) @@ -7009,6 +7807,53 @@ return 0; } +static int vop2_crtc_create_hdr_property(struct vop2 *vop2, struct drm_crtc *crtc) +{ + struct vop2_video_port *vp = to_vop2_video_port(crtc); + struct drm_property *prop; + + prop = drm_property_create(vop2->drm_dev, DRM_MODE_PROP_BLOB, "HDR_EXT_DATA", 0); + if (!prop) { + DRM_DEV_ERROR(vop2->dev, "create hdr ext data prop for vp%d failed\n", vp->id); + return -ENOMEM; + } + vp->hdr_ext_data_prop = prop; + drm_object_attach_property(&crtc->base, vp->hdr_ext_data_prop, 0); + + return 0; +} + +static int vop2_crtc_create_post_acm_property(struct vop2 *vop2, struct drm_crtc *crtc) +{ + struct vop2_video_port *vp = to_vop2_video_port(crtc); + struct drm_property *prop; + + prop = drm_property_create(vop2->drm_dev, DRM_MODE_PROP_BLOB, "ACM_LUT_DATA", 0); + if (!prop) { + DRM_DEV_ERROR(vop2->dev, "create acm lut data prop for vp%d failed\n", vp->id); + return -ENOMEM; + } + vp->acm_lut_data_prop = prop; + drm_object_attach_property(&crtc->base, vp->acm_lut_data_prop, 0); + + return 0; +} + +static int vop2_crtc_create_post_csc_property(struct vop2 *vop2, struct drm_crtc *crtc) +{ + struct vop2_video_port *vp = to_vop2_video_port(crtc); + struct drm_property *prop; + + prop = drm_property_create(vop2->drm_dev, DRM_MODE_PROP_BLOB, "POST_CSC_DATA", 0); + if (!prop) { + DRM_DEV_ERROR(vop2->dev, "create post csc data prop for vp%d failed\n", vp->id); + return -ENOMEM; + } + vp->post_csc_data_prop = prop; + drm_object_attach_property(&crtc->base, vp->post_csc_data_prop, 0); + + return 0; +} #define RK3566_MIRROR_PLANE_MASK (BIT(ROCKCHIP_VOP2_CLUSTER1) | BIT(ROCKCHIP_VOP2_ESMART1) | \ BIT(ROCKCHIP_VOP2_SMART1)) @@ -7021,7 +7866,7 @@ const struct vop2_data *vop2_data = vop2->data; struct drm_device *drm_dev = vop2->drm_dev; struct device *dev = vop2->dev; - struct drm_plane *plane; + struct drm_plane *primary; struct drm_plane *cursor = NULL; struct drm_crtc *crtc; struct device_node *port; @@ -7069,6 +7914,9 @@ vp->id = vp_data->id; vp->regs = vp_data->regs; vp->cursor_win_id = -1; + primary = NULL; + cursor = NULL; + if (vop2->disable_win_move) possible_crtcs = BIT(registered_num_crtcs); @@ -7116,6 +7964,7 @@ win->type = DRM_PLANE_TYPE_PRIMARY; } } else { + j = 0; while (j < vop2->registered_num_wins) { be_used_for_primary_plane = false; win = &vop2->win[j]; @@ -7157,24 +8006,43 @@ DRM_DEV_ERROR(vop2->dev, "failed to init primary plane\n"); break; } - plane = &win->base; + primary = &win->base; } /* some times we want a cursor window for some vp */ + if (vp->cursor_win_id < 0) { + bool be_used_for_cursor_plane = false; + + j = 0; + while (j < vop2->registered_num_wins) { + win = &vop2->win[j++]; + + if (win->parent || (win->feature & WIN_FEATURE_CLUSTER_SUB)) + continue; + + if (win->type != DRM_PLANE_TYPE_CURSOR) + continue; + + for (k = 0; k < vop2_data->nr_vps; k++) { + if (vop2->vps[k].cursor_win_id == win->phys_id) + be_used_for_cursor_plane = true; + } + if (be_used_for_cursor_plane) + continue; + vp->cursor_win_id = win->phys_id; + } + } + if (vp->cursor_win_id >= 0) { - if (win->possible_crtcs) - possible_crtcs = win->possible_crtcs; - cursor = vop2_cursor_plane_init(vp, possible_crtcs); + cursor = vop2_cursor_plane_init(vp); if (!cursor) DRM_WARN("failed to init cursor plane for vp%d\n", vp->id); else DRM_DEV_INFO(vop2->dev, "%s as cursor plane for vp%d\n", cursor->name, vp->id); - } else { - cursor = NULL; } - ret = drm_crtc_init_with_planes(drm_dev, crtc, plane, cursor, &vop2_crtc_funcs, + ret = drm_crtc_init_with_planes(drm_dev, crtc, primary, cursor, &vop2_crtc_funcs, "video_port%d", vp->id); if (ret) { DRM_DEV_ERROR(vop2->dev, "crtc init for video_port%d failed\n", i); @@ -7202,7 +8070,23 @@ drm_dev->mode_config.tv_top_margin_property, 100); drm_object_attach_property(&crtc->base, drm_dev->mode_config.tv_bottom_margin_property, 100); - vop2_crtc_create_plane_mask_property(vop2, crtc, plane_mask); + if (plane_mask) + vop2_crtc_create_plane_mask_property(vop2, crtc, plane_mask); + + if (vp_data->feature & VOP_FEATURE_VIVID_HDR) { + vop2_crtc_create_hdr_property(vop2, crtc); + vp->hdr_lut_gem_obj = rockchip_gem_create_object(vop2->drm_dev, + RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH * 4, true, 0); + if (IS_ERR(vp->hdr_lut_gem_obj)) { + DRM_ERROR("create hdr lut obj failed\n"); + return -ENOMEM; + } + } + if (vp_data->feature & VOP_FEATURE_POST_ACM) + vop2_crtc_create_post_acm_property(vop2, crtc); + if (vp_data->feature & VOP_FEATURE_POST_CSC) + vop2_crtc_create_post_csc_property(vop2, crtc); + registered_num_crtcs++; } @@ -7260,12 +8144,18 @@ DRM_WARN("failed to init overlay plane %s, ret:%d\n", win->name, ret); } + if (is_vop3(vop2)) + vop3_init_esmart_scale_engine(vop2); + return registered_num_crtcs; } static void vop2_destroy_crtc(struct drm_crtc *crtc) { struct vop2_video_port *vp = to_vop2_video_port(crtc); + + if (vp->hdr_lut_gem_obj) + rockchip_gem_free_object(&vp->hdr_lut_gem_obj->base); of_node_put(crtc->port); @@ -7322,7 +8212,6 @@ win->axi_id = win_data->axi_id; win->axi_yrgb_id = win_data->axi_yrgb_id; win->axi_uv_id = win_data->axi_uv_id; - win->scale_engine_num = win_data->scale_engine_num; win->possible_crtcs = win_data->possible_crtcs; num_wins++; @@ -7351,6 +8240,7 @@ area->vsd_filter_mode = win_data->vsd_filter_mode; area->hsd_pre_filter_mode = win_data->hsd_pre_filter_mode; area->vsd_pre_filter_mode = win_data->vsd_pre_filter_mode; + area->possible_crtcs = win->possible_crtcs; area->vop2 = vop2; area->win_id = i; @@ -7414,6 +8304,43 @@ return 0; } +static void post_buf_empty_work_event(struct work_struct *work) +{ + struct vop2 *vop2 = container_of(work, struct vop2, post_buf_empty_work); + struct rockchip_drm_private *private = vop2->drm_dev->dev_private; + struct vop2_video_port *vp = &vop2->vps[1]; + + /* + * For RK3528, VP1 only supports NTSC and PAL mode(both interlace). If + * POST_BUF_EMPTY_INTR comes, it is needed to reset the p2i_en bit, in + * order to update the line parity flag, which ensures the correct order + * of odd and even lines. + */ + if (vop2->version == VOP_VERSION_RK3528) { + if (atomic_read(&vp->post_buf_empty_flag) > 0) { + atomic_set(&vp->post_buf_empty_flag, 0); + + mutex_lock(&private->ovl_lock); + vop2_wait_for_fs_by_done_bit_status(vp); + VOP_MODULE_SET(vop2, vp, p2i_en, 0); + vop2_cfg_done(&vp->crtc); + vop2_wait_for_fs_by_done_bit_status(vp); + mutex_unlock(&private->ovl_lock); + + vp->need_reset_p2i_flag = true; + } else if (vp->need_reset_p2i_flag == true) { + mutex_lock(&private->ovl_lock); + vop2_wait_for_fs_by_done_bit_status(vp); + VOP_MODULE_SET(vop2, vp, p2i_en, 1); + vop2_cfg_done(&vp->crtc); + vop2_wait_for_fs_by_done_bit_status(vp); + mutex_unlock(&private->ovl_lock); + + vp->need_reset_p2i_flag = false; + } + } +} + static int vop2_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); @@ -7454,6 +8381,23 @@ vop2->disable_afbc_win = of_property_read_bool(dev->of_node, "disable-afbc-win"); vop2->disable_win_move = of_property_read_bool(dev->of_node, "disable-win-move"); vop2->skip_ref_fb = of_property_read_bool(dev->of_node, "skip-ref-fb"); + + /* + * esmart lb mode default config at vop2_reg.c vop2_data.esmart_lb_mode, + * 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 = of_property_read_u8(dev->of_node, "esmart_lb_mode", &vop2->esmart_lb_mode); + if (ret < 0) + vop2->esmart_lb_mode = vop2->data->esmart_lb_mode; ret = vop2_win_init(vop2); if (ret) @@ -7538,6 +8482,12 @@ spin_lock_init(&vop2->irq_lock); mutex_init(&vop2->vop2_lock); + if (vop2->version == VOP_VERSION_RK3528) { + atomic_set(&vop2->vps[1].post_buf_empty_flag, 0); + vop2->workqueue = create_workqueue("post_buf_empty_wq"); + INIT_WORK(&vop2->post_buf_empty_work, post_buf_empty_work_event); + } + ret = devm_request_irq(dev, vop2->irq, vop2_isr, IRQF_SHARED, dev_name(dev), vop2); if (ret) return ret; diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.c b/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.c new file mode 100644 index 0000000..212a4b4 --- /dev/null +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.c @@ -0,0 +1,1573 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * Author: Zhang yubing <yubing.zhang@rock-chips.com> + */ + +#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, +}; + +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 post_csc *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 post_csc *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) { + DRM_ERROR("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/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.h b/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.h new file mode 100644 index 0000000..1215a5c --- /dev/null +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.h @@ -0,0 +1,18 @@ +/* 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 <drm/drm_crtc.h> +#include "rockchip_drm_drv.h" +#include "rockchip_drm_vop.h" + +int rockchip_calc_post_csc(struct post_csc *csc, struct post_csc_coef *csc_coef, + int csc_mode, bool is_input_yuv, bool is_output_yuv); + +#endif diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c b/kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c index 9ff3186..9a7b1a7 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c @@ -173,6 +173,8 @@ static void rockchip_rgb_encoder_disable(struct drm_encoder *encoder) { struct rockchip_rgb *rgb = encoder_to_rgb(encoder); + struct drm_crtc *crtc = encoder->crtc; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); if (rgb->panel) { drm_panel_disable(rgb->panel); @@ -186,6 +188,13 @@ rgb->funcs->disable(rgb); pinctrl_pm_select_sleep_state(rgb->dev); + + if (s->output_if & VOP_OUTPUT_IF_RGB) + s->output_if &= ~VOP_OUTPUT_IF_RGB; + else if (s->output_if & VOP_OUTPUT_IF_BT656) + s->output_if &= ~VOP_OUTPUT_IF_BT656; + else if (s->output_if & VOP_OUTPUT_IF_BT1120) + s->output_if &= ~VOP_OUTPUT_IF_BT1120; } static int @@ -205,39 +214,39 @@ switch (s->bus_format) { case MEDIA_BUS_FMT_RGB666_1X18: s->output_mode = ROCKCHIP_OUT_MODE_P666; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; case MEDIA_BUS_FMT_RGB565_1X16: s->output_mode = ROCKCHIP_OUT_MODE_P565; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; case MEDIA_BUS_FMT_SRGB888_3X8: s->output_mode = ROCKCHIP_OUT_MODE_S888; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; case MEDIA_BUS_FMT_SRGB888_DUMMY_4X8: s->output_mode = ROCKCHIP_OUT_MODE_S888_DUMMY; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; case MEDIA_BUS_FMT_YUYV8_2X8: case MEDIA_BUS_FMT_YVYU8_2X8: case MEDIA_BUS_FMT_UYVY8_2X8: case MEDIA_BUS_FMT_VYUY8_2X8: s->output_mode = ROCKCHIP_OUT_MODE_BT656; - s->output_if = VOP_OUTPUT_IF_BT656; + s->output_if |= VOP_OUTPUT_IF_BT656; break; case MEDIA_BUS_FMT_YUYV8_1X16: case MEDIA_BUS_FMT_YVYU8_1X16: case MEDIA_BUS_FMT_UYVY8_1X16: case MEDIA_BUS_FMT_VYUY8_1X16: s->output_mode = ROCKCHIP_OUT_MODE_BT1120; - s->output_if = VOP_OUTPUT_IF_BT1120; + s->output_if |= VOP_OUTPUT_IF_BT1120; break; case MEDIA_BUS_FMT_RGB888_1X24: case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: default: s->output_mode = ROCKCHIP_OUT_MODE_P888; - s->output_if = VOP_OUTPUT_IF_RGB; + s->output_if |= VOP_OUTPUT_IF_RGB; break; } diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index 4eddb18..5917a76 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -63,6 +63,27 @@ DRM_FORMAT_VYUY, }; +static const uint32_t formats_for_esmart[] = { + DRM_FORMAT_XRGB8888, + DRM_FORMAT_ARGB8888, + DRM_FORMAT_XBGR8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_RGB888, + DRM_FORMAT_BGR888, + DRM_FORMAT_RGB565, + DRM_FORMAT_BGR565, + DRM_FORMAT_NV12, + DRM_FORMAT_NV16, + DRM_FORMAT_NV24, + DRM_FORMAT_NV12_10, + DRM_FORMAT_NV16_10, + DRM_FORMAT_NV24_10, + DRM_FORMAT_YVYU, + DRM_FORMAT_VYUY, + DRM_FORMAT_YUYV, + DRM_FORMAT_UYVY, +}; + static const uint32_t formats_for_smart[] = { DRM_FORMAT_XRGB8888, DRM_FORMAT_ARGB8888, @@ -120,6 +141,49 @@ AFBC_FORMAT_MOD_YTR | AFBC_FORMAT_MOD_SPARSE | AFBC_FORMAT_MOD_SPLIT), + DRM_FORMAT_MOD_INVALID, +}; + +static const uint64_t format_modifiers_afbc_tiled[] = { + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16), + + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | + AFBC_FORMAT_MOD_SPARSE), + + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | + AFBC_FORMAT_MOD_YTR), + + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | + AFBC_FORMAT_MOD_CBR), + + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | + AFBC_FORMAT_MOD_YTR | + AFBC_FORMAT_MOD_SPARSE), + + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | + AFBC_FORMAT_MOD_CBR | + AFBC_FORMAT_MOD_SPARSE), + + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | + AFBC_FORMAT_MOD_YTR | + AFBC_FORMAT_MOD_CBR), + + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | + AFBC_FORMAT_MOD_YTR | + AFBC_FORMAT_MOD_CBR | + AFBC_FORMAT_MOD_SPARSE), + + /* SPLIT mandates SPARSE, RGB modes mandates YTR */ + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | + AFBC_FORMAT_MOD_YTR | + AFBC_FORMAT_MOD_SPARSE | + AFBC_FORMAT_MOD_SPLIT), + + DRM_FORMAT_MOD_ROCKCHIP_TILED(ROCKCHIP_TILED_BLOCK_SIZE_8x8), + DRM_FORMAT_MOD_ROCKCHIP_TILED(ROCKCHIP_TILED_BLOCK_SIZE_4x4_MODE0), + DRM_FORMAT_MOD_ROCKCHIP_TILED(ROCKCHIP_TILED_BLOCK_SIZE_4x4_MODE1), + + DRM_FORMAT_MOD_LINEAR, DRM_FORMAT_MOD_INVALID, }; @@ -364,6 +428,16 @@ }; +static const struct vop_intr rk3528_vop_axi_intr[] = { + { + .intrs = rk3568_vop_axi_intrs, + .nintrs = ARRAY_SIZE(rk3568_vop_axi_intrs), + .status = VOP_REG(RK3568_SYS0_INT_STATUS, 0xfe, 0), + .enable = VOP_REG_MASK(RK3568_SYS0_INT_EN, 0xfe, 0), + .clear = VOP_REG_MASK(RK3568_SYS0_INT_CLR, 0xfe, 0), + }, +}; + static const struct vop_intr rk3568_vop_axi_intr[] = { { .intrs = rk3568_vop_axi_intrs, @@ -444,6 +518,191 @@ .max_output = { 1920, 1080 }, .fifo_depth = 1920 * 4 / 16, .regs = &rk3568_vop_wb_regs, +}; + +static const struct vop2_video_port_regs rk3528_vop_vp0_regs = { + .cfg_done = VOP_REG(RK3568_REG_CFG_DONE, 0x1, 0), + .overlay_mode = VOP_REG(RK3528_OVL_PORT0_CTRL, 0x1, 0), + .dsp_background = VOP_REG(RK3568_VP0_DSP_BG, 0xffffffff, 0), + .out_mode = VOP_REG(RK3568_VP0_DSP_CTRL, 0xf, 0), + .core_dclk_div = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 4), + .dclk_div2 = VOP_REG(RK3568_VP0_MIPI_CTRL, 0x1, 4), + .dclk_div2_phase_lock = VOP_REG(RK3568_VP0_MIPI_CTRL, 0x1, 5), + .p2i_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 5), + .dsp_filed_pol = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 6), + .dsp_interlace = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 7), + .dsp_data_swap = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1f, 8), + .post_dsp_out_r2y = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 15), + .pre_dither_down_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 16), + .dither_down_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 17), + .dither_down_sel = VOP_REG(RK3568_VP0_DSP_CTRL, 0x3, 18), + .dither_down_mode = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 20), + .gamma_update_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 22), + .dsp_lut_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 28), + .standby = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 31), + .bg_mix_ctrl = VOP_REG(RK3528_OVL_PORT0_BG_MIX_CTRL, 0xffff, 0), + .bg_dly = VOP_REG(RK3528_OVL_PORT0_BG_MIX_CTRL, 0xff, 24), + .pre_scan_htiming = VOP_REG(RK3568_VP0_PRE_SCAN_HTIMING, 0x1fff1fff, 0), + .hpost_st_end = VOP_REG(RK3568_VP0_POST_DSP_HACT_INFO, 0x1fff1fff, 0), + .vpost_st_end = VOP_REG(RK3568_VP0_POST_DSP_VACT_INFO, 0x1fff1fff, 0), + .post_scl_factor = VOP_REG(RK3568_VP0_POST_SCL_FACTOR_YRGB, 0xffffffff, 0), + .post_scl_ctrl = VOP_REG(RK3568_VP0_POST_SCL_CTRL, 0x3, 0), + .htotal_pw = VOP_REG(RK3568_VP0_DSP_HTOTAL_HS_END, 0xffffffff, 0), + .hact_st_end = VOP_REG(RK3568_VP0_DSP_HACT_ST_END, 0xffffffff, 0), + .vtotal_pw = VOP_REG(RK3568_VP0_DSP_VTOTAL_VS_END, 0x1fff1fff, 0), + .vact_st_end = VOP_REG(RK3568_VP0_DSP_VACT_ST_END, 0x1fff1fff, 0), + .vact_st_end_f1 = VOP_REG(RK3568_VP0_DSP_VACT_ST_END_F1, 0x1fff1fff, 0), + .vs_st_end_f1 = VOP_REG(RK3568_VP0_DSP_VS_ST_END_F1, 0x1fff1fff, 0), + .vpost_st_end_f1 = VOP_REG(RK3568_VP0_POST_DSP_VACT_INFO_F1, 0x1fff1fff, 0), + .lut_dma_rid = VOP_REG(RK3568_SYS_AXI_LUT_CTRL, 0xf, 4), + .layer_sel = VOP_REG(RK3528_OVL_PORT0_LAYER_SEL, 0xffff, 0), + .hdr_src_color_ctrl = VOP_REG(RK3528_HDR_SRC_COLOR_CTRL, 0xffffffff, 0), + .hdr_dst_color_ctrl = VOP_REG(RK3528_HDR_DST_COLOR_CTRL, 0xffffffff, 0), + .hdr_src_alpha_ctrl = VOP_REG(RK3528_HDR_SRC_ALPHA_CTRL, 0xffffffff, 0), + .hdr_dst_alpha_ctrl = VOP_REG(RK3528_HDR_DST_ALPHA_CTRL, 0xffffffff, 0), + .hdr_lut_update_en = VOP_REG(RK3568_HDR_LUT_CTRL, 0x1, 0), + .hdr_lut_mode = VOP_REG(RK3568_HDR_LUT_CTRL, 0x1, 1), + .hdr_lut_mst = VOP_REG(RK3568_HDR_LUT_MST, 0xffffffff, 0), + .hdr_lut_fetch_done = VOP_REG(RK3528_HDR_LUT_STATUS, 0x1, 0), + .hdr10_en = VOP_REG(RK3568_OVL_CTRL, 0x1, 4), + .sdr2hdr_path_en = VOP_REG(RK3568_OVL_CTRL, 0x1, 5), + .sdr2hdr_en = VOP_REG(RK3568_SDR2HDR_CTRL, 0x1, 0), + .sdr2hdr_auto_gating_en = VOP_REG(RK3568_SDR2HDR_CTRL, 0x1, 1), + .sdr2hdr_bypass_en = VOP_REG(RK3568_SDR2HDR_CTRL, 0x1, 2), + .sdr2hdr_dstmode = VOP_REG(RK3568_SDR2HDR_CTRL, 0x1, 3), + .hdr_vivid_en = VOP_REG(RK3528_HDRVIVID_CTRL, 0x1, 0), + .hdr_vivid_bypass_en = VOP_REG(RK3528_HDRVIVID_CTRL, 0x1, 2), + .hdr_vivid_path_mode = VOP_REG(RK3528_HDRVIVID_CTRL, 0x7, 3), + .hdr_vivid_dstgamut = VOP_REG(RK3528_HDRVIVID_CTRL, 0x1, 6), + .acm_bypass_en = VOP_REG(RK3528_VP0_ACM_CTRL, 0x1, 0), + .csc_en = VOP_REG(RK3528_VP0_ACM_CTRL, 0x1, 1), + .acm_r2y_en = VOP_REG(RK3528_VP0_ACM_CTRL, 0x1, 2), + .csc_mode = VOP_REG(RK3528_VP0_ACM_CTRL, 0x7, 3), + .acm_r2y_mode = VOP_REG(RK3528_VP0_ACM_CTRL, 0x7, 8), + .csc_coe00 = VOP_REG(RK3528_VP0_ACM_CTRL, 0xffff, 16), + .csc_coe01 = VOP_REG(RK3528_VP0_CSC_COE01_02, 0xffff, 0), + .csc_coe02 = VOP_REG(RK3528_VP0_CSC_COE01_02, 0xffff, 16), + .csc_coe10 = VOP_REG(RK3528_VP0_CSC_COE10_11, 0xffff, 0), + .csc_coe11 = VOP_REG(RK3528_VP0_CSC_COE10_11, 0xffff, 16), + .csc_coe12 = VOP_REG(RK3528_VP0_CSC_COE12_20, 0xffff, 0), + .csc_coe20 = VOP_REG(RK3528_VP0_CSC_COE12_20, 0xffff, 16), + .csc_coe21 = VOP_REG(RK3528_VP0_CSC_COE21_22, 0xffff, 0), + .csc_coe22 = VOP_REG(RK3528_VP0_CSC_COE21_22, 0xffff, 16), + .csc_offset0 = VOP_REG(RK3528_VP0_CSC_OFFSET0, 0xffffffff, 0), + .csc_offset1 = VOP_REG(RK3528_VP0_CSC_OFFSET1, 0xffffffff, 0), + .csc_offset2 = VOP_REG(RK3528_VP0_CSC_OFFSET2, 0xffffffff, 0), +}; + +static const struct vop2_video_port_regs rk3528_vop_vp1_regs = { + .cfg_done = VOP_REG(RK3568_REG_CFG_DONE, 0x1, 1), + .overlay_mode = VOP_REG(RK3528_OVL_PORT1_CTRL, 0x1, 0), + .dsp_background = VOP_REG(RK3568_VP1_DSP_BG, 0xffffffff, 0), + .out_mode = VOP_REG(RK3568_VP1_DSP_CTRL, 0xf, 0), + .core_dclk_div = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 4), + .p2i_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 5), + .dsp_filed_pol = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 6), + .dsp_interlace = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 7), + .dsp_data_swap = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1f, 8), + .post_dsp_out_r2y = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 15), + .pre_dither_down_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 16), + .dither_down_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 17), + .dither_down_sel = VOP_REG(RK3568_VP1_DSP_CTRL, 0x3, 18), + .dither_down_mode = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 20), + .gamma_update_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 22), + .dsp_lut_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 28), + .standby = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 31), + .bg_mix_ctrl = VOP_REG(RK3528_OVL_PORT1_BG_MIX_CTRL, 0xffff, 0), + .bg_dly = VOP_REG(RK3528_OVL_PORT1_BG_MIX_CTRL, 0xff, 24), + .pre_scan_htiming = VOP_REG(RK3568_VP1_PRE_SCAN_HTIMING, 0x1fff1fff, 0), + .hpost_st_end = VOP_REG(RK3568_VP1_POST_DSP_HACT_INFO, 0x1fff1fff, 0), + .vpost_st_end = VOP_REG(RK3568_VP1_POST_DSP_VACT_INFO, 0x1fff1fff, 0), + .post_scl_factor = VOP_REG(RK3568_VP1_POST_SCL_FACTOR_YRGB, 0xffffffff, 0), + .post_scl_ctrl = VOP_REG(RK3568_VP1_POST_SCL_CTRL, 0x3, 0), + .htotal_pw = VOP_REG(RK3568_VP1_DSP_HTOTAL_HS_END, 0xffffffff, 0), + .hact_st_end = VOP_REG(RK3568_VP1_DSP_HACT_ST_END, 0xffffffff, 0), + .vtotal_pw = VOP_REG(RK3568_VP1_DSP_VTOTAL_VS_END, 0x1fff1fff, 0), + .vact_st_end = VOP_REG(RK3568_VP1_DSP_VACT_ST_END, 0x1fff1fff, 0), + .vact_st_end_f1 = VOP_REG(RK3568_VP1_DSP_VACT_ST_END_F1, 0x1fff1fff, 0), + .vs_st_end_f1 = VOP_REG(RK3568_VP1_DSP_VS_ST_END_F1, 0x1fff1fff, 0), + .vpost_st_end_f1 = VOP_REG(RK3568_VP1_POST_DSP_VACT_INFO_F1, 0x1fff1fff, 0), + .bcsh_brightness = VOP_REG(RK3568_VP1_BCSH_BCS, 0xff, 0), + .bcsh_contrast = VOP_REG(RK3568_VP1_BCSH_BCS, 0x1ff, 8), + .bcsh_sat_con = VOP_REG(RK3568_VP1_BCSH_BCS, 0x3ff, 20), + .bcsh_out_mode = VOP_REG(RK3568_VP1_BCSH_BCS, 0x3, 30), + .bcsh_sin_hue = VOP_REG(RK3568_VP1_BCSH_H, 0x1ff, 0), + .bcsh_cos_hue = VOP_REG(RK3568_VP1_BCSH_H, 0x1ff, 16), + .bcsh_r2y_csc_mode = VOP_REG(RK3568_VP1_BCSH_CTRL, 0x3, 6), + .bcsh_r2y_en = VOP_REG(RK3568_VP1_BCSH_CTRL, 0x1, 4), + .bcsh_y2r_csc_mode = VOP_REG(RK3568_VP1_BCSH_CTRL, 0x3, 2), + .bcsh_y2r_en = VOP_REG(RK3568_VP1_BCSH_CTRL, 0x1, 0), + .bcsh_en = VOP_REG(RK3568_VP1_BCSH_COLOR_BAR, 0x1, 31), + .lut_dma_rid = VOP_REG(RK3568_SYS_AXI_LUT_CTRL, 0xf, 4), + .layer_sel = VOP_REG(RK3528_OVL_PORT1_LAYER_SEL, 0xffff, 0), +}; + +static const struct vop3_ovl_mix_regs rk3528_vop_hdr_mix_regs = { + .src_color_ctrl = VOP_REG(RK3528_HDR_SRC_COLOR_CTRL, 0xffffffff, 0), + .dst_color_ctrl = VOP_REG(RK3528_HDR_DST_COLOR_CTRL, 0xffffffff, 0), + .src_alpha_ctrl = VOP_REG(RK3528_HDR_SRC_ALPHA_CTRL, 0xffffffff, 0), + .dst_alpha_ctrl = VOP_REG(RK3528_HDR_DST_ALPHA_CTRL, 0xffffffff, 0), +}; + +static const struct vop3_ovl_mix_regs rk3528_vop_vp0_layer_mix_regs = { + .src_color_ctrl = VOP_REG(RK3528_OVL_PORT0_MIX0_SRC_COLOR_CTRL, 0xffffffff, 0), + .dst_color_ctrl = VOP_REG(RK3528_OVL_PORT0_MIX0_DST_COLOR_CTRL, 0xffffffff, 0), + .src_alpha_ctrl = VOP_REG(RK3528_OVL_PORT0_MIX0_SRC_ALPHA_CTRL, 0xffffffff, 0), + .dst_alpha_ctrl = VOP_REG(RK3528_OVL_PORT0_MIX0_DST_ALPHA_CTRL, 0xffffffff, 0), +}; + +static const struct vop3_ovl_mix_regs rk3528_vop_vp1_layer_mix_regs = { + .src_color_ctrl = VOP_REG(RK3528_OVL_PORT1_MIX0_SRC_COLOR_CTRL, 0xffffffff, 0), + .dst_color_ctrl = VOP_REG(RK3528_OVL_PORT1_MIX0_DST_COLOR_CTRL, 0xffffffff, 0), + .src_alpha_ctrl = VOP_REG(RK3528_OVL_PORT1_MIX0_SRC_ALPHA_CTRL, 0xffffffff, 0), + .dst_alpha_ctrl = VOP_REG(RK3528_OVL_PORT1_MIX0_DST_ALPHA_CTRL, 0xffffffff, 0), +}; + +static const struct vop3_ovl_regs rk3528_vop_vp0_ovl_regs = { + .layer_mix_regs = &rk3528_vop_vp0_layer_mix_regs, + .hdr_mix_regs = &rk3528_vop_hdr_mix_regs, +}; + +static const struct vop3_ovl_regs rk3528_vop_vp1_ovl_regs = { + .layer_mix_regs = &rk3528_vop_vp1_layer_mix_regs, +}; + +static const struct vop2_video_port_data rk3528_vop_video_ports[] = { + { + .id = 0, + .soc_id = { 0x3528, 0x3528 }, + .lut_dma_rid = 14, + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN | VOP_FEATURE_VIVID_HDR | + VOP_FEATURE_POST_ACM | VOP_FEATURE_POST_CSC | VOP_FEATURE_OUTPUT_10BIT, + .gamma_lut_len = 1024, + .max_output = { 4096, 4096 }, + .hdrvivid_dly = {17, 29, 32, 44, 15, 38, 1, 29, 0, 0}, + .sdr2hdr_dly = 21, + .layer_mix_dly = 6, + .hdr_mix_dly = 2, + .win_dly = 8, + .intr = &rk3568_vp0_intr, + .regs = &rk3528_vop_vp0_regs, + .ovl_regs = &rk3528_vop_vp0_ovl_regs, + }, + { + .id = 1, + .soc_id = { 0x3528, 0x3528 }, + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, + .max_output = { 720, 576 }, + .pre_scan_max_dly = { 37, 40, 40, 40 }, + .hdrvivid_dly = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + .sdr2hdr_dly = 0, + .layer_mix_dly = 2, + .hdr_mix_dly = 0, + .win_dly = 8, + .intr = &rk3568_vp1_intr, + .regs = &rk3528_vop_vp1_regs, + .ovl_regs = &rk3528_vop_vp1_ovl_regs, + }, }; static const struct vop2_video_port_regs rk3568_vop_vp0_regs = { @@ -718,6 +977,18 @@ }, }; +static const struct vop2_cluster_regs rk3528_vop_cluster0 = { + .afbc_enable = VOP_REG(RK3568_CLUSTER0_CTRL, 0x1, 1), + .enable = VOP_REG(RK3568_CLUSTER0_CTRL, 1, 0), + .lb_mode = VOP_REG(RK3568_CLUSTER0_CTRL, 0xf, 4), + .scl_lb_mode = VOP_REG(RK3568_CLUSTER0_CTRL, 0x3, 9), + .frm_reset_en = VOP_REG(RK3568_CLUSTER0_CTRL, 1, 31), + .src_color_ctrl = VOP_REG(RK3528_CLUSTER0_MIX_SRC_COLOR_CTRL, 0xffffffff, 0), + .dst_color_ctrl = VOP_REG(RK3528_CLUSTER0_MIX_DST_COLOR_CTRL, 0xffffffff, 0), + .src_alpha_ctrl = VOP_REG(RK3528_CLUSTER0_MIX_SRC_ALPHA_CTRL, 0xffffffff, 0), + .dst_alpha_ctrl = VOP_REG(RK3528_CLUSTER0_MIX_DST_ALPHA_CTRL, 0xffffffff, 0), +}; + static const struct vop2_cluster_regs rk3568_vop_cluster0 = { .afbc_enable = VOP_REG(RK3568_CLUSTER0_CTRL, 0x1, 1), .enable = VOP_REG(RK3568_CLUSTER0_CTRL, 1, 0), @@ -758,12 +1029,32 @@ .ymirror = VOP_REG(RK3568_CLUSTER0_WIN0_AFBCD_ROTATE_MODE, 0x1, 3), }; +static const struct vop2_scl_regs rk3528_cluster0_win_scl = { + .scale_yrgb_x = VOP_REG(RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0), + .scale_yrgb_y = VOP_REG(RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB, 0xffff, 16), + .yrgb_ver_scl_mode = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL1, 0x3, 14), + .yrgb_hor_scl_mode = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL1, 0x3, 22), + + .yrgb_vscl_filter_mode = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL1, 0x3, 12),/* supported from vop3 */ + .yrgb_hscl_filter_mode = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL1, 0x3, 20),/* supported from vop3 */ + + .vsd_yrgb_gt2 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 28), + .vsd_yrgb_gt4 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 29), + .vsd_cbcr_gt2 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 30), + .vsd_cbcr_gt4 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 31), + + .vsd_avg2 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 18),/* supported from vop3 */ + .vsd_avg4 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 19), + .xavg_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 27), + .xgt_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 24), + .xgt_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x3, 25), +}; + static const struct vop2_scl_regs rk3568_cluster0_win_scl = { .scale_yrgb_x = VOP_REG(RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0), .scale_yrgb_y = VOP_REG(RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB, 0xffff, 16), .yrgb_ver_scl_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x3, 14), .yrgb_hor_scl_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x3, 12), - .bic_coe_sel = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x3, 2), .vsd_yrgb_gt2 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 28), .vsd_yrgb_gt4 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 29), }; @@ -817,6 +1108,9 @@ .vsd_yrgb_gt4 = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 9), .vsd_cbcr_gt2 = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 10), .vsd_cbcr_gt4 = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 11), + .xavg_en = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 20),/* supported from vop3 */ + .xgt_en = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 21), + .xgt_mode = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x3, 22), }; static const struct vop2_scl_regs rk3568_area1_scl = { @@ -837,6 +1131,9 @@ .vsd_yrgb_gt4 = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 9), .vsd_cbcr_gt2 = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 10), .vsd_cbcr_gt4 = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 11), + .xavg_en = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 20),/* supported from vop3 */ + .xgt_en = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 21), + .xgt_mode = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x3, 22), }; static const struct vop2_scl_regs rk3568_area2_scl = { @@ -857,6 +1154,9 @@ .vsd_yrgb_gt4 = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 9), .vsd_cbcr_gt2 = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 10), .vsd_cbcr_gt4 = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 11), + .xavg_en = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 20),/* supported from vop3 */ + .xgt_en = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 21), + .xgt_mode = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x3, 22), }; static const struct vop2_scl_regs rk3568_area3_scl = { @@ -877,6 +1177,9 @@ .vsd_yrgb_gt4 = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 9), .vsd_cbcr_gt2 = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 10), .vsd_cbcr_gt4 = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 11), + .xavg_en = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 20),/* supported from vop3 */ + .xgt_en = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 21), + .xgt_mode = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x3, 22), }; static const struct vop2_win_regs rk3568_area1_data = { @@ -933,6 +1236,31 @@ &rk3568_area3_data }; +static const struct vop2_win_regs rk3528_cluster0_win_data = { + .scl = &rk3528_cluster0_win_scl, + .afbc = &rk3568_cluster0_afbc, + .cluster = &rk3528_vop_cluster0, + .enable = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0), + .format = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x3f, 1), + .tile_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 7), + .rb_swap = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 14), + .uv_swap = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 17), + .dither_up = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 18), + .act_info = VOP_REG(RK3568_CLUSTER0_WIN0_ACT_INFO, 0x1fff1fff, 0), + .dsp_info = VOP_REG(RK3568_CLUSTER0_WIN0_DSP_INFO, 0x0fff0fff, 0), + .dsp_st = VOP_REG(RK3568_CLUSTER0_WIN0_DSP_ST, 0x1fff1fff, 0), + .yrgb_mst = VOP_REG(RK3568_CLUSTER0_WIN0_YRGB_MST, 0xffffffff, 0), + .uv_mst = VOP_REG(RK3568_CLUSTER0_WIN0_CBR_MST, 0xffffffff, 0), + .yuv_clip = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 19), + .yrgb_vir = VOP_REG(RK3568_CLUSTER0_WIN0_VIR, 0xffff, 0), + .uv_vir = VOP_REG(RK3568_CLUSTER0_WIN0_VIR, 0xffff, 16), + .y2r_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 8), + .r2y_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 9), + .csc_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x7, 10), + .axi_yrgb_id = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL2, 0x1f, 0), + .axi_uv_id = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL2, 0x1f, 5), +}; + static const struct vop2_win_regs rk3568_cluster0_win_data = { .scl = &rk3568_cluster0_win_scl, .afbc = &rk3568_cluster0_afbc, @@ -977,6 +1305,9 @@ static const struct vop2_win_regs rk3568_esmart_win_data = { .scl = &rk3568_esmart_win_scl, + .axi_yrgb_id = VOP_REG(RK3568_ESMART0_CTRL1, 0x1f, 4), + .axi_uv_id = VOP_REG(RK3568_ESMART0_CTRL1, 0x1f, 12), + .axi_id = VOP_REG(RK3568_ESMART0_AXI_CTRL, 0x1, 1), .enable = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 0), .format = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1f, 1), .dither_up = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 12), @@ -993,9 +1324,204 @@ .y2r_en = VOP_REG(RK3568_ESMART0_CTRL0, 0x1, 0), .r2y_en = VOP_REG(RK3568_ESMART0_CTRL0, 0x1, 1), .csc_mode = VOP_REG(RK3568_ESMART0_CTRL0, 0x3, 2), + .csc_13bit_en = VOP_REG(RK3568_ESMART0_CTRL0, 0x1, 16), .ymirror = VOP_REG(RK3568_ESMART0_CTRL1, 0x1, 31), .color_key = VOP_REG(RK3568_ESMART0_COLOR_KEY_CTRL, 0x3fffffff, 0), .color_key_en = VOP_REG(RK3568_ESMART0_COLOR_KEY_CTRL, 0x1, 31), + .scale_engine_num = VOP_REG(RK3568_ESMART0_CTRL0, 0x3, 12),/* supported from vop3 */ +}; + +/* + * RK3528 VOP with 1 Cluster win and 4 Esmart win. + * Every Esmart win support 4 multi-region. + * VP0 can use Cluster win and Esmart0/1/2 + * VP1 can use Esmart 2/3 + * + * Scale filter mode: + * + * * Cluster: + * * Support prescale down: + * * H/V: gt2/avg2 or gt4/avg4 + * * After prescale down: + * * nearest-neighbor/bilinear/bicubic for scale up + * * nearest-neighbor/bilinear for scale down + * + * * Esmart: + * * Support prescale down: + * * H: gt2/avg2 or gt4/avg4 + * * V: gt2 or gt4 + * * After prescale down: + * * nearest-neighbor/bilinear/bicubic for scale up + * * nearest-neighbor/bilinear/average for scale down + */ +static const struct vop2_win_data rk3528_vop_win_data[] = { + { + .name = "Esmart0-win0", + .phys_id = ROCKCHIP_VOP2_ESMART0, + .formats = formats_for_esmart, + .nformats = ARRAY_SIZE(formats_for_esmart), + .format_modifiers = format_modifiers, + .base = 0x0, + .layer_sel_id = { 1, 0xff, 0xff, 0xff }, + .supported_rotations = DRM_MODE_REFLECT_Y, + .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 */ + .regs = &rk3568_esmart_win_data, + .area = rk3568_area_data, + .area_size = ARRAY_SIZE(rk3568_area_data), + .type = DRM_PLANE_TYPE_PRIMARY, + .axi_id = 0, + .axi_yrgb_id = 0x06, + .axi_uv_id = 0x07, + .possible_crtcs = 0x1,/* vp0 only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 27, 45, 48 }, + .feature = WIN_FEATURE_MULTI_AREA | WIN_FEATURE_Y2R_13BIT_DEPTH, + }, + + { + .name = "Esmart1-win0", + .phys_id = ROCKCHIP_VOP2_ESMART1, + .formats = formats_for_esmart, + .nformats = ARRAY_SIZE(formats_for_esmart), + .format_modifiers = format_modifiers, + .base = 0x200, + .layer_sel_id = { 2, 0xff, 0xff, 0xff }, + .supported_rotations = DRM_MODE_REFLECT_Y, + .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 */ + .regs = &rk3568_esmart_win_data, + .area = rk3568_area_data, + .area_size = ARRAY_SIZE(rk3568_area_data), + .type = DRM_PLANE_TYPE_OVERLAY, + .axi_id = 0, + .axi_yrgb_id = 0x08, + .axi_uv_id = 0x09, + .possible_crtcs = 0x1,/* vp0 only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 27, 45, 48 }, + .feature = WIN_FEATURE_MULTI_AREA, + }, + + { + .name = "Esmart2-win0", + .phys_id = ROCKCHIP_VOP2_ESMART2, + .base = 0x400, + .formats = formats_for_esmart, + .nformats = ARRAY_SIZE(formats_for_esmart), + .format_modifiers = format_modifiers, + .layer_sel_id = { 3, 0, 0xff, 0xff }, + .supported_rotations = DRM_MODE_REFLECT_Y, + .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 */ + .regs = &rk3568_esmart_win_data, + .area = rk3568_area_data, + .area_size = ARRAY_SIZE(rk3568_area_data), + .type = DRM_PLANE_TYPE_CURSOR, + .axi_id = 0, + .axi_yrgb_id = 0x0a, + .axi_uv_id = 0x0b, + .possible_crtcs = 0x3,/* vp0 or vp1 */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 27, 45, 48 }, + .feature = WIN_FEATURE_MULTI_AREA, + }, + + { + .name = "Esmart3-win0", + .phys_id = ROCKCHIP_VOP2_ESMART3, + .formats = formats_for_esmart, + .nformats = ARRAY_SIZE(formats_for_esmart), + .format_modifiers = format_modifiers, + .base = 0x600, + .layer_sel_id = { 0xff, 1, 0xff, 0xff }, + .supported_rotations = DRM_MODE_REFLECT_Y, + .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 */ + .regs = &rk3568_esmart_win_data, + .area = rk3568_area_data, + .area_size = ARRAY_SIZE(rk3568_area_data), + .type = DRM_PLANE_TYPE_PRIMARY, + .axi_id = 0, + .axi_yrgb_id = 0x0c, + .axi_uv_id = 0x0d, + .possible_crtcs = 0x2,/* vp1 only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 27, 45, 48 }, + .feature = WIN_FEATURE_MULTI_AREA, + }, + + { + .name = "Cluster0-win0", + .phys_id = ROCKCHIP_VOP2_CLUSTER0, + .base = 0x00, + .formats = formats_for_cluster, + .nformats = ARRAY_SIZE(formats_for_cluster), + .format_modifiers = format_modifiers_afbc_tiled, + .layer_sel_id = { 0, 0xff, 0xff, 0xff }, + .supported_rotations = DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270 | + DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y, + .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 */ + .regs = &rk3528_cluster0_win_data, + .axi_yrgb_id = 0x02, + .axi_uv_id = 0x03, + .possible_crtcs = 0x1,/* vp0 only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .dly = { 27, 27, 21 }, + .type = DRM_PLANE_TYPE_OVERLAY, + .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_MAIN | WIN_FEATURE_Y2R_13BIT_DEPTH, + }, + + { + .name = "Cluster0-win1", + .phys_id = ROCKCHIP_VOP2_CLUSTER0, + .base = 0x80, + .layer_sel_id = { 0, 0xff, 0xff, 0xff }, + .formats = formats_for_cluster, + .nformats = ARRAY_SIZE(formats_for_cluster), + .format_modifiers = format_modifiers_afbc_tiled, + .supported_rotations = DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y, + .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 */ + .regs = &rk3528_cluster0_win_data, + .axi_yrgb_id = 0x04, + .axi_uv_id = 0x05, + .possible_crtcs = 0x1,/* vp0 only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + .type = DRM_PLANE_TYPE_OVERLAY, + .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_SUB, + }, }; /* @@ -1193,6 +1719,37 @@ }, }; +static const struct vop2_ctrl rk3528_vop_ctrl = { + .cfg_done_en = VOP_REG(RK3568_REG_CFG_DONE, 0x1, 15), + .wb_cfg_done = VOP_REG_MASK(RK3568_REG_CFG_DONE, 0x1, 14), + .auto_gating_en = VOP_REG(RK3568_SYS_AUTO_GATING_CTRL, 0x1, 31), + .aclk_pre_auto_gating_en = VOP_REG(RK3568_SYS_AUTO_GATING_CTRL, 0x1, 7), + .if_ctrl_cfg_done_imd = VOP_REG(RK3568_DSP_IF_POL, 0x1, 28), + .version = VOP_REG(RK3568_VERSION_INFO, 0xffff, 16), + .lut_dma_en = VOP_REG(RK3568_SYS_AXI_LUT_CTRL, 0x1, 0), + .dsp_vs_t_sel = VOP_REG(RK3568_SYS_AXI_LUT_CTRL, 0x1, 16), + .rgb_en = VOP_REG(RK3568_DSP_IF_EN, 0x1, 0), + .hdmi0_en = VOP_REG(RK3568_DSP_IF_EN, 0x1, 1), + .bt656_en = VOP_REG(RK3568_DSP_IF_EN, 0x1, 7), + .rgb_mux = VOP_REG(RK3568_DSP_IF_EN, 0x3, 8), + .hdmi0_mux = VOP_REG(RK3568_DSP_IF_EN, 0x3, 10), + .bt656_yc_swap = VOP_REG(RK3568_DSP_IF_CTRL, 0x1, 5), + .bt656_dclk_pol = VOP_REG(RK3568_DSP_IF_CTRL, 0x1, 6), + .hdmi_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 4), + .hdmi_dclk_pol = VOP_REG(RK3568_DSP_IF_POL, 0x1, 7), + .esmart_lb_mode = VOP_REG(RK3568_LUT_PORT_SEL, 0x3, 26), + .win_vp_id[ROCKCHIP_VOP2_CLUSTER0] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 0), + .win_vp_id[ROCKCHIP_VOP2_ESMART0] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 16), + .win_vp_id[ROCKCHIP_VOP2_ESMART1] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 20), + .win_vp_id[ROCKCHIP_VOP2_ESMART2] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 24), + .win_vp_id[ROCKCHIP_VOP2_ESMART3] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 28), + .win_dly[ROCKCHIP_VOP2_CLUSTER0] = VOP_REG(RK3528_OVL_SYS_CLUSTER0_CTRL, 0xffff, 0), + .win_dly[ROCKCHIP_VOP2_ESMART0] = VOP_REG(RK3528_OVL_SYS_ESMART0_CTRL, 0xff, 0), + .win_dly[ROCKCHIP_VOP2_ESMART1] = VOP_REG(RK3528_OVL_SYS_ESMART1_CTRL, 0xff, 0), + .win_dly[ROCKCHIP_VOP2_ESMART2] = VOP_REG(RK3528_OVL_SYS_ESMART2_CTRL, 0xff, 0), + .win_dly[ROCKCHIP_VOP2_ESMART3] = VOP_REG(RK3528_OVL_SYS_ESMART3_CTRL, 0xff, 0), +}; + static const struct vop_grf_ctrl rk3568_grf_ctrl = { .grf_bt656_clk_inv = VOP_REG(RK3568_GRF_VO_CON1, 0x1, 1), .grf_bt1120_clk_inv = VOP_REG(RK3568_GRF_VO_CON1, 0x1, 2), @@ -1235,6 +1792,7 @@ .bt656_yc_swap = VOP_REG(RK3568_DSP_IF_CTRL, 0x1, 5), .bt1120_yc_swap = VOP_REG(RK3568_DSP_IF_CTRL, 0x1, 9), .gamma_port_sel = VOP_REG(RK3568_LUT_PORT_SEL, 0x3, 0), + .rgb_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 0), .lvds_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 0), .lvds_dclk_pol = VOP_REG(RK3568_DSP_IF_POL, 0x1, 3), .hdmi_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 4), @@ -1258,6 +1816,20 @@ .otp_en = VOP_REG(RK3568_OTP_WIN_EN, 0x1, 0), }; +static const struct vop_dump_regs rk3528_dump_regs[] = { + { RK3568_REG_CFG_DONE, "SYS", {0}, 0 }, + { RK3528_OVL_SYS, "OVL_SYS", {0}, 0 }, + { RK3528_OVL_PORT0_CTRL, "OVL_VP0", VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 31), 0 }, + { RK3528_OVL_PORT1_CTRL, "OVL_VP1", VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 31), 0 }, + { RK3568_VP0_DSP_CTRL, "VP0", VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 31), 0 }, + { RK3568_VP1_DSP_CTRL, "VP1", VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 31), 0 }, + { RK3568_CLUSTER0_WIN0_CTRL0, "Cluster0", VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0), 1 }, + { RK3568_ESMART0_CTRL0, "Esmart0", VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 0), 1 }, + { RK3568_ESMART1_CTRL0, "Esmart1", VOP_REG(RK3568_ESMART1_REGION0_CTRL, 0x1, 0), 1 }, + { RK3568_SMART0_CTRL0, "Esmart2", VOP_REG(RK3568_SMART0_CTRL0, 0x1, 0), 1 }, + { RK3568_SMART1_CTRL0, "Esmart3", VOP_REG(RK3568_SMART1_CTRL0, 0x1, 0), 1 }, +}; + static const struct vop_dump_regs rk3568_dump_regs[] = { { RK3568_REG_CFG_DONE, "SYS", {0}, 0 }, { RK3568_OVL_CTRL, "OVL", {0}, 0 }, @@ -1271,6 +1843,26 @@ { RK3568_SMART0_CTRL0, "Smart0", VOP_REG(RK3568_SMART0_REGION0_CTRL, 0x1, 0), 1 }, { RK3568_SMART1_CTRL0, "Smart1", VOP_REG(RK3568_SMART1_REGION0_CTRL, 0x1, 0), 1 }, { RK3568_HDR_LUT_CTRL, "HDR", VOP_REG(RK3568_OVL_CTRL, 0x1, 4), 1 }, +}; + +static const struct vop2_data rk3528_vop = { + .version = VOP_VERSION_RK3528, + .nr_vps = 2, + .nr_mixers = 3, + .nr_layers = 4, + .nr_gammas = 2, + .esmart_lb_mode = VOP3_ESMART_4K_2K_2K_MODE, + .max_input = { 4096, 4096 }, + .max_output = { 4096, 4096 }, + .ctrl = &rk3528_vop_ctrl, + .axi_intr = rk3528_vop_axi_intr, + .nr_axi_intr = ARRAY_SIZE(rk3528_vop_axi_intr), + .vp = rk3528_vop_video_ports, + .wb = &rk3568_vop_wb_data, + .win = rk3528_vop_win_data, + .win_size = ARRAY_SIZE(rk3528_vop_win_data), + .dump_regs = rk3528_dump_regs, + .dump_regs_size = ARRAY_SIZE(rk3528_dump_regs), }; static const struct vop2_data rk3568_vop = { @@ -1295,6 +1887,8 @@ }; static const struct of_device_id vop2_dt_match[] = { + { .compatible = "rockchip,rk3528-vop", + .data = &rk3528_vop }, { .compatible = "rockchip,rk3568-vop", .data = &rk3568_vop }, {}, diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h b/kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h index 7fb5abb..0681e3e 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h @@ -1091,6 +1091,7 @@ #define RK3568_VP0_DSP_CTRL 0xC00 #define RK3568_VP0_MIPI_CTRL 0xC04 #define RK3568_VP0_COLOR_BAR_CTRL 0xC08 +#define RK3568_VP0_DCLK_SEL 0xC0C #define RK3568_VP0_3D_LUT_CTRL 0xC10 #define RK3568_VP0_3D_LUT_MST 0xC20 #define RK3568_VP0_DSP_BG 0xC2C @@ -1110,6 +1111,16 @@ #define RK3568_VP0_BCSH_BCS 0xC64 #define RK3568_VP0_BCSH_H 0xC68 #define RK3568_VP0_BCSH_COLOR_BAR 0xC6C +#define RK3528_VP0_ACM_CTRL 0xCD0 +#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 RK3528_VP0_MCU_CTRL 0xCF8 +#define RK3528_VP0_MCU_RW_BYPASS_PORT 0xCFC #define RK3568_VP1_DSP_CTRL 0xD00 #define RK3568_VP1_MIPI_CTRL 0xD04 @@ -1133,6 +1144,8 @@ #define RK3568_VP1_BCSH_BCS 0xD64 #define RK3568_VP1_BCSH_H 0xD68 #define RK3568_VP1_BCSH_COLOR_BAR 0xD6C +#define RK3528_VP1_MCU_CTRL 0xDF8 +#define RK3528_VP1_MCU_RW_BYPASS_PORT 0xDFC #define RK3568_VP2_DSP_CTRL 0xE00 #define RK3568_VP2_MIPI_CTRL 0xE04 @@ -1157,7 +1170,76 @@ #define RK3568_VP2_BCSH_H 0xE68 #define RK3568_VP2_BCSH_COLOR_BAR 0xE6C -/* Overlay registers definition */ +#define RK3588_VP3_DSP_CTRL 0xF00 +#define RK3588_VP3_DUAL_CHANNEL_CTRL 0xF04 +#define RK3588_VP3_COLOR_BAR_CTRL 0xF08 +#define RK3568_VP3_CLK_CTRL 0xF0C +#define RK3588_VP3_DSP_BG 0xF2C +#define RK3588_VP3_PRE_SCAN_HTIMING 0xF30 +#define RK3588_VP3_POST_DSP_HACT_INFO 0xF34 +#define RK3588_VP3_POST_DSP_VACT_INFO 0xF38 +#define RK3588_VP3_POST_SCL_FACTOR_YRGB 0xF3C +#define RK3588_VP3_POST_SCL_CTRL 0xF40 +#define RK3588_VP3_DSP_HACT_INFO 0xF34 +#define RK3588_VP3_DSP_VACT_INFO 0xF38 +#define RK3588_VP3_POST_DSP_VACT_INFO_F1 0xF44 +#define RK3588_VP3_DSP_HTOTAL_HS_END 0xF48 +#define RK3588_VP3_DSP_HACT_ST_END 0xF4C +#define RK3588_VP3_DSP_VTOTAL_VS_END 0xF50 +#define RK3588_VP3_DSP_VACT_ST_END 0xF54 +#define RK3588_VP3_DSP_VS_ST_END_F1 0xF58 +#define RK3588_VP3_DSP_VACT_ST_END_F1 0xF5C +#define RK3588_VP3_BCSH_CTRL 0xF60 +#define RK3588_VP3_BCSH_BCS 0xF64 +#define RK3588_VP3_BCSH_H 0xF68 +#define RK3588_VP3_BCSH_COLOR_BAR 0xF6C +#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 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 RK3528_OVL_PORT0_LAYER_SEL 0x604 +#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 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 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 + #define RK3568_OVL_CTRL 0x600 #define RK3568_OVL_LAYER_SEL 0x604 #define RK3568_OVL_PORT_SEL 0x608 @@ -1186,6 +1268,8 @@ /* Cluster0 register definition */ #define RK3568_CLUSTER0_WIN0_CTRL0 0x1000 #define RK3568_CLUSTER0_WIN0_CTRL1 0x1004 +#define RK3528_CLUSTER0_WIN0_CTRL1 0x1004 +#define RK3528_CLUSTER0_WIN0_CTRL2 0x1008 #define RK3568_CLUSTER0_WIN0_YRGB_MST 0x1010 #define RK3568_CLUSTER0_WIN0_CBR_MST 0x1014 #define RK3568_CLUSTER0_WIN0_VIR 0x1018 @@ -1205,6 +1289,8 @@ #define RK3568_CLUSTER0_WIN1_CTRL0 0x1080 #define RK3568_CLUSTER0_WIN1_CTRL1 0x1084 +#define RK3528_CLUSTER0_WIN1_CTRL1 0x1084 +#define RK3528_CLUSTER0_WIN1_CTRL2 0x1088 #define RK3568_CLUSTER0_WIN1_YRGB_MST 0x1090 #define RK3568_CLUSTER0_WIN1_CBR_MST 0x1094 #define RK3568_CLUSTER0_WIN1_VIR 0x1098 @@ -1265,6 +1351,7 @@ /* Esmart register definition */ #define RK3568_ESMART0_CTRL0 0x1800 #define RK3568_ESMART0_CTRL1 0x1804 +#define RK3568_ESMART0_AXI_CTRL 0x1808 #define RK3568_ESMART0_REGION0_CTRL 0x1810 #define RK3568_ESMART0_REGION0_YRGB_MST 0x1814 #define RK3568_ESMART0_REGION0_CBR_MST 0x1818 @@ -1466,4 +1553,83 @@ #define RK3568_HDR_EOTF_OETF_Y0 0x20F0 #define RK3568_HDR_OETF_DX_POW1 0x2200 #define RK3568_HDR_OETF_XN1 0x2300 + +/* RK3528 HDR register definition */ +#define RK3528_HDR_LUT_CTRL 0x2000 +#define RK3528_HDR_LUT_MST 0x2004 +#define RK3528_HDR_LUT_STATUS 0x2008 +#define RK3528_SDR2HDR_CTRL 0x2010 +#define RK3528_SDR_CFG_COE0 0x2014 +#define RK3528_SDR_CFG_COE1 0x2018 +#define RK3528_SDR_CSC_COE00_01 0x201C +#define RK3528_SDR_CSC_COE02_10 0x2020 +#define RK3528_SDR_CSC_COE11_12 0x2024 +#define RK3528_SDR_CSC_COE20_21 0x2028 +#define RK3528_SDR_CSC_COE22 0x202C +#define RK3528_HDRVIVID_CTRL 0x2040 +#define RK3528_HDR_PQ_GAMMA 0x2044 +#define RK3528_HLG_RFIX_SCALEFAC 0x2048 +#define RK3528_HLG_MAXLUMA 0x204C +#define RK3528_HLG_R_TM_LIN2NON 0x2050 +#define RK3528_HDR_CSC_COE00_01 0x2054 +#define RK3528_HDR_CSC_COE02_10 0x2058 +#define RK3528_HDR_CSC_COE11_12 0x205C +#define RK3528_HDR_CSC_COE20_21 0x2060 +#define RK3528_HDR_CSC_COE22 0x2064 +#define RK3528_INK_CFG 0x2080 +#define RK3528_INK_POINT0_CFG 0x2084 +#define RK3528_INK_POINT1_CFG 0x2088 +#define RK3528_INK_POINT0_R0 0x208C +#define RK3528_INK_POINT0_G0 0x2090 +#define RK3528_INK_POINT0_B0 0x2094 +#define RK3528_INK_POINT0_R1 0x2098 +#define RK3528_INK_POINT0_G1 0x209C +#define RK3528_INK_POINT0_B1 0x20A0 +#define RK3528_INK_POINT1_R0 0x20A4 +#define RK3528_INK_POINT1_G0 0x20A8 +#define RK3528_INK_POINT1_B0 0x20AC +#define RK3528_INK_POINT1_R1 0x20B0 +#define RK3528_INK_POINT1_G1 0x20B4 +#define RK3528_INK_POINT1_B1 0x20B8 +#define RK3528_HDR_TONE_SCA 0x213C +#define RK3528_HDRGAMMA_CURVE 0x2540 +#define RK3528_HDRGAMMA_MDFVALUE 0x2690 +#define RK3528_SDRINVGAMMA_CURVE 0x2700 +#define RK3528_SDRINVGAMMA_STARTIDX 0x2820 +#define RK3528_SDRINVGAMMA_CHANGEIDX 0x2840 +#define RK3528_SDR_SMGAIN 0x2900 + +/* RK3588 ACM register definition */ +#define RK3528_ACM_CTRL 0x0000 +#define RK3528_ACM_ENABLE BIT(0) +#define RK3528_ACM_BYPASS BIT(1) +#define RK3528_ACM_DELTA_RANGE 0x0004 +#define RK3528_ACM_FETCH_START 0x0008 +#define RK3528_ACM_DEBUG_POINT0 0x0010 +#define RK3528_ACM_DEBUG_POINT1 0x0014 +#define RK3528_ACM_DEBUG_POINT2 0x0018 +#define RK3528_ACM_DEBUG_POINT3 0x001c +#define RK3528_ACM_FETCH_DONE 0x0020 +#define RK3528_ACM_DEBUG0_DATA0 0x0030 +#define RK3528_ACM_DEBUG0_DATA1 0x0034 +#define RK3528_ACM_DEBUG0_DATA2 0x0038 +#define RK3528_ACM_DEBUG0_DATA3 0x003c +#define RK3528_ACM_DEBUG1_DATA0 0x0040 +#define RK3528_ACM_DEBUG1_DATA1 0x0044 +#define RK3528_ACM_DEBUG1_DATA2 0x0048 +#define RK3528_ACM_DEBUG1_DATA3 0x004c +#define RK3528_ACM_DEBUG2_DATA0 0x0050 +#define RK3528_ACM_DEBUG2_DATA1 0x0054 +#define RK3528_ACM_DEBUG2_DATA2 0x0058 +#define RK3528_ACM_DEBUG2_DATA3 0x005c +#define RK3528_ACM_DEBUG3_DATA0 0x0060 +#define RK3528_ACM_DEBUG3_DATA1 0x0064 +#define RK3528_ACM_DEBUG3_DATA2 0x0068 +#define RK3528_ACM_DEBUG3_DATA3 0x006c +#define RK3528_ACM_YHS_DEL_HY_SEG0 0x0100 +#define RK3528_ACM_YHS_DEL_HY_SEG152 0x0360 +#define RK3528_ACM_YHS_DEL_HS_SEG0 0x0364 +#define RK3528_ACM_YHS_DEL_HS_SEG220 0x06d4 +#define RK3528_ACM_YHS_DEL_HGAIN_SEG0 0x06d8 +#define RK3528_ACM_YHS_DEL_HGAIN_SEG64 0x07d8 #endif /* _ROCKCHIP_VOP_REG_H */ diff --git a/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c index d0fd147..fb5a346 100644 --- a/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +++ b/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c @@ -167,10 +167,8 @@ { u32 *fifo_mem = dev_priv->mmio_virt; - preempt_disable(); if (cmpxchg(fifo_mem + SVGA_FIFO_BUSY, 0, 1) == 0) vmw_write(dev_priv, SVGA_REG_SYNC, reason); - preempt_enable(); } void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) diff --git a/kernel/drivers/headset_observe/rk_headset.c b/kernel/drivers/headset_observe/rk_headset.c index 54d4af1..5b16db7 100644 --- a/kernel/drivers/headset_observe/rk_headset.c +++ b/kernel/drivers/headset_observe/rk_headset.c @@ -153,7 +153,6 @@ { int level = 0; int level2 = 0; - int ret; struct rk_headset_pdata *pdata = headset_info->pdata; static unsigned int old_status = 0; @@ -183,11 +182,6 @@ headset_info->headset_status ? "in" : "out"); if (headset_info->headset_status == HEADSET_IN) { headset_info->cur_headset_status = BIT_HEADSET_NO_MIC; - ret = gpio_direction_output(pdata->spk_ctl_gpio,0); - if (ret < 0) { - printk("spk_ctl_gpio set direction fail\n"); - } - if (pdata->headset_insert_type == HEADSET_IN_HIGH) irq_set_irq_type(headset_info->irq[HEADSET], IRQF_TRIGGER_FALLING); @@ -202,10 +196,6 @@ goto out; } } else if (headset_info->headset_status == HEADSET_OUT) { - ret = gpio_direction_output(pdata->spk_ctl_gpio,1); - if (ret < 0) { - printk("spk_ctl_gpio set direction fail\n"); - } headset_info->hook_status = HOOK_UP; if (headset_info->isHook_irq == enable) { DBG("disable headset_hook irq\n"); diff --git a/kernel/drivers/headset_observe/rk_headset.h b/kernel/drivers/headset_observe/rk_headset.h index ffde994..c10961c 100644 --- a/kernel/drivers/headset_observe/rk_headset.h +++ b/kernel/drivers/headset_observe/rk_headset.h @@ -11,7 +11,6 @@ struct rk_headset_pdata { /* heaset about */ unsigned int headset_gpio; - unsigned int spk_ctl_gpio; /* Headphones into the state level */ unsigned int headset_insert_type; /* hook about */ diff --git a/kernel/drivers/headset_observe/rockchip_headset_core.c b/kernel/drivers/headset_observe/rockchip_headset_core.c index de4f548..3c2eeb7 100644 --- a/kernel/drivers/headset_observe/rockchip_headset_core.c +++ b/kernel/drivers/headset_observe/rockchip_headset_core.c @@ -73,35 +73,6 @@ HEADSET_IN_LOW : HEADSET_IN_HIGH; } - - /* spk-ctl */ - ret = of_get_named_gpio_flags(node, "spk_ctl_gpio", 0, &flags); - if (ret < 0) { - dev_err(&pdev->dev, "Can not read property headset_gpio\n"); - goto err; - } else { - pdata->spk_ctl_gpio = ret; - ret = devm_gpio_request(&pdev->dev, pdata->spk_ctl_gpio, - "spk_ctl_gpio"); - if (ret < 0) { - dev_err(&pdev->dev, "spk_ctl_gpio request fail\n"); - goto err; - } - - ret = gpio_get_value(pdata->headset_gpio); - printk(" headset_gpio value : %d\n",ret); - if (ret == 0) - ret = gpio_direction_output(pdata->spk_ctl_gpio,0); - else - ret = gpio_direction_output(pdata->spk_ctl_gpio,1); - if (ret < 0) { - dev_err(&pdev->dev, - "spk_ctl_gpio set direction fail\n"); - goto err; - } - } - - /* hook */ ret = of_get_named_gpio_flags(node, "hook_gpio", 0, &pdata->hook_gpio); if (ret < 0) { diff --git a/kernel/drivers/hv/hv.c b/kernel/drivers/hv/hv.c index 12bc9fa..278f03f 100644 --- a/kernel/drivers/hv/hv.c +++ b/kernel/drivers/hv/hv.c @@ -112,10 +112,12 @@ static void hv_stimer0_isr(void) { struct hv_per_cpu_context *hv_cpu; + struct pt_regs *regs = get_irq_regs(); + u64 ip = regs ? instruction_pointer(regs) : 0; hv_cpu = this_cpu_ptr(hv_context.cpu_context); hv_cpu->clk_evt->event_handler(hv_cpu->clk_evt); - add_interrupt_randomness(stimer0_vector, 0); + add_interrupt_randomness(stimer0_vector, 0, ip); } static int hv_ce_set_next_event(unsigned long delta, diff --git a/kernel/drivers/hv/hyperv_vmbus.h b/kernel/drivers/hv/hyperv_vmbus.h index c4ad518..14af29c 100644 --- a/kernel/drivers/hv/hyperv_vmbus.h +++ b/kernel/drivers/hv/hyperv_vmbus.h @@ -32,6 +32,7 @@ #include <linux/atomic.h> #include <linux/hyperv.h> #include <linux/interrupt.h> +#include <linux/irq.h> #include "hv_trace.h" diff --git a/kernel/drivers/hv/vmbus_drv.c b/kernel/drivers/hv/vmbus_drv.c index 51fe219..0df4a07 100644 --- a/kernel/drivers/hv/vmbus_drv.c +++ b/kernel/drivers/hv/vmbus_drv.c @@ -1103,6 +1103,8 @@ void *page_addr = hv_cpu->synic_event_page; struct hv_message *msg; union hv_synic_event_flags *event; + struct pt_regs *regs = get_irq_regs(); + u64 ip = regs ? instruction_pointer(regs) : 0; bool handled = false; if (unlikely(page_addr == NULL)) @@ -1146,7 +1148,7 @@ tasklet_schedule(&hv_cpu->msg_dpc); } - add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0); + add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0, ip); } /* diff --git a/kernel/drivers/i2c/busses/i2c-exynos5.c b/kernel/drivers/i2c/busses/i2c-exynos5.c index c1ce229..5c57ecf 100644 --- a/kernel/drivers/i2c/busses/i2c-exynos5.c +++ b/kernel/drivers/i2c/busses/i2c-exynos5.c @@ -800,9 +800,7 @@ } ret = devm_request_irq(&pdev->dev, i2c->irq, exynos5_i2c_irq, - IRQF_NO_SUSPEND | IRQF_ONESHOT, - dev_name(&pdev->dev), i2c); - + IRQF_NO_SUSPEND, dev_name(&pdev->dev), i2c); if (ret != 0) { dev_err(&pdev->dev, "cannot request HS-I2C IRQ %d\n", i2c->irq); goto err_clk; diff --git a/kernel/drivers/i2c/busses/i2c-hix5hd2.c b/kernel/drivers/i2c/busses/i2c-hix5hd2.c index b5ad769..0f08ef1 100644 --- a/kernel/drivers/i2c/busses/i2c-hix5hd2.c +++ b/kernel/drivers/i2c/busses/i2c-hix5hd2.c @@ -449,8 +449,7 @@ hix5hd2_i2c_init(priv); ret = devm_request_irq(&pdev->dev, irq, hix5hd2_i2c_irq, - IRQF_NO_SUSPEND | IRQF_ONESHOT, - dev_name(&pdev->dev), priv); + IRQF_NO_SUSPEND, dev_name(&pdev->dev), priv); if (ret != 0) { dev_err(&pdev->dev, "cannot request HS-I2C IRQ %d\n", irq); goto err_clk; diff --git a/kernel/drivers/iio/adc/rockchip_saradc.c b/kernel/drivers/iio/adc/rockchip_saradc.c index 6806017..c07b4c1 100644 --- a/kernel/drivers/iio/adc/rockchip_saradc.c +++ b/kernel/drivers/iio/adc/rockchip_saradc.c @@ -321,6 +321,21 @@ .power_down = rockchip_saradc_power_down_v1, }; +static const struct iio_chan_spec rockchip_rk3528_saradc_iio_channels[] = { + SARADC_CHANNEL(0, "adc0", 10), + SARADC_CHANNEL(1, "adc1", 10), + SARADC_CHANNEL(2, "adc2", 10), + SARADC_CHANNEL(3, "adc3", 10), +}; + +static const struct rockchip_saradc_data rk3528_saradc_data = { + .channels = rockchip_rk3528_saradc_iio_channels, + .num_channels = ARRAY_SIZE(rockchip_rk3528_saradc_iio_channels), + .clk_rate = 1000000, + .start = rockchip_saradc_start_v2, + .read = rockchip_saradc_read_v2, +}; + static const struct iio_chan_spec rockchip_rk3568_saradc_iio_channels[] = { SARADC_CHANNEL(0, "adc0", 10), SARADC_CHANNEL(1, "adc1", 10), @@ -384,6 +399,9 @@ .compatible = "rockchip,rk3399-saradc", .data = &rk3399_saradc_data, }, { + .compatible = "rockchip,rk3528-saradc", + .data = &rk3528_saradc_data, + }, { .compatible = "rockchip,rk3568-saradc", .data = &rk3568_saradc_data, }, { diff --git a/kernel/drivers/iio/imu/inv_icm40605/icm40605.h b/kernel/drivers/iio/imu/inv_icm40605/icm40605.h index b3be8fb..10c01d1 100644 --- a/kernel/drivers/iio/imu/inv_icm40605/icm40605.h +++ b/kernel/drivers/iio/imu/inv_icm40605/icm40605.h @@ -361,6 +361,7 @@ #define FIFO_FSYNC_BITS 0x0C #define HAVANA_MAX_PACKET_SIZE 20 #define ICM40605_FIFO_COUNT_LIMIT 60 +#define ICM40605_DATA_BUFF_SIZE 960 // BANK SEL enum icm40605_bank_index { @@ -427,7 +428,7 @@ s64 period_max; int period_divider; int interrupt_regval; - u8 data_buff[ICM40605_FIFO_COUNT_LIMIT]; + u8 data_buff[ICM40605_DATA_BUFF_SIZE]; }; /* scan indexes follow DATA register order */ diff --git a/kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c b/kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c index 122b098..a76c274 100644 --- a/kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c +++ b/kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c @@ -224,8 +224,6 @@ icm40605_update_period(st, pf->timestamp, fifo_count); data_len = bytes_per_datum * fifo_count; - if (data_len > ICM40605_FIFO_COUNT_LIMIT) - data_len = ICM40605_FIFO_COUNT_LIMIT; result = regmap_bulk_read(st->regmap, MPUREG_FIFO_DATA_REG, st->data_buff, data_len); diff --git a/kernel/drivers/infiniband/hw/hfi1/affinity.c b/kernel/drivers/infiniband/hw/hfi1/affinity.c index 01ed0a6..2c62de6 100644 --- a/kernel/drivers/infiniband/hw/hfi1/affinity.c +++ b/kernel/drivers/infiniband/hw/hfi1/affinity.c @@ -1039,7 +1039,7 @@ struct hfi1_affinity_node *entry; cpumask_var_t diff, hw_thread_mask, available_mask, intrs_mask; const struct cpumask *node_mask, - *proc_mask = ¤t->cpus_allowed; + *proc_mask = current->cpus_ptr; struct hfi1_affinity_node_list *affinity = &node_affinity; struct cpu_mask_set *set = &affinity->proc; @@ -1047,7 +1047,7 @@ * check whether process/context affinity has already * been set */ - if (cpumask_weight(proc_mask) == 1) { + if (current->nr_cpus_allowed == 1) { hfi1_cdbg(PROC, "PID %u %s affinity set to CPU %*pbl", current->pid, current->comm, cpumask_pr_args(proc_mask)); @@ -1058,7 +1058,7 @@ cpu = cpumask_first(proc_mask); cpumask_set_cpu(cpu, &set->used); goto done; - } else if (cpumask_weight(proc_mask) < cpumask_weight(&set->mask)) { + } else if (current->nr_cpus_allowed < cpumask_weight(&set->mask)) { hfi1_cdbg(PROC, "PID %u %s affinity set to CPU set(s) %*pbl", current->pid, current->comm, cpumask_pr_args(proc_mask)); diff --git a/kernel/drivers/infiniband/hw/hfi1/sdma.c b/kernel/drivers/infiniband/hw/hfi1/sdma.c index 38258de..3ee680f 100644 --- a/kernel/drivers/infiniband/hw/hfi1/sdma.c +++ b/kernel/drivers/infiniband/hw/hfi1/sdma.c @@ -853,14 +853,13 @@ { struct sdma_rht_node *rht_node; struct sdma_engine *sde = NULL; - const struct cpumask *current_mask = ¤t->cpus_allowed; unsigned long cpu_id; /* * To ensure that always the same sdma engine(s) will be * selected make sure the process is pinned to this CPU only. */ - if (cpumask_weight(current_mask) != 1) + if (current->nr_cpus_allowed != 1) goto out; cpu_id = smp_processor_id(); diff --git a/kernel/drivers/infiniband/hw/qib/qib_file_ops.c b/kernel/drivers/infiniband/hw/qib/qib_file_ops.c index 98e1ce1..5d38286 100644 --- a/kernel/drivers/infiniband/hw/qib/qib_file_ops.c +++ b/kernel/drivers/infiniband/hw/qib/qib_file_ops.c @@ -1142,7 +1142,7 @@ static void assign_ctxt_affinity(struct file *fp, struct qib_devdata *dd) { struct qib_filedata *fd = fp->private_data; - const unsigned int weight = cpumask_weight(¤t->cpus_allowed); + const unsigned int weight = current->nr_cpus_allowed; const struct cpumask *local_mask = cpumask_of_pcibus(dd->pcidev->bus); int local_cpu; @@ -1623,9 +1623,8 @@ ret = find_free_ctxt(i_minor - 1, fp, uinfo); else { int unit; - const unsigned int cpu = cpumask_first(¤t->cpus_allowed); - const unsigned int weight = - cpumask_weight(¤t->cpus_allowed); + const unsigned int cpu = cpumask_first(current->cpus_ptr); + const unsigned int weight = current->nr_cpus_allowed; if (weight == 1 && !test_bit(cpu, qib_cpulist)) if (!find_hca(cpu, &unit) && unit >= 0) diff --git a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c index 4392f57..cb11a10 100644 --- a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c +++ b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c @@ -335,9 +335,12 @@ return IRQ_NONE; if ((val & PWM_CH_POL(id)) == 0) { temp_hpr = readl_relaxed(ddata->base + PWM_REG_HPR); - DBG("hpr=%d\n", temp_hpr); + writel_relaxed(0, ddata->base + PWM_REG_HPR); temp_lpr = readl_relaxed(ddata->base + PWM_REG_LPR); + writel_relaxed(0, ddata->base + PWM_REG_LPR); + DBG("hpr=%d\n", temp_hpr); DBG("lpr=%d\n", temp_lpr); + temp_period = ddata->pwm_freq_nstime * temp_lpr / 1000; if (temp_period > RK_PWM_TIME_BIT0_MIN) { ddata->period = ddata->temp_period diff --git a/kernel/drivers/iommu/iommu.c b/kernel/drivers/iommu/iommu.c index 8f3c832..b9621b5 100644 --- a/kernel/drivers/iommu/iommu.c +++ b/kernel/drivers/iommu/iommu.c @@ -1762,9 +1762,6 @@ mapped += s->length; } - if (domain->ops->flush_iotlb_all && (prot & IOMMU_TLB_SHOT_ENTIRE)) - domain->ops->flush_iotlb_all(domain); - return mapped; out_err: diff --git a/kernel/drivers/iommu/rockchip-iommu.c b/kernel/drivers/iommu/rockchip-iommu.c index 38e70c1..4a8481a 100644 --- a/kernel/drivers/iommu/rockchip-iommu.c +++ b/kernel/drivers/iommu/rockchip-iommu.c @@ -114,6 +114,7 @@ dma_addr_t dt_dma; spinlock_t iommus_lock; /* lock for iommus list */ spinlock_t dt_lock; /* lock for modifying page directory table */ + bool shootdown_entire; struct iommu_domain domain; }; @@ -132,11 +133,14 @@ bool skip_read; /* rk3126/rk3128 can't read vop iommu registers */ bool dlr_disable; /* avoid access iommu when runtime ops called */ bool cmd_retry; + bool master_handle_irq; struct iommu_device iommu; struct list_head node; /* entry in rk_iommu_domain.iommus */ struct iommu_domain *domain; /* domain to which iommu is attached */ struct iommu_group *group; u32 version; + bool shootdown_entire; + bool need_res_map; }; struct rk_iommudata { @@ -146,6 +150,9 @@ }; static struct device *dma_dev; +static struct rk_iommu *rk_iommu_from_dev(struct device *dev); +static char reserve_range[PAGE_SIZE] __aligned(PAGE_SIZE); +static phys_addr_t res_page; static inline void rk_table_flush(struct rk_iommu_domain *dom, dma_addr_t dma, unsigned int count) @@ -290,6 +297,8 @@ #define RK_PTE_PAGE_READABLE_V2 BIT(2) #define RK_PTE_PAGE_WRITABLE_V2 BIT(1) +#define RK_PTE_PAGE_REPRESENT BIT(3) + static inline phys_addr_t rk_pte_page_address(u32 pte) { return (phys_addr_t)pte & RK_PTE_PAGE_ADDRESS_MASK; @@ -311,6 +320,11 @@ return pte & RK_PTE_PAGE_VALID; } +static inline bool rk_pte_is_page_represent(u32 pte) +{ + return pte & RK_PTE_PAGE_REPRESENT; +} + /* TODO: set cache flags per prot IOMMU_CACHE */ static u32 rk_mk_pte(phys_addr_t page, int prot) { @@ -318,6 +332,8 @@ flags |= (prot & IOMMU_READ) ? RK_PTE_PAGE_READABLE : 0; flags |= (prot & IOMMU_WRITE) ? RK_PTE_PAGE_WRITABLE : 0; + flags |= (prot & IOMMU_PRIV) ? RK_PTE_PAGE_REPRESENT : 0; + page &= RK_PTE_PAGE_ADDRESS_MASK; return page | flags | RK_PTE_PAGE_VALID; } @@ -328,6 +344,12 @@ flags |= (prot & IOMMU_READ) ? RK_PTE_PAGE_READABLE_V2 : 0; flags |= (prot & IOMMU_WRITE) ? RK_PTE_PAGE_WRITABLE_V2 : 0; + /* If BIT(3) set, don't break iommu_map if BIT(0) set. + * Means we can reupdate a page that already presented. We can use + * this bit to reupdate a pre-mapped 4G range. + */ + flags |= (prot & IOMMU_PRIV) ? RK_PTE_PAGE_REPRESENT : 0; + page = (page & PAGE_DESC_LO_MASK) | ((page & PAGE_DESC_HI_MASK1) >> PAGE_DESC_HI_SHIFT1) | (page & PAGE_DESC_HI_MASK2) >> PAGE_DESC_HI_SHIFT2; @@ -337,7 +359,7 @@ static u32 rk_mk_pte_invalid(u32 pte) { - return pte & ~RK_PTE_PAGE_VALID; + return pte & ~(RK_PTE_PAGE_VALID | RK_PTE_PAGE_REPRESENT); } /* @@ -686,22 +708,14 @@ rk_pte_is_page_valid(pte), &page_addr_phys, page_flags); } -static irqreturn_t rk_iommu_irq(int irq, void *dev_id) +static int rk_pagefault_done(struct rk_iommu *iommu) { - struct rk_iommu *iommu = dev_id; u32 status; u32 int_status; - u32 int_mask; dma_addr_t iova; + int i; + u32 int_mask; irqreturn_t ret = IRQ_NONE; - int i, err; - - err = pm_runtime_get_if_in_use(iommu->dev); - if (WARN_ON_ONCE(err <= 0)) - return ret; - - if (WARN_ON(clk_bulk_enable(iommu->num_clocks, iommu->clocks))) - goto out; for (i = 0; i < iommu->num_mmu; i++) { int_status = rk_iommu_read(iommu->bases[i], RK_MMU_INT_STATUS); @@ -724,16 +738,18 @@ log_iova(iommu, i, iova); - /* - * Report page fault to any installed handlers. - * Ignore the return code, though, since we always zap cache - * and clear the page fault anyway. - */ - if (iommu->domain) - report_iommu_fault(iommu->domain, iommu->dev, iova, + if (!iommu->master_handle_irq) { + /* + * Report page fault to any installed handlers. + * Ignore the return code, though, since we always zap cache + * and clear the page fault anyway. + */ + if (iommu->domain) + report_iommu_fault(iommu->domain, iommu->dev, iova, status); - else - dev_err(iommu->dev, "Page fault while iommu not attached to domain?\n"); + else + dev_err(iommu->dev, "Page fault while iommu not attached to domain?\n"); + } rk_iommu_base_command(iommu->bases[i], RK_MMU_CMD_ZAP_CACHE); @@ -755,6 +771,46 @@ int_status); rk_iommu_write(iommu->bases[i], RK_MMU_INT_CLEAR, int_status); + } + + return ret; +} + +int rockchip_pagefault_done(struct device *master_dev) +{ + struct rk_iommu *iommu = rk_iommu_from_dev(master_dev); + + return rk_pagefault_done(iommu); +} +EXPORT_SYMBOL_GPL(rockchip_pagefault_done); + +void __iomem *rockchip_get_iommu_base(struct device *master_dev, int idx) +{ + struct rk_iommu *iommu = rk_iommu_from_dev(master_dev); + + return iommu->bases[idx]; +} +EXPORT_SYMBOL_GPL(rockchip_get_iommu_base); + +static irqreturn_t rk_iommu_irq(int irq, void *dev_id) +{ + struct rk_iommu *iommu = dev_id; + irqreturn_t ret = IRQ_NONE; + int err; + + err = pm_runtime_get_if_in_use(iommu->dev); + if (WARN_ON_ONCE(err <= 0)) + return ret; + + if (WARN_ON(clk_bulk_enable(iommu->num_clocks, iommu->clocks))) + goto out; + + /* Master must call rockchip_pagefault_done to handle pagefault */ + if (iommu->master_handle_irq) { + if (iommu->domain) + ret = report_iommu_fault(iommu->domain, iommu->dev, -1, 0x0); + } else { + ret = rk_pagefault_done(iommu); } clk_bulk_disable(iommu->num_clocks, iommu->clocks); @@ -825,6 +881,10 @@ { struct list_head *pos; unsigned long flags; + + /* Do not zap tlb cache line if shootdown_entire set */ + if (rk_domain->shootdown_entire) + return; /* shootdown these iova from all iommus using this domain */ spin_lock_irqsave(&rk_domain->iommus_lock, flags); @@ -936,10 +996,11 @@ static size_t rk_iommu_unmap_iova(struct rk_iommu_domain *rk_domain, u32 *pte_addr, dma_addr_t pte_dma, - size_t size) + size_t size, struct rk_iommu *iommu) { unsigned int pte_count; unsigned int pte_total = size / SPAGE_SIZE; + int prot = IOMMU_READ | IOMMU_WRITE | IOMMU_PRIV; assert_spin_locked(&rk_domain->dt_lock); @@ -948,12 +1009,36 @@ if (!rk_pte_is_page_valid(pte)) break; - pte_addr[pte_count] = rk_mk_pte_invalid(pte); + if (iommu && iommu->need_res_map) { + if (iommu->version >= 0x2) + pte_addr[pte_count] = rk_mk_pte_v2(res_page, + prot); + else + pte_addr[pte_count] = rk_mk_pte(res_page, prot); + } else { + pte_addr[pte_count] = rk_mk_pte_invalid(pte); + } } rk_table_flush(rk_domain, pte_dma, pte_count); return pte_count * SPAGE_SIZE; +} + +static struct rk_iommu *rk_iommu_get(struct rk_iommu_domain *rk_domain) +{ + unsigned long flags; + struct list_head *pos; + struct rk_iommu *iommu = NULL; + + spin_lock_irqsave(&rk_domain->iommus_lock, flags); + list_for_each(pos, &rk_domain->iommus) { + iommu = list_entry(pos, struct rk_iommu, node); + if (iommu->need_res_map) + break; + } + spin_unlock_irqrestore(&rk_domain->iommus_lock, flags); + return iommu; } static int rk_iommu_map_iova(struct rk_iommu_domain *rk_domain, u32 *pte_addr, @@ -969,12 +1054,15 @@ for (pte_count = 0; pte_count < pte_total; pte_count++) { u32 pte = pte_addr[pte_count]; - if (rk_pte_is_page_valid(pte)) + if (rk_pte_is_page_valid(pte) && !rk_pte_is_page_represent(pte)) goto unwind; - pte_addr[pte_count] = rk_mk_pte(paddr, prot); - - paddr += SPAGE_SIZE; + if (prot & IOMMU_PRIV) { + pte_addr[pte_count] = rk_mk_pte(res_page, prot); + } else { + pte_addr[pte_count] = rk_mk_pte(paddr, prot); + paddr += SPAGE_SIZE; + } } rk_table_flush(rk_domain, pte_dma, pte_total); @@ -985,16 +1073,13 @@ * We only zap the first and last iova, since only they could have * dte or pte shared with an existing mapping. */ - - /* Do not zap tlb cache line if IOMMU_TLB_SHOT_ENTIRE set */ - if (!(prot & IOMMU_TLB_SHOT_ENTIRE)) - rk_iommu_zap_iova_first_last(rk_domain, iova, size); + rk_iommu_zap_iova_first_last(rk_domain, iova, size); return 0; unwind: /* Unmap the range of iovas that we just mapped */ rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, - pte_count * SPAGE_SIZE); + pte_count * SPAGE_SIZE, NULL); iova += pte_count * SPAGE_SIZE; page_phys = rk_pte_page_address(pte_addr[pte_count]); @@ -1017,12 +1102,15 @@ for (pte_count = 0; pte_count < pte_total; pte_count++) { u32 pte = pte_addr[pte_count]; - if (rk_pte_is_page_valid(pte)) + if (rk_pte_is_page_valid(pte) && !rk_pte_is_page_represent(pte)) goto unwind; - pte_addr[pte_count] = rk_mk_pte_v2(paddr, prot); - - paddr += SPAGE_SIZE; + if (prot & IOMMU_PRIV) { + pte_addr[pte_count] = rk_mk_pte_v2(res_page, prot); + } else { + pte_addr[pte_count] = rk_mk_pte_v2(paddr, prot); + paddr += SPAGE_SIZE; + } } rk_table_flush(rk_domain, pte_dma, pte_total); @@ -1033,16 +1121,13 @@ * We only zap the first and last iova, since only they could have * dte or pte shared with an existing mapping. */ - - /* Do not zap tlb cache line if IOMMU_TLB_SHOT_ENTIRE set */ - if (!(prot & IOMMU_TLB_SHOT_ENTIRE)) - rk_iommu_zap_iova_first_last(rk_domain, iova, size); + rk_iommu_zap_iova_first_last(rk_domain, iova, size); return 0; unwind: /* Unmap the range of iovas that we just mapped */ rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, - pte_count * SPAGE_SIZE); + pte_count * SPAGE_SIZE, NULL); iova += pte_count * SPAGE_SIZE; page_phys = rk_pte_page_address_v2(pte_addr[pte_count]); @@ -1136,6 +1221,7 @@ u32 dte; u32 *pte_addr; size_t unmap_size; + struct rk_iommu *iommu = rk_iommu_get(rk_domain); spin_lock_irqsave(&rk_domain->dt_lock, flags); @@ -1156,7 +1242,8 @@ pt_phys = rk_dte_pt_address(dte); pte_addr = (u32 *)phys_to_virt(pt_phys) + rk_iova_pte_index(iova); pte_dma = pt_phys + rk_iova_pte_index(iova) * sizeof(u32); - unmap_size = rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, size); + unmap_size = rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, size, + iommu); spin_unlock_irqrestore(&rk_domain->dt_lock, flags); @@ -1176,6 +1263,7 @@ u32 dte; u32 *pte_addr; size_t unmap_size; + struct rk_iommu *iommu = rk_iommu_get(rk_domain); spin_lock_irqsave(&rk_domain->dt_lock, flags); @@ -1196,7 +1284,8 @@ pt_phys = rk_dte_pt_address_v2(dte); pte_addr = (u32 *)phys_to_virt(pt_phys) + rk_iova_pte_index(iova); pte_dma = pt_phys + rk_iova_pte_index(iova) * sizeof(u32); - unmap_size = rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, size); + unmap_size = rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, size, + iommu); spin_unlock_irqrestore(&rk_domain->dt_lock, flags); @@ -1345,6 +1434,28 @@ } EXPORT_SYMBOL(rockchip_iommu_is_enabled); +int rockchip_iommu_force_reset(struct device *dev) +{ + struct rk_iommu *iommu; + int ret; + + iommu = rk_iommu_from_dev(dev); + if (!iommu) + return -ENODEV; + + ret = rk_iommu_enable_stall(iommu); + if (ret) + return ret; + + ret = rk_iommu_force_reset(iommu); + + rk_iommu_disable_stall(iommu); + + return ret; + +} +EXPORT_SYMBOL(rockchip_iommu_force_reset); + static void rk_iommu_detach_device(struct iommu_domain *domain, struct device *dev) { @@ -1413,6 +1524,7 @@ list_add_tail(&iommu->node, &rk_domain->iommus); spin_unlock_irqrestore(&rk_domain->iommus_lock, flags); + rk_domain->shootdown_entire = iommu->shootdown_entire; ret = pm_runtime_get_if_in_use(iommu->dev); if (!ret || WARN_ON_ONCE(ret < 0)) return 0; @@ -1764,11 +1876,16 @@ "rockchip,skip-mmu-read"); iommu->dlr_disable = device_property_read_bool(dev, "rockchip,disable-device-link-resume"); - + iommu->shootdown_entire = device_property_read_bool(dev, + "rockchip,shootdown-entire"); + iommu->master_handle_irq = device_property_read_bool(dev, + "rockchip,master-handle-irq"); if (of_machine_is_compatible("rockchip,rv1126") || of_machine_is_compatible("rockchip,rv1109")) iommu->cmd_retry = device_property_read_bool(dev, "rockchip,enable-cmd-retry"); + iommu->need_res_map = device_property_read_bool(dev, + "rockchip,reserve-map"); /* * iommu clocks should be present for all new devices and devicetrees @@ -1839,6 +1956,10 @@ } skip_request_irq: + if (!res_page && iommu->need_res_map) { + res_page = __pa_symbol(reserve_range); + pr_info("%s,%d, res_page = 0x%pa\n", __func__, __LINE__, &res_page); + } return 0; err_remove_sysfs: iommu_device_sysfs_remove(&iommu->iommu); @@ -1854,9 +1975,13 @@ struct rk_iommu *iommu = platform_get_drvdata(pdev); int i = 0, irq; + if (iommu->skip_read) + goto skip_free_irq; + while ((irq = platform_get_irq(pdev, i++)) != -ENXIO) devm_free_irq(iommu->dev, irq, iommu); +skip_free_irq: pm_runtime_force_suspend(&pdev->dev); } diff --git a/kernel/drivers/irqchip/irq-gic-v3-its.c b/kernel/drivers/irqchip/irq-gic-v3-its.c index c730208..2cd131d 100644 --- a/kernel/drivers/irqchip/irq-gic-v3-its.c +++ b/kernel/drivers/irqchip/irq-gic-v3-its.c @@ -179,6 +179,7 @@ static DEFINE_IDA(its_vpeid_ida); #define gic_data_rdist() (raw_cpu_ptr(gic_rdists->rdist)) +#define gic_data_rdist_cpu(cpu) (per_cpu_ptr(gic_rdists->rdist, cpu)) #define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base) #define gic_data_rdist_vlpi_base() (gic_data_rdist_rd_base() + SZ_128K) @@ -1661,7 +1662,7 @@ get_order(LPI_PROPBASE_SZ)); } -static int __init its_alloc_lpi_tables(void) +static int __init its_alloc_lpi_prop_table(void) { phys_addr_t paddr; @@ -2023,29 +2024,46 @@ return val; } +static int __init allocate_lpi_tables(void) +{ + int err, cpu; + + err = its_alloc_lpi_prop_table(); + if (err) + return err; + + /* + * We allocate all the pending tables anyway, as we may have a + * mix of RDs that have had LPIs enabled, and some that + * don't. We'll free the unused ones as each CPU comes online. + */ + for_each_possible_cpu(cpu) { + struct page *pend_page; + + pend_page = its_allocate_pending_table(GFP_NOWAIT); + if (!pend_page) { + pr_err("Failed to allocate PENDBASE for CPU%d\n", cpu); + return -ENOMEM; + } + + gic_data_rdist_cpu(cpu)->pend_page = pend_page; + } + + return 0; +} + static void its_cpu_init_lpis(void) { void __iomem *rbase = gic_data_rdist_rd_base(); struct page *pend_page; + phys_addr_t paddr; u64 val, tmp; - /* If we didn't allocate the pending table yet, do it now */ + if (gic_data_rdist()->lpi_enabled) + return; + pend_page = gic_data_rdist()->pend_page; - if (!pend_page) { - phys_addr_t paddr; - - pend_page = its_allocate_pending_table(GFP_NOWAIT); - if (!pend_page) { - pr_err("Failed to allocate PENDBASE for CPU%d\n", - smp_processor_id()); - return; - } - - paddr = page_to_phys(pend_page); - pr_info("CPU%d: using LPI pending table @%pa\n", - smp_processor_id(), &paddr); - gic_data_rdist()->pend_page = pend_page; - } + paddr = page_to_phys(pend_page); /* set PROPBASE */ val = (page_to_phys(gic_rdists->prop_page) | @@ -2128,6 +2146,10 @@ /* Make sure the GIC has seen the above */ dsb(sy); + gic_data_rdist()->lpi_enabled = true; + pr_info("GICv3: CPU%d: using LPI pending table @%pa\n", + smp_processor_id(), + &paddr); } static void its_cpu_init_collection(struct its_node *its) @@ -3623,16 +3645,6 @@ u64 timeout = USEC_PER_SEC; u64 val; - /* - * If coming via a CPU hotplug event, we don't need to disable - * LPIs before trying to re-enable them. They are already - * configured and all is well in the world. Detect this case - * by checking the allocation of the pending table for the - * current CPU. - */ - if (gic_data_rdist()->pend_page) - return 0; - if (!gic_rdists_supports_plpis()) { pr_info("CPU%d: LPIs not supported\n", smp_processor_id()); return -ENXIO; @@ -3642,7 +3654,18 @@ if (!(val & GICR_CTLR_ENABLE_LPIS)) return 0; - pr_warn("CPU%d: Booted with LPIs enabled, memory probably corrupted\n", + /* + * If coming via a CPU hotplug event, we don't need to disable + * LPIs before trying to re-enable them. They are already + * configured and all is well in the world. + */ + if (gic_data_rdist()->lpi_enabled) + return 0; + + /* + * From that point on, we only try to do some damage control. + */ + pr_warn("GICv3: CPU%d: Booted with LPIs enabled, memory probably corrupted\n", smp_processor_id()); add_taint(TAINT_CRAP, LOCKDEP_STILL_OK); @@ -3898,7 +3921,8 @@ } gic_rdists = rdists; - err = its_alloc_lpi_tables(); + + err = allocate_lpi_tables(); if (err) return err; diff --git a/kernel/drivers/leds/trigger/Kconfig b/kernel/drivers/leds/trigger/Kconfig index 4018af76..b4ce8c1 100644 --- a/kernel/drivers/leds/trigger/Kconfig +++ b/kernel/drivers/leds/trigger/Kconfig @@ -63,6 +63,7 @@ config LEDS_TRIGGER_CPU bool "LED CPU Trigger" + depends on !PREEMPT_RT_BASE help This allows LEDs to be controlled by active CPUs. This shows the active CPUs across an array of LEDs so you can see which diff --git a/kernel/drivers/mailbox/rockchip-mailbox.c b/kernel/drivers/mailbox/rockchip-mailbox.c index 4b8718e..b55c3a3 100644 --- a/kernel/drivers/mailbox/rockchip-mailbox.c +++ b/kernel/drivers/mailbox/rockchip-mailbox.c @@ -24,6 +24,8 @@ #define MAILBOX_B2A_CMD(x) (0x30 + (x) * 8) #define MAILBOX_B2A_DAT(x) (0x34 + (x) * 8) +#define MAILBOX_POLLING_MS 5 /* default polling interval 5ms */ + struct rockchip_mbox_data { int num_chans; }; @@ -99,10 +101,21 @@ spin_unlock(&mb->cfg_lock); } +static bool rockchip_mbox_last_tx_done(struct mbox_chan *chan) +{ + struct rockchip_mbox *mb = dev_get_drvdata(chan->mbox->dev); + struct rockchip_mbox_chan *chans = chan->con_priv; + u32 status; + + status = readl_relaxed(mb->mbox_base + MAILBOX_A2B_STATUS); + return !(status & (1U << chans->idx)); +} + static const struct mbox_chan_ops rockchip_mbox_chan_ops = { .send_data = rockchip_mbox_send_data, .startup = rockchip_mbox_startup, .shutdown = rockchip_mbox_shutdown, + .last_tx_done = rockchip_mbox_last_tx_done, }; int rockchip_mbox_read_msg(struct mbox_chan *chan, @@ -172,6 +185,7 @@ const struct rockchip_mbox_data *drv_data; struct resource *res; int ret, irq, i; + u32 txpoll_period; if (!pdev->dev.of_node) return -ENODEV; @@ -203,9 +217,12 @@ mb->mbox.dev = &pdev->dev; mb->mbox.num_chans = drv_data->num_chans; mb->mbox.ops = &rockchip_mbox_chan_ops; - mb->mbox.txdone_irq = true; spin_lock_init(&mb->cfg_lock); + mb->mbox.txdone_poll = true; + ret = device_property_read_u32(&pdev->dev, "rockchip,txpoll-period-ms", &txpoll_period); + mb->mbox.txpoll_period = !ret ? txpoll_period : MAILBOX_POLLING_MS; + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -ENODEV; diff --git a/kernel/drivers/md/bcache/Kconfig b/kernel/drivers/md/bcache/Kconfig index f6e0a8b..18c03d7 100644 --- a/kernel/drivers/md/bcache/Kconfig +++ b/kernel/drivers/md/bcache/Kconfig @@ -1,6 +1,7 @@ config BCACHE tristate "Block device as cache" + depends on !PREEMPT_RT_FULL select CRC64 help Allows a block device to be used as cache for other devices; uses diff --git a/kernel/drivers/md/dm-rq.c b/kernel/drivers/md/dm-rq.c index 2957a37..bc8192b 100644 --- a/kernel/drivers/md/dm-rq.c +++ b/kernel/drivers/md/dm-rq.c @@ -689,7 +689,6 @@ /* Establish tio->ti before queuing work (map_tio_request) */ tio->ti = ti; kthread_queue_work(&md->kworker, &tio->work); - BUG_ON(!irqs_disabled()); } } diff --git a/kernel/drivers/md/raid5.c b/kernel/drivers/md/raid5.c index c7bda4b..8eb2347 100644 --- a/kernel/drivers/md/raid5.c +++ b/kernel/drivers/md/raid5.c @@ -2069,8 +2069,9 @@ struct raid5_percpu *percpu; unsigned long cpu; - cpu = get_cpu(); + cpu = get_cpu_light(); percpu = per_cpu_ptr(conf->percpu, cpu); + spin_lock(&percpu->lock); if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) { ops_run_biofill(sh); overlap_clear++; @@ -2129,7 +2130,8 @@ if (test_and_clear_bit(R5_Overlap, &dev->flags)) wake_up(&sh->raid_conf->wait_for_overlap); } - put_cpu(); + spin_unlock(&percpu->lock); + put_cpu_light(); } static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh) @@ -6816,6 +6818,7 @@ __func__, cpu); return -ENOMEM; } + spin_lock_init(&per_cpu_ptr(conf->percpu, cpu)->lock); return 0; } @@ -6826,7 +6829,6 @@ conf->percpu = alloc_percpu(struct raid5_percpu); if (!conf->percpu) return -ENOMEM; - err = cpuhp_state_add_instance(CPUHP_MD_RAID5_PREPARE, &conf->node); if (!err) { conf->scribble_disks = max(conf->raid_disks, diff --git a/kernel/drivers/md/raid5.h b/kernel/drivers/md/raid5.h index 8474c22..a3bf907 100644 --- a/kernel/drivers/md/raid5.h +++ b/kernel/drivers/md/raid5.h @@ -637,6 +637,7 @@ int recovery_disabled; /* per cpu variables */ struct raid5_percpu { + spinlock_t lock; /* Protection for -RT */ struct page *spare_page; /* Used when checking P/Q in raid6 */ struct flex_array *scribble; /* space for constructing buffer * lists and performing address diff --git a/kernel/drivers/media/cec/cec-adap.c b/kernel/drivers/media/cec/cec-adap.c index a77f961..efb6dfd 100644 --- a/kernel/drivers/media/cec/cec-adap.c +++ b/kernel/drivers/media/cec/cec-adap.c @@ -4,7 +4,7 @@ * * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved. */ - +#include <linux/delay.h> #include <linux/errno.h> #include <linux/init.h> #include <linux/module.h> @@ -457,7 +457,12 @@ if (adap->transmit_in_progress) { int err; + /* in rk platform 400ms is enough */ + int time_out_ms = 400; + /* poll msg only need 100ms */ + if (adap->transmitting && adap->transmitting->msg.len == 1) + time_out_ms = 100; /* * We are transmitting a message, so add a timeout * to prevent the state machine to get stuck waiting @@ -471,7 +476,7 @@ kthread_should_stop() || (!adap->transmit_in_progress && !list_empty(&adap->transmit_queue)), - msecs_to_jiffies(CEC_XFER_TIMEOUT_MS)); + msecs_to_jiffies(time_out_ms)); timeout = err == 0; } else { /* Otherwise we just wait for something to happen. */ @@ -532,19 +537,11 @@ adap->transmitting = data; /* - * Suggested number of attempts as per the CEC 2.0 spec: - * 4 attempts is the default, except for 'secondary poll - * messages', i.e. poll messages not sent during the adapter - * configuration phase when it allocates logical addresses. + * The number of retries is not set before the first sending, + * but is set according to the actual sending result. */ - if (data->msg.len == 1 && adap->is_configured) - attempts = 2; - else -#ifdef CONFIG_ANDROID - attempts = 1; -#else - attempts = 4; -#endif + attempts = 0; + /* Set the suggested signal free time */ if (data->attempts) { /* should be >= 3 data bit periods for a retry */ @@ -610,6 +607,28 @@ adap->transmit_in_progress = false; goto wake_thread; } + + if (!(status & CEC_TX_STATUS_OK)) { + /* poll message is prefer to send twice */ + if (nack_cnt && data->msg.len == 1) { + /* first send is successful or recover from bus busy */ + if (!data->attempts || data->attempts > 2) + data->attempts = 2; + usleep_range(200, 300); + /* + * If cec bus is busy, need retry. + * Especially when TV wakes up STB, TV will + * send cec messages then occupy cec bus. + * The longest cec message takes more than 300 ms to send, + * so retry in 400 ms. + */ + } else { + if (!data->attempts) + data->attempts = 200; + usleep_range(2000, 2200); + } + } + adap->transmit_in_progress = false; msg = &data->msg; @@ -1362,6 +1381,7 @@ unsigned int type = las->log_addr_type[i]; const u8 *la_list; u8 last_la; + const u8 invalid_log_addrs[] = { CEC_LOG_ADDR_INVALID }; /* * The TV functionality can only map to physical address 0. @@ -1386,6 +1406,8 @@ if (err < 0) goto unconfigure; + la_list = invalid_log_addrs; + for (j = 0; la_list[j] != CEC_LOG_ADDR_INVALID; j++) { /* Tried this one already, skip it */ if (la_list[j] == last_la) diff --git a/kernel/drivers/media/i2c/Kconfig b/kernel/drivers/media/i2c/Kconfig index b76e2db..a982b86 100644 --- a/kernel/drivers/media/i2c/Kconfig +++ b/kernel/drivers/media/i2c/Kconfig @@ -748,6 +748,17 @@ To compile this driver as a module, choose M here: the module will be called imx219. +config VIDEO_IMX241 + tristate "Sony IMX241 sensor support" + depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API + depends on MEDIA_CAMERA_SUPPORT + help + This is a Video4Linux2 sensor driver for the Sony + IMX241 camera. + + To compile this driver as a module, choose M here: the + module will be called imx241. + config VIDEO_IMX258 tristate "Sony IMX258 sensor support" depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API diff --git a/kernel/drivers/media/i2c/Makefile b/kernel/drivers/media/i2c/Makefile index 924215b..5b2057d 100644 --- a/kernel/drivers/media/i2c/Makefile +++ b/kernel/drivers/media/i2c/Makefile @@ -155,6 +155,7 @@ obj-$(CONFIG_VIDEO_IMX214) += imx214.o obj-$(CONFIG_VIDEO_IMX214_EEPROM) += imx214_eeprom.o obj-$(CONFIG_VIDEO_IMX219) += imx219.o +obj-$(CONFIG_VIDEO_IMX241) += imx241.o obj-$(CONFIG_VIDEO_IMX258) += imx258.o obj-$(CONFIG_VIDEO_IMX258_EEPROM) += imx258_eeprom.o obj-$(CONFIG_VIDEO_IMX274) += imx274.o diff --git a/kernel/drivers/media/i2c/gc2145.c b/kernel/drivers/media/i2c/gc2145.c index bb7388e..0ea0b91 100644 --- a/kernel/drivers/media/i2c/gc2145.c +++ b/kernel/drivers/media/i2c/gc2145.c @@ -2583,8 +2583,11 @@ } ret = gc2145_ioctl(sd, cmd, inf); - if (!ret) + if (!ret) { ret = copy_to_user(up, inf, sizeof(*inf)); + if (ret) + ret = -EFAULT; + } kfree(inf); break; case RKMODULE_AWB_CFG: @@ -2597,12 +2600,16 @@ ret = copy_from_user(cfg, up, sizeof(*cfg)); if (!ret) ret = gc2145_ioctl(sd, cmd, cfg); + else + ret = -EFAULT; kfree(cfg); break; case RKMODULE_SET_QUICK_STREAM: ret = copy_from_user(&stream, up, sizeof(u32)); if (!ret) ret = gc2145_ioctl(sd, cmd, &stream); + else + ret = -EFAULT; break; default: ret = -ENOIOCTLCMD; @@ -2871,7 +2878,7 @@ if (ret) dev_info(dev, "Failed to get power regulators\n"); - return __gc2145_power_on(gc2145); + return ret; } static int gc2145_probe(struct i2c_client *client, @@ -2915,11 +2922,6 @@ ret = gc2145_parse_of(gc2145); if (ret != 0) - return -EINVAL; - - gc2145->xvclk_frequency = clk_get_rate(gc2145->xvclk); - if (gc2145->xvclk_frequency < 6000000 || - gc2145->xvclk_frequency > 27000000) return -EINVAL; v4l2_ctrl_handler_init(&gc2145->ctrls, 3); @@ -2972,6 +2974,12 @@ gc2145->fps = DIV_ROUND_CLOSEST(gc2145->framesize_cfg[0].max_fps.denominator, gc2145->framesize_cfg[0].max_fps.numerator); + __gc2145_power_on(gc2145); + gc2145->xvclk_frequency = clk_get_rate(gc2145->xvclk); + if (gc2145->xvclk_frequency < 6000000 || + gc2145->xvclk_frequency > 27000000) + goto error; + ret = gc2145_detect(gc2145); if (ret < 0) { dev_info(&client->dev, "Check id failed:\n" diff --git a/kernel/drivers/media/i2c/imx241.c b/kernel/drivers/media/i2c/imx241.c new file mode 100644 index 0000000..7889754 --- /dev/null +++ b/kernel/drivers/media/i2c/imx241.c @@ -0,0 +1,1356 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * imx241 camera driver + * + * Copyright (C) 2022 Rockchip Electronics Co., Ltd. + * + * V0.0X01.0X00 first version. + * V0.0X01.0X01 fix compile errors. + * V0.0X01.0X02 add 4lane mode support. + * + */ + +#include <linux/clk.h> +#include <linux/device.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/pm_runtime.h> +#include <linux/regulator/consumer.h> +#include <linux/sysfs.h> +#include <linux/slab.h> +#include <linux/version.h> +#include <linux/rk-camera-module.h> +#include <media/media-entity.h> +#include <media/v4l2-async.h> +#include <media/v4l2-ctrls.h> +#include <media/v4l2-subdev.h> +#include <media/v4l2-fwnode.h> +#include <media/v4l2-mediabus.h> +#include <linux/pinctrl/consumer.h> +#include <linux/rk-preisp.h> +#include <linux/of_graph.h> + +#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x02) + +#ifndef V4L2_CID_DIGITAL_GAIN +#define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN +#endif + +#define IMX241_LINK_FREQ_400MHZ 400000000U +/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */ +#define IMX241_PIXEL_RATE (IMX241_LINK_FREQ_400MHZ * 2LL * 2LL / 10LL) +#define IMX241_XVCLK_FREQ 24000000 + +#define CHIP_ID 0x40 +#define IMX241_REG_CHIP_ID 0x3032 + +#define IMX241_REG_CTRL_MODE 0x0100 +#define IMX241_MODE_SW_STANDBY 0x0 +#define IMX241_MODE_STREAMING BIT(0) + +#define IMX241_REG_EXPOSURE 0x0202 +#define IMX241_EXPOSURE_MIN 1 +#define IMX241_EXPOSURE_STEP 1 +#define IMX241_VTS_MAX 0xffff + +#define IMX241_REG_GAIN 0x0205 +#define IMX241_GAIN_MIN 0x100 +#define IMX241_GAIN_MAX 0x1000 +#define IMX241_GAIN_STEP 0x1 +#define IMX241_GAIN_DEFAULT (8 * IMX241_GAIN_MIN) + +#define IMX241_REG_TEST_PATTERN 0x0600 +#define IMX241_TEST_PATTERN_ENABLE 0x100 +#define IMX241_TEST_PATTERN_DISABLE 0x0 + +#define IMX241_REG_VTS 0x0340 + +#define REG_NULL 0xFFFF + +#define IMX241_REG_VALUE_08BIT 1 +#define IMX241_REG_VALUE_16BIT 2 +#define IMX241_REG_VALUE_24BIT 3 + +#define IMX241_BITS_PER_SAMPLE 10 + +#define OF_CAMERA_PINCTRL_STATE_DEFAULT "rockchip,camera_default" +#define OF_CAMERA_PINCTRL_STATE_SLEEP "rockchip,camera_sleep" + +#define IMX241_NAME "imx241" +#define IMX241_MEDIA_BUS_FMT MEDIA_BUS_FMT_SRGGB10_1X10 + +static const char * const imx241_supply_names[] = { + "avdd", /* Analog power */ + "dovdd", /* Digital I/O power */ + "dvdd", /* Digital core power */ +}; + +#define IMX241_NUM_SUPPLIES ARRAY_SIZE(imx241_supply_names) + +struct regval { + u16 addr; + u8 val; +}; + +struct imx241_mode { + u32 bus_fmt; + u32 width; + u32 height; + struct v4l2_fract max_fps; + u32 hts_def; + u32 vts_def; + u32 exp_def; + u32 link_freq_idx; + u32 bpp; + const struct regval *reg_list; +}; + +struct imx241 { + struct i2c_client *client; + struct clk *xvclk; + struct gpio_desc *power_gpio; + struct gpio_desc *reset_gpio; + struct gpio_desc *pwdn_gpio; + struct regulator_bulk_data supplies[IMX241_NUM_SUPPLIES]; + + struct pinctrl *pinctrl; + struct pinctrl_state *pins_default; + struct pinctrl_state *pins_sleep; + + struct v4l2_subdev subdev; + struct media_pad pad; + struct v4l2_ctrl_handler ctrl_handler; + struct v4l2_ctrl *exposure; + struct v4l2_ctrl *anal_gain; + struct v4l2_ctrl *digi_gain; + struct v4l2_ctrl *hblank; + struct v4l2_ctrl *vblank; + struct v4l2_ctrl *pixel_rate; + struct v4l2_ctrl *link_freq; + struct v4l2_ctrl *test_pattern; + struct mutex mutex; + struct v4l2_fwnode_endpoint bus_cfg; + bool streaming; + bool power_on; + const struct imx241_mode *support_modes; + const struct imx241_mode *cur_mode; + u32 module_index; + u32 cfg_num; + const char *module_facing; + const char *module_name; + const char *len_name; + struct rkmodule_inf module_inf; + struct rkmodule_awb_cfg awb_cfg; + struct rkmodule_lsc_cfg lsc_cfg; +}; + +#define to_imx241(sd) container_of(sd, struct imx241, subdev) + +static const struct regval imx241_2592x1944_30fps_regs_2lane[] = { + {0x0101, 0x00}, + {0x303C, 0x4B}, // 24M MCLK + {0x303D, 0x00}, + {0x3041, 0xD7}, + {0x30E0, 0x00}, + {0x30E1, 0x00}, + {0x30F6, 0x00}, //Embedded Data Line output control + {0x34CE, 0xFF}, + + // Mode Setting + {0x0340, 0x08}, + {0x0341, 0xF0}, // 2288, lines vts + {0x0342, 0x05}, + {0x0343, 0xB0}, // 1456, line length / 2, hts / 2 + {0x0344, 0x00}, // x_addr_start[12:8] + {0x0345, 0x00}, // x_addr_start[7:0] + {0x0346, 0x00}, // y_addr_start[11:8] + {0x0347, 0x00}, // y_addr_start[7:0] + + + {0x0348, 0x0A}, // x_addr_end[12:8] + {0x0349, 0x1F}, // x_addr_end[7:0], 2591 + {0x034A, 0x07}, // y_addr_end[11:8] + {0x034B, 0x97}, // y_addr_end[7:0], 1943 + + /* binning setting */ + {0x0381, 0x01}, // x_even_inc[3:0] + {0x0383, 0x01}, // x_odd_inc[3:0] + {0x0385, 0x01}, // y_even_inc[3:0] + {0x0387, 0x01}, // y_odd_inc[3:0] + {0x3048, 0x20}, + {0x30D5, 0x00}, + {0x3165, 0x20}, + {0x30D1, 0x00}, + {0x30D0, 0x2A}, + {0x3102, 0x13}, + {0x3103, 0x47}, + {0x3049, 0x01}, + {0x304D, 0x02}, + {0x304C, 0xD7}, + {0x0112, 0x0A}, + {0x0113, 0x0A}, + + {0x034C, 0x0A}, // x_output_size[12:8] + {0x034D, 0x20}, // x_output_size[7:0], 2592 + {0x034E, 0x07}, // y_output_size[11:8] + {0x034F, 0x98}, // y_output_size[7:0], 1944 + + /* + * Frame Rate [frame/s] = Logic Clock/(frame_length_lines x line_length_pck) + * Logic Clock + * = PLCK (PLL output clock frequency) x Logic clock division ratio + * = (INCK frequency x PreDivider ratio setting x PLL multiplier setting ) x + * Divider2 frequency division ratio x Divider4 frequency division ratio + * + * PLCK = 24M x (1/3) x 125 = 1000M + * Logic Clock = 1000M x (1/5) x (1/2) = 100M + * fps = 100M / 2288 / 1456 = 30fps + */ + {0x0305, 0x03}, // Pre Dividers setting, 1/3 + {0x0307, 0x7D}, // PLL multiplication setting, 125 + + {0x3037, 0x0A}, // Divider2: Pre divider setting, 1/5 + {0x3038, 0x01}, // Divider4: Logic Clock divider setting, 1/2 + {0x303E, 0x01}, // Divider3: CK_PIXEL divider setting, 1/2 + {0x30A2, 0x0E}, + {0x30A5, 0x60}, + {0x30A7, 0x40}, + {0x31AA, 0x02}, + + {0x3301, 0x00}, + {0x3318, 0x60}, // MIPI Global Timing + + + {0x0202, 0x08}, // coarse_integration_time + {0x0203, 0xEB}, + + {0x0204, 0x00}, + {0x0205, 0x00}, // analogue_gain_code_global + + {0x020E, 0x01}, // DIG_GAIN_GR [15:8] + {0x020F, 0x00}, // DIG_GAIN_GR [7:0] + + {0x0210, 0x01}, // DIG_GAIN_R [15:8] + {0x0211, 0x00}, // DIG_GAIN_R [7:0] + + {0x0212, 0x01}, // DIG_GAIN_B [15:8] + {0x0213, 0x00}, // DIG_GAIN_B [15:8] + + {0x0215, 0x00}, // DIG_GAIN_B [7:0] + + {0x0100, 0x00}, + + {0xFFFF, 0xFF}, +}; + +static const struct imx241_mode supported_modes_2lane[] = { + { + .width = 2592, + .height = 1944, + .max_fps = { + .numerator = 10000, + .denominator = 300000, + }, + .exp_def = 0x0630, + .hts_def = 0xBE0, + .vts_def = 0x08F0, + .bpp = 10, + .bus_fmt = IMX241_MEDIA_BUS_FMT, + .reg_list = imx241_2592x1944_30fps_regs_2lane, + .link_freq_idx = 0, + }, +}; + +static const s64 link_freq_items[] = { + IMX241_LINK_FREQ_400MHZ, +}; + +static const char * const imx241_test_pattern_menu[] = { + "Disabled", + "Solid Clolor", + "100% Color Bar", + "Fade to grey Color Bar", + "PN9" +}; + +/* Write registers up to 4 at a time */ +static int imx241_write_reg(struct i2c_client *client, u16 reg, + u32 len, u32 val) +{ + u32 buf_i, val_i; + u8 buf[6]; + u8 *val_p; + __be32 val_be; + + dev_dbg(&client->dev, "write reg(0x%x val:0x%x)!\n", reg, val); + + if (len > 4) + return -EINVAL; + + buf[0] = reg >> 8; + buf[1] = reg & 0xff; + + val_be = cpu_to_be32(val); + val_p = (u8 *)&val_be; + buf_i = 2; + val_i = 4 - len; + + while (val_i < 4) + buf[buf_i++] = val_p[val_i++]; + + if (i2c_master_send(client, buf, len + 2) != len + 2) + return -EIO; + + return 0; +} + +static int imx241_write_array(struct i2c_client *client, + const struct regval *regs) +{ + u32 i; + int ret = 0; + + for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) + ret = imx241_write_reg(client, regs[i].addr, + IMX241_REG_VALUE_08BIT, + regs[i].val); + + return ret; +} + +/* Read registers up to 4 at a time */ +static int imx241_read_reg(struct i2c_client *client, u16 reg, + unsigned int len, u32 *val) +{ + struct i2c_msg msgs[2]; + u8 *data_be_p; + __be32 data_be = 0; + __be16 reg_addr_be = cpu_to_be16(reg); + int ret; + + if (len > 4 || !len) + return -EINVAL; + + data_be_p = (u8 *)&data_be; + /* Write register address */ + msgs[0].addr = client->addr; + msgs[0].flags = 0; + msgs[0].len = 2; + msgs[0].buf = (u8 *)®_addr_be; + + /* Read data from register */ + msgs[1].addr = client->addr; + msgs[1].flags = I2C_M_RD; + msgs[1].len = len; + msgs[1].buf = &data_be_p[4 - len]; + + ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); + if (ret != ARRAY_SIZE(msgs)) + return -EIO; + + *val = be32_to_cpu(data_be); + + return 0; +} + +static int imx241_get_reso_dist(const struct imx241_mode *mode, + struct v4l2_mbus_framefmt *framefmt) +{ + return abs(mode->width - framefmt->width) + + abs(mode->height - framefmt->height); +} + +static const struct imx241_mode * +imx241_find_best_fit(struct imx241 *imx241, struct v4l2_subdev_format *fmt) +{ + struct v4l2_mbus_framefmt *framefmt = &fmt->format; + int dist; + int cur_best_fit = 0; + int cur_best_fit_dist = -1; + unsigned int i; + + for (i = 0; i < imx241->cfg_num; i++) { + dist = imx241_get_reso_dist(&imx241->support_modes[i], framefmt); + if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) { + cur_best_fit_dist = dist; + cur_best_fit = i; + } + } + + return &imx241->support_modes[cur_best_fit]; +} + +static int imx241_set_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_format *fmt) +{ + struct imx241 *imx241 = to_imx241(sd); + const struct imx241_mode *mode; + s64 h_blank, vblank_def; + u64 pixel_rate = 0; + u32 lane_num = imx241->bus_cfg.bus.mipi_csi2.num_data_lanes; + + mutex_lock(&imx241->mutex); + + mode = imx241_find_best_fit(imx241, fmt); + fmt->format.code = IMX241_MEDIA_BUS_FMT; + fmt->format.width = mode->width; + fmt->format.height = mode->height; + fmt->format.field = V4L2_FIELD_NONE; + if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { +#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API + *v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format; +#else + mutex_unlock(&imx241->mutex); + return -ENOTTY; +#endif + } else { + imx241->cur_mode = mode; + h_blank = mode->hts_def - mode->width; + __v4l2_ctrl_modify_range(imx241->hblank, h_blank, + h_blank, 1, h_blank); + vblank_def = mode->vts_def - mode->height; + __v4l2_ctrl_modify_range(imx241->vblank, vblank_def, + IMX241_VTS_MAX - mode->height, + 1, vblank_def); + pixel_rate = (u32)link_freq_items[mode->link_freq_idx] / mode->bpp * 2 * lane_num; + + __v4l2_ctrl_s_ctrl_int64(imx241->pixel_rate, + pixel_rate); + __v4l2_ctrl_s_ctrl(imx241->link_freq, + mode->link_freq_idx); + } + + mutex_unlock(&imx241->mutex); + + return 0; +} + +static int imx241_get_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_format *fmt) +{ + struct imx241 *imx241 = to_imx241(sd); + const struct imx241_mode *mode = imx241->cur_mode; + + mutex_lock(&imx241->mutex); + if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { +#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API + fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad); +#else + mutex_unlock(&imx241->mutex); + return -ENOTTY; +#endif + } else { + fmt->format.width = mode->width; + fmt->format.height = mode->height; + fmt->format.code = IMX241_MEDIA_BUS_FMT; + fmt->format.field = V4L2_FIELD_NONE; + } + mutex_unlock(&imx241->mutex); + + return 0; +} + +static int imx241_enum_mbus_code(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_mbus_code_enum *code) +{ + if (code->index != 0) + return -EINVAL; + code->code = IMX241_MEDIA_BUS_FMT; + + return 0; +} + +static int imx241_enum_frame_sizes(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_frame_size_enum *fse) +{ + struct imx241 *imx241 = to_imx241(sd); + + if (fse->index >= imx241->cfg_num) + return -EINVAL; + + if (fse->code != IMX241_MEDIA_BUS_FMT) + return -EINVAL; + + fse->min_width = imx241->support_modes[fse->index].width; + fse->max_width = imx241->support_modes[fse->index].width; + fse->max_height = imx241->support_modes[fse->index].height; + fse->min_height = imx241->support_modes[fse->index].height; + + return 0; +} + +static int imx241_enable_test_pattern(struct imx241 *imx241, u32 pattern) +{ + if (pattern == 0) + return 0; + + dev_err(&imx241->client->dev, "test pattern %u not implement yet.\n", pattern); + + return -EINVAL; +} + +static int imx241_g_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_frame_interval *fi) +{ + struct imx241 *imx241 = to_imx241(sd); + const struct imx241_mode *mode = imx241->cur_mode; + + mutex_lock(&imx241->mutex); + fi->interval = mode->max_fps; + mutex_unlock(&imx241->mutex); + + return 0; +} + +static void imx241_get_module_inf(struct imx241 *imx241, + struct rkmodule_inf *inf) +{ + memset(inf, 0, sizeof(*inf)); + strscpy(inf->base.sensor, IMX241_NAME, sizeof(inf->base.sensor)); + strscpy(inf->base.module, imx241->module_name, + sizeof(inf->base.module)); + strscpy(inf->base.lens, imx241->len_name, sizeof(inf->base.lens)); +} + +static void imx241_set_awb_cfg(struct imx241 *imx241, + struct rkmodule_awb_cfg *cfg) +{ + mutex_lock(&imx241->mutex); + memcpy(&imx241->awb_cfg, cfg, sizeof(*cfg)); + mutex_unlock(&imx241->mutex); +} + +static void imx241_set_lsc_cfg(struct imx241 *imx241, + struct rkmodule_lsc_cfg *cfg) +{ + mutex_lock(&imx241->mutex); + memcpy(&imx241->lsc_cfg, cfg, sizeof(*cfg)); + mutex_unlock(&imx241->mutex); +} + +static long imx241_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) +{ + struct imx241 *imx241 = to_imx241(sd); + struct rkmodule_hdr_cfg *hdr; + long ret = 0; + u32 stream = 0; + + switch (cmd) { + case RKMODULE_GET_MODULE_INFO: + imx241_get_module_inf(imx241, (struct rkmodule_inf *)arg); + break; + case RKMODULE_AWB_CFG: + imx241_set_awb_cfg(imx241, (struct rkmodule_awb_cfg *)arg); + break; + case RKMODULE_LSC_CFG: + imx241_set_lsc_cfg(imx241, (struct rkmodule_lsc_cfg *)arg); + break; + case RKMODULE_SET_QUICK_STREAM: + stream = *((u32 *)arg); + + if (stream) + ret = imx241_write_reg(imx241->client, + IMX241_REG_CTRL_MODE, + IMX241_REG_VALUE_08BIT, + IMX241_MODE_STREAMING); + else + ret = imx241_write_reg(imx241->client, + IMX241_REG_CTRL_MODE, + IMX241_REG_VALUE_08BIT, + IMX241_MODE_SW_STANDBY); + break; + case RKMODULE_GET_HDR_CFG: + hdr = (struct rkmodule_hdr_cfg *)arg; + hdr->esp.mode = HDR_NORMAL_VC; + hdr->hdr_mode = NO_HDR; + break; + case RKMODULE_SET_HDR_CFG: + ret = 0; + break; + default: + ret = -ENOIOCTLCMD; + break; + } + + return ret; +} + +#ifdef CONFIG_COMPAT +static long imx241_compat_ioctl32(struct v4l2_subdev *sd, + unsigned int cmd, unsigned long arg) +{ + void __user *up = compat_ptr(arg); + struct rkmodule_inf *inf; + struct rkmodule_awb_cfg *cfg; + struct rkmodule_lsc_cfg *lsc_cfg; + long ret = 0; + u32 stream = 0; + + switch (cmd) { + case RKMODULE_GET_MODULE_INFO: + inf = kzalloc(sizeof(*inf), GFP_KERNEL); + if (!inf) { + ret = -ENOMEM; + return ret; + } + + ret = imx241_ioctl(sd, cmd, inf); + if (!ret) { + ret = copy_to_user(up, inf, sizeof(*inf)); + if (ret) + ret = -EFAULT; + } + kfree(inf); + break; + case RKMODULE_AWB_CFG: + cfg = kzalloc(sizeof(*cfg), GFP_KERNEL); + if (!cfg) { + ret = -ENOMEM; + return ret; + } + + ret = copy_from_user(cfg, up, sizeof(*cfg)); + if (!ret) + ret = imx241_ioctl(sd, cmd, cfg); + else + ret = -EFAULT; + kfree(cfg); + break; + case RKMODULE_LSC_CFG: + lsc_cfg = kzalloc(sizeof(*lsc_cfg), GFP_KERNEL); + if (!lsc_cfg) { + ret = -ENOMEM; + return ret; + } + + ret = copy_from_user(lsc_cfg, up, sizeof(*lsc_cfg)); + if (!ret) + ret = imx241_ioctl(sd, cmd, lsc_cfg); + else + ret = -EFAULT; + kfree(lsc_cfg); + break; + case RKMODULE_SET_QUICK_STREAM: + ret = copy_from_user(&stream, up, sizeof(u32)); + if (!ret) + ret = imx241_ioctl(sd, cmd, &stream); + else + ret = -EFAULT; + break; + default: + ret = -ENOIOCTLCMD; + break; + } + + return ret; +} +#endif + +static int __imx241_start_stream(struct imx241 *imx241) +{ + int ret; + + ret = imx241_write_array(imx241->client, imx241->cur_mode->reg_list); + if (ret) + return ret; + + /* In case these controls are set before streaming */ + mutex_unlock(&imx241->mutex); + ret = v4l2_ctrl_handler_setup(&imx241->ctrl_handler); + mutex_lock(&imx241->mutex); + if (ret) + return ret; + + return imx241_write_reg(imx241->client, + IMX241_REG_CTRL_MODE, + IMX241_REG_VALUE_08BIT, + IMX241_MODE_STREAMING); +} + +static int __imx241_stop_stream(struct imx241 *imx241) +{ + return imx241_write_reg(imx241->client, + IMX241_REG_CTRL_MODE, + IMX241_REG_VALUE_08BIT, + IMX241_MODE_SW_STANDBY); +} + +static int imx241_s_stream(struct v4l2_subdev *sd, int on) +{ + struct imx241 *imx241 = to_imx241(sd); + struct i2c_client *client = imx241->client; + int ret = 0; + + dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on, + imx241->cur_mode->width, + imx241->cur_mode->height, + DIV_ROUND_CLOSEST(imx241->cur_mode->max_fps.denominator, + imx241->cur_mode->max_fps.numerator)); + + + mutex_lock(&imx241->mutex); + on = !!on; + if (on == imx241->streaming) + goto unlock_and_return; + + if (on) { + ret = pm_runtime_get_sync(&client->dev); + if (ret < 0) { + pm_runtime_put_noidle(&client->dev); + goto unlock_and_return; + } + + ret = __imx241_start_stream(imx241); + if (ret) { + v4l2_err(sd, "start stream failed while write regs\n"); + pm_runtime_put(&client->dev); + goto unlock_and_return; + } + } else { + __imx241_stop_stream(imx241); + pm_runtime_put(&client->dev); + } + + imx241->streaming = on; + +unlock_and_return: + mutex_unlock(&imx241->mutex); + + return ret; +} + +static int imx241_s_power(struct v4l2_subdev *sd, int on) +{ + struct imx241 *imx241 = to_imx241(sd); + struct i2c_client *client = imx241->client; + int ret = 0; + + mutex_lock(&imx241->mutex); + + /* If the power state is not modified - no work to do. */ + if (imx241->power_on == !!on) + goto unlock_and_return; + + if (on) { + ret = pm_runtime_get_sync(&client->dev); + if (ret < 0) { + pm_runtime_put_noidle(&client->dev); + goto unlock_and_return; + } + + imx241->power_on = true; + } else { + pm_runtime_put(&client->dev); + imx241->power_on = false; + } + +unlock_and_return: + mutex_unlock(&imx241->mutex); + + return ret; +} + +/* Calculate the delay in us by clock rate and clock cycles */ +static inline u32 imx241_cal_delay(u32 cycles) +{ + return DIV_ROUND_UP(cycles, IMX241_XVCLK_FREQ / 1000 / 1000); +} + +static int __imx241_power_on(struct imx241 *imx241) +{ + int ret; + u32 delay_us; + struct device *dev = &imx241->client->dev; + + if (!IS_ERR(imx241->power_gpio)) + gpiod_set_value_cansleep(imx241->power_gpio, 1); + + usleep_range(1000, 2000); + + if (!IS_ERR_OR_NULL(imx241->pins_default)) { + ret = pinctrl_select_state(imx241->pinctrl, + imx241->pins_default); + if (ret < 0) + dev_err(dev, "could not set pins\n"); + } + + ret = clk_set_rate(imx241->xvclk, IMX241_XVCLK_FREQ); + if (ret < 0) + dev_warn(dev, "Failed to set xvclk rate (24MHz)\n"); + + if (clk_get_rate(imx241->xvclk) != IMX241_XVCLK_FREQ) + dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n"); + + ret = clk_prepare_enable(imx241->xvclk); + if (ret < 0) { + dev_err(dev, "Failed to enable xvclk\n"); + return ret; + } + + if (!IS_ERR(imx241->reset_gpio)) + gpiod_set_value_cansleep(imx241->reset_gpio, 0); + + ret = regulator_bulk_enable(IMX241_NUM_SUPPLIES, imx241->supplies); + if (ret < 0) { + dev_err(dev, "Failed to enable regulators\n"); + goto disable_clk; + } + + if (!IS_ERR(imx241->reset_gpio)) + gpiod_set_value_cansleep(imx241->reset_gpio, 1); + + usleep_range(500, 1000); + if (!IS_ERR(imx241->pwdn_gpio)) + gpiod_set_value_cansleep(imx241->pwdn_gpio, 1); + + /* 8192 cycles prior to first SCCB transaction */ + delay_us = imx241_cal_delay(8192); + usleep_range(delay_us, delay_us * 2); + + return 0; + +disable_clk: + clk_disable_unprepare(imx241->xvclk); + + return ret; +} + +static void __imx241_power_off(struct imx241 *imx241) +{ + int ret; + struct device *dev = &imx241->client->dev; + + if (!IS_ERR(imx241->pwdn_gpio)) + gpiod_set_value_cansleep(imx241->pwdn_gpio, 0); + clk_disable_unprepare(imx241->xvclk); + if (!IS_ERR(imx241->reset_gpio)) + gpiod_set_value_cansleep(imx241->reset_gpio, 0); + + if (!IS_ERR_OR_NULL(imx241->pins_sleep)) { + ret = pinctrl_select_state(imx241->pinctrl, + imx241->pins_sleep); + if (ret < 0) + dev_dbg(dev, "could not set pins\n"); + } + if (!IS_ERR(imx241->power_gpio)) + gpiod_set_value_cansleep(imx241->power_gpio, 0); + + regulator_bulk_disable(IMX241_NUM_SUPPLIES, imx241->supplies); +} + +static int imx241_runtime_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct imx241 *imx241 = to_imx241(sd); + + return __imx241_power_on(imx241); +} + +static int imx241_runtime_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct imx241 *imx241 = to_imx241(sd); + + __imx241_power_off(imx241); + + return 0; +} + +#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API +static int imx241_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) +{ + struct imx241 *imx241 = to_imx241(sd); + struct v4l2_mbus_framefmt *try_fmt = + v4l2_subdev_get_try_format(sd, fh->pad, 0); + const struct imx241_mode *def_mode = &imx241->support_modes[0]; + + mutex_lock(&imx241->mutex); + /* Initialize try_fmt */ + try_fmt->width = def_mode->width; + try_fmt->height = def_mode->height; + //try_fmt->code = def_mode->bus_fmt; + try_fmt->code = IMX241_MEDIA_BUS_FMT; + try_fmt->field = V4L2_FIELD_NONE; + + mutex_unlock(&imx241->mutex); + /* No crop or compose */ + + return 0; +} +#endif + +static int imx241_enum_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_frame_interval_enum *fie) +{ + struct imx241 *imx241 = to_imx241(sd); + + if (fie->index >= imx241->cfg_num) + return -EINVAL; + + fie->code = imx241->support_modes[fie->index].bus_fmt; + fie->width = imx241->support_modes[fie->index].width; + fie->height = imx241->support_modes[fie->index].height; + fie->interval = imx241->support_modes[fie->index].max_fps; + + return 0; +} + +static int imx241_g_mbus_config(struct v4l2_subdev *sd, + struct v4l2_mbus_config *config) +{ + struct imx241 *imx241 = to_imx241(sd); + u32 lane_num = imx241->bus_cfg.bus.mipi_csi2.num_data_lanes; + u32 val = 0; + + val = 1 << (lane_num - 1) | + V4L2_MBUS_CSI2_CHANNEL_0 | + V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; + + config->type = V4L2_MBUS_CSI2; + config->flags = val; + + return 0; +} + +static const struct dev_pm_ops imx241_pm_ops = { + SET_RUNTIME_PM_OPS(imx241_runtime_suspend, + imx241_runtime_resume, NULL) +}; + +#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API +static const struct v4l2_subdev_internal_ops imx241_internal_ops = { + .open = imx241_open, +}; +#endif + +static const struct v4l2_subdev_core_ops imx241_core_ops = { + .s_power = imx241_s_power, + .ioctl = imx241_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl32 = imx241_compat_ioctl32, +#endif +}; + +static const struct v4l2_subdev_video_ops imx241_video_ops = { + .s_stream = imx241_s_stream, + .g_frame_interval = imx241_g_frame_interval, + .g_mbus_config = imx241_g_mbus_config, +}; + +static const struct v4l2_subdev_pad_ops imx241_pad_ops = { + .enum_mbus_code = imx241_enum_mbus_code, + .enum_frame_size = imx241_enum_frame_sizes, + .enum_frame_interval = imx241_enum_frame_interval, + .get_fmt = imx241_get_fmt, + .set_fmt = imx241_set_fmt, +}; + +static const struct v4l2_subdev_ops imx241_subdev_ops = { + .core = &imx241_core_ops, + .video = &imx241_video_ops, + .pad = &imx241_pad_ops, +}; + +static int imx241_set_gain_reg(struct imx241 *imx241, u32 a_gain) +{ + int ret = 0; + u32 gain_reg = 0; + + gain_reg = (256 - (256 * 256 / a_gain)); + if (gain_reg > 240) + gain_reg = 240; + + ret |= imx241_write_reg(imx241->client, + IMX241_REG_GAIN, + IMX241_REG_VALUE_08BIT, + (gain_reg & 0xff)); + return ret; +} + +static int imx241_set_ctrl(struct v4l2_ctrl *ctrl) +{ + struct imx241 *imx241 = container_of(ctrl->handler, + struct imx241, ctrl_handler); + struct i2c_client *client = imx241->client; + s64 max; + int ret = 0; + + /* Propagate change of current control to all related controls */ + switch (ctrl->id) { + case V4L2_CID_VBLANK: + /* Update max exposure while meeting expected vblanking */ + max = imx241->cur_mode->height + ctrl->val - 4; + __v4l2_ctrl_modify_range(imx241->exposure, + imx241->exposure->minimum, max, + imx241->exposure->step, + imx241->exposure->default_value); + break; + } + + if (!pm_runtime_get_if_in_use(&client->dev)) + return 0; + + switch (ctrl->id) { + case V4L2_CID_EXPOSURE: + /* 4 least significant bits of expsoure are fractional part */ + ret = imx241_write_reg(imx241->client, + IMX241_REG_EXPOSURE, + IMX241_REG_VALUE_16BIT, + ctrl->val); + break; + case V4L2_CID_ANALOGUE_GAIN: + ret = imx241_set_gain_reg(imx241, ctrl->val); + break; + case V4L2_CID_VBLANK: + ret = imx241_write_reg(imx241->client, + IMX241_REG_VTS, + IMX241_REG_VALUE_16BIT, + ctrl->val + imx241->cur_mode->height); + break; + case V4L2_CID_TEST_PATTERN: + ret = imx241_enable_test_pattern(imx241, ctrl->val); + break; + default: + dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n", + __func__, ctrl->id, ctrl->val); + break; + } + + pm_runtime_put(&client->dev); + + return ret; +} + +static const struct v4l2_ctrl_ops imx241_ctrl_ops = { + .s_ctrl = imx241_set_ctrl, +}; + +static int imx241_initialize_controls(struct imx241 *imx241) +{ + const struct imx241_mode *mode; + struct v4l2_ctrl_handler *handler; + s64 exposure_max, vblank_def; + u32 h_blank; + int ret; + u64 dst_pixel_rate = 0; + u32 lane_num = imx241->bus_cfg.bus.mipi_csi2.num_data_lanes; + + handler = &imx241->ctrl_handler; + mode = imx241->cur_mode; + ret = v4l2_ctrl_handler_init(handler, 8); + if (ret) + return ret; + handler->lock = &imx241->mutex; + + imx241->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, + V4L2_CID_LINK_FREQ, + 1, 0, link_freq_items); + + dst_pixel_rate = (u32)link_freq_items[mode->link_freq_idx] / mode->bpp * 2 * lane_num; + + imx241->pixel_rate = v4l2_ctrl_new_std(handler, NULL, + V4L2_CID_PIXEL_RATE, + 0, IMX241_PIXEL_RATE, + 1, dst_pixel_rate); + + __v4l2_ctrl_s_ctrl(imx241->link_freq, + mode->link_freq_idx); + + h_blank = mode->hts_def - mode->width; + imx241->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, + h_blank, h_blank, 1, h_blank); + if (imx241->hblank) + imx241->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; + + vblank_def = mode->vts_def - mode->height; + imx241->vblank = v4l2_ctrl_new_std(handler, &imx241_ctrl_ops, + V4L2_CID_VBLANK, vblank_def, + IMX241_VTS_MAX - mode->height, + 1, vblank_def); + + exposure_max = mode->vts_def - 5; + imx241->exposure = v4l2_ctrl_new_std(handler, &imx241_ctrl_ops, + V4L2_CID_EXPOSURE, IMX241_EXPOSURE_MIN, + exposure_max, IMX241_EXPOSURE_STEP, + mode->exp_def); + + imx241->anal_gain = v4l2_ctrl_new_std(handler, &imx241_ctrl_ops, + V4L2_CID_ANALOGUE_GAIN, IMX241_GAIN_MIN, + IMX241_GAIN_MAX, IMX241_GAIN_STEP, + IMX241_GAIN_DEFAULT); + + imx241->test_pattern = v4l2_ctrl_new_std_menu_items(handler, + &imx241_ctrl_ops, V4L2_CID_TEST_PATTERN, + ARRAY_SIZE(imx241_test_pattern_menu) - 1, + 0, 0, imx241_test_pattern_menu); + + if (handler->error) { + ret = handler->error; + dev_err(&imx241->client->dev, + "Failed to init controls(%d)\n", ret); + goto err_free_handler; + } + + imx241->subdev.ctrl_handler = handler; + + return 0; + +err_free_handler: + v4l2_ctrl_handler_free(handler); + + return ret; +} + +static int imx241_check_sensor_id(struct imx241 *imx241, + struct i2c_client *client) +{ + struct device *dev = &imx241->client->dev; + u32 id = 0; + int ret; + + ret = imx241_read_reg(client, IMX241_REG_CHIP_ID, + IMX241_REG_VALUE_08BIT, &id); + if (id != CHIP_ID) { + dev_err(dev, "Unexpected sensor id(%04x), ret(%d)\n", id, ret); + return -ENODEV; + } + + dev_info(dev, "Detected IMX241 sensor\n"); + + return 0; +} + +static int imx241_configure_regulators(struct imx241 *imx241) +{ + unsigned int i; + + for (i = 0; i < IMX241_NUM_SUPPLIES; i++) + imx241->supplies[i].supply = imx241_supply_names[i]; + + return devm_regulator_bulk_get(&imx241->client->dev, + IMX241_NUM_SUPPLIES, + imx241->supplies); +} + +static int imx241_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct device *dev = &client->dev; + struct device_node *node = dev->of_node; + struct imx241 *imx241; + struct v4l2_subdev *sd; + struct device_node *endpoint; + char facing[2]; + int ret; + + dev_info(dev, "driver version: %02x.%02x.%02x", + DRIVER_VERSION >> 16, + (DRIVER_VERSION & 0xff00) >> 8, + DRIVER_VERSION & 0x00ff); + + imx241 = devm_kzalloc(dev, sizeof(*imx241), GFP_KERNEL); + if (!imx241) + return -ENOMEM; + + ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX, + &imx241->module_index); + ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING, + &imx241->module_facing); + ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME, + &imx241->module_name); + ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME, + &imx241->len_name); + if (ret) { + dev_err(dev, "could not get module information!\n"); + return -EINVAL; + } + + imx241->client = client; + endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); + if (!endpoint) { + dev_err(dev, "Failed to get endpoint\n"); + return -EINVAL; + } + ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(endpoint), + &imx241->bus_cfg); + if (ret) { + dev_err(dev, "Failed to get bus cfg\n"); + return ret; + } + + imx241->support_modes = supported_modes_2lane; + imx241->cfg_num = ARRAY_SIZE(supported_modes_2lane); + imx241->cur_mode = &imx241->support_modes[0]; + + imx241->xvclk = devm_clk_get(dev, "xvclk"); + if (IS_ERR(imx241->xvclk)) { + dev_err(dev, "Failed to get xvclk\n"); + return -EINVAL; + } + + imx241->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); + if (IS_ERR(imx241->power_gpio)) + dev_warn(dev, "Failed to get power-gpios, maybe no use\n"); + + imx241->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(imx241->reset_gpio)) + dev_warn(dev, "Failed to get reset-gpios\n"); + + imx241->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); + if (IS_ERR(imx241->pwdn_gpio)) + dev_warn(dev, "Failed to get pwdn-gpios\n"); + + ret = imx241_configure_regulators(imx241); + if (ret) { + dev_err(dev, "Failed to get power regulators\n"); + return ret; + } + + imx241->pinctrl = devm_pinctrl_get(dev); + if (!IS_ERR(imx241->pinctrl)) { + imx241->pins_default = + pinctrl_lookup_state(imx241->pinctrl, + OF_CAMERA_PINCTRL_STATE_DEFAULT); + if (IS_ERR(imx241->pins_default)) + dev_err(dev, "could not get default pinstate\n"); + + imx241->pins_sleep = + pinctrl_lookup_state(imx241->pinctrl, + OF_CAMERA_PINCTRL_STATE_SLEEP); + if (IS_ERR(imx241->pins_sleep)) + dev_err(dev, "could not get sleep pinstate\n"); + } + + mutex_init(&imx241->mutex); + + sd = &imx241->subdev; + v4l2_i2c_subdev_init(sd, client, &imx241_subdev_ops); + ret = imx241_initialize_controls(imx241); + if (ret) + goto err_destroy_mutex; + + ret = __imx241_power_on(imx241); + if (ret) + goto err_free_handler; + + ret = imx241_check_sensor_id(imx241, client); + if (ret) + goto err_power_off; + +#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API + sd->internal_ops = &imx241_internal_ops; + sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; +#endif +#if defined(CONFIG_MEDIA_CONTROLLER) + imx241->pad.flags = MEDIA_PAD_FL_SOURCE; + sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; + ret = media_entity_pads_init(&sd->entity, 1, &imx241->pad); + if (ret < 0) + goto err_power_off; +#endif + + memset(facing, 0, sizeof(facing)); + if (strcmp(imx241->module_facing, "back") == 0) + facing[0] = 'b'; + else + facing[0] = 'f'; + + snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s", + imx241->module_index, facing, + IMX241_NAME, dev_name(sd->dev)); + ret = v4l2_async_register_subdev_sensor_common(sd); + if (ret) { + dev_err(dev, "v4l2 async register subdev failed\n"); + goto err_clean_entity; + } + + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + pm_runtime_idle(dev); + + return 0; + +err_clean_entity: +#if defined(CONFIG_MEDIA_CONTROLLER) + media_entity_cleanup(&sd->entity); +#endif +err_power_off: + __imx241_power_off(imx241); +err_free_handler: + v4l2_ctrl_handler_free(&imx241->ctrl_handler); +err_destroy_mutex: + mutex_destroy(&imx241->mutex); + + return ret; +} + +static int imx241_remove(struct i2c_client *client) +{ + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct imx241 *imx241 = to_imx241(sd); + + v4l2_async_unregister_subdev(sd); +#if defined(CONFIG_MEDIA_CONTROLLER) + media_entity_cleanup(&sd->entity); +#endif + v4l2_ctrl_handler_free(&imx241->ctrl_handler); + mutex_destroy(&imx241->mutex); + + pm_runtime_disable(&client->dev); + + if (!pm_runtime_status_suspended(&client->dev)) + __imx241_power_off(imx241); + + pm_runtime_set_suspended(&client->dev); + + return 0; +} + +#if IS_ENABLED(CONFIG_OF) +static const struct of_device_id imx241_of_match[] = { + { .compatible = "sony,imx241" }, + {}, +}; +MODULE_DEVICE_TABLE(of, imx241_of_match); +#endif + +static const struct i2c_device_id imx241_match_id[] = { + { "sony,imx241", 0 }, + {}, +}; + +static struct i2c_driver imx241_i2c_driver = { + .driver = { + .name = IMX241_NAME, + .pm = &imx241_pm_ops, + .of_match_table = of_match_ptr(imx241_of_match), + }, + .probe = &imx241_probe, + .remove = &imx241_remove, + .id_table = imx241_match_id, +}; + +static int __init sensor_mod_init(void) +{ + return i2c_add_driver(&imx241_i2c_driver); +} + +static void __exit sensor_mod_exit(void) +{ + i2c_del_driver(&imx241_i2c_driver); +} + +device_initcall_sync(sensor_mod_init); +module_exit(sensor_mod_exit); + +MODULE_DESCRIPTION("Sony imx241 sensor driver"); +MODULE_LICENSE("GPL"); diff --git a/kernel/drivers/media/i2c/imx464.c b/kernel/drivers/media/i2c/imx464.c index 3458ff9..8d6c04b 100644 --- a/kernel/drivers/media/i2c/imx464.c +++ b/kernel/drivers/media/i2c/imx464.c @@ -10,6 +10,7 @@ * V0.0X01.0X03 support enum sensor fmt */ +//#define DEBUG #include <linux/clk.h> #include <linux/device.h> #include <linux/delay.h> @@ -26,8 +27,11 @@ #include <media/v4l2-async.h> #include <media/v4l2-ctrls.h> #include <media/v4l2-subdev.h> +#include <media/v4l2-fwnode.h> +#include <media/v4l2-mediabus.h> #include <linux/pinctrl/consumer.h> #include <linux/rk-preisp.h> +#include <linux/of_graph.h> #define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x03) @@ -42,15 +46,12 @@ #define OF_CAMERA_HDR_MODE "rockchip,camera-hdr-mode" /* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */ -#define IMX464_10BIT_LINEAR_PIXEL_RATE (MIPI_FREQ_445M * 2 / 10 * 4) #define IMX464_10BIT_HDR2_PIXEL_RATE (MIPI_FREQ_594M * 2 / 10 * 4) -#define IMX464_10BIT_HDR3_PIXEL_RATE (MIPI_FREQ_594M * 2 / 10 * 4) -#define IMX464_12BIT_PIXEL_RATE (MIPI_FREQ_360M * 2 / 12 * 4) #define IMX464_XVCLK_FREQ_37M 37125000 #define IMX464_XVCLK_FREQ_24M 24000000 -#define CHIP_ID 0x00 -#define IMX464_REG_CHIP_ID 0x0000 +#define CHIP_ID 0x06 +#define IMX464_REG_CHIP_ID 0x3057 #define IMX464_REG_CTRL_MODE 0x3000 #define IMX464_MODE_SW_STANDBY BIT(0) @@ -133,8 +134,6 @@ #define IMX464_REG_VALUE_16BIT 2 #define IMX464_REG_VALUE_24BIT 3 -#define IMX464_2LANES 2 -#define IMX464_4LANES 4 #define IMX464_BITS_PER_SAMPLE 10 #define IMX464_VREVERSE_REG 0x304f @@ -150,12 +149,10 @@ #define USED_SYS_DEBUG -static bool g_isHCG; - #define OF_CAMERA_PINCTRL_STATE_DEFAULT "rockchip,camera_default" #define OF_CAMERA_PINCTRL_STATE_SLEEP "rockchip,camera_sleep" -#define IMX464_NAME "IMX464" +#define IMX464_NAME "imx464" static const char * const IMX464_supply_names[] = { "avdd", /* Analog power */ @@ -165,17 +162,17 @@ #define IMX464_NUM_SUPPLIES ARRAY_SIZE(IMX464_supply_names) +struct regval { + u16 addr; + u8 val; +}; + enum IMX464_max_pad { PAD0, /* link to isp */ PAD1, /* link to csi wr0 | hdr x2:L x3:M */ PAD2, /* link to csi wr1 | hdr x3:L */ PAD3, /* link to csi wr2 | hdr x2:M x3:S */ PAD_MAX, -}; - -struct regval { - u16 addr; - u8 val; }; struct IMX464_mode { @@ -186,6 +183,9 @@ u32 hts_def; u32 vts_def; u32 exp_def; + u32 mipi_freq_idx; + u32 mclk; + u32 bpp; const struct regval *reg_list; u32 hdr_mode; u32 vc[PAD_MAX]; @@ -213,19 +213,22 @@ struct v4l2_ctrl *pixel_rate; struct v4l2_ctrl *link_freq; struct mutex mutex; + struct v4l2_fwnode_endpoint bus_cfg; bool streaming; bool power_on; + bool has_init_exp; + const struct IMX464_mode *support_modes; const struct IMX464_mode *cur_mode; u32 module_index; u32 cfg_num; - u32 cur_pixel_rate; - u32 cur_link_freq; + u32 cur_vts; + u32 cur_mclk; const char *module_facing; const char *module_name; const char *len_name; - u32 cur_vts; - bool has_init_exp; + enum rkmodule_sync_mode sync_mode; struct preisp_hdrae_exp_s init_hdrae_exp; + bool isHCG; }; #define to_IMX464(sd) container_of(sd, struct IMX464, subdev) @@ -237,16 +240,16 @@ {REG_NULL, 0x00}, }; -static const struct regval IMX464_linear_10bit_2688x1520_regs[] = { +static __maybe_unused const struct regval IMX464_linear_10bit_2688x1520_2lane_37m_regs[] = { {0x3000, 0x01}, {0x3002, 0x01}, {0x300C, 0x5B}, {0x300D, 0x40}, - {0x3030, 0xE4}, - {0x3031, 0x0C}, + {0x3034, 0xDC}, + {0x3035, 0x05}, {0x3050, 0x00}, - {0x3058, 0x06}, - {0x3059, 0x09}, + {0x3058, 0x83}, + {0x3059, 0x04}, {0x30BE, 0x5E}, {0x30E8, 0x14}, {0x3110, 0x02}, @@ -256,6 +259,488 @@ {0x319D, 0x00}, {0x319E, 0x02}, {0x31A1, 0x00}, + {0x3288, 0x22}, + {0x328A, 0x02}, + {0x328C, 0xA2}, + {0x328E, 0x22}, + {0x3415, 0x27}, + {0x3418, 0x27}, + {0x3428, 0xFE}, + {0x349E, 0x6A}, + {0x34A2, 0x9A}, + {0x34A4, 0x8A}, + {0x34A6, 0x8E}, + {0x34AA, 0xD8}, + {0x35BC, 0x00}, + {0x35BE, 0xFF}, + {0x35CC, 0x1B}, + {0x35CD, 0x00}, + {0x35CE, 0x2A}, + {0x35CF, 0x00}, + {0x35DC, 0x07}, + {0x35DE, 0x1A}, + {0x35DF, 0x00}, + {0x35E4, 0x2B}, + {0x35E5, 0x00}, + {0x35E6, 0x07}, + {0x35E7, 0x01}, + {0x3648, 0x01}, + {0x3678, 0x01}, + {0x367C, 0x69}, + {0x367E, 0x69}, + {0x3680, 0x69}, + {0x3682, 0x69}, + {0x3718, 0x1C}, + {0x371D, 0x05}, + {0x375D, 0x11}, + {0x375E, 0x43}, + {0x375F, 0x76}, + {0x3760, 0x07}, + {0x3768, 0x1B}, + {0x3769, 0x1B}, + {0x376A, 0x1A}, + {0x376B, 0x19}, + {0x376C, 0x17}, + {0x376D, 0x0F}, + {0x376E, 0x0B}, + {0x376F, 0x0B}, + {0x3770, 0x0B}, + {0x3776, 0x89}, + {0x3777, 0x00}, + {0x3778, 0xCA}, + {0x3779, 0x00}, + {0x377A, 0x45}, + {0x377B, 0x01}, + {0x377C, 0x56}, + {0x377D, 0x02}, + {0x377E, 0xFE}, + {0x377F, 0x03}, + {0x3780, 0xFE}, + {0x3781, 0x05}, + {0x3782, 0xFE}, + {0x3783, 0x06}, + {0x3784, 0x7F}, + {0x3788, 0x1F}, + {0x378A, 0xCA}, + {0x378B, 0x00}, + {0x378C, 0x45}, + {0x378D, 0x01}, + {0x378E, 0x56}, + {0x378F, 0x02}, + {0x3790, 0xFE}, + {0x3791, 0x03}, + {0x3792, 0xFE}, + {0x3793, 0x05}, + {0x3794, 0xFE}, + {0x3795, 0x06}, + {0x3796, 0x7F}, + {0x3798, 0xBF}, + {0x3A01, 0x01}, + {0x3A18, 0x7F}, + {0x3A1A, 0x37}, + {0x3A1C, 0x37}, + {0x3A1E, 0xF7}, + {0x3A1F, 0x00}, + {0x3A20, 0x3F}, + {0x3A22, 0x6F}, + {0x3A24, 0x3F}, + {0x3A26, 0x5F}, + {0x3A28, 0x2F}, + {REG_NULL, 0x00}, +}; + +static __maybe_unused const struct regval IMX464_hdr_2x_10bit_2688x1520_2lane_37m_regs[] = { + {0x3000, 0x01}, + {0x3002, 0x01}, + {0x300C, 0x5B}, + {0x300D, 0x40}, + {0x3034, 0xDC}, + {0x3035, 0x05}, + {0x3048, 0x01}, + {0x3049, 0x01}, + {0x304A, 0x01}, + {0x304B, 0x01}, + {0x304C, 0x13}, + {0x304D, 0x00}, + {0x3050, 0x00}, + {0x3058, 0xF4}, + {0x3059, 0x0A}, + {0x3068, 0x3D}, + {0x30BE, 0x5E}, + {0x30E8, 0x0A}, + {0x3110, 0x02}, + {0x314C, 0x80},// + {0x315A, 0x02}, + {0x316A, 0x7E}, + {0x319D, 0x00}, + {0x319E, 0x01},//1188M + {0x31A1, 0x00}, + {0x31D7, 0x01}, + {0x3200, 0x10}, + {0x3288, 0x22}, + {0x328A, 0x02}, + {0x328C, 0xA2}, + {0x328E, 0x22}, + {0x3415, 0x27}, + {0x3418, 0x27}, + {0x3428, 0xFE}, + {0x349E, 0x6A}, + {0x34A2, 0x9A}, + {0x34A4, 0x8A}, + {0x34A6, 0x8E}, + {0x34AA, 0xD8}, + {0x35BC, 0x00}, + {0x35BE, 0xFF}, + {0x35CC, 0x1B}, + {0x35CD, 0x00}, + {0x35CE, 0x2A}, + {0x35CF, 0x00}, + {0x35DC, 0x07}, + {0x35DE, 0x1A}, + {0x35DF, 0x00}, + {0x35E4, 0x2B}, + {0x35E5, 0x00}, + {0x35E6, 0x07}, + {0x35E7, 0x01}, + {0x3648, 0x01}, + {0x3678, 0x01}, + {0x367C, 0x69}, + {0x367E, 0x69}, + {0x3680, 0x69}, + {0x3682, 0x69}, + {0x3718, 0x1C}, + {0x371D, 0x05}, + {0x375D, 0x11}, + {0x375E, 0x43}, + {0x375F, 0x76}, + {0x3760, 0x07}, + {0x3768, 0x1B}, + {0x3769, 0x1B}, + {0x376A, 0x1A}, + {0x376B, 0x19}, + {0x376C, 0x17}, + {0x376D, 0x0F}, + {0x376E, 0x0B}, + {0x376F, 0x0B}, + {0x3770, 0x0B}, + {0x3776, 0x89}, + {0x3777, 0x00}, + {0x3778, 0xCA}, + {0x3779, 0x00}, + {0x377A, 0x45}, + {0x377B, 0x01}, + {0x377C, 0x56}, + {0x377D, 0x02}, + {0x377E, 0xFE}, + {0x377F, 0x03}, + {0x3780, 0xFE}, + {0x3781, 0x05}, + {0x3782, 0xFE}, + {0x3783, 0x06}, + {0x3784, 0x7F}, + {0x3788, 0x1F}, + {0x378A, 0xCA}, + {0x378B, 0x00}, + {0x378C, 0x45}, + {0x378D, 0x01}, + {0x378E, 0x56}, + {0x378F, 0x02}, + {0x3790, 0xFE}, + {0x3791, 0x03}, + {0x3792, 0xFE}, + {0x3793, 0x05}, + {0x3794, 0xFE}, + {0x3795, 0x06}, + {0x3796, 0x7F}, + {0x3798, 0xBF}, + {0x3A01, 0x01}, + {0x3A18, 0x8F}, + {0x3A1A, 0x4F}, + {0x3A1C, 0x47}, + {0x3A1E, 0x37}, + {0x3A1F, 0x01}, + {0x3A20, 0x4F}, + {0x3A22, 0x87}, + {0x3A24, 0x4F}, + {0x3A26, 0x7F}, + {0x3A28, 0x3F}, + {REG_NULL, 0x00}, +}; + +static const struct regval IMX464_linear_10bit_2688x1520_2lane_regs[] = { + {0x3000, 0x01}, + {0x3002, 0x01}, + {0x300C, 0x3b}, + {0x300D, 0x2a}, + {0x3034, 0xDC}, + {0x3035, 0x05}, + {0x3048, 0x00}, + {0x3049, 0x00}, + {0x304A, 0x03}, + {0x304B, 0x02}, + {0x304C, 0x14}, + {0x304D, 0x03}, + {0x3050, 0x00}, + {0x3058, 0x83}, + {0x3059, 0x04}, + {0x3068, 0xc9}, + {0x30BE, 0x5E}, + {0x30E8, 0x14}, + {0x3110, 0x02}, + {0x314C, 0x29}, + {0x314D, 0x01}, + {0x315A, 0x06}, + {0x3168, 0xA0}, + {0x316A, 0x7E}, + {0x319D, 0x00}, + {0x319E, 0x02}, + {0x31A1, 0x00}, + {0x31D7, 0x00}, + {0x3200, 0x11}, + {0x3288, 0x22}, + {0x328A, 0x02}, + {0x328C, 0xA2}, + {0x328E, 0x22}, + {0x3415, 0x27}, + {0x3418, 0x27}, + {0x3428, 0xFE}, + {0x349E, 0x6A}, + {0x34A2, 0x9A}, + {0x34A4, 0x8A}, + {0x34A6, 0x8E}, + {0x34AA, 0xD8}, + {0x35BC, 0x00}, + {0x35BE, 0xFF}, + {0x35CC, 0x1B}, + {0x35CD, 0x00}, + {0x35CE, 0x2A}, + {0x35CF, 0x00}, + {0x35DC, 0x07}, + {0x35DE, 0x1A}, + {0x35DF, 0x00}, + {0x35E4, 0x2B}, + {0x35E5, 0x00}, + {0x35E6, 0x07}, + {0x35E7, 0x01}, + {0x3648, 0x01}, + {0x3678, 0x01}, + {0x367C, 0x69}, + {0x367E, 0x69}, + {0x3680, 0x69}, + {0x3682, 0x69}, + {0x3718, 0x1C}, + {0x371D, 0x05}, + {0x375D, 0x11}, + {0x375E, 0x43}, + {0x375F, 0x76}, + {0x3760, 0x07}, + {0x3768, 0x1B}, + {0x3769, 0x1B}, + {0x376A, 0x1A}, + {0x376B, 0x19}, + {0x376C, 0x17}, + {0x376D, 0x0F}, + {0x376E, 0x0B}, + {0x376F, 0x0B}, + {0x3770, 0x0B}, + {0x3776, 0x89}, + {0x3777, 0x00}, + {0x3778, 0xCA}, + {0x3779, 0x00}, + {0x377A, 0x45}, + {0x377B, 0x01}, + {0x377C, 0x56}, + {0x377D, 0x02}, + {0x377E, 0xFE}, + {0x377F, 0x03}, + {0x3780, 0xFE}, + {0x3781, 0x05}, + {0x3782, 0xFE}, + {0x3783, 0x06}, + {0x3784, 0x7F}, + {0x3788, 0x1F}, + {0x378A, 0xCA}, + {0x378B, 0x00}, + {0x378C, 0x45}, + {0x378D, 0x01}, + {0x378E, 0x56}, + {0x378F, 0x02}, + {0x3790, 0xFE}, + {0x3791, 0x03}, + {0x3792, 0xFE}, + {0x3793, 0x05}, + {0x3794, 0xFE}, + {0x3795, 0x06}, + {0x3796, 0x7F}, + {0x3798, 0xBF}, + {0x3A01, 0x01}, + {0x3A18, 0x7F}, + {0x3A1A, 0x37}, + {0x3A1C, 0x37}, + {0x3A1E, 0xF7}, + {0x3A1F, 0x00}, + {0x3A20, 0x3F}, + {0x3A22, 0x6F}, + {0x3A24, 0x3F}, + {0x3A26, 0x5F}, + {0x3A28, 0x2F}, + {REG_NULL, 0x00}, +}; + +static const struct regval IMX464_hdr_2x_10bit_2688x1520_2lane_regs[] = { + {0x3000, 0x01}, + {0x3002, 0x01}, + {0x300C, 0x3B}, + {0x300D, 0x2A}, + {0x3034, 0xDC}, + {0x3035, 0x05}, + {0x3048, 0x01}, + {0x3049, 0x01}, + {0x304A, 0x04}, + {0x304B, 0x04}, + {0x304C, 0x13}, + {0x304D, 0x00}, + {0x3050, 0x00}, + {0x3058, 0xF4}, + {0x3059, 0x0A}, + {0x3068, 0x3D}, + {0x30BE, 0x5E}, + {0x30E8, 0x14}, + {0x3110, 0x02}, + {0x314C, 0x29},// + {0x314D, 0x01},// + {0x315A, 0x06}, + {0x3168, 0xA0}, + {0x316A, 0x7E}, + {0x319D, 0x00}, + {0x319E, 0x02},//1188M + {0x31A1, 0x00}, + {0x31D7, 0x01}, + {0x3200, 0x10}, + {0x3288, 0x22}, + {0x328A, 0x02}, + {0x328C, 0xA2}, + {0x328E, 0x22}, + {0x3415, 0x27}, + {0x3418, 0x27}, + {0x3428, 0xFE}, + {0x349E, 0x6A}, + {0x34A2, 0x9A}, + {0x34A4, 0x8A}, + {0x34A6, 0x8E}, + {0x34AA, 0xD8}, + {0x35BC, 0x00}, + {0x35BE, 0xFF}, + {0x35CC, 0x1B}, + {0x35CD, 0x00}, + {0x35CE, 0x2A}, + {0x35CF, 0x00}, + {0x35DC, 0x07}, + {0x35DE, 0x1A}, + {0x35DF, 0x00}, + {0x35E4, 0x2B}, + {0x35E5, 0x00}, + {0x35E6, 0x07}, + {0x35E7, 0x01}, + {0x3648, 0x01}, + {0x3678, 0x01}, + {0x367C, 0x69}, + {0x367E, 0x69}, + {0x3680, 0x69}, + {0x3682, 0x69}, + {0x3718, 0x1C}, + {0x371D, 0x05}, + {0x375D, 0x11}, + {0x375E, 0x43}, + {0x375F, 0x76}, + {0x3760, 0x07}, + {0x3768, 0x1B}, + {0x3769, 0x1B}, + {0x376A, 0x1A}, + {0x376B, 0x19}, + {0x376C, 0x17}, + {0x376D, 0x0F}, + {0x376E, 0x0B}, + {0x376F, 0x0B}, + {0x3770, 0x0B}, + {0x3776, 0x89}, + {0x3777, 0x00}, + {0x3778, 0xCA}, + {0x3779, 0x00}, + {0x377A, 0x45}, + {0x377B, 0x01}, + {0x377C, 0x56}, + {0x377D, 0x02}, + {0x377E, 0xFE}, + {0x377F, 0x03}, + {0x3780, 0xFE}, + {0x3781, 0x05}, + {0x3782, 0xFE}, + {0x3783, 0x06}, + {0x3784, 0x7F}, + {0x3788, 0x1F}, + {0x378A, 0xCA}, + {0x378B, 0x00}, + {0x378C, 0x45}, + {0x378D, 0x01}, + {0x378E, 0x56}, + {0x378F, 0x02}, + {0x3790, 0xFE}, + {0x3791, 0x03}, + {0x3792, 0xFE}, + {0x3793, 0x05}, + {0x3794, 0xFE}, + {0x3795, 0x06}, + {0x3796, 0x7F}, + {0x3798, 0xBF}, + {0x3A01, 0x01}, + {0x3A18, 0x7F}, + {0x3A1A, 0x37}, + {0x3A1C, 0x37}, + {0x3A1E, 0xF7}, + {0x3A1F, 0x00}, + {0x3A20, 0x3F}, + {0x3A22, 0x6F}, + {0x3A24, 0x3F}, + {0x3A26, 0x5F}, + {0x3A28, 0x2F}, + {REG_NULL, 0x00}, +}; + +static const struct regval IMX464_linear_10bit_2688x1520_regs[] = { + {0x3000, 0x01}, + {0x3002, 0x01}, + {0x300C, 0x5B}, + {0x300D, 0x40}, + {0x3030, 0xE4}, + {0x3031, 0x0C}, + {0x3034, 0xee}, + {0x3035, 0x02}, + {0x3048, 0x00}, + {0x3049, 0x00}, + {0x304A, 0x03}, + {0x304B, 0x02}, + {0x304C, 0x14}, + {0x3050, 0x00}, + {0x3058, 0x06}, + {0x3059, 0x09}, + {0x305C, 0x09}, + {0x3060, 0x21}, + {0x3061, 0x01}, + {0x3068, 0xc9}, + {0x306C, 0x56}, + {0x306D, 0x09}, + {0x30BE, 0x5E}, + {0x30E8, 0x14}, + {0x3110, 0x02}, + {0x314C, 0xC0}, + {0x315A, 0x06}, + {0x316A, 0x7E}, + {0x319D, 0x00}, + {0x319E, 0x02}, + {0x31A1, 0x00}, + {0x31D7, 0x00}, + {0x3200, 0x11}, {0x3288, 0x22}, {0x328A, 0x02}, {0x328C, 0xA2}, @@ -350,6 +835,10 @@ {0x3002, 0x01}, {0x300C, 0x5B}, {0x300D, 0x40}, + {0x3030, 0x72}, + {0x3031, 0x06}, + {0x3034, 0xee}, + {0x3035, 0x02}, {0x3048, 0x01}, {0x3049, 0x01}, {0x304A, 0x04}, @@ -358,7 +847,12 @@ {0x3050, 0x00}, {0x3058, 0x06}, {0x3059, 0x09}, + {0x305C, 0x09}, + {0x3060, 0x21}, + {0x3061, 0x01}, {0x3068, 0x6D}, + {0x306C, 0x56}, + {0x306D, 0x09}, {0x30BE, 0x5E}, {0x30E8, 0x14}, {0x3110, 0x02}, @@ -498,6 +992,7 @@ {0x319E, 0x01}, {0x31A1, 0x00}, {0x31D7, 0x03}, + {0x3200, 0x10}, {0x3288, 0x22}, {0x328A, 0x02}, {0x328C, 0xA2}, @@ -584,7 +1079,6 @@ {0x3A24, 0x4F}, {0x3A26, 0x5F}, {0x3A28, 0x3F}, - {0x3200, 0x10}, {REG_NULL, 0x00}, }; @@ -824,6 +1318,33 @@ {REG_NULL, 0x00}, }; +static __maybe_unused const struct regval IMX464_interal_sync_master_start_regs[] = { + {0x3010, 0x07}, + {0x31a1, 0x00}, + {REG_NULL, 0x00}, +}; +static __maybe_unused const struct regval IMX464_interal_sync_master_stop_regs[] = { + {0x31a1, 0x0f}, + {REG_NULL, 0x00}, +}; + +static __maybe_unused const struct regval IMX464_external_sync_master_start_regs[] = { + {0x3010, 0x05}, + {0x31a1, 0x03}, + {0x31d9, 0x01}, + {REG_NULL, 0x00}, +}; +static __maybe_unused const struct regval IMX464_external_sync_master_stop_regs[] = { + {0x31a1, 0x0f}, + {REG_NULL, 0x00}, +}; + +static __maybe_unused const struct regval IMX464_slave_start_regs[] = { + {0x3010, 0x05}, + {0x31a1, 0x0f}, + {REG_NULL, 0x00}, +}; + /* * The width and height must be configured to be * the same as the current output resolution of the sensor. @@ -848,6 +1369,9 @@ .exp_def = 0x0906, .hts_def = 0x05dc * 2, .vts_def = 0x0ce4, + .mipi_freq_idx = 0, + .bpp = 10, + .mclk = 37125000, .reg_list = IMX464_linear_10bit_2688x1520_regs, .hdr_mode = NO_HDR, .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0, @@ -863,6 +1387,9 @@ .exp_def = 0x03de, .hts_def = 0x02ee * 4, .vts_def = 0x0672 * 2, + .mipi_freq_idx = 1, + .bpp = 10, + .mclk = 37125000, .reg_list = IMX464_hdr_2x_10bit_2688x1520_regs, .hdr_mode = HDR_X2, .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1, @@ -889,12 +1416,57 @@ #else .vts_def = 0x04D1 * 4, #endif + .mipi_freq_idx = 1, + .bpp = 10, + .mclk = 37125000, .reg_list = IMX464_hdr_3x_10bit_2688x1520_regs, .hdr_mode = HDR_X3, .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_2, .vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr0 .vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr1 .vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_2,//S->csi wr2 + }, +}; + +static const struct IMX464_mode supported_modes_2lane[] = { + { + .bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10, + .width = 2712, + .height = 1538, + .max_fps = { + .numerator = 10000, + .denominator = 300000, + }, + .exp_def = 0x0600, + .hts_def = 0x05dc * 2, + .vts_def = 0x672, + .mipi_freq_idx = 0, + .bpp = 10, + .mclk = 24000000, + .reg_list = IMX464_linear_10bit_2688x1520_2lane_regs, + .hdr_mode = NO_HDR, + .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0, + }, + { + .bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10, + .width = 2712, + .height = 1538, + .max_fps = { + .numerator = 10000, + .denominator = 150000, + }, + .exp_def = 0x0600, + .hts_def = 0x05dc * 4, + .vts_def = 0x0672 * 2, + .mipi_freq_idx = 0, + .bpp = 10, + .mclk = 24000000, + .reg_list = IMX464_hdr_2x_10bit_2688x1520_2lane_regs, + .hdr_mode = HDR_X2, + .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1, + .vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0 + .vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_1, + .vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr2 }, }; @@ -997,15 +1569,15 @@ unsigned int i; for (i = 0; i < IMX464->cfg_num; i++) { - dist = IMX464_get_reso_dist(&supported_modes[i], framefmt); + dist = IMX464_get_reso_dist(&IMX464->support_modes[i], framefmt); if ((cur_best_fit_dist == -1 || dist <= cur_best_fit_dist) && - supported_modes[i].bus_fmt == framefmt->code) { + IMX464->support_modes[i].bus_fmt == framefmt->code) { cur_best_fit_dist = dist; cur_best_fit = i; } } - return &supported_modes[cur_best_fit]; + return &IMX464->support_modes[cur_best_fit]; } static int IMX464_set_fmt(struct v4l2_subdev *sd, @@ -1015,8 +1587,7 @@ struct IMX464 *IMX464 = to_IMX464(sd); const struct IMX464_mode *mode; s64 h_blank, vblank_def; - struct device *dev = &IMX464->client->dev; - int ret = 0; + u64 pixel_rate = 0; mutex_lock(&IMX464->mutex); @@ -1042,42 +1613,12 @@ IMX464_VTS_MAX - mode->height, 1, vblank_def); IMX464->cur_vts = IMX464->cur_mode->vts_def; - if (mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) { - IMX464->cur_link_freq = 1; - if (mode->hdr_mode == NO_HDR) { - IMX464->cur_pixel_rate = IMX464_10BIT_LINEAR_PIXEL_RATE; - IMX464->cur_link_freq = 0; - } else if (mode->hdr_mode == HDR_X2) - IMX464->cur_pixel_rate = IMX464_10BIT_HDR2_PIXEL_RATE; - else if (mode->hdr_mode == HDR_X3) - IMX464->cur_pixel_rate = IMX464_10BIT_HDR3_PIXEL_RATE; - - clk_disable_unprepare(IMX464->xvclk); - ret = clk_set_rate(IMX464->xvclk, IMX464_XVCLK_FREQ_37M); - if (ret < 0) - dev_err(dev, "Failed to set xvclk rate\n"); - if (clk_get_rate(IMX464->xvclk) != IMX464_XVCLK_FREQ_37M) - dev_err(dev, "xvclk mismatched\n"); - ret = clk_prepare_enable(IMX464->xvclk); - if (ret < 0) - dev_err(dev, "Failed to enable xvclk\n"); - } else { - IMX464->cur_pixel_rate = IMX464_12BIT_PIXEL_RATE; - IMX464->cur_link_freq = 0; - clk_disable_unprepare(IMX464->xvclk); - ret = clk_set_rate(IMX464->xvclk, IMX464_XVCLK_FREQ_24M); - if (ret < 0) - dev_err(dev, "Failed to set xvclk rate\n"); - if (clk_get_rate(IMX464->xvclk) != IMX464_XVCLK_FREQ_24M) - dev_err(dev, "xvclk mismatched\n"); - ret = clk_prepare_enable(IMX464->xvclk); - if (ret < 0) - dev_err(dev, "Failed to enable xvclk\n"); - } + pixel_rate = (u32)link_freq_menu_items[mode->mipi_freq_idx] / mode->bpp * 2 * + IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes; __v4l2_ctrl_s_ctrl_int64(IMX464->pixel_rate, - IMX464->cur_pixel_rate); + pixel_rate); __v4l2_ctrl_s_ctrl(IMX464->link_freq, - IMX464->cur_link_freq); + mode->mipi_freq_idx); } mutex_unlock(&IMX464->mutex); @@ -1137,13 +1678,13 @@ if (fse->index >= IMX464->cfg_num) return -EINVAL; - if (fse->code != supported_modes[fse->index].bus_fmt) + if (fse->code != IMX464->support_modes[fse->index].bus_fmt) return -EINVAL; - fse->min_width = supported_modes[fse->index].width; - fse->max_width = supported_modes[fse->index].width; - fse->max_height = supported_modes[fse->index].height; - fse->min_height = supported_modes[fse->index].height; + fse->min_width = IMX464->support_modes[fse->index].width; + fse->max_width = IMX464->support_modes[fse->index].width; + fse->max_height = IMX464->support_modes[fse->index].height; + fse->min_height = IMX464->support_modes[fse->index].height; return 0; } @@ -1167,19 +1708,20 @@ struct IMX464 *IMX464 = to_IMX464(sd); const struct IMX464_mode *mode = IMX464->cur_mode; u32 val = 0; + u32 lane_num = IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes; if (mode->hdr_mode == NO_HDR) { - val = 1 << (IMX464_4LANES - 1) | + val = 1 << (lane_num - 1) | V4L2_MBUS_CSI2_CHANNEL_0 | V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; } if (mode->hdr_mode == HDR_X2) - val = 1 << (IMX464_4LANES - 1) | + val = 1 << (lane_num - 1) | V4L2_MBUS_CSI2_CHANNEL_0 | V4L2_MBUS_CSI2_CONTINUOUS_CLOCK | V4L2_MBUS_CSI2_CHANNEL_1; if (mode->hdr_mode == HDR_X3) - val = 1 << (IMX464_4LANES - 1) | + val = 1 << (lane_num - 1) | V4L2_MBUS_CSI2_CHANNEL_0 | V4L2_MBUS_CSI2_CONTINUOUS_CLOCK | V4L2_MBUS_CSI2_CHANNEL_1 | @@ -1241,12 +1783,12 @@ l_exp_time = m_exp_time; cg_mode = ae->middle_cg_mode; } - if (!g_isHCG && cg_mode == GAIN_MODE_HCG) { + if (!IMX464->isHCG && cg_mode == GAIN_MODE_HCG) { gain_switch = 0x01 | 0x100; - g_isHCG = true; - } else if (g_isHCG && cg_mode == GAIN_MODE_LCG) { + IMX464->isHCG = true; + } else if (IMX464->isHCG && cg_mode == GAIN_MODE_LCG) { gain_switch = 0x00 | 0x100; - g_isHCG = false; + IMX464->isHCG = false; } ret = imx464_write_reg(client, IMX464_GROUP_HOLD_REG, @@ -1428,12 +1970,12 @@ //3 stagger cg_mode = ae->long_cg_mode; } - if (!g_isHCG && cg_mode == GAIN_MODE_HCG) { + if (!IMX464->isHCG && cg_mode == GAIN_MODE_HCG) { gain_switch = 0x01 | 0x100; - g_isHCG = true; - } else if (g_isHCG && cg_mode == GAIN_MODE_LCG) { + IMX464->isHCG = true; + } else if (IMX464->isHCG && cg_mode == GAIN_MODE_LCG) { gain_switch = 0x00 | 0x100; - g_isHCG = false; + IMX464->isHCG = false; } dev_dbg(&client->dev, @@ -1670,12 +2212,12 @@ int cur_cg = *cg; u32 gain_switch = 0; - if (g_isHCG && cur_cg == GAIN_MODE_LCG) { + if (IMX464->isHCG && cur_cg == GAIN_MODE_LCG) { gain_switch = 0x00 | 0x100; - g_isHCG = false; - } else if (!g_isHCG && cur_cg == GAIN_MODE_HCG) { + IMX464->isHCG = false; + } else if (!IMX464->isHCG && cur_cg == GAIN_MODE_HCG) { gain_switch = 0x01 | 0x100; - g_isHCG = true; + IMX464->isHCG = true; } ret = imx464_write_reg(client, IMX464_GROUP_HOLD_REG, @@ -1743,12 +2285,26 @@ } #endif +static int IMX464_get_channel_info(struct IMX464 *IMX464, struct rkmodule_channel_info *ch_info) +{ + if (ch_info->index >= PAD_MAX) + return -EINVAL; + ch_info->vc = IMX464->cur_mode->vc[ch_info->index]; + ch_info->width = IMX464->cur_mode->width; + ch_info->height = IMX464->cur_mode->height; + ch_info->bus_fmt = IMX464->cur_mode->bus_fmt; + return 0; +} + static long IMX464_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) { struct IMX464 *IMX464 = to_IMX464(sd); struct rkmodule_hdr_cfg *hdr; + struct rkmodule_channel_info *ch_info; u32 i, h, w, stream; long ret = 0; + u64 pixel_rate = 0; + u32 *sync_mode = NULL; switch (cmd) { case PREISP_CMD_SET_HDRAE_EXP: @@ -1770,10 +2326,10 @@ w = IMX464->cur_mode->width; h = IMX464->cur_mode->height; for (i = 0; i < IMX464->cfg_num; i++) { - if (w == supported_modes[i].width && - h == supported_modes[i].height && - supported_modes[i].hdr_mode == hdr->hdr_mode) { - IMX464->cur_mode = &supported_modes[i]; + if (w == IMX464->support_modes[i].width && + h == IMX464->support_modes[i].height && + IMX464->support_modes[i].hdr_mode == hdr->hdr_mode) { + IMX464->cur_mode = &IMX464->support_modes[i]; break; } } @@ -1790,16 +2346,13 @@ IMX464_VTS_MAX - IMX464->cur_mode->height, 1, h); IMX464->cur_vts = IMX464->cur_mode->vts_def; - if (IMX464->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) { - if (IMX464->cur_mode->hdr_mode == NO_HDR) - IMX464->cur_pixel_rate = IMX464_10BIT_LINEAR_PIXEL_RATE; - else if (IMX464->cur_mode->hdr_mode == HDR_X2) - IMX464->cur_pixel_rate = IMX464_10BIT_HDR2_PIXEL_RATE; - else if (IMX464->cur_mode->hdr_mode == HDR_X3) - IMX464->cur_pixel_rate = IMX464_10BIT_HDR3_PIXEL_RATE; - __v4l2_ctrl_s_ctrl_int64(IMX464->pixel_rate, - IMX464->cur_pixel_rate); - } + pixel_rate = (u32)link_freq_menu_items[IMX464->cur_mode->mipi_freq_idx] / + IMX464->cur_mode->bpp * 2 * + IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes; + __v4l2_ctrl_s_ctrl_int64(IMX464->pixel_rate, + pixel_rate); + __v4l2_ctrl_s_ctrl(IMX464->link_freq, + IMX464->cur_mode->mipi_freq_idx); } break; case RKMODULE_SET_CONVERSION_GAIN: @@ -1809,16 +2362,25 @@ stream = *((u32 *)arg); - if (stream) { + if (stream) ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, IMX464_REG_VALUE_08BIT, IMX464_MODE_STREAMING); - usleep_range(30000, 40000); - imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE, - IMX464_REG_VALUE_08BIT, 0); - } else { + else ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, IMX464_REG_VALUE_08BIT, IMX464_MODE_SW_STANDBY); - } + + break; + case RKMODULE_GET_CHANNEL_INFO: + ch_info = (struct rkmodule_channel_info *)arg; + ret = IMX464_get_channel_info(IMX464, ch_info); + break; + case RKMODULE_GET_SYNC_MODE: + sync_mode = (u32 *)arg; + *sync_mode = IMX464->sync_mode; + break; + case RKMODULE_SET_SYNC_MODE: + sync_mode = (u32 *)arg; + IMX464->sync_mode = *sync_mode; break; default: ret = -ENOIOCTLCMD; @@ -1837,9 +2399,11 @@ struct rkmodule_awb_cfg *cfg; struct rkmodule_hdr_cfg *hdr; struct preisp_hdrae_exp_s *hdrae; + struct rkmodule_channel_info *ch_info; long ret; u32 cg = 0; u32 stream; + u32 sync_mode; switch (cmd) { case RKMODULE_GET_MODULE_INFO: @@ -1850,8 +2414,11 @@ } ret = IMX464_ioctl(sd, cmd, inf); - if (!ret) + if (!ret) { ret = copy_to_user(up, inf, sizeof(*inf)); + if (ret) + ret = -EFAULT; + } kfree(inf); break; case RKMODULE_AWB_CFG: @@ -1864,6 +2431,8 @@ ret = copy_from_user(cfg, up, sizeof(*cfg)); if (!ret) ret = IMX464_ioctl(sd, cmd, cfg); + else + ret = -EFAULT; kfree(cfg); break; case RKMODULE_GET_HDR_CFG: @@ -1874,8 +2443,11 @@ } ret = IMX464_ioctl(sd, cmd, hdr); - if (!ret) + if (!ret) { ret = copy_to_user(up, hdr, sizeof(*hdr)); + if (ret) + ret = -EFAULT; + } kfree(hdr); break; case RKMODULE_SET_HDR_CFG: @@ -1888,6 +2460,8 @@ ret = copy_from_user(hdr, up, sizeof(*hdr)); if (!ret) ret = IMX464_ioctl(sd, cmd, hdr); + else + ret = -EFAULT; kfree(hdr); break; case PREISP_CMD_SET_HDRAE_EXP: @@ -1900,18 +2474,54 @@ ret = copy_from_user(hdrae, up, sizeof(*hdrae)); if (!ret) ret = IMX464_ioctl(sd, cmd, hdrae); + else + ret = -EFAULT; kfree(hdrae); break; case RKMODULE_SET_CONVERSION_GAIN: ret = copy_from_user(&cg, up, sizeof(cg)); if (!ret) ret = IMX464_ioctl(sd, cmd, &cg); + else + ret = -EFAULT; break; case RKMODULE_SET_QUICK_STREAM: ret = copy_from_user(&stream, up, sizeof(u32)); if (!ret) ret = IMX464_ioctl(sd, cmd, &stream); + else + ret = -EFAULT; + break; + case RKMODULE_GET_CHANNEL_INFO: + ch_info = kzalloc(sizeof(*ch_info), GFP_KERNEL); + if (!ch_info) { + ret = -ENOMEM; + return ret; + } + + ret = IMX464_ioctl(sd, cmd, ch_info); + if (!ret) { + ret = copy_to_user(up, ch_info, sizeof(*ch_info)); + if (ret) + ret = -EFAULT; + } + kfree(ch_info); + break; + case RKMODULE_GET_SYNC_MODE: + ret = IMX464_ioctl(sd, cmd, &sync_mode); + if (!ret) { + ret = copy_to_user(up, &sync_mode, sizeof(u32)); + if (ret) + ret = -EFAULT; + } + break; + case RKMODULE_SET_SYNC_MODE: + ret = copy_from_user(&sync_mode, up, sizeof(u32)); + if (!ret) + ret = IMX464_ioctl(sd, cmd, &sync_mode); + else + ret = -EFAULT; break; default: ret = -ENOIOCTLCMD; @@ -1922,17 +2532,20 @@ } #endif -static int IMX464_init_conversion_gain(struct IMX464 *IMX464) +static int IMX464_init_conversion_gain(struct IMX464 *IMX464, bool isHCG) { - int ret = 0; struct i2c_client *client = IMX464->client; + int ret = 0; + u32 val = 0; + if (isHCG) + val = 0x01; + else + val = 0; ret = imx464_write_reg(client, IMX464_GAIN_SWITCH_REG, IMX464_REG_VALUE_08BIT, - 0X00); - if (!ret) - g_isHCG = false; + val); return ret; } @@ -1943,7 +2556,7 @@ ret = IMX464_write_array(IMX464->client, IMX464->cur_mode->reg_list); if (ret) return ret; - ret = IMX464_init_conversion_gain(IMX464); + ret = IMX464_init_conversion_gain(IMX464, IMX464->isHCG); if (ret) return ret; /* In case these controls are set before streaming */ @@ -1959,18 +2572,43 @@ return ret; } } - imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, - IMX464_REG_VALUE_08BIT, IMX464_MODE_STREAMING); - usleep_range(30000, 40000); - return imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE, - IMX464_REG_VALUE_08BIT, 0); + + if (IMX464->sync_mode == EXTERNAL_MASTER_MODE) { + ret |= IMX464_write_array(IMX464->client, IMX464_external_sync_master_start_regs); + v4l2_err(&IMX464->subdev, "cur externam master mode\n"); + } else if (IMX464->sync_mode == INTERNAL_MASTER_MODE) { + ret |= IMX464_write_array(IMX464->client, IMX464_interal_sync_master_start_regs); + v4l2_err(&IMX464->subdev, "cur intertal master\n"); + } else if (IMX464->sync_mode == SLAVE_MODE) { + ret |= IMX464_write_array(IMX464->client, IMX464_slave_start_regs); + v4l2_err(&IMX464->subdev, "cur slave mode\n"); + } + if (IMX464->sync_mode == NO_SYNC_MODE) { + ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, + IMX464_REG_VALUE_08BIT, IMX464_MODE_STREAMING); + usleep_range(30000, 40000); + ret |= imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE, + IMX464_REG_VALUE_08BIT, 0); + } else { + ret |= imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE, + IMX464_REG_VALUE_08BIT, 0); + } + return ret; } static int __IMX464_stop_stream(struct IMX464 *IMX464) { + int ret = 0; + IMX464->has_init_exp = false; - return imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, - IMX464_REG_VALUE_08BIT, IMX464_MODE_SW_STANDBY); + ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, + IMX464_REG_VALUE_08BIT, IMX464_MODE_SW_STANDBY); + + if (IMX464->sync_mode == EXTERNAL_MASTER_MODE) + ret |= IMX464_write_array(IMX464->client, IMX464_external_sync_master_stop_regs); + else if (IMX464->sync_mode == INTERNAL_MASTER_MODE) + ret |= IMX464_write_array(IMX464->client, IMX464_interal_sync_master_stop_regs); + return ret; } static int IMX464_s_stream(struct v4l2_subdev *sd, int on) @@ -2059,7 +2697,6 @@ int ret; u32 delay_us; struct device *dev = &IMX464->client->dev; - unsigned long mclk = 0; if (!IS_ERR_OR_NULL(IMX464->pins_default)) { ret = pinctrl_select_state(IMX464->pinctrl, @@ -2067,15 +2704,14 @@ if (ret < 0) dev_err(dev, "could not set pins\n"); } - if (IMX464->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) - mclk = IMX464_XVCLK_FREQ_37M; - else - mclk = IMX464_XVCLK_FREQ_24M; - ret = clk_set_rate(IMX464->xvclk, mclk); + + ret = clk_set_rate(IMX464->xvclk, IMX464->cur_mode->mclk); if (ret < 0) dev_warn(dev, "Failed to set xvclk rate\n"); - if (clk_get_rate(IMX464->xvclk) != mclk) - dev_warn(dev, "xvclk mismatched\n"); + if (clk_get_rate(IMX464->xvclk) != IMX464->cur_mode->mclk) + dev_warn(dev, "xvclk mismatched, %lu\n", clk_get_rate(IMX464->xvclk)); + else + IMX464->cur_mclk = IMX464->cur_mode->mclk; ret = clk_prepare_enable(IMX464->xvclk); if (ret < 0) { dev_err(dev, "Failed to enable xvclk\n"); @@ -2089,7 +2725,7 @@ dev_err(dev, "Failed to enable regulators\n"); goto disable_clk; } - + usleep_range(15000, 16000); if (!IS_ERR(IMX464->reset_gpio)) gpiod_set_value_cansleep(IMX464->reset_gpio, 1); @@ -2126,6 +2762,7 @@ dev_err(dev, "could not set pins\n"); } regulator_bulk_disable(IMX464_NUM_SUPPLIES, IMX464->supplies); + usleep_range(15000, 16000); } static int IMX464_runtime_resume(struct device *dev) @@ -2154,7 +2791,7 @@ struct IMX464 *IMX464 = to_IMX464(sd); struct v4l2_mbus_framefmt *try_fmt = v4l2_subdev_get_try_format(sd, fh->pad, 0); - const struct IMX464_mode *def_mode = &supported_modes[0]; + const struct IMX464_mode *def_mode = &IMX464->support_modes[0]; mutex_lock(&IMX464->mutex); /* Initialize try_fmt */ @@ -2179,16 +2816,16 @@ if (fie->index >= IMX464->cfg_num) return -EINVAL; - fie->code = supported_modes[fie->index].bus_fmt; - fie->width = supported_modes[fie->index].width; - fie->height = supported_modes[fie->index].height; - fie->interval = supported_modes[fie->index].max_fps; - fie->reserved[0] = supported_modes[fie->index].hdr_mode; + fie->code = IMX464->support_modes[fie->index].bus_fmt; + fie->width = IMX464->support_modes[fie->index].width; + fie->height = IMX464->support_modes[fie->index].height; + fie->interval = IMX464->support_modes[fie->index].max_fps; + fie->reserved[0] = IMX464->support_modes[fie->index].hdr_mode; return 0; } #define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4) -#define DST_WIDTH 2688 +#define DST_WIDTH 2560 #define DST_HEIGHT 1520 /* @@ -2266,7 +2903,7 @@ u32 vts = 0; int ret = 0; u32 shr0 = 0; - //u32 flip = 0; + u32 flip = 0; /* Propagate change of current control to all related controls */ switch (ctrl->id) { @@ -2298,7 +2935,7 @@ ret |= imx464_write_reg(IMX464->client, IMX464_LF_EXPO_REG_H, IMX464_REG_VALUE_08BIT, IMX464_FETCH_EXP_H(shr0)); - dev_err(&client->dev, "set exposure 0x%x\n", + dev_dbg(&client->dev, "set exposure 0x%x\n", ctrl->val); } break; @@ -2310,7 +2947,7 @@ ret |= imx464_write_reg(IMX464->client, IMX464_LF_GAIN_REG_L, IMX464_REG_VALUE_08BIT, IMX464_FETCH_GAIN_L(ctrl->val)); - dev_err(&client->dev, "set analog gain 0x%x\n", + dev_dbg(&client->dev, "set analog gain 0x%x\n", ctrl->val); } break; @@ -2338,12 +2975,67 @@ IMX464_REG_VALUE_08BIT, IMX464_FETCH_VTS_H(vts)); - dev_err(&client->dev, "set vts 0x%x\n", - vts); + dev_dbg(&client->dev, "set vts 0x%x\n", vts); break; case V4L2_CID_HFLIP: + ret = imx464_write_reg(client, + IMX464_GROUP_HOLD_REG, + IMX464_REG_VALUE_08BIT, + IMX464_GROUP_HOLD_START); + ret |= imx464_write_reg(IMX464->client, IMX464_HREVERSE_REG, + IMX464_REG_VALUE_08BIT, !!ctrl->val); + ret |= imx464_write_reg(client, + IMX464_GROUP_HOLD_REG, + IMX464_REG_VALUE_08BIT, + IMX464_GROUP_HOLD_END); break; case V4L2_CID_VFLIP: + flip = ctrl->val; + ret = imx464_write_reg(client, + IMX464_GROUP_HOLD_REG, + IMX464_REG_VALUE_08BIT, + IMX464_GROUP_HOLD_START); + ret |= imx464_write_reg(IMX464->client, IMX464_VREVERSE_REG, + IMX464_REG_VALUE_08BIT, !!flip); + if (flip) { + ret |= imx464_write_reg(IMX464->client, 0x3074, + IMX464_REG_VALUE_08BIT, 0x40); + ret |= imx464_write_reg(IMX464->client, 0x3075, + IMX464_REG_VALUE_08BIT, 0x06); + ret |= imx464_write_reg(IMX464->client, 0x3080, + IMX464_REG_VALUE_08BIT, 0xff); + ret |= imx464_write_reg(IMX464->client, 0x30ad, + IMX464_REG_VALUE_08BIT, 0x7e); + ret |= imx464_write_reg(IMX464->client, 0x30b6, + IMX464_REG_VALUE_08BIT, 0xff); + ret |= imx464_write_reg(IMX464->client, 0x30b7, + IMX464_REG_VALUE_08BIT, 0x01); + ret |= imx464_write_reg(IMX464->client, 0x30d8, + IMX464_REG_VALUE_08BIT, 0x45); + ret |= imx464_write_reg(IMX464->client, 0x3114, + IMX464_REG_VALUE_08BIT, 0x01); + } else { + ret |= imx464_write_reg(IMX464->client, 0x3074, + IMX464_REG_VALUE_08BIT, 0x3c); + ret |= imx464_write_reg(IMX464->client, 0x3075, + IMX464_REG_VALUE_08BIT, 0x00); + ret |= imx464_write_reg(IMX464->client, 0x3080, + IMX464_REG_VALUE_08BIT, 0x01); + ret |= imx464_write_reg(IMX464->client, 0x30ad, + IMX464_REG_VALUE_08BIT, 0x02); + ret |= imx464_write_reg(IMX464->client, 0x30b6, + IMX464_REG_VALUE_08BIT, 0x00); + ret |= imx464_write_reg(IMX464->client, 0x30b7, + IMX464_REG_VALUE_08BIT, 0x00); + ret |= imx464_write_reg(IMX464->client, 0x30d8, + IMX464_REG_VALUE_08BIT, 0x44); + ret |= imx464_write_reg(IMX464->client, 0x3114, + IMX464_REG_VALUE_08BIT, 0x02); + } + ret |= imx464_write_reg(client, + IMX464_GROUP_HOLD_REG, + IMX464_REG_VALUE_08BIT, + IMX464_GROUP_HOLD_END); break; default: dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n", @@ -2366,6 +3058,7 @@ struct v4l2_ctrl_handler *handler; s64 exposure_max, vblank_def; u32 h_blank; + u64 pixel_rate = 0; int ret; handler = &IMX464->ctrl_handler; @@ -2378,28 +3071,13 @@ IMX464->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ, 1, 0, link_freq_menu_items); - if (IMX464->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) { - IMX464->cur_link_freq = 1; - if (IMX464->cur_mode->hdr_mode == NO_HDR) { - IMX464->cur_pixel_rate = - IMX464_10BIT_LINEAR_PIXEL_RATE; - IMX464->cur_link_freq = 0; - } else if (IMX464->cur_mode->hdr_mode == HDR_X2) - IMX464->cur_pixel_rate = - IMX464_10BIT_HDR2_PIXEL_RATE; - else if (IMX464->cur_mode->hdr_mode == HDR_X3) - IMX464->cur_pixel_rate = - IMX464_10BIT_HDR3_PIXEL_RATE; - } else { - IMX464->cur_link_freq = 0; - IMX464->cur_pixel_rate = - IMX464_12BIT_PIXEL_RATE; - } __v4l2_ctrl_s_ctrl(IMX464->link_freq, - IMX464->cur_link_freq); + IMX464->cur_mode->mipi_freq_idx); + pixel_rate = (u32)link_freq_menu_items[mode->mipi_freq_idx] / mode->bpp * 2 * + IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes; IMX464->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, 0, IMX464_10BIT_HDR2_PIXEL_RATE, - 1, IMX464->cur_pixel_rate); + 1, pixel_rate); h_blank = mode->hts_def - mode->width; IMX464->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, @@ -2436,6 +3114,7 @@ IMX464->subdev.ctrl_handler = handler; IMX464->has_init_exp = false; + IMX464->isHCG = false; return 0; @@ -2483,9 +3162,12 @@ struct device_node *node = dev->of_node; struct IMX464 *IMX464; struct v4l2_subdev *sd; + struct device_node *endpoint; char facing[2]; int ret; u32 i, hdr_mode = 0; + const char *sync_mode_name = NULL; + dev_info(dev, "driver version: %02x.%02x.%02x", DRIVER_VERSION >> 16, @@ -2509,6 +3191,20 @@ return -EINVAL; } + ret = of_property_read_string(node, RKMODULE_CAMERA_SYNC_MODE, + &sync_mode_name); + if (ret) { + IMX464->sync_mode = NO_SYNC_MODE; + dev_err(dev, "could not get sync mode!\n"); + } else { + if (strcmp(sync_mode_name, RKMODULE_EXTERNAL_MASTER_MODE) == 0) + IMX464->sync_mode = EXTERNAL_MASTER_MODE; + else if (strcmp(sync_mode_name, RKMODULE_INTERNAL_MASTER_MODE) == 0) + IMX464->sync_mode = INTERNAL_MASTER_MODE; + else if (strcmp(sync_mode_name, RKMODULE_SLAVE_MODE) == 0) + IMX464->sync_mode = SLAVE_MODE; + } + ret = of_property_read_u32(node, OF_CAMERA_HDR_MODE, &hdr_mode); if (ret) { @@ -2516,15 +3212,32 @@ dev_warn(dev, " Get hdr mode failed! no hdr default\n"); } IMX464->client = client; + endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); + if (!endpoint) { + dev_err(dev, "Failed to get endpoint\n"); + return -EINVAL; + } + ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(endpoint), + &IMX464->bus_cfg); + if (ret) { + dev_err(dev, "Failed to get bus cfg\n"); + return ret; + } + if (IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes == 4) { + IMX464->support_modes = supported_modes; + IMX464->cfg_num = ARRAY_SIZE(supported_modes); + } else { + IMX464->support_modes = supported_modes_2lane; + IMX464->cfg_num = ARRAY_SIZE(supported_modes_2lane); + } - IMX464->cfg_num = ARRAY_SIZE(supported_modes); for (i = 0; i < IMX464->cfg_num; i++) { - if (hdr_mode == supported_modes[i].hdr_mode) { - IMX464->cur_mode = &supported_modes[i]; + if (hdr_mode == IMX464->support_modes[i].hdr_mode) { + IMX464->cur_mode = &IMX464->support_modes[i]; break; } } - IMX464->cur_mode = &supported_modes[0]; + IMX464->cur_mode = &IMX464->support_modes[0]; IMX464->xvclk = devm_clk_get(dev, "xvclk"); if (IS_ERR(IMX464->xvclk)) { dev_err(dev, "Failed to get xvclk\n"); @@ -2610,7 +3323,6 @@ pm_runtime_enable(dev); pm_runtime_idle(dev); - g_isHCG = false; #ifdef USED_SYS_DEBUG add_sysfs_interfaces(dev); #endif @@ -2655,6 +3367,7 @@ #if IS_ENABLED(CONFIG_OF) static const struct of_device_id IMX464_of_match[] = { { .compatible = "sony,IMX464" }, + { .compatible = "sony,imx464" }, {}, }; MODULE_DEVICE_TABLE(of, IMX464_of_match); @@ -2662,6 +3375,7 @@ static const struct i2c_device_id IMX464_match_id[] = { { "sony,IMX464", 0 }, + { "sony,imx464", 0 }, { }, }; diff --git a/kernel/drivers/media/platform/rockchip/cif/capture.c b/kernel/drivers/media/platform/rockchip/cif/capture.c index ac8b596..25c664d 100644 --- a/kernel/drivers/media/platform/rockchip/cif/capture.c +++ b/kernel/drivers/media/platform/rockchip/cif/capture.c @@ -553,18 +553,21 @@ case MEDIA_BUS_FMT_SGBRG8_1X8: case MEDIA_BUS_FMT_SGRBG8_1X8: case MEDIA_BUS_FMT_SRGGB8_1X8: + case MEDIA_BUS_FMT_Y8_1X8: return 0x2a; /* csi raw10 */ case MEDIA_BUS_FMT_SBGGR10_1X10: case MEDIA_BUS_FMT_SGBRG10_1X10: case MEDIA_BUS_FMT_SGRBG10_1X10: case MEDIA_BUS_FMT_SRGGB10_1X10: + case MEDIA_BUS_FMT_Y10_1X10: return 0x2b; /* csi raw12 */ case MEDIA_BUS_FMT_SBGGR12_1X12: case MEDIA_BUS_FMT_SGBRG12_1X12: case MEDIA_BUS_FMT_SGRBG12_1X12: case MEDIA_BUS_FMT_SRGGB12_1X12: + case MEDIA_BUS_FMT_Y12_1X12: return 0x2c; /* csi uyvy 422 */ case MEDIA_BUS_FMT_UYVY8_2X8: @@ -2425,7 +2428,7 @@ int i; unsigned long flags; - mutex_lock(&dev->stream_lock); + mutex_lock(&dev->hw_dev->dev_lock); v4l2_info(&dev->v4l2_dev, "stream[%d] start stopping\n", stream->id); @@ -2499,20 +2502,18 @@ if (dev->can_be_reset && can_reset) { rkcif_do_cru_reset(dev); dev->can_be_reset = false; - dev->reset_work_cancel = true; + hw_dev->reset_work_cancel = true; hw_dev->hw_timer.is_running = false; hw_dev->reset_info.is_need_reset = 0; } spin_unlock_irqrestore(&hw_dev->hw_timer.timer_lock, flags); - - pm_runtime_put_sync(dev->dev); if (!atomic_read(&dev->pipe.stream_cnt) && dev->dummy_buf.vaddr) rkcif_destroy_dummy_buf(stream); v4l2_info(&dev->v4l2_dev, "stream[%d] stopping finished\n", stream->id); - mutex_unlock(&dev->stream_lock); + mutex_unlock(&dev->hw_dev->dev_lock); } /* @@ -3081,7 +3082,7 @@ v4l2_info(&dev->v4l2_dev, "stream[%d] start streaming\n", stream->id); - mutex_lock(&dev->stream_lock); + mutex_lock(&dev->hw_dev->dev_lock); if (WARN_ON(stream->state != RKCIF_STATE_READY)) { ret = -EBUSY; @@ -3141,14 +3142,6 @@ v4l2_err(v4l2_dev, "Failed to create dummy_buf, %d\n", ret); goto destroy_buf; } - } - - /* enable clocks/power-domains */ - ret = pm_runtime_get_sync(dev->dev); - if (ret < 0) { - v4l2_err(v4l2_dev, "Failed to get runtime pm, %d\n", - ret); - goto destroy_buf; } ret = dev->pipe.open(&dev->pipe, &node->vdev.entity, true); @@ -3218,7 +3211,8 @@ } } - dev->reset_work_cancel = false; + if (dev->hw_dev->reset_work_cancel) + dev->hw_dev->reset_work_cancel = false; if (dev->hdr.mode == NO_HDR) stream->streamon_timestamp = ktime_get_ns(); goto out; @@ -3246,7 +3240,7 @@ } out: - mutex_unlock(&dev->stream_lock); + mutex_unlock(&dev->hw_dev->dev_lock); return ret; } @@ -3524,6 +3518,13 @@ return ret; } + /* enable clocks/power-domains */ + ret = pm_runtime_get_sync(cifdev->dev); + if (ret < 0) { + v4l2_err(vdev, "Failed to get runtime pm, %d\n", + ret); + return ret; + } /* * Soft reset via CRU. * Because CRU would reset iommu too, so there's not chance @@ -3574,6 +3575,7 @@ else if (atomic_read(&cifdev->fh_cnt) < 0) atomic_set(&cifdev->fh_cnt, 0); mutex_unlock(&cifdev->stream_lock); + pm_runtime_put_sync(cifdev->dev); return ret; } @@ -3584,6 +3586,9 @@ .unlocked_ioctl = video_ioctl2, .poll = vb2_fop_poll, .mmap = vb2_fop_mmap, +#ifdef CONFIG_COMPAT + .compat_ioctl32 = video_ioctl2, +#endif }; static int rkcif_enum_input(struct file *file, void *priv, @@ -3925,6 +3930,7 @@ int vc = 0; struct rkcif_reset_info *reset_info; int reset_src = 0; + unsigned long flags; switch (cmd) { case RKCIF_CMD_GET_CSI_MEMORY_MODE: @@ -3967,12 +3973,16 @@ break; case RKCIF_CMD_GET_RESET_INFO: reset_info = (struct rkcif_reset_info *)arg; + spin_lock_irqsave(&dev->hw_dev->spin_lock, flags); *reset_info = dev->hw_dev->reset_info; - if (dev->hw_dev->reset_info.is_need_reset) - dev->hw_dev->reset_info.is_need_reset = 0; + spin_unlock_irqrestore(&dev->hw_dev->spin_lock, flags); break; case RKCIF_CMD_SET_RESET: reset_src = *(int *)arg; + spin_lock_irqsave(&dev->hw_dev->spin_lock, flags); + if (dev->hw_dev->reset_info.is_need_reset) + dev->hw_dev->reset_info.is_need_reset = 0; + spin_unlock_irqrestore(&dev->hw_dev->spin_lock, flags); return rkcif_do_reset_work(dev, reset_src); default: return -EINVAL; @@ -4789,6 +4799,7 @@ if (dev->irq_stats.csi_bwidth_lack_cnt) { is_triggered = true; dev->irq_stats.csi_bwidth_lack_cnt = 0; + v4l2_info(&dev->v4l2_dev, "reset for bandwidth lack\n"); } if (dev->irq_stats.csi_overflow_cnt) { is_triggered = true; @@ -5402,7 +5413,6 @@ for (i = 0, j = 0; i < RKCIF_MAX_STREAM_MIPI; i++) { stream = &cif_dev->stream[i]; - mutex_lock(&cif_dev->stream_lock); if (stream->state == RKCIF_STATE_STREAMING) { stream_off_cnt++; @@ -5422,9 +5432,7 @@ stream->frame_idx, sof_cnt); - resume_info->frm_sync_seq = sof_cnt; - if (stream->frame_idx != sof_cnt) - stream->frame_idx = sof_cnt; + resume_info->frm_sync_seq = stream->frame_idx; } stream->state = RKCIF_STATE_RESET_IN_STREAMING; @@ -5438,7 +5446,6 @@ __func__, stream->id, stream->frame_idx, rkcif_csi2_get_sof()); } - mutex_unlock(&cif_dev->stream_lock); } if (!stream_off_cnt) return 0; @@ -5486,7 +5493,6 @@ stream = resume_stream[i]; if (stream == NULL || stream->state != RKCIF_STATE_RESET_IN_STREAMING) break; - mutex_lock(&cif_dev->stream_lock); stream_on_cnt++; stream->fs_cnt_in_single_frame = 0; if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) { @@ -5514,7 +5520,6 @@ } atomic_inc(&p->stream_cnt); stream->streamon_timestamp = ktime_get_ns(); - mutex_unlock(&cif_dev->stream_lock); v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "resume stream[%d], frm_idx:%d, csi_sof:%d\n", stream->id, stream->frame_idx, @@ -5552,11 +5557,9 @@ v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n"); - mutex_unlock(&cif_dev->stream_lock); return 0; unlock_stream: - mutex_unlock(&cif_dev->stream_lock); return ret; } @@ -5570,8 +5573,13 @@ int i = 0; int ret = 0; - v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset\n"); + v4l2_info(&cif_dev->v4l2_dev, "do rkcif reset\n"); + mutex_lock(&cif_dev->hw_dev->dev_lock); + if (hw->reset_work_cancel) { + mutex_unlock(&hw->dev_lock); + return 0; + } for (i = 0; i < hw->dev_num; i++) { cifdev = hw->cif_dev[i]; resume_info[i] = &cifdev->reset_work.resume_info; @@ -5585,13 +5593,7 @@ rkcif_do_cru_reset(cif_dev); - rkcif_disable_sys_clk(cif_dev->hw_dev); - - udelay(5); - - ret |= rkcif_enable_sys_clk(cif_dev->hw_dev); - if (ret < 0) - v4l2_err(&cif_dev->v4l2_dev, "%s:resume cif clk failed\n", __func__); + udelay(30); for (i = 0; i < hw->dev_num; i++) { cifdev = hw->cif_dev[i]; @@ -5607,8 +5609,8 @@ hw->hw_timer.is_running = false; rkcif_monitor_reset_event(cif_dev->hw_dev); - v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n"); - + v4l2_info(&cif_dev->v4l2_dev, "do rkcif reset successfully!\n"); + mutex_unlock(&hw->dev_lock); return ret; } @@ -5710,8 +5712,10 @@ spin_unlock_irqrestore(&timer->csi2_err_lock, flags); } if (hw_timer->is_reset_by_user) { + spin_lock_irqsave(&hw->spin_lock, flags); hw->reset_info.is_need_reset = 1; hw->reset_info.reset_src = hw_timer->reset_src; + spin_unlock_irqrestore(&hw->spin_lock, flags); } else { dev->reset_work.reset_src = hw_timer->reset_src; if (schedule_work(&dev->reset_work.work)) { @@ -5762,8 +5766,10 @@ hw_timer->reset_src = RKCIF_RESET_SRC_ERR_HOTPLUG; v4l2_subdev_call(terminal_sensor->sd, core, ioctl, RKMODULE_SET_VICAP_RST_INFO, &rst_info); - if (!is_reset && stream->cifdev->inf_id == RKCIF_MIPI_LVDS) + if (!is_reset && stream->cifdev->inf_id == RKCIF_MIPI_LVDS) { + hw_timer->reset_src = RKICF_RESET_SRC_ERR_CUTOFF; is_reset = rkcif_is_csi2_err_trigger_reset(timer); + } } else if (hw_timer->monitor_mode == RKCIF_MONITOR_MODE_CONTINUE) { if (stream->cifdev->inf_id == RKCIF_MIPI_LVDS) is_reset = rkcif_is_csi2_err_trigger_reset(timer); @@ -5859,6 +5865,7 @@ int is_reset = 0; int check_cnt = 0; bool is_mod_timer = false; + struct rkmodule_vicap_reset_info rst_info; for (i = 0; i < hw->dev_num; i++) { dev = hw->cif_dev[i]; @@ -5867,7 +5874,16 @@ &is_mod_timer); if (is_reset) break; + } + if (hw_timer->monitor_mode == RKCIF_MONITOR_MODE_HOTPLUG && is_reset) { + for (i = 0; i < hw->dev_num; i++) { + dev = hw->cif_dev[i]; + rst_info.is_reset = 0; + if (dev->terminal_sensor.sd) + v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, + RKMODULE_SET_VICAP_RST_INFO, &rst_info); + } } if (!is_reset && is_mod_timer) @@ -6069,6 +6085,7 @@ } } +#define CSI_START_INTSTAT(id) (0x3 << ((id) * 2)) void rkcif_irq_pingpong(struct rkcif_device *cif_dev) { struct rkcif_stream *stream; @@ -6125,27 +6142,6 @@ __func__); } - if (intstat & CSI_FRAME0_START_ID0) { - if (mbus->type == V4L2_MBUS_CSI2) - rkcif_csi2_event_inc_sof(); - else if (mbus->type == V4L2_MBUS_CCP2) - rkcif_lvds_event_inc_sof(cif_dev); - detect_stream->fs_cnt_in_single_frame++; - spin_lock_irqsave(&detect_stream->fps_lock, flags); - detect_stream->readout.fs_timestamp = ktime_get_ns(); - spin_unlock_irqrestore(&detect_stream->fps_lock, flags); - } - - if (intstat & CSI_FRAME1_START_ID0) { - if (mbus->type == V4L2_MBUS_CSI2) - rkcif_csi2_event_inc_sof(); - else if (mbus->type == V4L2_MBUS_CCP2) - rkcif_lvds_event_inc_sof(cif_dev); - detect_stream->fs_cnt_in_single_frame++; - spin_lock_irqsave(&detect_stream->fps_lock, flags); - detect_stream->readout.fs_timestamp = ktime_get_ns(); - spin_unlock_irqrestore(&detect_stream->fps_lock, flags); - } for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) { if (intstat & CSI_LINE_INTSTAT(i)) { stream = &cif_dev->stream[i]; @@ -6159,11 +6155,6 @@ "%s: id0 cur line:%d\n", __func__, lastline & 0x3fff); } } - - /* if do not reach frame dma end, return irq */ - mipi_id = rkcif_csi_g_mipi_id(&cif_dev->v4l2_dev, intstat); - if (mipi_id < 0) - return; for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) { mipi_id = rkcif_csi_g_mipi_id(&cif_dev->v4l2_dev, @@ -6220,8 +6211,28 @@ detect_stream->fs_cnt_in_single_frame--; } } + cif_dev->irq_stats.all_frm_end_cnt++; } - cif_dev->irq_stats.all_frm_end_cnt++; + for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) { + if (intstat & CSI_START_INTSTAT(i)) { + stream = &cif_dev->stream[i]; + if (i == 0) { + if (mbus->type == V4L2_MBUS_CSI2) + rkcif_csi2_event_inc_sof(); + else if (mbus->type == V4L2_MBUS_CCP2) + rkcif_lvds_event_inc_sof(cif_dev); + stream->fs_cnt_in_single_frame++; + spin_lock_irqsave(&stream->fps_lock, flags); + stream->readout.fs_timestamp = ktime_get_ns(); + spin_unlock_irqrestore(&stream->fps_lock, flags); + } else { + spin_lock_irqsave(&stream->fps_lock, flags); + stream->readout.fs_timestamp = ktime_get_ns(); + spin_unlock_irqrestore(&stream->fps_lock, flags); + } + } + } + } else { u32 lastline, lastpix, ctl; u32 cif_frmst, frmid, int_en; diff --git a/kernel/drivers/media/platform/rockchip/cif/dev.h b/kernel/drivers/media/platform/rockchip/cif/dev.h index 1d84d1d..fa53396 100644 --- a/kernel/drivers/media/platform/rockchip/cif/dev.h +++ b/kernel/drivers/media/platform/rockchip/cif/dev.h @@ -524,7 +524,6 @@ unsigned int wait_line_cache; struct rkcif_dummy_buffer dummy_buf; bool is_start_hdr; - bool reset_work_cancel; bool iommu_en; bool is_use_dummybuf; }; diff --git a/kernel/drivers/media/platform/rockchip/cif/hw.c b/kernel/drivers/media/platform/rockchip/cif/hw.c index a2bf0cb..328fb02 100644 --- a/kernel/drivers/media/platform/rockchip/cif/hw.c +++ b/kernel/drivers/media/platform/rockchip/cif/hw.c @@ -1039,6 +1039,7 @@ rkcif_hw_soft_reset(cif_hw, true); mutex_init(&cif_hw->dev_lock); + spin_lock_init(&cif_hw->spin_lock); pm_runtime_enable(&pdev->dev); rkcif_init_reset_timer(cif_hw); diff --git a/kernel/drivers/media/platform/rockchip/cif/hw.h b/kernel/drivers/media/platform/rockchip/cif/hw.h index 18b663a..845545a 100644 --- a/kernel/drivers/media/platform/rockchip/cif/hw.h +++ b/kernel/drivers/media/platform/rockchip/cif/hw.h @@ -116,6 +116,8 @@ struct mutex dev_lock; struct rkcif_hw_timer hw_timer; struct rkcif_reset_info reset_info; + spinlock_t spin_lock; + bool reset_work_cancel; }; void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu); diff --git a/kernel/drivers/media/platform/rockchip/isp/capture.c b/kernel/drivers/media/platform/rockchip/isp/capture.c index 416d369..670acc1 100644 --- a/kernel/drivers/media/platform/rockchip/isp/capture.c +++ b/kernel/drivers/media/platform/rockchip/isp/capture.c @@ -364,9 +364,10 @@ continue; for (j = RKISP_STREAM_DMATX0; j < RKISP_MAX_STREAM; j++) { stream = &isp->cap_dev.stream[j]; - if (!stream->linked || stream->u.dmatx.is_config) + if (!stream->linked || stream->curr_buf || stream->next_buf) continue; - mi_set_y_addr(stream, hw->dummy_buf.dma_addr); + if (!rkisp_read(dev, stream->config->mi.y_base_ad_init, true)) + mi_set_y_addr(stream, hw->dummy_buf.dma_addr); } } } @@ -1082,6 +1083,9 @@ .unlocked_ioctl = video_ioctl2, .poll = vb2_fop_poll, .mmap = vb2_fop_mmap, +#ifdef CONFIG_COMPAT + .compat_ioctl32 = video_ioctl2, +#endif }; /* diff --git a/kernel/drivers/media/platform/rockchip/isp/capture_v21.c b/kernel/drivers/media/platform/rockchip/isp/capture_v21.c index 79402c5..a243756 100644 --- a/kernel/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/kernel/drivers/media/platform/rockchip/isp/capture_v21.c @@ -1046,14 +1046,7 @@ { void __iomem *base = stream->ispdev->base_addr; struct rkisp_device *dev = stream->ispdev; - bool is_update = false; int ret; - - if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) { - is_update = (stream->id == RKISP_STREAM_MP) ? - !dev->cap_dev.stream[RKISP_STREAM_SP].streaming : - !dev->cap_dev.stream[RKISP_STREAM_MP].streaming; - } if (stream->ops->set_data_path) stream->ops->set_data_path(base); @@ -1064,9 +1057,6 @@ stream->ops->enable_mi(stream); if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) hdr_config_dmatx(dev); - if (is_update) - dev->irq_ends_mask |= - (stream->id == RKISP_STREAM_MP) ? ISP_FRAME_MP : ISP_FRAME_SP; stream->streaming = true; return 0; @@ -1217,6 +1207,22 @@ spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); } +static void rkisp_stop_streaming_tx(struct rkisp_stream *stream) +{ + struct rkisp_device *dev = stream->ispdev; + + stream->stopping = true; + if (dev->isp_state & ISP_START && + !stream->ops->is_stream_stopped(dev->base_addr)) { + stream->ops->stop_mi(stream); + wait_event_timeout(stream->done, !stream->streaming, + msecs_to_jiffies(300)); + } + stream->stopping = false; + stream->streaming = false; + destroy_buf_queue(stream, VB2_BUF_STATE_ERROR); +} + static void rkisp_stop_streaming(struct vb2_queue *queue) { struct rkisp_stream *stream = queue->drv_priv; @@ -1225,24 +1231,23 @@ struct v4l2_device *v4l2_dev = &dev->v4l2_dev; int ret; - mutex_lock(&dev->hw_dev->dev_lock); - v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s %d\n", __func__, stream->id); - if (!stream->streaming) - goto end; + return; + + if (stream->id != RKISP_STREAM_MP && stream->id != RKISP_STREAM_SP) + return rkisp_stop_streaming_tx(stream); + + mutex_lock(&dev->hw_dev->dev_lock); rkisp_stream_stop(stream); - if (stream->id == RKISP_STREAM_MP || - stream->id == RKISP_STREAM_SP) { - /* call to the other devices */ - media_pipeline_stop(&node->vdev.entity); - ret = dev->pipe.set_stream(&dev->pipe, false); - if (ret < 0) - v4l2_err(v4l2_dev, - "pipeline stream-off failed:%d\n", ret); - } + /* call to the other devices */ + media_pipeline_stop(&node->vdev.entity); + ret = dev->pipe.set_stream(&dev->pipe, false); + if (ret < 0) + v4l2_err(v4l2_dev, + "pipeline stream-off failed:%d\n", ret); /* release buffers */ destroy_buf_queue(stream, VB2_BUF_STATE_ERROR); @@ -1253,7 +1258,6 @@ rkisp_destroy_dummy_buf(stream); atomic_dec(&dev->cap_dev.refcnt); -end: mutex_unlock(&dev->hw_dev->dev_lock); } @@ -1296,6 +1300,25 @@ } static int +rkisp_start_streaming_tx(struct rkisp_stream *stream) +{ + struct rkisp_device *dev = stream->ispdev; + int ret = -1; + + if (!dev->isp_inp || !stream->linked) + goto buffer_done; + + ret = rkisp_stream_start(stream); + if (ret < 0) + goto buffer_done; + return 0; +buffer_done: + destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED); + stream->streaming = false; + return ret; +} + +static int rkisp_start_streaming(struct vb2_queue *queue, unsigned int count) { struct rkisp_stream *stream = queue->drv_priv; @@ -1304,17 +1327,16 @@ struct v4l2_device *v4l2_dev = &dev->v4l2_dev; int ret = -1; - mutex_lock(&dev->hw_dev->dev_lock); - v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s %d\n", __func__, stream->id); - - if (WARN_ON(stream->streaming)) { - mutex_unlock(&dev->hw_dev->dev_lock); + if (WARN_ON(stream->streaming)) return -EBUSY; - } - memset(&stream->dbg, 0, sizeof(stream->dbg)); + + if (stream->id != RKISP_STREAM_MP && stream->id != RKISP_STREAM_SP) + return rkisp_start_streaming_tx(stream); + + mutex_lock(&dev->hw_dev->dev_lock); atomic_inc(&dev->cap_dev.refcnt); if (!dev->isp_inp || !stream->linked) { v4l2_err(v4l2_dev, "check video link or isp input\n"); @@ -1364,19 +1386,16 @@ goto close_pipe; } - if (stream->id == RKISP_STREAM_MP || - stream->id == RKISP_STREAM_SP) { - /* start sub-devices */ - ret = dev->pipe.set_stream(&dev->pipe, true); - if (ret < 0) - goto stop_stream; + /* start sub-devices */ + ret = dev->pipe.set_stream(&dev->pipe, true); + if (ret < 0) + goto stop_stream; - ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, - "start pipeline failed %d\n", ret); - goto pipe_stream_off; - } + ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe); + if (ret < 0) { + v4l2_err(&dev->v4l2_dev, + "start pipeline failed %d\n", ret); + goto pipe_stream_off; } mutex_unlock(&dev->hw_dev->dev_lock); @@ -1613,17 +1632,13 @@ stream = &dev->cap_dev.stream[RKISP_STREAM_MP]; if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_MP; - else - dev->irq_ends_mask |= ISP_FRAME_MP; - rkisp_check_idle(dev, ISP_FRAME_MP); + rkisp_check_idle(dev, ISP_FRAME_MP & dev->irq_ends_mask); } if (mis_val & CIF_MI_SP_FRAME) { stream = &dev->cap_dev.stream[RKISP_STREAM_SP]; if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_SP; - else - dev->irq_ends_mask |= ISP_FRAME_SP; - rkisp_check_idle(dev, ISP_FRAME_SP); + rkisp_check_idle(dev, ISP_FRAME_SP & dev->irq_ends_mask); } } diff --git a/kernel/drivers/media/platform/rockchip/isp/dev.c b/kernel/drivers/media/platform/rockchip/isp/dev.c index 64a4e74..0501a38 100644 --- a/kernel/drivers/media/platform/rockchip/isp/dev.c +++ b/kernel/drivers/media/platform/rockchip/isp/dev.c @@ -289,6 +289,12 @@ goto err_stream_off; } } else { + if (dev->hw_dev->monitor.is_en) { + dev->hw_dev->monitor.is_en = 0; + dev->hw_dev->monitor.state = ISP_STOP; + if (!completion_done(&dev->hw_dev->monitor.cmpl)) + complete(&dev->hw_dev->monitor.cmpl); + } /* sensor -> phy */ for (i = p->num_subdevs - 1; i >= 0; --i) v4l2_subdev_call(p->subdevs[i], video, s_stream, on); diff --git a/kernel/drivers/media/platform/rockchip/isp/dmarx.c b/kernel/drivers/media/platform/rockchip/isp/dmarx.c index d65662b..4529eb1 100644 --- a/kernel/drivers/media/platform/rockchip/isp/dmarx.c +++ b/kernel/drivers/media/platform/rockchip/isp/dmarx.c @@ -443,8 +443,7 @@ list_del(&stream->curr_buf->queue); } - if (stream->streaming) - stream->ops->update_mi(stream); + stream->ops->update_mi(stream); spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); return 0; } @@ -786,6 +785,9 @@ .unlocked_ioctl = video_ioctl2, .poll = vb2_fop_poll, .mmap = vb2_fop_mmap, +#ifdef CONFIG_COMPAT + .compat_ioctl32 = video_ioctl2, +#endif }; static int rkisp_try_fmt_vid_out_mplane(struct file *file, void *fh, diff --git a/kernel/drivers/media/platform/rockchip/isp/hw.c b/kernel/drivers/media/platform/rockchip/isp/hw.c index 60aa895..5e17cee 100644 --- a/kernel/drivers/media/platform/rockchip/isp/hw.c +++ b/kernel/drivers/media/platform/rockchip/isp/hw.c @@ -551,6 +551,9 @@ rockchip_iommu_disable(dev->dev); rockchip_iommu_enable(dev->dev); } + + if (dev->isp_ver == ISP_V21) + writel(readl(base + MI_RD_CTRL2) | BIT(30), base + MI_RD_CTRL2); } static void isp_config_clk(struct rkisp_hw_dev *dev, int on) diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_ispp.h b/kernel/drivers/media/platform/rockchip/isp/isp_ispp.h index 6ebb89f..f39f177 100644 --- a/kernel/drivers/media/platform/rockchip/isp/isp_ispp.h +++ b/kernel/drivers/media/platform/rockchip/isp/isp_ispp.h @@ -40,6 +40,10 @@ DEV_ID1, DEV_ID2, DEV_ID3, + DEV_ID4, + DEV_ID5, + DEV_ID6, + DEV_ID7, DEV_MAX, }; diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_params.h b/kernel/drivers/media/platform/rockchip/isp/isp_params.h index 89b3e78..2efa308 100644 --- a/kernel/drivers/media/platform/rockchip/isp/isp_params.h +++ b/kernel/drivers/media/platform/rockchip/isp/isp_params.h @@ -67,7 +67,7 @@ enum v4l2_quantization quantization; enum rkisp_fmt_raw_pat_type raw_type; u32 in_mbus_code; - + u32 cur_frame_id; struct preisp_hdrae_para_s hdrae_para; struct rkisp_isp_params_ops *ops; diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c b/kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c index 4f43539..a1592d8 100644 --- a/kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -3649,6 +3649,7 @@ (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops; u64 module_cfg_update = new_params->module_cfg_update; + params_vdev->cur_frame_id = new_params->frame_id; if (type == RKISP_PARAMS_SHD) return; diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c b/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c index c51e823..98e27c6 100644 --- a/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c +++ b/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c @@ -940,6 +940,7 @@ struct rkisp_isp21_stat_buffer *cur_stat_buf = NULL; struct rkisp_stats_v21_ops *ops = (struct rkisp_stats_v21_ops *)stats_vdev->priv_ops; + struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev; int ret = 0; cur_frame_id = meas_work->frame_id; @@ -958,6 +959,7 @@ cur_stat_buf = (struct rkisp_isp21_stat_buffer *)(cur_buf->vaddr[0]); cur_stat_buf->frame_id = cur_frame_id; + cur_stat_buf->params_id = params_vdev->cur_frame_id; } if (meas_work->isp_ris & ISP2X_AFM_SUM_OF) diff --git a/kernel/drivers/media/platform/rockchip/isp/regs_v2x.h b/kernel/drivers/media/platform/rockchip/isp/regs_v2x.h index a2c8ef1..d6cf58e 100644 --- a/kernel/drivers/media/platform/rockchip/isp/regs_v2x.h +++ b/kernel/drivers/media/platform/rockchip/isp/regs_v2x.h @@ -2697,8 +2697,6 @@ is_direct = false; rkisp_write(stream->ispdev, stream->config->mi.length, stream->out_fmt.plane_fmt[0].bytesperline, is_direct); - if (stream->ispdev->isp_ver == ISP_V21) - rkisp_set_bits(stream->ispdev, MI_RD_CTRL2, 0, BIT(30), false); } static inline void rx_force_upd(void __iomem *base) diff --git a/kernel/drivers/media/platform/rockchip/isp/rkisp.c b/kernel/drivers/media/platform/rockchip/isp/rkisp.c index 3350646..f65e7e7 100644 --- a/kernel/drivers/media/platform/rockchip/isp/rkisp.c +++ b/kernel/drivers/media/platform/rockchip/isp/rkisp.c @@ -608,6 +608,17 @@ if (is_3dlut_upd) rkisp_write(dev, ISP_3DLUT_UPDATE, 1, true); + /* if output stream enable, wait it end */ + val = rkisp_read(dev, CIF_MI_CTRL_SHD, true); + if (val & CIF_MI_CTRL_SHD_MP_OUT_ENABLED) + dev->irq_ends_mask |= ISP_FRAME_MP; + else + dev->irq_ends_mask &= ~ISP_FRAME_MP; + if (val & CIF_MI_CTRL_SHD_SP_OUT_ENABLED) + dev->irq_ends_mask |= ISP_FRAME_SP; + else + dev->irq_ends_mask &= ~ISP_FRAME_SP; + memset(dev->filt_state, 0, sizeof(dev->filt_state)); dev->filt_state[RDBK_F_VS] = dma2frm; @@ -735,12 +746,27 @@ if (!completion_done(&dev->hw_dev->monitor.cmpl)) complete(&dev->hw_dev->monitor.cmpl); } - if (dev->irq_ends != dev->irq_ends_mask || !IS_HDR_RDBK(dev->rd_mode)) + if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask || + !IS_HDR_RDBK(dev->rd_mode)) return; - if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC))) - dev->isp_state = ISP_STOP; + /* check output stream is off */ + val = ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC; + if (!(dev->irq_ends_mask & val)) { + u32 state = dev->isp_state; + struct rkisp_stream *s; + for (val = 0; val <= RKISP_STREAM_SP; val++) { + s = &dev->cap_dev.stream[val]; + dev->isp_state = ISP_STOP; + if (s->streaming) { + dev->isp_state = state; + break; + } + } + } + + val = 0; dev->irq_ends = 0; switch (dev->rd_mode) { case HDR_RDBK_FRAME3://for rd1 rd0 rd2 @@ -754,8 +780,6 @@ /* FALLTHROUGH */ } rkisp2_rawrd_isr(val, dev); - if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC))) - dev->isp_state = ISP_STOP; if (dev->dmarx_dev.trigger == T_MANUAL) rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL); if (dev->isp_state == ISP_STOP) @@ -1382,6 +1406,10 @@ ret = -EINVAL; } + /* fix 3a_wr no output with selfpath */ + if (dev->isp_ver == ISP_V21) + dpcl |= CIF_VI_DPCL_CHAN_MODE_MP | CIF_VI_DPCL_MP_MUX_MRSZ_MI; + writel(dpcl, dev->base_addr + CIF_VI_DPCL); return ret; @@ -1483,13 +1511,6 @@ if (atomic_read(&dev->hw_dev->refcnt) > 1) goto end; - - if (dev->hw_dev->monitor.is_en) { - dev->hw_dev->monitor.is_en = 0; - dev->hw_dev->monitor.state = ISP_STOP; - if (!completion_done(&dev->hw_dev->monitor.cmpl)) - complete(&dev->hw_dev->monitor.cmpl); - } /* * ISP(mi) stop in mi frame end -> Stop ISP(mipi) -> * Stop ISP(isp) ->wait for ISP isp off @@ -2241,7 +2262,7 @@ if (dev->hw_dev->is_single) { for (i = 0; i < RKISP_MAX_STREAM; i++) { stream = &dev->cap_dev.stream[i]; - if (stream->streaming) + if (stream->streaming && !stream->next_buf) stream->ops->frame_end(stream); } } @@ -2252,7 +2273,6 @@ struct rkisp_device *isp_dev = sd_to_isp_dev(sd); if (!on) { - rkisp_stop_3a_run(isp_dev); wait_event_timeout(isp_dev->sync_onoff, isp_dev->irq_ends_mask == (ISP_FRAME_END | ISP_FRAME_IN) && (!IS_HDR_RDBK(isp_dev->rd_mode) || @@ -2260,6 +2280,7 @@ rkisp_isp_stop(isp_dev); atomic_dec(&isp_dev->hw_dev->refcnt); rkisp_params_stream_stop(&isp_dev->params_vdev); + rkisp_stop_3a_run(isp_dev); return 0; } diff --git a/kernel/drivers/media/platform/rockchip/isp1/rkisp1.c b/kernel/drivers/media/platform/rockchip/isp1/rkisp1.c index 07246bc..f96fa83 100644 --- a/kernel/drivers/media/platform/rockchip/isp1/rkisp1.c +++ b/kernel/drivers/media/platform/rockchip/isp1/rkisp1.c @@ -1476,7 +1476,7 @@ } } else { rkisp1_config_clk(isp_dev, on); - ret = pm_runtime_put(isp_dev->dev); + ret = pm_runtime_put_sync(isp_dev->dev); if (ret < 0) return ret; } diff --git a/kernel/drivers/media/spi/ms41908.c b/kernel/drivers/media/spi/ms41908.c index 93f452b..92598a1 100644 --- a/kernel/drivers/media/spi/ms41908.c +++ b/kernel/drivers/media/spi/ms41908.c @@ -289,6 +289,7 @@ } ext_dev->is_running = true; reinit_completion(&ext_dev->complete); + reinit_completion(&ext_dev->complete_out); if (ext_dev->is_dir_opp) { if (pos > ext_dev->last_pos) { @@ -1239,7 +1240,6 @@ unsigned long ret = 0; if (dev->is_running) { - reinit_completion(&dev->complete_out); ret = wait_for_completion_timeout(&dev->complete_out, 10 * HZ); if (ret == 0) dev_info(&motor->spi->dev, @@ -2560,8 +2560,9 @@ (motor->piris->run_data.psum * 24); motor->piris->is_running = false; dev_info(&motor->spi->dev, - "piris vd_fz_period_us %u, inict %d\n", + "piris vd_fz_period_us %u, psum %d, inict %d\n", motor->vd_fz_period_us, + motor->piris->run_data.psum, motor->piris->run_data.intct); } if (motor->is_use_focus) { @@ -2580,8 +2581,9 @@ motor->focus->is_running = false; motor->focus->reback_ctrl = false; dev_info(&motor->spi->dev, - "focus vd_fz_period_us %u, inict %d\n", + "focus vd_fz_period_us %u, psum %d, inict %d\n", motor->vd_fz_period_us, + motor->focus->run_data.psum, motor->focus->run_data.intct); if (motor->focus->reback != 0) { motor->focus->cur_back_delay = 0; @@ -2619,7 +2621,6 @@ motor->zoom->mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns()); init_completion(&motor->zoom->complete); init_completion(&motor->zoom->complete_out); - motor->vd_fz_period_us = VD_FZ_US; motor->zoom->run_data.psum = motor->vd_fz_period_us * motor->zoom->start_up_speed * 8 / 1000000; motor->zoom->run_data.intct = 27 * motor->vd_fz_period_us / @@ -2653,8 +2654,9 @@ motor->zoom->reback_move_time_us = reback_vd_cnt * (motor->vd_fz_period_us + 500); } dev_info(&motor->spi->dev, - "zoom vd_fz_period_us %u, inict %d\n", + "zoom vd_fz_period_us %u, psum %d, inict %d\n", motor->vd_fz_period_us, + motor->zoom->run_data.psum, motor->zoom->run_data.intct); } if (motor->is_use_zoom1) { @@ -2666,7 +2668,6 @@ motor->zoom1->mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns()); init_completion(&motor->zoom1->complete); init_completion(&motor->zoom1->complete_out); - motor->vd_fz_period_us = VD_FZ_US; motor->zoom1->run_data.psum = motor->vd_fz_period_us * motor->zoom1->start_up_speed * 8 / 1000000; motor->zoom1->run_data.intct = 27 * motor->vd_fz_period_us / @@ -2674,8 +2675,9 @@ motor->zoom1->is_running = false; motor->zoom1->reback_ctrl = false; dev_info(&motor->spi->dev, - "zoom1 vd_fz_period_us %u, inict %d\n", + "zoom1 vd_fz_period_us %u, psum %d, inict %d\n", motor->vd_fz_period_us, + motor->zoom1->run_data.psum, motor->zoom1->run_data.intct); } diff --git a/kernel/drivers/mfd/fusb302.c b/kernel/drivers/mfd/fusb302.c index 205739f..1044b59 100644 --- a/kernel/drivers/mfd/fusb302.c +++ b/kernel/drivers/mfd/fusb302.c @@ -17,6 +17,8 @@ #include <linux/of_gpio.h> #include <linux/regmap.h> #include <linux/power_supply.h> +#include <linux/kthread.h> +#include <uapi/linux/sched/types.h> #include "fusb302.h" @@ -188,12 +190,12 @@ break; case 1: /* Battery */ - if ((CAP_VPDO_VOLTAGE(chip->rec_load[i]) * 50) <= + if ((CAP_VPDO_MAX_VOLTAGE(chip->rec_load[i]) * 50) <= max_vol && (CAP_VPDO_CURRENT(chip->rec_load[i]) * 10) <= max_cur) { chip->pos_power = i + 1; - tmp = CAP_VPDO_VOLTAGE(chip->rec_load[i]); + tmp = CAP_VPDO_MAX_VOLTAGE(chip->rec_load[i]); chip->pd_output_vol = tmp * 50; tmp = CAP_VPDO_CURRENT(chip->rec_load[i]); chip->pd_output_cur = tmp * 10; @@ -929,6 +931,7 @@ static void set_mesg(struct fusb30x_chip *chip, int cmd, int is_DMT) { int i; + uint32_t rec_load; struct PD_CAP_INFO *pd_cap_info = &chip->pd_cap_info; chip->send_head = ((chip->msg_id & 0x7) << 9) | @@ -962,23 +965,62 @@ (0 << 25) | (0 << 24); - switch (CAP_POWER_TYPE(chip->rec_load[chip->pos_power - 1])) { + rec_load = chip->rec_load[chip->pos_power - 1]; + switch (CAP_POWER_TYPE(rec_load)) { case 0: /* Fixed Supply */ - chip->send_load[0] |= ((CAP_FPDO_VOLTAGE(chip->rec_load[chip->pos_power - 1]) << 10) & 0x3ff); - chip->send_load[0] |= (CAP_FPDO_CURRENT(chip->rec_load[chip->pos_power - 1]) & 0x3ff); + chip->sink_supply_type = 0; + chip->sink_volt = CAP_FPDO_VOLTAGE(rec_load); + chip->sink_opr_cur = CAP_FPDO_CURRENT(rec_load); + chip->send_load[0] |= chip->sink_volt << 10; + chip->send_load[0] |= chip->sink_opr_cur; break; case 1: - /* Battery */ - chip->send_load[0] |= ((CAP_VPDO_VOLTAGE(chip->rec_load[chip->pos_power - 1]) << 10) & 0x3ff); - chip->send_load[0] |= (CAP_VPDO_CURRENT(chip->rec_load[chip->pos_power - 1]) & 0x3ff); + /* Battery Supply */ + chip->sink_supply_type = 1; + chip->sink_max_volt = + CAP_VPDO_MAX_VOLTAGE(rec_load); + chip->sink_min_volt = + CAP_VPDO_MIN_VOLTAGE(rec_load); + chip->sink_opr_power = + CAP_VPDO_CURRENT(rec_load); + chip->send_load[0] |= chip->sink_max_volt << 20; + chip->send_load[0] |= chip->sink_min_volt << 10; + chip->send_load[0] |= chip->sink_opr_power; break; default: - /* not meet battery caps */ + dev_warn(chip->dev, "No support supply req type %d\n", + CAP_POWER_TYPE(rec_load)); break; } break; case DMT_SINKCAPABILITIES: + chip->send_head |= (1 << 12) | (cmd & 0xf); + switch (chip->sink_supply_type) { + case 0: + /* + * Fixed Supply + * bit26 for 'USB Communiications Capable' + */ + chip->send_load[0] = + (chip->sink_supply_type << 30) | + (1 << 26) | + (chip->sink_volt << 10) | + (chip->sink_opr_cur); + break; + case 1: + /* Battery Supply */ + chip->send_load[0] = + (chip->sink_supply_type << 30) | + (chip->sink_max_volt << 20) | + (chip->sink_min_volt << 10) | + (chip->sink_opr_cur); + break; + default: + dev_warn(chip->dev, "No support sink supply type %d\n", + chip->sink_supply_type); + break; + } break; case DMT_VENDERDEFINED: break; @@ -2529,7 +2571,7 @@ break; case 1: /* Battery */ - if (CAP_VPDO_VOLTAGE(chip->rec_load[tmp]) <= 100) + if (CAP_VPDO_MAX_VOLTAGE(chip->rec_load[tmp]) <= 100) chip->pos_power = tmp + 1; break; default: @@ -2620,6 +2662,14 @@ chip->notify.is_pd_connected = true; dev_info(chip->dev, "PD connected as UFP, fetching 5V\n"); + tcpm_get_message(chip); + if (PACKET_IS_CONTROL_MSG(chip->rec_head, + CMT_GETSINKCAP)) { + set_mesg(chip, DMT_SINKCAPABILITIES, + DATAMESSAGE); + chip->tx_state = tx_idle; + policy_send_data(chip); + } set_state(chip, policy_snk_ready); } else if (PACKET_IS_DATA_MSG(chip->rec_head, DMT_SOURCECAPABILITIES)) { @@ -2671,7 +2721,12 @@ static void fusb_state_snk_ready(struct fusb30x_chip *chip, u32 evt) { if (evt & EVENT_RX) { - if (PACKET_IS_DATA_MSG(chip->rec_head, DMT_VENDERDEFINED)) { + if (PACKET_IS_CONTROL_MSG(chip->rec_head, CMT_GETSINKCAP)) { + set_mesg(chip, DMT_SINKCAPABILITIES, DATAMESSAGE); + chip->tx_state = tx_idle; + policy_send_data(chip); + } else if (PACKET_IS_DATA_MSG(chip->rec_head, + DMT_VENDERDEFINED)) { process_vdm_msg(chip); chip->work_continue |= EVENT_WORK_CONTINUE; chip->timer_state = T_DISABLED; @@ -3189,22 +3244,22 @@ BACK: if (chip->work_continue) { - queue_work(chip->fusb30x_wq, &chip->work); + kthread_queue_work(chip->irq_worker, &chip->irq_work); return; } if (!platform_get_device_irq_state(chip)) fusb_irq_enable(chip); else - queue_work(chip->fusb30x_wq, &chip->work); + kthread_queue_work(chip->irq_worker, &chip->irq_work); } static irqreturn_t cc_interrupt_handler(int irq, void *dev_id) { struct fusb30x_chip *chip = dev_id; - queue_work(chip->fusb30x_wq, &chip->work); fusb_irq_disable(chip); + kthread_queue_work(chip->irq_worker, &chip->irq_work); return IRQ_HANDLED; } @@ -3266,8 +3321,8 @@ } if (i != fusb30x_port_used) - queue_work(fusb30x_port_info[i]->fusb30x_wq, - &fusb30x_port_info[i]->work); + kthread_queue_work(fusb30x_port_info[i]->irq_worker, + &fusb30x_port_info[i]->irq_work); return HRTIMER_NORESTART; } @@ -3286,11 +3341,11 @@ chip->timer_mux = T_DISABLED; } -static void fusb302_work_func(struct work_struct *work) +static void fusb302_work_func(struct kthread_work *work) { struct fusb30x_chip *chip; - chip = container_of(work, struct fusb30x_chip, work); + chip = container_of(work, struct fusb30x_chip, irq_work); if (!chip->suspended) state_machine_typec(chip); } @@ -3300,6 +3355,7 @@ { struct fusb30x_chip *chip; struct PD_CAP_INFO *pd_cap_info; + struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 }; int ret; char *string[2]; @@ -3326,8 +3382,11 @@ fusb_initialize_timer(chip); - chip->fusb30x_wq = create_workqueue("fusb302_wq"); - INIT_WORK(&chip->work, fusb302_work_func); + chip->irq_worker = kthread_create_worker(0, dev_name(chip->dev)); + if (IS_ERR(chip->irq_worker)) + return PTR_ERR(chip->irq_worker); + sched_setscheduler_nocheck(chip->irq_worker->task, SCHED_FIFO, ¶m); + kthread_init_work(&chip->irq_work, fusb302_work_func); chip->role = ROLE_MODE_NONE; chip->try_role = ROLE_MODE_NONE; @@ -3368,6 +3427,8 @@ chip->n_caps_used = 1; chip->source_power_supply[0] = 0x64; chip->source_max_current[0] = 0x96; + chip->sink_volt = 100; + chip->sink_opr_cur = 200; pd_cap_info = &chip->pd_cap_info; pd_cap_info->dual_role_power = 1; @@ -3468,13 +3529,8 @@ goto IRQ_ERR; } - ret = devm_request_threaded_irq(&client->dev, - chip->gpio_int_irq, - NULL, - cc_interrupt_handler, - IRQF_ONESHOT | IRQF_TRIGGER_LOW, - client->name, - chip); + ret = request_irq(chip->gpio_int_irq, cc_interrupt_handler, + IRQF_TRIGGER_LOW, "fsc_interrupt_int_n", chip); if (ret) { dev_err(&client->dev, "irq request failed\n"); goto IRQ_ERR; @@ -3503,7 +3559,7 @@ } return 0; IRQ_ERR: - destroy_workqueue(chip->fusb30x_wq); + kthread_destroy_worker(chip->irq_worker); return ret; } @@ -3511,7 +3567,8 @@ { struct fusb30x_chip *chip = i2c_get_clientdata(client); - destroy_workqueue(chip->fusb30x_wq); + free_irq(chip->gpio_int_irq, chip); + kthread_destroy_worker(chip->irq_worker); return 0; } @@ -3534,7 +3591,7 @@ fusb_irq_disable(chip); chip->suspended = true; - cancel_work_sync(&chip->work); + kthread_cancel_work_sync(&chip->irq_work); return 0; } @@ -3545,7 +3602,7 @@ fusb_irq_enable(chip); chip->suspended = false; - queue_work(chip->fusb30x_wq, &chip->work); + kthread_queue_work(chip->irq_worker, &chip->irq_work); return 0; } diff --git a/kernel/drivers/mfd/fusb302.h b/kernel/drivers/mfd/fusb302.h index 749bff8..9b162f5 100644 --- a/kernel/drivers/mfd/fusb302.h +++ b/kernel/drivers/mfd/fusb302.h @@ -411,7 +411,8 @@ #define CAP_POWER_TYPE(PDO) ((PDO >> 30) & 3) #define CAP_FPDO_VOLTAGE(PDO) ((PDO >> 10) & 0x3ff) -#define CAP_VPDO_VOLTAGE(PDO) ((PDO >> 20) & 0x3ff) +#define CAP_VPDO_MAX_VOLTAGE(PDO) ((PDO >> 20) & 0x3ff) +#define CAP_VPDO_MIN_VOLTAGE(PDO) ((PDO >> 10) & 0x3ff) #define CAP_FPDO_CURRENT(PDO) ((PDO >> 0) & 0x3ff) #define CAP_VPDO_CURRENT(PDO) ((PDO >> 0) & 0x3ff) @@ -481,8 +482,8 @@ struct i2c_client *client; struct device *dev; struct regmap *regmap; - struct work_struct work; - struct workqueue_struct *fusb30x_wq; + struct kthread_work irq_work; + struct kthread_worker *irq_worker; struct hrtimer timer_state_machine; struct hrtimer timer_mux_machine; struct PD_CAP_INFO pd_cap_info; @@ -524,10 +525,19 @@ int msg_id; enum tx_state tx_state; int hardrst_count; - u32 source_power_supply[7]; /* 50mv unit */ - u32 source_max_current[7]; + u32 source_power_supply[7]; /* 10ma uint*/ + u32 source_max_current[7]; + /* Fixed supply = 0, Battery supply = 1 */ + u32 sink_supply_type; + /* Sink Fixed Supply */ + u32 sink_volt; + u32 sink_opr_cur; + /* Sink Battery Supply */ + u32 sink_max_volt; + u32 sink_min_volt; + u32 sink_opr_power; int pos_power; /* * if PartnerCap[0] == 0xffffffff diff --git a/kernel/drivers/misc/Kconfig b/kernel/drivers/misc/Kconfig index a575ad1..4bf0664 100644 --- a/kernel/drivers/misc/Kconfig +++ b/kernel/drivers/misc/Kconfig @@ -76,8 +76,7 @@ are combined to make a single 32-bit timer. When GENERIC_CLOCKEVENTS is defined, the third timer channel - may be used as a clock event device supporting oneshot mode - (delays of up to two seconds) based on the 32 KiHz clock. + may be used as a clock event device supporting oneshot mode. config ATMEL_TCB_CLKSRC_BLOCK int @@ -90,6 +89,15 @@ TC can be used for other purposes, such as PWM generation and interval timing. +config ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK + bool "TC Block use 32 KiHz clock" + depends on ATMEL_TCB_CLKSRC + default y + help + Select this to use 32 KiHz base clock rate as TC block clock + source for clock events. + + config DUMMY_IRQ tristate "Dummy IRQ handler" default n diff --git a/kernel/drivers/misc/Makefile b/kernel/drivers/misc/Makefile index f516b9a..6f30411 100644 --- a/kernel/drivers/misc/Makefile +++ b/kernel/drivers/misc/Makefile @@ -62,5 +62,4 @@ obj-$(CONFIG_UID_SYS_STATS) += uid_sys_stats.o obj-$(CONFIG_PIR_ASCHIP) += pir-aschip.o obj-$(CONFIG_RK803) += rk803.o -obj-y += nkio/ -obj-y += nkmcu/ +obj-y += nkio/ diff --git a/kernel/drivers/misc/eeprom/at24.c b/kernel/drivers/misc/eeprom/at24.c index dde0b45..dc35376 100644 --- a/kernel/drivers/misc/eeprom/at24.c +++ b/kernel/drivers/misc/eeprom/at24.c @@ -6,7 +6,6 @@ * Copyright (C) 2008 Wolfram Sang, Pengutronix */ -#define DEBUG #include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> @@ -107,8 +106,6 @@ module_param_named(write_timeout, at24_write_timeout, uint, 0); MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)"); -//Ben -struct at24_data *at24_private=NULL; struct at24_chip_data { /* * these fields mirror their equivalents in @@ -424,146 +421,6 @@ return 0; } -//add ben -static ssize_t at24_read_private(struct at24_data *at24, - char *buf, loff_t off, size_t count) -{ - ssize_t retval = 0; - - if (unlikely(!count)) - return count; - - if (off + count > at24->byte_len) - return -EINVAL; - - /* - * Read data from chip, protecting against concurrent updates - * from this host, but not from other I2C masters. - */ - mutex_lock(&at24->lock); - - while (count) { - ssize_t status; - - //status = at24_eeprom_read_i2c(at24, buf, off, count); - status = at24_regmap_read(at24, buf, off, count); - if (status <= 0) { - if (retval == 0) - retval = status; - break; - } - buf += status; - off += status; - count -= status; - retval += status; - } - - mutex_unlock(&at24->lock); - - return retval; -} - -#if 0 -static unsigned char AscToHex(unsigned char aChar) -{ - if((aChar>=0x30)&&(aChar<=0x39)) - aChar -= 0x30; - else if((aChar>=0x41)&&(aChar<=0x46)) - aChar -= 0x37; - else if((aChar>=0x61)&&(aChar<=0x66)) - aChar -= 0x57; - else aChar = 0xff; - - return aChar; -} -#endif - -#if 0 -ssize_t at24_mac_read(unsigned char* addr) -{ - char buf[20]; - char buf_tmp[12]; - int i; - ssize_t ret; - if (at24_private == NULL) - { - printk("ben %s: at24_private==null error\n", __func__); - return 0; - } - memset(buf, 0x00, 20); - memset(buf_tmp, 0x00, 12); - ret = at24_read(at24_private, 0, buf, 12); - if (ret > 0) - { - for(i=0; i<12; i++) - { - buf_tmp[i] = AscToHex(buf[i]); - } - addr[0] = (buf_tmp[0] << 4) | buf_tmp[1]; - addr[1] = (buf_tmp[2] << 4) | buf_tmp[3]; - addr[2] = (buf_tmp[4] << 4) | buf_tmp[5]; - addr[3] = (buf_tmp[6] << 4) | buf_tmp[7]; - addr[4] = (buf_tmp[8] << 4) | buf_tmp[9]; - addr[5] = (buf_tmp[10] << 4) | buf_tmp[11]; - } - return ret; -} -#endif - -ssize_t at24_mac_read(unsigned char* addr) -{ - char buf[20]; - char buf_tmp[12]; - ssize_t ret; - if (at24_private == NULL) - { - printk("ben: at24_mac_read at24_private==null error"); - return 0; - } - memset(buf, 0x00, 20); - memset(buf_tmp, 0x00, 12); - ret = at24_read_private(at24_private, buf, 0, 6); - if (ret > 0) - { - addr[0] = buf[0]; - addr[1] = buf[1]; - addr[2] = buf[2]; - addr[3] = buf[3]; - addr[4] = buf[4]; - addr[5] = buf[5]; - } - printk("at24_mac_read ...............\n"); - return ret; -} -EXPORT_SYMBOL(at24_mac_read); - -ssize_t at24_mac1_read(unsigned char* mac) -{ - char buf[20]; - char buf_tmp[12]; - ssize_t ret; - if (at24_private == NULL) - { - printk("zcl: at24_mac_read at24_private==null error"); - return 0; - } - memset(buf, 0x00, 20); - memset(buf_tmp, 0x00, 12); - ret = at24_read_private(at24_private, buf, 0x10, 6); - if (ret > 0) - { - *mac = buf[0]; - *(mac + 1) = buf[1]; - *(mac + 2) = buf[2]; - *(mac + 3) = buf[3]; - *(mac + 4) = buf[4]; - *(mac + 5) = buf[5]; - } - printk("at24_mac1_read ...............\n"); - return ret; -} -EXPORT_SYMBOL(at24_mac1_read); - static int at24_write(void *priv, unsigned int off, void *val, size_t count) { struct at24_data *at24; @@ -773,7 +630,6 @@ u8 test_byte; int err; - printk("ben %s ...\n", __func__); i2c_fn_i2c = i2c_check_functionality(client->adapter, I2C_FUNC_I2C); i2c_fn_block = i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_I2C_BLOCK); @@ -818,7 +674,6 @@ if (!at24) return -ENOMEM; - at24_private = at24; mutex_init(&at24->lock); at24->byte_len = pdata.byte_len; at24->page_size = pdata.page_size; @@ -937,8 +792,7 @@ at24_io_limit = rounddown_pow_of_two(at24_io_limit); return i2c_add_driver(&at24_driver); } -//module_init(at24_init); -postcore_initcall_sync(at24_init); +module_init(at24_init); static void __exit at24_exit(void) { diff --git a/kernel/drivers/misc/nkio/nk_io_core.c_bak b/kernel/drivers/misc/nkio/nk_io_core.c_bak new file mode 100755 index 0000000..19f204b --- /dev/null +++ b/kernel/drivers/misc/nkio/nk_io_core.c_bak @@ -0,0 +1,427 @@ +/* + * Copyright (C) 2014 Rockchip Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/init.h> +#include <linux/delay.h> +#include <linux/pm.h> +#include <linux/i2c.h> +#include <linux/spi/spi.h> +#include <linux/platform_device.h> +#include <linux/errno.h> +#include <linux/err.h> +#include <linux/debugfs.h> +#include <linux/of_gpio.h> +#include <linux/gpio.h> +#include <linux/iio/consumer.h> +#include <linux/of.h> +#include "nkio.h" + +/* Debug */ +#if 1 +#define DBG(x...) printk(x) +#else +#define DBG(x...) do { } while (0) +#endif + +struct ndj_io_pdata *NDJpdata_info; +u32 op0_enable,op1_enable,op2_enable,op3_enable,op4_enable,op5_enable,mic_enable; +u32 ip0_enable,ip1_enable,ip2_enable,ip3_enable,ip4_enable,ip5_enable; +u32 module_enable; +static struct class *ndj_class; + + +static int ndj_io_control_probe(struct platform_device *pdev) +{ + struct device_node *node = pdev->dev.of_node; + struct ndj_io_pdata *pdata; + int ret; + int i=0; + enum of_gpio_flags flags; + int ch342_reset, ch342_reset_2; + printk(" ####### NDJ_io_control_probe####### \n"); + + pdata = kzalloc(sizeof(struct ndj_io_pdata), GFP_KERNEL); + if (pdata == NULL) { + printk("%s failed to allocate driver data\n",__FUNCTION__); + return -ENOMEM; + } + memset(pdata,0,sizeof(struct ndj_io_pdata)); + + + //mic_switch_gpio + ret = of_get_named_gpio_flags(node, "mic_switch_gpio", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property mic_switch_gpio\n", __FUNCTION__); + goto err; + } else { + pdata->mic_switch_gpio = ret; + ret = devm_gpio_request(&pdev->dev, pdata->mic_switch_gpio, "mic_switch_gpio"); + if(ret < 0){ + printk("%s() devm_gpio_request mic_switch_gpio request ERROR\n", __FUNCTION__); + goto err; + } + ret = gpio_direction_output(pdata->mic_switch_gpio,0); + mic_enable = 0; + if(ret < 0){ + printk("%s() gpio_direction_input mic_switch_gpio set ERROR\n", __FUNCTION__); + goto err; + } + } + + //vcc_5v_io + ret = of_get_named_gpio_flags(node, "vcc_5v_io", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property vcc_5v_io\n", __FUNCTION__); + goto err; + } else { + pdata->vcc_5v_io = ret; + ret = devm_gpio_request(&pdev->dev, pdata->vcc_5v_io, "vcc_5v_io"); + if(ret < 0){ + printk("%s() devm_gpio_request vcc_5v_io request ERROR\n", __FUNCTION__); + goto err; + } + + ret = gpio_direction_output(pdata->vcc_5v_io,1); + if(ret < 0){ + printk("%s() gpio_direction_output vcc_5v_io set ERROR\n", __FUNCTION__); + goto err; + } + } + + //vcc_12v_io + ret = of_get_named_gpio_flags(node, "vcc_12v_io", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property vcc_12v_io\n", __FUNCTION__); + goto err; + } else { + pdata->vcc_12v_io = ret; + ret = devm_gpio_request(&pdev->dev, pdata->vcc_12v_io, "vcc_12v_io"); + if(ret < 0){ + printk("%s() devm_gpio_request vcc_12v_io request ERROR\n", __FUNCTION__); + goto err; + } + + ret = gpio_direction_output(pdata->vcc_12v_io,1); + if(ret < 0){ + printk("%s() gpio_direction_output vcc_12v_io set ERROR\n", __FUNCTION__); + goto err; + } + } +#if 0 + //hub_5V_gpio + ret = of_get_named_gpio_flags(node, "hub_5V_gpio", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property hub_5V_gpio\n", __FUNCTION__); + goto err; + } else { + + pdata->hub_5V_gpio = ret; + gpio_free(ret); + ret = devm_gpio_request(&pdev->dev, pdata->hub_5V_gpio, "hub_5V_gpio"); + if(ret < 0){ + printk("%s() devm_gpio_request hub_5V_gpio request ERROR\n", __FUNCTION__); + goto err; + } + + ret = gpio_direction_output(pdata->hub_5V_gpio,1); + if(ret < 0){ + printk("%s() gpio_direction_output hub_5V_gpio set ERROR\n", __FUNCTION__); + goto err; + } + } +#endif + + //hub_5V_rest_gpio + ret = of_get_named_gpio_flags(node, "hub_5V_rest_gpio", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property hub_5V_rest_gpio\n", __FUNCTION__); + goto err; + } else { + pdata->hub_5V_rest_gpio = ret; + ret = devm_gpio_request(&pdev->dev, pdata->hub_5V_rest_gpio, "hub_5V_rest_gpio"); + if(ret < 0){ + printk("%s() devm_gpio_request hub_5V_rest_gpio request ERROR\n", __FUNCTION__); + goto err; + } + + ret = gpio_direction_output(pdata->hub_5V_rest_gpio,0); + if(ret < 0){ + printk("%s() gpio_direction_output hub_5V_rest_gpio set ERROR\n", __FUNCTION__); + goto err; + } + msleep(800); + ret = gpio_direction_output(pdata->hub_5V_rest_gpio,1); + if(ret < 0){ + printk("%s() gpio_direction_output hub_5V_rest_gpio set ERROR\n", __FUNCTION__); + goto err; + } + } + + ret = of_get_named_gpio_flags(node, "ch342_power", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property ch342_power\n", __FUNCTION__); + } else { + pdata->ch342_power = ret; + + ret = devm_gpio_request(&pdev->dev, pdata->ch342_power, "wch342_power"); + if(ret < 0){ + printk("%s() devm_gpio_request ch342_power request ERROR\n", __FUNCTION__); + } + ret = gpio_direction_output(pdata->ch342_power,1); + if(ret < 0){ + printk("%s() gpio_direction_input wake_4g_gpio set ERROR\n", __FUNCTION__); + } + } + + #if 1 + // ch342_reset + ret = of_get_named_gpio_flags(node, "ch342_reset", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property ch342_reset\n", __FUNCTION__); + } else { + pdata->reset_ch342_gpio = ret; + + ret = devm_gpio_request(&pdev->dev, pdata->reset_ch342_gpio, "ch342_reset"); + if(ret < 0){ + printk("%s() devm_gpio_request ch342_reset request ERROR\n", __FUNCTION__); + } + + ret = gpio_direction_output(pdata->reset_ch342_gpio,0); + if(ret < 0){ + printk("%s() gpio_direction_output reset_ch342_gpio set ERROR\n", __FUNCTION__); + goto err; + } + msleep(200); + ret = gpio_direction_output(pdata->reset_ch342_gpio,1); + if(ret < 0){ + printk("%s() gpio_direction_output reset_ch342_gpio set ERROR\n", __FUNCTION__); + goto err; + } + } + + ret = of_get_named_gpio_flags(node, "ch342_reset_2", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property ch342_reset_2\n", __FUNCTION__); + } else { + pdata->reset_ch342_gpio_2 = ret; + + ret = devm_gpio_request(&pdev->dev, pdata->reset_ch342_gpio_2, "ch342_reset_2"); + if(ret < 0){ + printk("%s() devm_gpio_request ch342_reset request ERROR\n", __FUNCTION__); + } + ret = gpio_direction_output(pdata->reset_ch342_gpio_2,0); + if(ret < 0){ + printk("%s() gpio_direction_output reset_ch342_gpio_2 set ERROR\n", __FUNCTION__); + goto err; + } + msleep(200); + ret = gpio_direction_output(pdata->reset_ch342_gpio_2,1); + if(ret < 0){ + printk("%s() gpio_direction_output reset_ch342_gpio_2 set ERROR\n", __FUNCTION__); + goto err; + } + } +#endif +#if 1 + //reset_4g_gpio + ret = of_get_named_gpio_flags(node, "reset_4g_gpio", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property reset_4g_gpio\n", __FUNCTION__); + } else { + pdata->reset_4g_gpio = ret; + + ret = devm_gpio_request(&pdev->dev, pdata->reset_4g_gpio, "reset_4g_gpio"); + if(ret < 0){ + printk("%s() devm_gpio_request reset_4g_gpio request ERROR\n", __FUNCTION__); + } + ret = gpio_direction_output(pdata->reset_4g_gpio,1); + if(ret < 0){ + printk("%s() gpio_direction_input reset_4g_gpio set ERROR\n", __FUNCTION__); + } + mdelay(300); + ret = gpio_direction_output(pdata->reset_4g_gpio,0); + if(ret < 0){ + printk("%s() gpio_direction_input reset_4g_gpio set ERROR\n", __FUNCTION__); + } + } +#endif + + //en_4g_gpio + ret = of_get_named_gpio_flags(node, "en_4g_gpio", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property en_4g_gpio\n", __FUNCTION__); + } else { + pdata->en_4g_gpio = ret; + + ret = devm_gpio_request(&pdev->dev, pdata->en_4g_gpio, "en_4g_gpio"); + if(ret < 0){ + printk("%s() devm_gpio_request en_4g_gpio request ERROR\n", __FUNCTION__); + } + ret = gpio_direction_output(pdata->en_4g_gpio,1); + if(ret < 0){ + printk("%s() gpio_direction_input en_4g_gpio set ERROR\n", __FUNCTION__); + } + } + + + //air_mode_4g_gpio + ret = of_get_named_gpio_flags(node, "air_mode_4g_gpio", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property air_mode_4g_gpio\n", __FUNCTION__); + } else { + pdata->air_mode_4g_gpio = ret; + + ret = devm_gpio_request(&pdev->dev, pdata->air_mode_4g_gpio, "air_mode_4g_gpio"); + if(ret < 0){ + printk("%s() devm_gpio_request air_mode_4g_gpio request ERROR\n", __FUNCTION__); + } + ret = gpio_direction_output(pdata->air_mode_4g_gpio,0); + if(ret < 0){ + printk("%s() gpio_direction_input air_mode_4g_gpio set ERROR\n", __FUNCTION__); + } + } + + + //air_mode_4g_gpio + ret = of_get_named_gpio_flags(node, "wake_4g_gpio", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property wake_4g_gpio\n", __FUNCTION__); + } else { + pdata->air_mode_4g_gpio = ret; + + ret = devm_gpio_request(&pdev->dev, pdata->air_mode_4g_gpio, "wake_4g_gpio"); + if(ret < 0){ + printk("%s() devm_gpio_request wake_4g_gpio request ERROR\n", __FUNCTION__); + } + ret = gpio_direction_output(pdata->wake_4g_gpio,0); + if(ret < 0){ + printk("%s() gpio_direction_output wake_4g_gpio set ERROR\n", __FUNCTION__); + } + } + + + + #if 0 + //audio_switch_gpio + ret = of_get_named_gpio_flags(node, "audio_switch_gpio", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property audio_switch_gpio\n", __FUNCTION__); + goto err; + } else { + pdata->audio_switch_gpio = ret; + ret = devm_gpio_request(&pdev->dev, pdata->audio_switch_gpio, "audio_switch_gpio"); + if(ret < 0){ + printk("%s() devm_gpio_request audio_switch_gpio request ERROR\n", __FUNCTION__); + goto err; + } + ret = gpio_direction_output(pdata->audio_switch_gpio, !flags); + if(ret < 0){ + printk("%s() gpio_direction_input audio_switch_gpio set ERROR\n", __FUNCTION__); + goto err; + } + } + #endif + +// printk("fan_io_en ....\r\n"); + ret = of_get_named_gpio_flags(node, "fan_io_en", 0, &flags); + if (ret < 0) { + printk("%s() Can not read property fan_io_en\n", __FUNCTION__); + goto err; + } else { + int gpio = ret; + ret = devm_gpio_request(&pdev->dev, gpio, "fan_io_en"); + if(ret < 0){ + printk("%s() devm_gpio_request vcc_5v_io request ERROR\n", __FUNCTION__); + goto err; + } + + ret = gpio_direction_output(gpio, !flags); + if(ret < 0){ + printk("%s() gpio_direction_input fan_io_en set ERROR\n", __FUNCTION__); + goto err; + } + } + // printk("fan_io_en ....ok!\r\n"); + + + + NDJpdata_info = pdata; + + printk(" #######ndj_io_control_probe end####### \n"); + return 0; +err: + kfree(pdata); + return ret; +} + +static int ndj_io_control_remove(struct platform_device *pdev) +{ + if(NDJpdata_info) + kfree(NDJpdata_info); + return 0; +} + +static int ndj_io_control_suspend(struct platform_device *pdev, pm_message_t state) +{ + printk("LED_early_suspend LED_early_suspend LED_early_suspend !!!!\n"); + + //enable = 0; + //LED_SET(0); + return 0; +} + +static int ndj_io_control_resume(struct platform_device *pdev) +{ + printk("LED_early_resume LED_early_resume LED_early_resume !!!!\n"); + + //enable = 1; + //LED_SET(11); + return 0; +} + +static const struct of_device_id ndj_io_control_of_match[] = { + { .compatible = "ndj_io_control", }, + {}, +}; +MODULE_DEVICE_TABLE(of, ndj_io_control_of_match); + +static struct platform_driver ndj_io_control_driver = { + .probe = ndj_io_control_probe, + .remove = ndj_io_control_remove, + .resume = ndj_io_control_resume, + .suspend = ndj_io_control_suspend, + .driver = { + .name = "ndj_io_control", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(ndj_io_control_of_match), + }, +}; + +static int __init ndj_io_control_init(void) +{ + platform_driver_register(&ndj_io_control_driver); + return 0; +} + +static void __exit ndj_io_control_exit(void) +{ + platform_driver_unregister(&ndj_io_control_driver); +} + +subsys_initcall(ndj_io_control_init); + +//late_initcall(ndj_io_control_init); +MODULE_DESCRIPTION("ndj io Core Driver"); +MODULE_LICENSE("GPL"); diff --git a/kernel/drivers/misc/nkmcu/Makefile b/kernel/drivers/misc/nkmcu/Makefile deleted file mode 100644 index aca06fb..0000000 --- a/kernel/drivers/misc/nkmcu/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-y += nk_mcu.o diff --git a/kernel/drivers/misc/nkmcu/nk_mcu.c b/kernel/drivers/misc/nkmcu/nk_mcu.c deleted file mode 100755 index b0702be..0000000 --- a/kernel/drivers/misc/nkmcu/nk_mcu.c +++ /dev/null @@ -1,161 +0,0 @@ -#include <linux/module.h> -#include <linux/clk-provider.h> -#include <linux/i2c.h> -#include <linux/delay.h> - -static struct i2c_client s_m_client; -static struct i2c_client* m_client; - -//写16位寄存器 -static inline int nkmcu_reg_write(struct i2c_client *client,int index,unsigned short reg, unsigned char val) -{ - unsigned char u8_buf[3] = { 0 }; - unsigned int buf_len = 3; - int retry, timeout = 5; - int ret; - - ret = 0; - u8_buf[0] = (reg >> 8) & 0xFF;//寄存器地址高位 - u8_buf[1] = reg & 0xFF; //寄存器地址低位 - u8_buf[2] = val; //要发送的数据 - - //pdata->client->addr = ADDR + index; - for (retry = 0; retry < timeout; retry++) - { - if (i2c_master_send(client, u8_buf, buf_len) < 0) - { - pr_err("%s:write reg error: reg=0x%x, val=0x%x, retry = %d.\n", __func__, reg, val, retry); - ret = -1; - msleep(5); - continue; - } - else - { - pr_err("%s:write reg ok: reg=0x%x, val=0x%x, retry = %d.\n", __func__, reg, val, retry); - ret = 0; - break; - } - } - return ret; -} - -//16位读 -static inline int nkmcu_reg_read(struct i2c_client *client, int index, unsigned short reg) -{ - unsigned char u8_buf[2] = { 0 }; - unsigned int buf_len = 2; - int retry, timeout = 5; - unsigned char u8_val = 0; - - u8_buf[0] = (reg >> 8) & 0xFF;//寄存器地址高位 - u8_buf[1] = reg & 0xFF;//寄存器地址低位 - - //pdata->client->addr = ADDR + index; - for (retry = 0; retry < timeout; retry++) - { - if (i2c_master_send(client, u8_buf, buf_len) < 0) - { - pr_err("%s:read reg error on send: reg=0x%x, retry = %d.\n", __func__, reg, retry); - msleep(5); - continue; - } - if (i2c_master_recv(client, &u8_val, 1) != 1) { - pr_err("%s:read reg error on recv: reg=0x%x, retry = %d.\n", __func__, reg, retry); - msleep(5); - continue; - } - break; - } - - if (retry >= timeout) { - pr_err("%s:read reg error: reg=0x%x.\n", __func__, reg); - return -1; - } - - return u8_val; -} - -void nkmcu_device_shutdown(void) -{ - int ret; - - pr_err("nkmcu_device_shutdown.. \n"); - - //powenoff - if (m_client != NULL) - { - ret = nkmcu_reg_write(m_client, 0x00, 0x06, 0x01); - if (ret < 0) - pr_err("nkmcu_device_shutdown..failed \n"); - else - pr_err("nkmcu_device_shutdown.. ok \n"); - } - -} -EXPORT_SYMBOL(nkmcu_device_shutdown); - -static int nk_mcu_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct device_node *np = client->dev.of_node; - int ret; - - printk("%s: probe\n", __FUNCTION__); - - /* check state of calendar information */ - //device id - //i2c_smbus_read_word_data - msleep(100); - //ret = i2c_smbus_read_byte_data(client, 0x00); - ret = nkmcu_reg_read(client, 0x00, 0x00); - printk("device id:%x \n", ret); - if (ret != 0xaa) - goto error; - - //powenon - msleep(100); - //ret = i2c_smbus_write_word_data(client, 0x07, 0x01); - ret = nkmcu_reg_write(client, 0x00, 0x07, 0x01); - printk("poweron command:%x \n", ret); - if (ret < 0) - goto error; - - //m_client = client; - memcpy(&s_m_client, client, sizeof(struct i2c_client)); - m_client = &s_m_client; - return 0; - -error: - return -1; -} - -static const struct i2c_device_id nk_mcu_id[] = { - { "nk_mcu", 0 }, - { } -}; - -static struct i2c_driver nk_mcu_driver = { - .driver = { - .name = "nk_mcu", - .owner = THIS_MODULE, - }, - .probe = nk_mcu_probe, - .id_table = nk_mcu_id, -}; - -static int __init nk_mcu_init(void) -{ - return i2c_add_driver(&nk_mcu_driver); -} - -static void __exit nk_mcu_exit(void) -{ - i2c_del_driver(&nk_mcu_driver); -} - - -MODULE_AUTHOR("ben@hotmail.com"); -MODULE_DESCRIPTION("nodka mcu driver"); -MODULE_LICENSE("GPL"); - -late_initcall(nk_mcu_init); -module_exit(nk_mcu_exit); diff --git a/kernel/drivers/mmc/core/core.c b/kernel/drivers/mmc/core/core.c index b7d646a..c12ce9b 100644 --- a/kernel/drivers/mmc/core/core.c +++ b/kernel/drivers/mmc/core/core.c @@ -2432,7 +2432,7 @@ } EXPORT_SYMBOL(mmc_set_blockcount); -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC static void mmc_hw_reset_for_init(struct mmc_host *host) { mmc_pwrseq_reset(host); @@ -2504,7 +2504,7 @@ * Some eMMCs (with VCCQ always on) may not be reset after power up, so * do a hardware reset if possible. */ -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC mmc_hw_reset_for_init(host); #endif diff --git a/kernel/drivers/mmc/core/mmc.c b/kernel/drivers/mmc/core/mmc.c index 1315805..0d96658 100644 --- a/kernel/drivers/mmc/core/mmc.c +++ b/kernel/drivers/mmc/core/mmc.c @@ -70,7 +70,7 @@ /* * Given the decoded CSD structure, decode the raw CID to our CID structure. */ -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC static int mmc_decode_cid(struct mmc_card *card) { u32 *resp = card->raw_cid; @@ -666,7 +666,7 @@ return err; } -#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC static void *mmc_tb_map_ecsd(phys_addr_t start, size_t len) { int i; @@ -696,7 +696,7 @@ { u8 *ext_csd; int err; -#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC void *ecsd = NULL; bool valid_ecsd = false; bool valid_reserved = false; @@ -707,7 +707,7 @@ if (!mmc_can_ext_csd(card)) return 0; -#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC mem = of_parse_phandle(dev->of_node, "memory-region-ecsd", 0); if (mem) { err = of_address_to_resource(mem, 0, ®); @@ -758,11 +758,11 @@ return err; } -#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC decode: #endif err = mmc_decode_ext_csd(card, ext_csd); -#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC if (!valid_ecsd) kfree(ext_csd); else @@ -777,7 +777,7 @@ return err; } -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) { u8 *bw_ext_csd; @@ -1117,7 +1117,7 @@ * compare ext_csd previously read in 1 bit mode * against ext_csd at new bus width */ -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST)) err = mmc_compare_ext_csds(card, bus_width); else @@ -1495,6 +1495,9 @@ if (host->ops->hs400_enhanced_strobe) host->ops->hs400_enhanced_strobe(host, &host->ios); + /* some emmc device need a delay before read status */ + usleep_range(100, 200); + err = mmc_switch_status(card); if (err) goto out_err; @@ -1653,7 +1656,7 @@ * respond. * mmc_go_idle is needed for eMMC that are asleep */ -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC mmc_go_idle(host); #endif @@ -1698,7 +1701,7 @@ card->ocr = ocr; card->type = MMC_TYPE_MMC; card->rca = 1; -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); #endif } @@ -1731,7 +1734,7 @@ err = mmc_decode_csd(card); if (err) goto free_card; -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC err = mmc_decode_cid(card); if (err) goto free_card; @@ -1866,7 +1869,7 @@ /* * Enable HPI feature (if supported) */ -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC if (card->ext_csd.hpi) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HPI_MGMT, 1, diff --git a/kernel/drivers/mmc/core/mmc_ops.c b/kernel/drivers/mmc/core/mmc_ops.c index 1b35251..8060fec 100644 --- a/kernel/drivers/mmc/core/mmc_ops.c +++ b/kernel/drivers/mmc/core/mmc_ops.c @@ -147,7 +147,7 @@ * rules that must accommodate non-MMC slaves which this layer * won't even know about. */ -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC if (!mmc_host_is_spi(host)) { mmc_set_chip_select(host, MMC_CS_HIGH); mmc_delay(1); @@ -159,7 +159,7 @@ err = mmc_wait_for_cmd(host, &cmd, 0); -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC mmc_delay(1); if (!mmc_host_is_spi(host)) { mmc_set_chip_select(host, MMC_CS_DONTCARE); @@ -199,7 +199,7 @@ } err = -ETIMEDOUT; -#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC mmc_delay(1); #else udelay(1); diff --git a/kernel/drivers/mmc/host/android-goldfish.c b/kernel/drivers/mmc/host/android-goldfish.c index 61e4e2a..0840fed 100644 --- a/kernel/drivers/mmc/host/android-goldfish.c +++ b/kernel/drivers/mmc/host/android-goldfish.c @@ -549,6 +549,7 @@ .remove = goldfish_mmc_remove, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/kernel/drivers/mmc/host/atmel-mci.c b/kernel/drivers/mmc/host/atmel-mci.c index fbc56ee..2d31aa9 100644 --- a/kernel/drivers/mmc/host/atmel-mci.c +++ b/kernel/drivers/mmc/host/atmel-mci.c @@ -2701,6 +2701,7 @@ .remove = atmci_remove, .driver = { .name = "atmel_mci", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(atmci_dt_ids), .pm = &atmci_dev_pm_ops, }, diff --git a/kernel/drivers/mmc/host/au1xmmc.c b/kernel/drivers/mmc/host/au1xmmc.c index 9b4be67..bfe3536 100644 --- a/kernel/drivers/mmc/host/au1xmmc.c +++ b/kernel/drivers/mmc/host/au1xmmc.c @@ -1210,6 +1210,7 @@ .resume = au1xmmc_resume, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/kernel/drivers/mmc/host/davinci_mmc.c b/kernel/drivers/mmc/host/davinci_mmc.c index e6f1425..775afc85 100644 --- a/kernel/drivers/mmc/host/davinci_mmc.c +++ b/kernel/drivers/mmc/host/davinci_mmc.c @@ -1409,6 +1409,7 @@ static struct platform_driver davinci_mmcsd_driver = { .driver = { .name = "davinci_mmc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = davinci_mmcsd_pm_ops, .of_match_table = davinci_mmc_dt_ids, }, diff --git a/kernel/drivers/mmc/host/dw_mmc-exynos.c b/kernel/drivers/mmc/host/dw_mmc-exynos.c index d7915e5..6788b60 100644 --- a/kernel/drivers/mmc/host/dw_mmc-exynos.c +++ b/kernel/drivers/mmc/host/dw_mmc-exynos.c @@ -597,6 +597,7 @@ .remove = dw_mci_exynos_remove, .driver = { .name = "dwmmc_exynos", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = dw_mci_exynos_match, .pm = &dw_mci_exynos_pmops, }, diff --git a/kernel/drivers/mmc/host/dw_mmc-k3.c b/kernel/drivers/mmc/host/dw_mmc-k3.c index 89cdb3d..9c9762d 100644 --- a/kernel/drivers/mmc/host/dw_mmc-k3.c +++ b/kernel/drivers/mmc/host/dw_mmc-k3.c @@ -477,6 +477,7 @@ .remove = dw_mci_pltfm_remove, .driver = { .name = "dwmmc_k3", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = dw_mci_k3_match, .pm = &dw_mci_k3_dev_pm_ops, }, diff --git a/kernel/drivers/mmc/host/dw_mmc-pltfm.c b/kernel/drivers/mmc/host/dw_mmc-pltfm.c index 58c13e2..a7382ab 100644 --- a/kernel/drivers/mmc/host/dw_mmc-pltfm.c +++ b/kernel/drivers/mmc/host/dw_mmc-pltfm.c @@ -102,6 +102,7 @@ .remove = dw_mci_pltfm_remove, .driver = { .name = "dw_mmc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = dw_mci_pltfm_match, .pm = &dw_mci_pltfm_pmops, }, diff --git a/kernel/drivers/mmc/host/dw_mmc-rockchip.c b/kernel/drivers/mmc/host/dw_mmc-rockchip.c index b63b157..947ab8f 100644 --- a/kernel/drivers/mmc/host/dw_mmc-rockchip.c +++ b/kernel/drivers/mmc/host/dw_mmc-rockchip.c @@ -438,8 +438,10 @@ if (!pdev->dev.of_node) return -ENODEV; - if (!device_property_read_bool(&pdev->dev, "non-removable") && - !device_property_read_bool(&pdev->dev, "cd-gpios")) + if ((!device_property_read_bool(&pdev->dev, "non-removable") && + !device_property_read_bool(&pdev->dev, "cd-gpios")) || + (device_property_read_bool(&pdev->dev, "no-sd") && + device_property_read_bool(&pdev->dev, "no-mmc"))) use_rpm = false; match = of_match_node(dw_mci_rockchip_match, pdev->dev.of_node); @@ -496,6 +498,7 @@ .remove = dw_mci_rockchip_remove, .driver = { .name = "dwmmc_rockchip", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = dw_mci_rockchip_match, .pm = &dw_mci_rockchip_dev_pm_ops, }, diff --git a/kernel/drivers/mmc/host/dw_mmc.c b/kernel/drivers/mmc/host/dw_mmc.c index 51dee0a..954e932 100644 --- a/kernel/drivers/mmc/host/dw_mmc.c +++ b/kernel/drivers/mmc/host/dw_mmc.c @@ -246,7 +246,7 @@ * ...also allow sending for SDMMC_CMD_VOLT_SWITCH where busy is * expected. */ -#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC if (host->slot->mmc->restrict_caps & RESTRICT_CARD_TYPE_EMMC) delay = 0; #endif @@ -1508,6 +1508,9 @@ switch (ios->power_mode) { case MMC_POWER_UP: + if (!IS_ERR_OR_NULL(slot->host->pinctrl)) + pinctrl_select_state(slot->host->pinctrl, slot->host->idle_state); + if (!IS_ERR(mmc->supply.vmmc)) { ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); @@ -1524,6 +1527,9 @@ mci_writel(slot->host, PWREN, regs); break; case MMC_POWER_ON: + if (!IS_ERR_OR_NULL(slot->host->pinctrl)) + pinctrl_select_state(slot->host->pinctrl, slot->host->normal_state); + if (!slot->host->vqmmc_enabled) { if (!IS_ERR(mmc->supply.vqmmc)) { ret = regulator_enable(mmc->supply.vqmmc); @@ -1548,6 +1554,9 @@ break; case MMC_POWER_OFF: + if (!IS_ERR_OR_NULL(slot->host->pinctrl)) + pinctrl_select_state(slot->host->pinctrl, slot->host->idle_state); + /* Turn clock off before power goes down */ dw_mci_setup_bus(slot, false); @@ -3272,6 +3281,22 @@ return ERR_PTR(ret); } + host->pinctrl = devm_pinctrl_get(host->dev); + if (!IS_ERR(host->pinctrl)) { + host->normal_state = pinctrl_lookup_state(host->pinctrl, "normal"); + if (IS_ERR(host->normal_state)) + dev_warn(dev, "No normal pinctrl state\n"); + + host->idle_state = pinctrl_lookup_state(host->pinctrl, "idle"); + if (IS_ERR(host->idle_state)) + dev_warn(dev, "No idle pinctrl state\n"); + + if (!IS_ERR(host->normal_state) && !IS_ERR(host->idle_state)) + pinctrl_select_state(host->pinctrl, host->idle_state); + else + host->pinctrl = NULL; + } + return pdata; } @@ -3329,7 +3354,7 @@ return ret; } } -#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC if (device_property_read_bool(host->dev, "supports-emmc")) { if (readl_poll_timeout(host->regs + SDMMC_STATUS, fifo_size, diff --git a/kernel/drivers/mmc/host/dw_mmc.h b/kernel/drivers/mmc/host/dw_mmc.h index 18c0236..12539bc 100644 --- a/kernel/drivers/mmc/host/dw_mmc.h +++ b/kernel/drivers/mmc/host/dw_mmc.h @@ -236,6 +236,9 @@ struct timer_list dto_timer; bool need_xfer_timer; struct timer_list xfer_timer; + struct pinctrl *pinctrl; + struct pinctrl_state *normal_state; + struct pinctrl_state *idle_state; }; /* DMA ops for Internal/External DMAC interface */ diff --git a/kernel/drivers/mmc/host/jz4740_mmc.c b/kernel/drivers/mmc/host/jz4740_mmc.c index 864338e..9a7b9cc 100644 --- a/kernel/drivers/mmc/host/jz4740_mmc.c +++ b/kernel/drivers/mmc/host/jz4740_mmc.c @@ -1188,6 +1188,7 @@ .remove = jz4740_mmc_remove, .driver = { .name = "jz4740-mmc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(jz4740_mmc_of_match), .pm = JZ4740_MMC_PM_OPS, }, diff --git a/kernel/drivers/mmc/host/moxart-mmc.c b/kernel/drivers/mmc/host/moxart-mmc.c index 5c81dc7..f2dfb39 100644 --- a/kernel/drivers/mmc/host/moxart-mmc.c +++ b/kernel/drivers/mmc/host/moxart-mmc.c @@ -718,6 +718,7 @@ .remove = moxart_remove, .driver = { .name = "mmc-moxart", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = moxart_mmc_match, }, }; diff --git a/kernel/drivers/mmc/host/mtk-sd.c b/kernel/drivers/mmc/host/mtk-sd.c index 967e477..f0f6170 100644 --- a/kernel/drivers/mmc/host/mtk-sd.c +++ b/kernel/drivers/mmc/host/mtk-sd.c @@ -2115,6 +2115,7 @@ .remove = msdc_drv_remove, .driver = { .name = "mtk-msdc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = msdc_of_ids, .pm = &msdc_dev_pm_ops, }, diff --git a/kernel/drivers/mmc/host/mvsdio.c b/kernel/drivers/mmc/host/mvsdio.c index e22bbff..baf7e3e 100644 --- a/kernel/drivers/mmc/host/mvsdio.c +++ b/kernel/drivers/mmc/host/mvsdio.c @@ -831,6 +831,7 @@ .remove = mvsd_remove, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = mvsdio_dt_ids, }, }; diff --git a/kernel/drivers/mmc/host/mxcmmc.c b/kernel/drivers/mmc/host/mxcmmc.c index 2f604b3..24a01fd 100644 --- a/kernel/drivers/mmc/host/mxcmmc.c +++ b/kernel/drivers/mmc/host/mxcmmc.c @@ -1244,6 +1244,7 @@ .id_table = mxcmci_devtype, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &mxcmci_pm_ops, .of_match_table = mxcmci_of_match, } diff --git a/kernel/drivers/mmc/host/mxs-mmc.c b/kernel/drivers/mmc/host/mxs-mmc.c index d7601dc..02cecad 100644 --- a/kernel/drivers/mmc/host/mxs-mmc.c +++ b/kernel/drivers/mmc/host/mxs-mmc.c @@ -752,6 +752,7 @@ .id_table = mxs_ssp_ids, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &mxs_mmc_pm_ops, .of_match_table = mxs_mmc_dt_ids, }, diff --git a/kernel/drivers/mmc/host/omap.c b/kernel/drivers/mmc/host/omap.c index b2873a2..7a8273c 100644 --- a/kernel/drivers/mmc/host/omap.c +++ b/kernel/drivers/mmc/host/omap.c @@ -1507,6 +1507,7 @@ .remove = mmc_omap_remove, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(mmc_omap_match), }, }; diff --git a/kernel/drivers/mmc/host/omap_hsmmc.c b/kernel/drivers/mmc/host/omap_hsmmc.c index 0135693..1652832 100644 --- a/kernel/drivers/mmc/host/omap_hsmmc.c +++ b/kernel/drivers/mmc/host/omap_hsmmc.c @@ -2357,6 +2357,7 @@ .remove = omap_hsmmc_remove, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &omap_hsmmc_dev_pm_ops, .of_match_table = of_match_ptr(omap_mmc_of_match), }, diff --git a/kernel/drivers/mmc/host/pxamci.c b/kernel/drivers/mmc/host/pxamci.c index 00b5465..1db0d03 100644 --- a/kernel/drivers/mmc/host/pxamci.c +++ b/kernel/drivers/mmc/host/pxamci.c @@ -828,6 +828,7 @@ .remove = pxamci_remove, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(pxa_mmc_dt_ids), }, }; diff --git a/kernel/drivers/mmc/host/rtsx_pci_sdmmc.c b/kernel/drivers/mmc/host/rtsx_pci_sdmmc.c index c1de8fa..6df6877 100644 --- a/kernel/drivers/mmc/host/rtsx_pci_sdmmc.c +++ b/kernel/drivers/mmc/host/rtsx_pci_sdmmc.c @@ -1491,6 +1491,7 @@ .id_table = rtsx_pci_sdmmc_ids, .driver = { .name = DRV_NAME_RTSX_PCI_SDMMC, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; module_platform_driver(rtsx_pci_sdmmc_driver); diff --git a/kernel/drivers/mmc/host/rtsx_usb_sdmmc.c b/kernel/drivers/mmc/host/rtsx_usb_sdmmc.c index 9a3ff22..5aa69a4 100644 --- a/kernel/drivers/mmc/host/rtsx_usb_sdmmc.c +++ b/kernel/drivers/mmc/host/rtsx_usb_sdmmc.c @@ -1443,6 +1443,7 @@ .id_table = rtsx_usb_sdmmc_ids, .driver = { .name = "rtsx_usb_sdmmc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; module_platform_driver(rtsx_usb_sdmmc_driver); diff --git a/kernel/drivers/mmc/host/s3cmci.c b/kernel/drivers/mmc/host/s3cmci.c index f774936..b8ab04f 100644 --- a/kernel/drivers/mmc/host/s3cmci.c +++ b/kernel/drivers/mmc/host/s3cmci.c @@ -1864,6 +1864,7 @@ static struct platform_driver s3cmci_driver = { .driver = { .name = "s3c-sdi", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = s3cmci_dt_match, }, .id_table = s3cmci_driver_ids, diff --git a/kernel/drivers/mmc/host/sdhci-acpi.c b/kernel/drivers/mmc/host/sdhci-acpi.c index 6cc187c..ded5914 100644 --- a/kernel/drivers/mmc/host/sdhci-acpi.c +++ b/kernel/drivers/mmc/host/sdhci-acpi.c @@ -886,6 +886,7 @@ static struct platform_driver sdhci_acpi_driver = { .driver = { .name = "sdhci-acpi", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .acpi_match_table = sdhci_acpi_ids, .pm = &sdhci_acpi_pm_ops, }, diff --git a/kernel/drivers/mmc/host/sdhci-bcm-kona.c b/kernel/drivers/mmc/host/sdhci-bcm-kona.c index bdbd489..769dd94 100644 --- a/kernel/drivers/mmc/host/sdhci-bcm-kona.c +++ b/kernel/drivers/mmc/host/sdhci-bcm-kona.c @@ -326,6 +326,7 @@ static struct platform_driver sdhci_bcm_kona_driver = { .driver = { .name = "sdhci-kona", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &sdhci_pltfm_pmops, .of_match_table = sdhci_bcm_kona_of_match, }, diff --git a/kernel/drivers/mmc/host/sdhci-cns3xxx.c b/kernel/drivers/mmc/host/sdhci-cns3xxx.c index bd286db..f704cd8 100644 --- a/kernel/drivers/mmc/host/sdhci-cns3xxx.c +++ b/kernel/drivers/mmc/host/sdhci-cns3xxx.c @@ -101,6 +101,7 @@ static struct platform_driver sdhci_cns3xxx_driver = { .driver = { .name = "sdhci-cns3xxx", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &sdhci_pltfm_pmops, }, .probe = sdhci_cns3xxx_probe, diff --git a/kernel/drivers/mmc/host/sdhci-dove.c b/kernel/drivers/mmc/host/sdhci-dove.c index de9f960..60854d7 100644 --- a/kernel/drivers/mmc/host/sdhci-dove.c +++ b/kernel/drivers/mmc/host/sdhci-dove.c @@ -117,6 +117,7 @@ static struct platform_driver sdhci_dove_driver = { .driver = { .name = "sdhci-dove", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &sdhci_pltfm_pmops, .of_match_table = sdhci_dove_of_match_table, }, diff --git a/kernel/drivers/mmc/host/sdhci-esdhc-imx.c b/kernel/drivers/mmc/host/sdhci-esdhc-imx.c index f8a4791..c735685 100644 --- a/kernel/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/kernel/drivers/mmc/host/sdhci-esdhc-imx.c @@ -1501,6 +1501,7 @@ static struct platform_driver sdhci_esdhc_imx_driver = { .driver = { .name = "sdhci-esdhc-imx", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = imx_esdhc_dt_ids, .pm = &sdhci_esdhc_pmops, }, diff --git a/kernel/drivers/mmc/host/sdhci-iproc.c b/kernel/drivers/mmc/host/sdhci-iproc.c index f903ab9..a533ba9 100644 --- a/kernel/drivers/mmc/host/sdhci-iproc.c +++ b/kernel/drivers/mmc/host/sdhci-iproc.c @@ -321,6 +321,7 @@ static struct platform_driver sdhci_iproc_driver = { .driver = { .name = "sdhci-iproc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sdhci_iproc_of_match, .pm = &sdhci_pltfm_pmops, }, diff --git a/kernel/drivers/mmc/host/sdhci-of-arasan.c b/kernel/drivers/mmc/host/sdhci-of-arasan.c index e4fb3f6..1da1df8 100644 --- a/kernel/drivers/mmc/host/sdhci-of-arasan.c +++ b/kernel/drivers/mmc/host/sdhci-of-arasan.c @@ -884,6 +884,7 @@ static struct platform_driver sdhci_arasan_driver = { .driver = { .name = "sdhci-arasan", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sdhci_arasan_of_match, .pm = &sdhci_arasan_dev_pm_ops, }, diff --git a/kernel/drivers/mmc/host/sdhci-of-at91.c b/kernel/drivers/mmc/host/sdhci-of-at91.c index 8cd1794..05901da 100644 --- a/kernel/drivers/mmc/host/sdhci-of-at91.c +++ b/kernel/drivers/mmc/host/sdhci-of-at91.c @@ -455,6 +455,7 @@ static struct platform_driver sdhci_at91_driver = { .driver = { .name = "sdhci-at91", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sdhci_at91_dt_match, .pm = &sdhci_at91_dev_pm_ops, }, diff --git a/kernel/drivers/mmc/host/sdhci-of-dwcmshc.c b/kernel/drivers/mmc/host/sdhci-of-dwcmshc.c index 54736dc..c1d95d7 100644 --- a/kernel/drivers/mmc/host/sdhci-of-dwcmshc.c +++ b/kernel/drivers/mmc/host/sdhci-of-dwcmshc.c @@ -39,6 +39,7 @@ #define DWCMSHC_EMMC_DLL_STRBIN 0x80c #define DECMSHC_EMMC_DLL_CMDOUT 0x810 #define DWCMSHC_EMMC_DLL_STATUS0 0x840 +#define DWCMSHC_EMMC_DLL_STATUS1 0x844 #define DWCMSHC_EMMC_DLL_START BIT(0) #define DWCMSHC_EMMC_DLL_LOCKED BIT(8) @@ -48,26 +49,26 @@ #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 0x9 +#define DLL_TAP_VALUE_SEL BIT(25) +#define DLL_TAP_VALUE_OFFSET 8 + #define DLL_TXCLK_TAPNUM_FROM_SW BIT(24) #define DLL_TXCLK_NO_INVERTER BIT(29) -#define DLL_STRBIN_TAPNUM_DEFAULT 0x4 #define DLL_STRBIN_TAPNUM_FROM_SW BIT(24) #define DLL_STRBIN_DELAY_NUM_SEL BIT(26) #define DLL_STRBIN_DELAY_NUM_OFFSET 16 -#define DLL_STRBIN_DELAY_NUM_DEFAULT 0x10 #define DLL_RXCLK_NO_INVERTER BIT(29) +#define DLL_RXCLK_ORI_GATE BIT(31) #define DWCMSHC_CARD_IS_EMMC BIT(0) #define DWCMSHC_ENHANCED_STROBE BIT(8) -#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 DLL_LOCK_WO_TMOUT(x) \ ((((x) & DWCMSHC_EMMC_DLL_LOCKED) == DWCMSHC_EMMC_DLL_LOCKED) && \ @@ -77,6 +78,21 @@ #define BOUNDARY_OK(addr, len) \ ((addr | (SZ_128M - 1)) == ((addr + len - 1) | (SZ_128M - 1))) +struct dwcmshc_driver_data { + const struct sdhci_pltfm_data *pdata; + u32 flags; +#define RK_PLATFROM BIT(0) +#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 ddr50_strbin_delay_num; + u8 hs400_strbin_tap; +}; + struct dwcmshc_priv { struct clk *bus_clk; u32 cclk_rate; @@ -84,17 +100,8 @@ /* Rockchip specified optional clocks */ struct clk_bulk_data rockchip_clks[ROCKCHIP_MAX_CLKS]; struct reset_control *reset; - int txclk_tapnum; unsigned int actual_clk; - u32 flags; -}; - -struct dwcmshc_driver_data { - const struct sdhci_pltfm_data *pdata; - u32 flags; -#define RK_PLATFROM BIT(0) -#define RK_DLL_CMD_OUT BIT(1) -#define RK_RXCLK_NO_INVERTER BIT(2) + const struct dwcmshc_driver_data *drv_data; }; /* @@ -195,7 +202,8 @@ { struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host); - u32 txclk_tapnum, extra; + const struct dwcmshc_driver_data *drv_data = priv->drv_data; + u32 txclk_tapnum, extra, dll_lock_value; int err; host->mmc->actual_clock = 0; @@ -221,13 +229,18 @@ extra &= ~BIT(0); sdhci_writel(host, extra, DWCMSHC_HOST_CTRL3); + /* Disable output clock while config DLL */ + sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); + if (clock <= 52000000) { + /* Disable DLL */ + sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL); /* - * Disable DLL and reset both of sample and drive clock. + * Config DLL BYPASS and Reset both of sample and drive clock. * The bypass bit and start bit need to set if DLL is not locked. */ sdhci_writel(host, DWCMSHC_EMMC_DLL_BYPASS | DWCMSHC_EMMC_DLL_START, DWCMSHC_EMMC_DLL_CTRL); - sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_RXCLK); + sdhci_writel(host, DLL_RXCLK_ORI_GATE, DWCMSHC_EMMC_DLL_RXCLK); sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK); sdhci_writel(host, 0, DECMSHC_EMMC_DLL_CMDOUT); /* @@ -237,24 +250,15 @@ */ extra = DWCMSHC_EMMC_DLL_DLYENA | DLL_STRBIN_DELAY_NUM_SEL | - DLL_STRBIN_DELAY_NUM_DEFAULT << DLL_STRBIN_DELAY_NUM_OFFSET; + drv_data->ddr50_strbin_delay_num << DLL_STRBIN_DELAY_NUM_OFFSET; sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN); - return; + goto exit; } /* Reset DLL */ sdhci_writel(host, BIT(1), DWCMSHC_EMMC_DLL_CTRL); udelay(1); sdhci_writel(host, 0x0, DWCMSHC_EMMC_DLL_CTRL); - - /* - * We shouldn't set DLL_RXCLK_NO_INVERTER for identify mode but - * we must set it in higher speed mode. - */ - extra = DWCMSHC_EMMC_DLL_DLYENA; - if (priv->flags & RK_RXCLK_NO_INVERTER) - extra |= DLL_RXCLK_NO_INVERTER; - sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_RXCLK); /* Init DLL settings, clean start bit before resetting */ sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL); @@ -267,38 +271,56 @@ 500 * USEC_PER_MSEC); if (err) { dev_err(mmc_dev(host->mmc), "DLL lock timeout!\n"); - return; + goto exit; } + dll_lock_value = ((sdhci_readl(host, DWCMSHC_EMMC_DLL_STATUS0) & 0xFF) * 2) & 0xFF; + extra = 0x1 << 16 | /* tune clock stop en */ - 0x2 << 17 | /* pre-change delay */ + 0x3 << 17 | /* pre-change delay */ 0x3 << 19; /* post-change delay */ sdhci_writel(host, extra, DWCMSHC_EMMC_ATCTRL); - txclk_tapnum = priv->txclk_tapnum; + extra = DWCMSHC_EMMC_DLL_DLYENA | DLL_RXCLK_ORI_GATE; + if (drv_data->flags & RK_RXCLK_NO_INVERTER) + extra |= DLL_RXCLK_NO_INVERTER; + if (drv_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); - if ((priv->flags & RK_DLL_CMD_OUT) && - host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { - txclk_tapnum = DLL_TXCLK_TAPNUM_90_DEGREES; + txclk_tapnum = drv_data->hs200_tx_tap; + if (host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { + txclk_tapnum = drv_data->hs400_tx_tap; - extra = DLL_CMDOUT_SRC_CLK_NEG | - DLL_CMDOUT_EN_SRC_CLK_NEG | - DWCMSHC_EMMC_DLL_DLYENA | - DLL_CMDOUT_TAPNUM_90_DEGREES | - DLL_CMDOUT_TAPNUM_FROM_SW; - sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); + if (drv_data->flags & RK_DLL_CMD_OUT) { + extra = DLL_CMDOUT_SRC_CLK_NEG | + DLL_CMDOUT_BOTH_CLK_EDGE | + DWCMSHC_EMMC_DLL_DLYENA | + drv_data->hs400_cmd_tap | + DLL_CMDOUT_TAPNUM_FROM_SW; + if (drv_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_RXCLK_NO_INVERTER | txclk_tapnum; + if (drv_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 | + drv_data->hs400_strbin_tap | DLL_STRBIN_TAPNUM_FROM_SW; + if (drv_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); + +exit: + /* enable output clock */ + sdhci_enable_clk(host, 0); } static void rockchip_sdhci_reset(struct sdhci_host *host, u8 mask) @@ -367,11 +389,31 @@ static const struct dwcmshc_driver_data rk3568_drvdata = { .pdata = &sdhci_dwcmshc_rk_pdata, .flags = RK_PLATFROM | RK_RXCLK_NO_INVERTER, + .hs200_tx_tap = 16, + .hs400_tx_tap = 8, + .hs400_cmd_tap = 8, + .hs400_strbin_tap = 4, + .ddr50_strbin_delay_num = 16, }; static const struct dwcmshc_driver_data rk3588_drvdata = { .pdata = &sdhci_dwcmshc_rk_pdata, .flags = RK_PLATFROM | RK_DLL_CMD_OUT, + .hs200_tx_tap = 16, + .hs400_tx_tap = 9, + .hs400_cmd_tap = 8, + .hs400_strbin_tap = 4, + .ddr50_strbin_delay_num = 16, +}; + +static const struct dwcmshc_driver_data rk3528_drvdata = { + .pdata = &sdhci_dwcmshc_rk_pdata, + .flags = RK_PLATFROM | 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 int rockchip_pltf_init(struct sdhci_host *host, struct dwcmshc_priv *priv) @@ -393,10 +435,6 @@ dev_err(mmc_dev(host->mmc), "failed to enable clocks %d\n", err); return err; } - - if (of_property_read_u32(mmc_dev(host->mmc)->of_node, "rockchip,txclk-tapnum", - &priv->txclk_tapnum)) - priv->txclk_tapnum = DLL_TXCLK_TAPNUM_DEFAULT; /* Disable cmd conflict check */ sdhci_writel(host, 0x0, DWCMSHC_HOST_CTRL3); @@ -424,6 +462,10 @@ { .compatible = "rockchip,dwcmshc-sdhci", .data = &rk3568_drvdata, + }, + { + .compatible = "rockchip,rk3528-dwcmshc", + .data = &rk3528_drvdata, }, { .compatible = "rockchip,rk3588-dwcmshc", @@ -463,7 +505,7 @@ pltfm_host = sdhci_priv(host); priv = sdhci_pltfm_priv(pltfm_host); - + priv->drv_data = drv_data; priv->reset = devm_reset_control_array_get_exclusive(&pdev->dev); pltfm_host->clk = devm_clk_get(&pdev->dev, "core"); if (IS_ERR(pltfm_host->clk)) { @@ -502,7 +544,6 @@ if (err) goto err_clk; - priv->flags = drv_data->flags; if (drv_data->flags & RK_PLATFROM) { err = rockchip_pltf_init(host, priv); if (err) diff --git a/kernel/drivers/mmc/host/sdhci-of-esdhc.c b/kernel/drivers/mmc/host/sdhci-of-esdhc.c index d6cb0f9..be26753 100644 --- a/kernel/drivers/mmc/host/sdhci-of-esdhc.c +++ b/kernel/drivers/mmc/host/sdhci-of-esdhc.c @@ -969,6 +969,7 @@ static struct platform_driver sdhci_esdhc_driver = { .driver = { .name = "sdhci-esdhc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sdhci_esdhc_of_match, .pm = &esdhc_of_dev_pm_ops, }, diff --git a/kernel/drivers/mmc/host/sdhci-of-hlwd.c b/kernel/drivers/mmc/host/sdhci-of-hlwd.c index ac00c5e..fa83e0a 100644 --- a/kernel/drivers/mmc/host/sdhci-of-hlwd.c +++ b/kernel/drivers/mmc/host/sdhci-of-hlwd.c @@ -84,6 +84,7 @@ static struct platform_driver sdhci_hlwd_driver = { .driver = { .name = "sdhci-hlwd", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sdhci_hlwd_of_match, .pm = &sdhci_pltfm_pmops, }, diff --git a/kernel/drivers/mmc/host/sdhci-pxav2.c b/kernel/drivers/mmc/host/sdhci-pxav2.c index 2c3827f..608b84f 100644 --- a/kernel/drivers/mmc/host/sdhci-pxav2.c +++ b/kernel/drivers/mmc/host/sdhci-pxav2.c @@ -236,6 +236,7 @@ static struct platform_driver sdhci_pxav2_driver = { .driver = { .name = "sdhci-pxav2", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(sdhci_pxav2_of_match), .pm = &sdhci_pltfm_pmops, }, diff --git a/kernel/drivers/mmc/host/sdhci-pxav3.c b/kernel/drivers/mmc/host/sdhci-pxav3.c index b8e96f3..a572197 100644 --- a/kernel/drivers/mmc/host/sdhci-pxav3.c +++ b/kernel/drivers/mmc/host/sdhci-pxav3.c @@ -590,6 +590,7 @@ static struct platform_driver sdhci_pxav3_driver = { .driver = { .name = "sdhci-pxav3", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(sdhci_pxav3_of_match), .pm = &sdhci_pxav3_pmops, }, diff --git a/kernel/drivers/mmc/host/sdhci-s3c.c b/kernel/drivers/mmc/host/sdhci-s3c.c index 9ef89d0..a8b9929 100644 --- a/kernel/drivers/mmc/host/sdhci-s3c.c +++ b/kernel/drivers/mmc/host/sdhci-s3c.c @@ -788,6 +788,7 @@ .id_table = sdhci_s3c_driver_ids, .driver = { .name = "s3c-sdhci", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(sdhci_s3c_dt_match), .pm = &sdhci_s3c_pmops, }, diff --git a/kernel/drivers/mmc/host/sdhci-sirf.c b/kernel/drivers/mmc/host/sdhci-sirf.c index 391d52b..4ab4e82 100644 --- a/kernel/drivers/mmc/host/sdhci-sirf.c +++ b/kernel/drivers/mmc/host/sdhci-sirf.c @@ -239,6 +239,7 @@ static struct platform_driver sdhci_sirf_driver = { .driver = { .name = "sdhci-sirf", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sdhci_sirf_of_match, .pm = &sdhci_pltfm_pmops, }, diff --git a/kernel/drivers/mmc/host/sdhci-spear.c b/kernel/drivers/mmc/host/sdhci-spear.c index 9247d51..ba99f1b 100644 --- a/kernel/drivers/mmc/host/sdhci-spear.c +++ b/kernel/drivers/mmc/host/sdhci-spear.c @@ -206,6 +206,7 @@ static struct platform_driver sdhci_driver = { .driver = { .name = "sdhci", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &sdhci_pm_ops, .of_match_table = of_match_ptr(sdhci_spear_id_table), }, diff --git a/kernel/drivers/mmc/host/sdhci-st.c b/kernel/drivers/mmc/host/sdhci-st.c index 8f95647..96a4b6b 100644 --- a/kernel/drivers/mmc/host/sdhci-st.c +++ b/kernel/drivers/mmc/host/sdhci-st.c @@ -530,6 +530,7 @@ .remove = sdhci_st_remove, .driver = { .name = "sdhci-st", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &sdhci_st_pmops, .of_match_table = of_match_ptr(st_sdhci_match), }, diff --git a/kernel/drivers/mmc/host/sdhci-tegra.c b/kernel/drivers/mmc/host/sdhci-tegra.c index 27bdf6d..b5ccd1c 100644 --- a/kernel/drivers/mmc/host/sdhci-tegra.c +++ b/kernel/drivers/mmc/host/sdhci-tegra.c @@ -578,6 +578,7 @@ static struct platform_driver sdhci_tegra_driver = { .driver = { .name = "sdhci-tegra", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sdhci_tegra_dt_match, .pm = &sdhci_pltfm_pmops, }, diff --git a/kernel/drivers/mmc/host/sdhci_f_sdh30.c b/kernel/drivers/mmc/host/sdhci_f_sdh30.c index 485f759..55e2cd2 100644 --- a/kernel/drivers/mmc/host/sdhci_f_sdh30.c +++ b/kernel/drivers/mmc/host/sdhci_f_sdh30.c @@ -250,6 +250,7 @@ static struct platform_driver sdhci_f_sdh30_driver = { .driver = { .name = "f_sdh30", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(f_sdh30_dt_ids), .acpi_match_table = ACPI_PTR(f_sdh30_acpi_ids), .pm = &sdhci_pltfm_pmops, diff --git a/kernel/drivers/mmc/host/sh_mmcif.c b/kernel/drivers/mmc/host/sh_mmcif.c index 4c2a1f8..3e39d4b 100644 --- a/kernel/drivers/mmc/host/sh_mmcif.c +++ b/kernel/drivers/mmc/host/sh_mmcif.c @@ -1565,6 +1565,7 @@ .remove = sh_mmcif_remove, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &sh_mmcif_dev_pm_ops, .of_match_table = sh_mmcif_of_match, }, diff --git a/kernel/drivers/mmc/host/sunxi-mmc.c b/kernel/drivers/mmc/host/sunxi-mmc.c index c458418..a7b6e4b 100644 --- a/kernel/drivers/mmc/host/sunxi-mmc.c +++ b/kernel/drivers/mmc/host/sunxi-mmc.c @@ -1496,6 +1496,7 @@ static struct platform_driver sunxi_mmc_driver = { .driver = { .name = "sunxi-mmc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(sunxi_mmc_of_match), .pm = &sunxi_mmc_pm_ops, }, diff --git a/kernel/drivers/mmc/host/tmio_mmc.c b/kernel/drivers/mmc/host/tmio_mmc.c index 43a2ea5..81fc88c 100644 --- a/kernel/drivers/mmc/host/tmio_mmc.c +++ b/kernel/drivers/mmc/host/tmio_mmc.c @@ -153,6 +153,7 @@ static struct platform_driver tmio_mmc_driver = { .driver = { .name = "tmio-mmc", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &tmio_mmc_dev_pm_ops, }, .probe = tmio_mmc_probe, diff --git a/kernel/drivers/mmc/host/usdhi6rol0.c b/kernel/drivers/mmc/host/usdhi6rol0.c index b88728b..bd45cb1 100644 --- a/kernel/drivers/mmc/host/usdhi6rol0.c +++ b/kernel/drivers/mmc/host/usdhi6rol0.c @@ -1901,6 +1901,7 @@ .remove = usdhi6_remove, .driver = { .name = "usdhi6rol0", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = usdhi6_of_match, }, }; diff --git a/kernel/drivers/mmc/host/wbsd.c b/kernel/drivers/mmc/host/wbsd.c index 1e54bbf..71c0c66 100644 --- a/kernel/drivers/mmc/host/wbsd.c +++ b/kernel/drivers/mmc/host/wbsd.c @@ -1908,6 +1908,7 @@ .resume = wbsd_platform_resume, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/kernel/drivers/mmc/host/wmt-sdmmc.c b/kernel/drivers/mmc/host/wmt-sdmmc.c index 3ba42f5..f5a692c 100644 --- a/kernel/drivers/mmc/host/wmt-sdmmc.c +++ b/kernel/drivers/mmc/host/wmt-sdmmc.c @@ -994,6 +994,7 @@ .remove = wmt_mci_remove, .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = wmt_mci_pm_ops, .of_match_table = wmt_mci_dt_ids, }, diff --git a/kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c b/kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c index 1405edb..a8ea5bf 100644 --- a/kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c +++ b/kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c @@ -149,6 +149,7 @@ int max_ecc_strength; u32 *oob_buf; u32 *page_buf; + struct mtd_info *mtd; }; static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl) @@ -348,7 +349,7 @@ if (bch_st & NANDC_V6_BCH0_ST_ERR || bch_st & NANDC_V6_BCH1_ST_ERR) { mtd->ecc_stats.failed++; - max_bitflips = -1; + max_bitflips = 0; } else { ret = NANDC_V6_ECC_ERR_CNT0(bch_st); mtd->ecc_stats.corrected += ret; @@ -599,15 +600,6 @@ if (max_strength > nfc->max_ecc_strength) max_strength = nfc->max_ecc_strength; - nfc->page_buf = kmalloc(mtd->writesize, GFP_KERNEL | GFP_DMA); - if (!nfc->page_buf) - return -ENOMEM; - nfc->oob_buf = kmalloc(ecc->steps * 128, GFP_KERNEL | GFP_DMA); - if (!nfc->oob_buf) { - kfree(nfc->page_buf); - return -ENOMEM; - } - for (i = 0; i < ARRAY_SIZE(strengths); i++) if (max_strength >= strengths[i]) break; @@ -617,6 +609,15 @@ return -ENOTSUPP; } + nfc->page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(mtd->writesize)); + if (!nfc->page_buf) + return -ENOMEM; + nfc->oob_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(ecc->steps * 128)); + if (!nfc->oob_buf) { + free_pages((unsigned long)nfc->page_buf, get_order(mtd->writesize)); + return -ENOMEM; + } + nfc->mtd = mtd; nfc->ecc_mode = strengths[i]; rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode); @@ -951,10 +952,11 @@ static int rk_nfc_remove(struct platform_device *pdev) { struct rk_nfc *nfc = platform_get_drvdata(pdev); + struct nand_chip *nand = mtd_to_nand(nfc->mtd); rk_nand_chips_cleanup(nfc); - kfree(nfc->page_buf); - kfree(nfc->oob_buf); + free_pages((unsigned long)nfc->page_buf, get_order(nfc->mtd->writesize)); + free_pages((unsigned long)nfc->oob_buf, get_order(nand->ecc.steps * 128)); clk_disable_unprepare(nfc->clk); clk_disable_unprepare(nfc->hclk); if (!(IS_ERR(nfc->gclk))) diff --git a/kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c b/kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c index f5ba7b4..7ef7529 100644 --- a/kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c +++ b/kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c @@ -144,6 +144,7 @@ int max_ecc_strength; u32 *oob_buf; u32 *page_buf; + struct mtd_info *mtd; }; static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl) @@ -338,7 +339,7 @@ if (bch_st & NANDC_V9_BCH0_ST_ERR || bch_st & NANDC_V9_BCH1_ST_ERR) { mtd->ecc_stats.failed++; - max_bitflips = -1; + max_bitflips = 0; } else { ret = NANDC_V9_ECC_ERR_CNT0(bch_st); mtd->ecc_stats.corrected += ret; @@ -584,15 +585,6 @@ if (max_strength > nfc->max_ecc_strength) max_strength = nfc->max_ecc_strength; - nfc->page_buf = kmalloc(mtd->writesize, GFP_KERNEL | GFP_DMA); - if (!nfc->page_buf) - return -ENOMEM; - nfc->oob_buf = kmalloc(ecc->steps * 128, GFP_KERNEL | GFP_DMA); - if (!nfc->oob_buf) { - kfree(nfc->page_buf); - return -ENOMEM; - } - for (i = 0; i < ARRAY_SIZE(strengths); i++) if (max_strength >= strengths[i]) break; @@ -602,6 +594,15 @@ return -ENOTSUPP; } + nfc->page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(mtd->writesize)); + if (!nfc->page_buf) + return -ENOMEM; + nfc->oob_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(ecc->steps * 128)); + if (!nfc->oob_buf) { + free_pages((unsigned long)nfc->page_buf, get_order(mtd->writesize)); + return -ENOMEM; + } + nfc->mtd = mtd; nfc->ecc_mode = strengths[i]; rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode); @@ -936,10 +937,11 @@ static int rk_nfc_remove(struct platform_device *pdev) { struct rk_nfc *nfc = platform_get_drvdata(pdev); + struct nand_chip *nand = mtd_to_nand(nfc->mtd); rk_nand_chips_cleanup(nfc); - kfree(nfc->page_buf); - kfree(nfc->oob_buf); + free_pages((unsigned long)nfc->page_buf, get_order(nfc->mtd->writesize)); + free_pages((unsigned long)nfc->oob_buf, get_order(nand->ecc.steps * 128)); clk_disable_unprepare(nfc->clk); clk_disable_unprepare(nfc->hclk); if (!(IS_ERR(nfc->gclk))) diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig b/kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig index 324049e..7d1ae95 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig @@ -12,6 +12,32 @@ if STMMAC_ETH +config STMMAC_UIO + tristate "STMMAC_UIO ethernet controller" + default n + select UIO + help + Say M here if you want to use the stmmac_uio.ko for DPDK. + +config STMMAC_ETHTOOL + bool "Ethtool feature for STMMAC" + default STMMAC_ETH + help + This selects the ethtool function, default is Y. + +config STMMAC_FULL + bool "Support full driver for STMMAC" + default STMMAC_ETH + help + This selects the full function, default is Y, full-featured version + includes 4.10 and other versions, if it is N, only 4.10 core working. + +config STMMAC_PTP + bool "PTP feature for STMMAC" + default STMMAC_ETH + help + This selects the ptp timestamp function, default is Y. + config STMMAC_PLATFORM tristate "STMMAC Platform bus support" depends on STMMAC_ETH @@ -108,6 +134,16 @@ This selects the Rockchip RK3288 SoC glue layer support for the stmmac device driver. +config DWMAC_ROCKCHIP_TOOL + bool "Rockchip dwmac tool support" + depends on DWMAC_ROCKCHIP + default DWMAC_ROCKCHIP + help + Support for Ethernet functions on Rockchip SoCs. + + This selects the features for Rockchip's Ethernet, include PHY loopback, + MAC loopback, and delayline scanning of RGMII mode. + config DWMAC_SOCFPGA tristate "SOCFPGA dwmac support" default (ARCH_SOCFPGA || ARCH_STRATIX10) diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/Makefile b/kernel/drivers/net/ethernet/stmicro/stmmac/Makefile index 2a3afda..82adb5a 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/Makefile +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/Makefile @@ -1,12 +1,19 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_STMMAC_ETH) += stmmac.o -stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o \ - chain_mode.o dwmac_lib.o dwmac1000_core.o dwmac1000_dma.o \ - dwmac100_core.o dwmac100_dma.o enh_desc.o norm_desc.o \ - mmc_core.o stmmac_hwtstamp.o stmmac_ptp.o dwmac4_descs.o \ - dwmac4_dma.o dwmac4_lib.o dwmac4_core.o dwmac5.o hwif.o \ - stmmac_tc.o dwxgmac2_core.o dwxgmac2_dma.o dwxgmac2_descs.o \ + +stmmac-objs:= stmmac_main.o stmmac_mdio.o dwmac_lib.o \ + mmc_core.o dwmac4_descs.o dwmac4_dma.o \ + dwmac4_lib.o dwmac4_core.o hwif.o \ $(stmmac-y) + +stmmac-$(CONFIG_STMMAC_FULL) += ring_mode.o chain_mode.o dwmac1000_core.o \ + dwmac1000_dma.o dwmac100_core.o dwmac100_dma.o \ + enh_desc.o norm_desc.o dwmac5.o stmmac_tc.o \ + dwxgmac2_core.o dwxgmac2_dma.o dwxgmac2_descs.o + +stmmac-$(CONFIG_STMMAC_ETHTOOL) += stmmac_ethtool.o + +stmmac-$(CONFIG_STMMAC_PTP) += stmmac_hwtstamp.o stmmac_ptp.o # Ordering matters. Generic driver must be last. obj-$(CONFIG_STMMAC_PLATFORM) += stmmac-platform.o @@ -16,7 +23,9 @@ obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o dwmac-meson8b.o obj-$(CONFIG_DWMAC_OXNAS) += dwmac-oxnas.o obj-$(CONFIG_DWMAC_ROCKCHIP) += dwmac-rockchip.o -dwmac-rockchip-objs := dwmac-rk.o dwmac-rk-tool.o +dwmac-rockchip-objs := dwmac-rk.o +dwmac-rockchip-$(CONFIG_DWMAC_ROCKCHIP_TOOL) += dwmac-rk-tool.o +obj-$(CONFIG_STMMAC_UIO) += stmmac_uio.o obj-$(CONFIG_DWMAC_SOCFPGA) += dwmac-altr-socfpga.o obj-$(CONFIG_DWMAC_STI) += dwmac-sti.o obj-$(CONFIG_DWMAC_STM32) += dwmac-stm32.o diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/common.h b/kernel/drivers/net/ethernet/stmicro/stmmac/common.h index c3c0c8c..6bb4f4e 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/common.h +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/common.h @@ -47,8 +47,13 @@ #define STMMAC_CHAN0 0 /* Always supported and default for all chips */ /* These need to be power of two, and >= 4 */ +#if IS_ENABLED(CONFIG_STMMAC_UIO) +#define DMA_TX_SIZE 1024 +#define DMA_RX_SIZE 1024 +#else #define DMA_TX_SIZE 512 #define DMA_RX_SIZE 512 +#endif #define STMMAC_GET_ENTRY(x, size) ((x + 1) & (size - 1)) #undef FRAME_FILTER_DEBUG @@ -261,7 +266,7 @@ #define STMMAC_COAL_TX_TIMER 1000 #define STMMAC_MAX_COAL_TX_TICK 100000 #define STMMAC_TX_MAX_FRAMES 256 -#define STMMAC_TX_FRAMES 1 +#define STMMAC_TX_FRAMES 25 /* Packets types */ enum packets_types { diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c index fad5038..b3365b3 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c @@ -71,6 +71,7 @@ static const struct of_device_id dwmac_generic_match[] = { { .compatible = "st,spear600-gmac"}, + { .compatible = "snps,dwmac-3.40a"}, { .compatible = "snps,dwmac-3.50a"}, { .compatible = "snps,dwmac-3.610"}, { .compatible = "snps,dwmac-3.70a"}, diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c index 826626e..03b11f1 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c @@ -288,10 +288,7 @@ val &= ~NSS_COMMON_GMAC_CTL_PHY_IFACE_SEL; break; default: - dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n", - phy_modes(gmac->phy_mode)); - err = -EINVAL; - goto err_remove_config_dt; + goto err_unsupported_phy; } regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val); @@ -308,10 +305,7 @@ NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id); break; default: - dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n", - phy_modes(gmac->phy_mode)); - err = -EINVAL; - goto err_remove_config_dt; + goto err_unsupported_phy; } regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val); @@ -328,8 +322,7 @@ NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id); break; default: - /* We don't get here; the switch above will have errored out */ - unreachable(); + goto err_unsupported_phy; } regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val); @@ -351,6 +344,8 @@ plat_dat->bsp_priv = gmac; plat_dat->fix_mac_speed = ipq806x_gmac_fix_mac_speed; plat_dat->multicast_filter_bins = 0; + plat_dat->tx_fifo_size = 8192; + plat_dat->rx_fifo_size = 8192; err = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); if (err) @@ -358,6 +353,11 @@ return 0; +err_unsupported_phy: + dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n", + phy_modes(gmac->phy_mode)); + err = -EINVAL; + err_remove_config_dt: stmmac_remove_config_dt(pdev, plat_dat); diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c index 46633a6..aea25b6 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c @@ -85,6 +85,7 @@ int rx; int final_tx; int final_rx; + int max_delay; }; #define DMA_CONTROL_OSP BIT(4) @@ -545,15 +546,15 @@ static void dwmac_rk_rx_clean(struct stmmac_priv *priv, struct dwmac_rk_lb_priv *lb_priv) { - struct sk_buff *skb; - - skb = lb_priv->rx_skbuff; - - if (likely(lb_priv->rx_skbuff)) { + if (likely(lb_priv->rx_skbuff_dma)) { dma_unmap_single(priv->device, lb_priv->rx_skbuff_dma, lb_priv->dma_buf_sz, DMA_FROM_DEVICE); - dev_kfree_skb(skb); + lb_priv->rx_skbuff_dma = 0; + } + + if (likely(lb_priv->rx_skbuff)) { + dev_consume_skb_any(lb_priv->rx_skbuff); lb_priv->rx_skbuff = NULL; } } @@ -582,7 +583,12 @@ } frame_len -= ETH_FCS_LEN; + prefetch(skb->data - NET_IP_ALIGN); skb_put(skb, frame_len); + dma_unmap_single(priv->device, + lb_priv->rx_skbuff_dma, + lb_priv->dma_buf_sz, + DMA_FROM_DEVICE); return dwmac_rk_loopback_validate(priv, lb_priv, skb); } @@ -616,10 +622,9 @@ static void dwmac_rk_tx_clean(struct stmmac_priv *priv, struct dwmac_rk_lb_priv *lb_priv) { - struct sk_buff *skb; + struct sk_buff *skb = lb_priv->tx_skbuff; struct dma_desc *p; - skb = lb_priv->tx_skbuff; p = lb_priv->dma_tx; if (likely(lb_priv->tx_skbuff_dma)) { @@ -631,7 +636,7 @@ } if (likely(skb)) { - dev_kfree_skb(skb); + dev_consume_skb_any(skb); lb_priv->tx_skbuff = NULL; } @@ -655,9 +660,10 @@ lb_priv->tx_skbuff = skb; des = dma_map_single(priv->device, skb->data, - nopaged_len, DMA_TO_DEVICE); + nopaged_len, DMA_TO_DEVICE); if (dma_mapping_error(priv->device, des)) goto dma_map_err; + lb_priv->tx_skbuff_dma = des; stmmac_set_desc_addr(priv, desc, des); lb_priv->tx_skbuff_dma_len = nopaged_len; @@ -771,9 +777,20 @@ return __dwmac_rk_loopback_run(priv, lb_priv); } -static inline bool dwmac_rk_delayline_is_valid(int tx, int rx) +static inline bool dwmac_rk_delayline_is_txvalid(struct dwmac_rk_lb_priv *lb_priv, + int tx) { - if ((tx > 0 && tx < MAX_DELAYLINE) && (rx > 0 && rx < MAX_DELAYLINE)) + if (tx > 0 && tx < lb_priv->max_delay) + return true; + else + return false; +} + +static inline bool dwmac_rk_delayline_is_valid(struct dwmac_rk_lb_priv *lb_priv, + int tx, int rx) +{ + if ((tx > 0 && tx < lb_priv->max_delay) && + (rx > 0 && rx < lb_priv->max_delay)) return true; else return false; @@ -784,7 +801,7 @@ { int tx_left, tx_right, rx_up, rx_down; int i, j, tx_index, rx_index; - int tx_mid, rx_mid; + int tx_mid = 0, rx_mid = 0; /* initiation */ tx_index = SCAN_STEP; @@ -792,12 +809,12 @@ re_scan: /* start from rx based on the experience */ - for (i = rx_index; i <= (MAX_DELAYLINE - SCAN_STEP); i += SCAN_STEP) { + for (i = rx_index; i <= (lb_priv->max_delay - SCAN_STEP); i += SCAN_STEP) { tx_left = 0; tx_right = 0; tx_mid = 0; - for (j = tx_index; j <= (MAX_DELAYLINE - SCAN_STEP); + for (j = tx_index; j <= (lb_priv->max_delay - SCAN_STEP); j += SCAN_STEP) { if (!dwmac_rk_loopback_with_identify(priv, lb_priv, j, i)) { @@ -815,14 +832,14 @@ } /* Worst case: reach the end */ - if (i >= (MAX_DELAYLINE - SCAN_STEP)) + if (i >= (lb_priv->max_delay - SCAN_STEP)) goto end; rx_up = 0; rx_down = 0; /* look for rx_mid base on the tx_mid */ - for (i = SCAN_STEP; i <= (MAX_DELAYLINE - SCAN_STEP); + for (i = SCAN_STEP; i <= (lb_priv->max_delay - SCAN_STEP); i += SCAN_STEP) { if (!dwmac_rk_loopback_with_identify(priv, lb_priv, tx_mid, i)) { @@ -841,23 +858,24 @@ goto re_scan; } - if (dwmac_rk_delayline_is_valid(tx_mid, rx_mid)) { + if (dwmac_rk_delayline_is_valid(lb_priv, tx_mid, rx_mid)) { lb_priv->final_tx = tx_mid; lb_priv->final_rx = rx_mid; - pr_info("Find suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n", + pr_info("Find available tx_delay = 0x%02x, rx_delay = 0x%02x\n", lb_priv->final_tx, lb_priv->final_rx); return 0; } end: - pr_err("Can't find suitable delayline\n"); + pr_err("Can't find available delayline\n"); return -ENXIO; } static int dwmac_rk_delayline_scan(struct stmmac_priv *priv, struct dwmac_rk_lb_priv *lb_priv) { + int phy_iface = dwmac_rk_get_phy_interface(priv); int tx, rx, tx_sum, rx_sum, count; int tx_mid, rx_mid; int ret = -ENXIO; @@ -866,9 +884,11 @@ rx_sum = 0; count = 0; - for (rx = 0x0; rx <= MAX_DELAYLINE; rx++) { - printk(KERN_CONT "RX(0x%02x):", rx); - for (tx = 0x0; tx <= MAX_DELAYLINE; tx++) { + for (rx = 0x0; rx <= lb_priv->max_delay; rx++) { + if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID) + rx = -1; + printk(KERN_CONT "RX(%03d):", rx); + for (tx = 0x0; tx <= lb_priv->max_delay; tx++) { if (!dwmac_rk_loopback_with_identify(priv, lb_priv, tx, rx)) { tx_sum += tx; @@ -880,24 +900,40 @@ } } printk(KERN_CONT "\n"); + + if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID) + break; } if (tx_sum && rx_sum && count) { tx_mid = tx_sum / count; rx_mid = rx_sum / count; - if (dwmac_rk_delayline_is_valid(tx_mid, rx_mid)) { - lb_priv->final_tx = tx_mid; - lb_priv->final_rx = rx_mid; - ret = 0; + if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID) { + if (dwmac_rk_delayline_is_txvalid(lb_priv, tx_mid)) { + lb_priv->final_tx = tx_mid; + lb_priv->final_rx = -1; + ret = 0; + } + } else { + if (dwmac_rk_delayline_is_valid(lb_priv, tx_mid, rx_mid)) { + lb_priv->final_tx = tx_mid; + lb_priv->final_rx = rx_mid; + ret = 0; + } } } - if (ret) + if (ret) { pr_err("\nCan't find suitable delayline\n"); - else - pr_info("\nFind suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n", - lb_priv->final_tx, lb_priv->final_rx); + } else { + if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID) + pr_info("Find available tx_delay = 0x%02x, rx_delay = disable\n", + lb_priv->final_tx); + else + pr_info("\nFind suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n", + lb_priv->final_tx, lb_priv->final_rx); + } return ret; } @@ -1173,6 +1209,11 @@ dwmac_rk_free_dma_desc_resources(priv, lb_priv); } +static int dwmac_rk_get_max_delayline(struct stmmac_priv *priv) +{ + return MAX_DELAYLINE; +} + static int dwmac_rk_loopback_run(struct stmmac_priv *priv, struct dwmac_rk_lb_priv *lb_priv) { @@ -1183,6 +1224,8 @@ if (!ndev || !priv->mii) return -EINVAL; + + lb_priv->max_delay = dwmac_rk_get_max_delayline(priv); rtnl_lock(); /* check the netdevice up or not */ @@ -1224,7 +1267,9 @@ if (lb_priv->scan) { /* scan only support for rgmii mode */ if (phy_iface != PHY_INTERFACE_MODE_RGMII && - phy_iface != PHY_INTERFACE_MODE_RGMII_ID) { + phy_iface != PHY_INTERFACE_MODE_RGMII_ID && + phy_iface != PHY_INTERFACE_MODE_RGMII_RXID && + phy_iface != PHY_INTERFACE_MODE_RGMII_TXID) { ret = -EINVAL; goto out; } @@ -1286,10 +1331,10 @@ *data = 0; data++; - if (kstrtoint(tmp, 0, &tx) || tx > MAX_DELAYLINE) + if (kstrtoint(tmp, 0, &tx) || tx > dwmac_rk_get_max_delayline(priv)) goto out; - if (kstrtoint(data, 0, &rx) || rx > MAX_DELAYLINE) + if (kstrtoint(data, 0, &rx) || rx > dwmac_rk_get_max_delayline(priv)) goto out; dwmac_rk_set_rgmii_delayline(priv, tx, rx); diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h index d71989b..5fc7a1b 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h @@ -13,8 +13,20 @@ void dwmac_rk_get_rgmii_delayline(struct stmmac_priv *priv, int *tx_delay, int *rx_delay); int dwmac_rk_get_phy_interface(struct stmmac_priv *priv); +#ifdef CONFIG_DWMAC_ROCKCHIP_TOOL int dwmac_rk_create_loopback_sysfs(struct device *dev); int dwmac_rk_remove_loopback_sysfs(struct device *device); +#else +static inline int dwmac_rk_create_loopback_sysfs(struct device *dev) +{ + return 0; +} + +static inline int dwmac_rk_remove_loopback_sysfs(struct device *device) +{ + return 0; +} +#endif #ifdef CONFIG_DWMAC_RK_AUTO_DELAYLINE int dwmac_rk_get_rgmii_delayline_from_vendor(struct stmmac_priv *priv); @@ -22,4 +34,3 @@ #endif #endif /* __DWMAC_RK_TOOL_H__ */ - diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index c6b6cae..d945d92 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c @@ -24,6 +24,7 @@ #include <linux/of_net.h> #include <linux/gpio.h> #include <linux/module.h> +#include <linux/nvmem-consumer.h> #include <linux/of_gpio.h> #include <linux/of_device.h> #include <linux/platform_device.h> @@ -47,7 +48,10 @@ void (*set_to_qsgmii)(struct rk_priv_data *bsp_priv); void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed); void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed); - void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv); + void (*set_sgmii_speed)(struct rk_priv_data *bsp_priv, int speed); + void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input, + bool enable); + void (*integrated_phy_power)(struct rk_priv_data *bsp_priv, bool up); }; struct rk_priv_data { @@ -61,6 +65,7 @@ bool clk_enabled; bool clock_input; bool integrated_phy; + struct phy *comphy; struct clk *clk_mac; struct clk *gmac_clkin; @@ -73,6 +78,7 @@ struct clk *pclk_mac; struct clk *clk_phy; struct clk *pclk_xpcs; + struct clk *clk_xpcs_eee; struct reset_control *phy_reset; @@ -81,6 +87,8 @@ struct regmap *grf; struct regmap *xpcs; + + unsigned char otp_data; }; /* XPCS */ @@ -165,10 +173,10 @@ int ret, i, id = bsp_priv->bus_id; u32 val; - if (mode == PHY_INTERFACE_MODE_QSGMII && id > 0) + if (mode == PHY_INTERFACE_MODE_QSGMII && !id) return 0; - ret = xpcs_soft_reset(bsp_priv, id); + ret = xpcs_soft_reset(bsp_priv, 0); if (ret) { dev_err(&bsp_priv->pdev->dev, "xpcs_soft_reset fail %d\n", ret); return ret; @@ -195,10 +203,10 @@ SR_MII_CTRL_AN_ENABLE); } } else { - val = xpcs_read(bsp_priv, SR_MII_OFFSET(id) + VR_MII_DIG_CTRL1); - xpcs_write(bsp_priv, SR_MII_OFFSET(id) + VR_MII_DIG_CTRL1, + val = xpcs_read(bsp_priv, SR_MII_OFFSET(0) + VR_MII_DIG_CTRL1); + xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_DIG_CTRL1, val | MII_MAC_AUTO_SW); - xpcs_write(bsp_priv, SR_MII_OFFSET(id) + MII_BMCR, + xpcs_write(bsp_priv, SR_MII_OFFSET(0) + MII_BMCR, SR_MII_CTRL_AN_ENABLE); } @@ -212,8 +220,55 @@ #define GRF_CLR_BIT(nr) (BIT(nr+16)) #define DELAY_ENABLE(soc, tx, rx) \ - (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \ - ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE)) + ((((tx) >= 0) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \ + (((rx) >= 0) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE)) + +#define DELAY_VALUE(soc, tx, rx) \ + ((((tx) >= 0) ? soc##_GMAC_CLK_TX_DL_CFG(tx) : 0) | \ + (((rx) >= 0) ? soc##_GMAC_CLK_RX_DL_CFG(rx) : 0)) + +/* Integrated EPHY */ + +#define RK_GRF_MACPHY_CON0 0xb00 +#define RK_GRF_MACPHY_CON1 0xb04 +#define RK_GRF_MACPHY_CON2 0xb08 +#define RK_GRF_MACPHY_CON3 0xb0c + +#define RK_MACPHY_ENABLE GRF_BIT(0) +#define RK_MACPHY_DISABLE GRF_CLR_BIT(0) +#define RK_MACPHY_CFG_CLK_50M GRF_BIT(14) +#define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7)) +#define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0) +#define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0) + +static void rk_gmac_integrated_ephy_powerup(struct rk_priv_data *priv) +{ + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M); + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE); + + regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID); + regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID); + + if (priv->phy_reset) { + /* PHY needs to be disabled before trying to reset it */ + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE); + if (priv->phy_reset) + reset_control_assert(priv->phy_reset); + usleep_range(10, 20); + if (priv->phy_reset) + reset_control_deassert(priv->phy_reset); + usleep_range(10, 20); + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE); + msleep(30); + } +} + +static void rk_gmac_integrated_ephy_powerdown(struct rk_priv_data *priv) +{ + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE); + if (priv->phy_reset) + reset_control_assert(priv->phy_reset); +} #define PX30_GRF_GMAC_CON1 0x0904 @@ -306,12 +361,10 @@ regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1, RK1808_GMAC_PHY_INTF_SEL_RGMII | - RK1808_GMAC_RXCLK_DLY_ENABLE | - RK1808_GMAC_TXCLK_DLY_ENABLE); + DELAY_ENABLE(RK1808, tx_delay, rx_delay)); regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON0, - RK1808_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK1808_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK1808, tx_delay, rx_delay)); } static void rk1808_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -439,8 +492,7 @@ RK3128_GMAC_RMII_MODE_CLR); regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0, DELAY_ENABLE(RK3128, tx_delay, rx_delay) | - RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK3128_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK3128, tx_delay, rx_delay)); } static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -556,8 +608,7 @@ DELAY_ENABLE(RK3228, tx_delay, rx_delay)); regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0, - RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK3228_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK3128, tx_delay, rx_delay)); } static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -620,10 +671,16 @@ dev_err(dev, "unknown speed value for RMII! speed=%d", speed); } -static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv) +static void rk3228_integrated_phy_power(struct rk_priv_data *priv, bool up) { - regmap_write(priv->grf, RK3228_GRF_CON_MUX, - RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); + if (up) { + regmap_write(priv->grf, RK3228_GRF_CON_MUX, + RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); + + rk_gmac_integrated_ephy_powerup(priv); + } else { + rk_gmac_integrated_ephy_powerdown(priv); + } } static const struct rk_gmac_ops rk3228_ops = { @@ -631,7 +688,7 @@ .set_to_rmii = rk3228_set_to_rmii, .set_rgmii_speed = rk3228_set_rgmii_speed, .set_rmii_speed = rk3228_set_rmii_speed, - .integrated_phy_powerup = rk3228_integrated_phy_powerup, + .integrated_phy_power = rk3228_integrated_phy_power, }; #define RK3288_GRF_SOC_CON1 0x0248 @@ -677,8 +734,7 @@ RK3288_GMAC_RMII_MODE_CLR); regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3, DELAY_ENABLE(RK3288, tx_delay, rx_delay) | - RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK3288_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK3288, tx_delay, rx_delay)); } static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -849,12 +905,10 @@ regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1, RK3328_GMAC_PHY_INTF_SEL_RGMII | RK3328_GMAC_RMII_MODE_CLR | - RK3328_GMAC_RXCLK_DLY_ENABLE | - RK3328_GMAC_TXCLK_DLY_ENABLE); + DELAY_ENABLE(RK3328, tx_delay, rx_delay)); regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0, - RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK3328_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK3328, tx_delay, rx_delay)); } static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -922,10 +976,16 @@ dev_err(dev, "unknown speed value for RMII! speed=%d", speed); } -static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv) +static void rk3328_integrated_phy_power(struct rk_priv_data *priv, bool up) { - regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1, - RK3328_MACPHY_RMII_MODE); + if (up) { + regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1, + RK3328_MACPHY_RMII_MODE); + + rk_gmac_integrated_ephy_powerup(priv); + } else { + rk_gmac_integrated_ephy_powerdown(priv); + } } static const struct rk_gmac_ops rk3328_ops = { @@ -933,7 +993,7 @@ .set_to_rmii = rk3328_set_to_rmii, .set_rgmii_speed = rk3328_set_rgmii_speed, .set_rmii_speed = rk3328_set_rmii_speed, - .integrated_phy_powerup = rk3328_integrated_phy_powerup, + .integrated_phy_power = rk3328_integrated_phy_power, }; #define RK3366_GRF_SOC_CON6 0x0418 @@ -979,8 +1039,7 @@ RK3366_GMAC_RMII_MODE_CLR); regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7, DELAY_ENABLE(RK3366, tx_delay, rx_delay) | - RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK3366_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK3366, tx_delay, rx_delay)); } static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -1090,8 +1149,7 @@ RK3368_GMAC_RMII_MODE_CLR); regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16, DELAY_ENABLE(RK3368, tx_delay, rx_delay) | - RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK3368_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK3368, tx_delay, rx_delay)); } static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -1201,8 +1259,7 @@ RK3399_GMAC_RMII_MODE_CLR); regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6, DELAY_ENABLE(RK3399, tx_delay, rx_delay) | - RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK3399_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK3399, tx_delay, rx_delay)); } static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -1267,6 +1324,208 @@ .set_to_rmii = rk3399_set_to_rmii, .set_rgmii_speed = rk3399_set_rgmii_speed, .set_rmii_speed = rk3399_set_rmii_speed, +}; + +#define RK3528_VO_GRF_GMAC_CON 0X60018 +#define RK3528_VPU_GRF_GMAC_CON5 0X40018 +#define RK3528_VPU_GRF_GMAC_CON6 0X4001c + +#define RK3528_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15) +#define RK3528_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15) +#define RK3528_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14) +#define RK3528_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14) + +#define RK3528_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 8) +#define RK3528_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 0) + +#define RK3528_GMAC0_PHY_INTF_SEL_RMII GRF_BIT(1) +#define RK3528_GMAC1_PHY_INTF_SEL_RGMII GRF_CLR_BIT(8) +#define RK3528_GMAC1_PHY_INTF_SEL_RMII GRF_BIT(8) + +#define RK3528_GMAC1_CLK_SELET_CRU GRF_CLR_BIT(12) +#define RK3528_GMAC1_CLK_SELET_IO GRF_BIT(12) + +#define RK3528_GMAC0_CLK_RMII_DIV2 GRF_BIT(3) +#define RK3528_GMAC0_CLK_RMII_DIV20 GRF_CLR_BIT(3) +#define RK3528_GMAC1_CLK_RMII_DIV2 GRF_BIT(10) +#define RK3528_GMAC1_CLK_RMII_DIV20 GRF_CLR_BIT(10) + +#define RK3528_GMAC1_CLK_RGMII_DIV1 \ + (GRF_CLR_BIT(11) | GRF_CLR_BIT(10)) +#define RK3528_GMAC1_CLK_RGMII_DIV5 \ + (GRF_BIT(11) | GRF_BIT(10)) +#define RK3528_GMAC1_CLK_RGMII_DIV50 \ + (GRF_BIT(11) | GRF_CLR_BIT(10)) + +#define RK3528_GMAC0_CLK_RMII_GATE GRF_BIT(2) +#define RK3528_GMAC0_CLK_RMII_NOGATE GRF_CLR_BIT(2) +#define RK3528_GMAC1_CLK_RMII_GATE GRF_BIT(9) +#define RK3528_GMAC1_CLK_RMII_NOGATE GRF_CLR_BIT(9) + +#define RK3528_VO_GRF_MACPHY_CON0 0X6001c +#define RK3528_VO_GRF_MACPHY_CON1 0X60020 + +#define RK3528_VO_GRF_MACPHY_SHUTDOWN GRF_BIT(1) +#define RK3528_VO_GRF_MACPHY_POWERUP GRF_CLR_BIT(1) +#define RK3528_VO_GRF_MACPHY_INTERNAL_RMII_SEL GRF_BIT(6) +#define RK3528_VO_GRF_MACPHY_24M_CLK_SEL (GRF_BIT(8) | GRF_BIT(9)) +#define RK3528_VO_GRF_MACPHY_PHY_ID GRF_BIT(11) + +#define RK3528_VO_GRF_MACPHY_BGS HIWORD_UPDATE(0x0, 0xf, 0) + +static void rk3528_set_to_rgmii(struct rk_priv_data *bsp_priv, + int tx_delay, int rx_delay) +{ + struct device *dev = &bsp_priv->pdev->dev; + + if (IS_ERR(bsp_priv->grf)) { + dev_err(dev, "Missing rockchip,grf property\n"); + return; + } + + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, + RK3528_GMAC1_PHY_INTF_SEL_RGMII); + + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, + DELAY_ENABLE(RK3528, tx_delay, rx_delay)); + + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON6, + DELAY_VALUE(RK3528, tx_delay, rx_delay)); +} + +static void rk3528_set_to_rmii(struct rk_priv_data *bsp_priv) +{ + struct device *dev = &bsp_priv->pdev->dev; + unsigned int id = bsp_priv->bus_id; + + if (IS_ERR(bsp_priv->grf)) { + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); + return; + } + + if (id == 1) + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, + RK3528_GMAC1_PHY_INTF_SEL_RMII); + else + regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON, + RK3528_GMAC0_PHY_INTF_SEL_RMII); +} + +static void rk3528_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed) +{ + struct device *dev = &bsp_priv->pdev->dev; + unsigned int val = 0; + + switch (speed) { + case 10: + val = RK3528_GMAC1_CLK_RGMII_DIV50; + break; + case 100: + val = RK3528_GMAC1_CLK_RGMII_DIV5; + break; + case 1000: + val = RK3528_GMAC1_CLK_RGMII_DIV1; + break; + default: + goto err; + } + + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, val); + return; +err: + dev_err(dev, "unknown RGMII speed value for GMAC speed=%d", speed); +} + +static void rk3528_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) +{ + struct device *dev = &bsp_priv->pdev->dev; + unsigned int val, offset, id = bsp_priv->bus_id; + + switch (speed) { + case 10: + val = (id == 1) ? RK3528_GMAC1_CLK_RMII_DIV20 : + RK3528_GMAC0_CLK_RMII_DIV20; + break; + case 100: + val = (id == 1) ? RK3528_GMAC1_CLK_RMII_DIV2 : + RK3528_GMAC0_CLK_RMII_DIV2; + break; + default: + goto err; + } + + offset = (id == 1) ? RK3528_VPU_GRF_GMAC_CON5 : RK3528_VO_GRF_GMAC_CON; + regmap_write(bsp_priv->grf, offset, val); + + return; +err: + dev_err(dev, "unknown RMII speed value for GMAC speed=%d", speed); +} + +static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv, + bool input, bool enable) +{ + unsigned int value, id = bsp_priv->bus_id; + + if (id == 1) { + value = input ? RK3528_GMAC1_CLK_SELET_IO : + RK3528_GMAC1_CLK_SELET_CRU; + value |= enable ? RK3528_GMAC1_CLK_RMII_NOGATE : + RK3528_GMAC1_CLK_RMII_GATE; + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, value); + } else { + value = enable ? RK3528_GMAC0_CLK_RMII_NOGATE : + RK3528_GMAC0_CLK_RMII_GATE; + regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON, value); + } +} + +static void rk3528_integrated_sphy_power(struct rk_priv_data *priv, bool up) +{ + struct device *dev = &priv->pdev->dev; + unsigned int id = priv->bus_id; + + /* Only GMAC0 support integrated phy */ + if (id > 0) + return; + + if (IS_ERR(priv->grf) || !priv->phy_reset) { + dev_err(dev, "%s: Missing rockchip,grf or phy_reset property\n", + __func__); + return; + } + + if (up) { + unsigned int bgs = RK3528_VO_GRF_MACPHY_BGS; + + reset_control_assert(priv->phy_reset); + udelay(20); + regmap_write(priv->grf, RK3528_VO_GRF_MACPHY_CON0, + RK3528_VO_GRF_MACPHY_POWERUP | + RK3528_VO_GRF_MACPHY_INTERNAL_RMII_SEL | + RK3528_VO_GRF_MACPHY_24M_CLK_SEL | + RK3528_VO_GRF_MACPHY_PHY_ID); + + if (priv->otp_data > 0) + bgs = HIWORD_UPDATE(priv->otp_data, 0xf, 0); + + regmap_write(priv->grf, RK3528_VO_GRF_MACPHY_CON1, bgs); + usleep_range(10 * 1000, 12 * 1000); + reset_control_deassert(priv->phy_reset); + usleep_range(50 * 1000, 60 * 1000); + } else { + regmap_write(priv->grf, RK3528_VO_GRF_MACPHY_CON0, + RK3528_VO_GRF_MACPHY_SHUTDOWN); + } +} + +static const struct rk_gmac_ops rk3528_ops = { + .set_to_rgmii = rk3528_set_to_rgmii, + .set_to_rmii = rk3528_set_to_rmii, + .set_rgmii_speed = rk3528_set_rgmii_speed, + .set_rmii_speed = rk3528_set_rmii_speed, + .set_clock_selection = rk3528_set_clock_selection, + .integrated_phy_power = rk3528_integrated_sphy_power, }; #define RK3568_GRF_GMAC0_CON0 0X0380 @@ -1349,12 +1608,10 @@ regmap_write(bsp_priv->grf, offset_con1, RK3568_GMAC_PHY_INTF_SEL_RGMII | - RK3568_GMAC_RXCLK_DLY_ENABLE | - RK3568_GMAC_TXCLK_DLY_ENABLE); + DELAY_ENABLE(RK3568, tx_delay, rx_delay)); regmap_write(bsp_priv->grf, offset_con0, - RK3568_GMAC_CLK_RX_DL_CFG(rx_delay) | - RK3568_GMAC_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RK3568, tx_delay, rx_delay)); } static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -1400,6 +1657,34 @@ __func__, rate, ret); } +static void rk3568_set_gmac_sgmii_speed(struct rk_priv_data *bsp_priv, int speed) +{ + struct device *dev = &bsp_priv->pdev->dev; + unsigned int ctrl; + + /* Only gmac1 set the speed for port1 */ + if (!bsp_priv->bus_id) + return; + + switch (speed) { + case 10: + ctrl = BMCR_SPEED10; + break; + case 100: + ctrl = BMCR_SPEED100; + break; + case 1000: + ctrl = BMCR_SPEED1000; + break; + default: + dev_err(dev, "unknown speed value for GMAC speed=%d", speed); + return; + } + + xpcs_write(bsp_priv, SR_MII_OFFSET(bsp_priv->bus_id) + MII_BMCR, + ctrl | BMCR_FULLDPLX); +} + static const struct rk_gmac_ops rk3568_ops = { .set_to_rgmii = rk3568_set_to_rgmii, .set_to_rmii = rk3568_set_to_rmii, @@ -1407,6 +1692,7 @@ .set_to_qsgmii = rk3568_set_to_qsgmii, .set_rgmii_speed = rk3568_set_gmac_speed, .set_rmii_speed = rk3568_set_gmac_speed, + .set_sgmii_speed = rk3568_set_gmac_sgmii_speed, }; #define RV1108_GRF_GMAC_CON0 0X0900 @@ -1472,21 +1758,18 @@ (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6)) #define RV1126_GMAC_FLOW_CTRL GRF_BIT(7) #define RV1126_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(7) -#define RV1126_GMAC_M0_RXCLK_DLY_ENABLE GRF_BIT(1) -#define RV1126_GMAC_M0_RXCLK_DLY_DISABLE GRF_CLR_BIT(1) -#define RV1126_GMAC_M0_TXCLK_DLY_ENABLE GRF_BIT(0) -#define RV1126_GMAC_M0_TXCLK_DLY_DISABLE GRF_CLR_BIT(0) -#define RV1126_GMAC_M1_RXCLK_DLY_ENABLE GRF_BIT(3) -#define RV1126_GMAC_M1_RXCLK_DLY_DISABLE GRF_CLR_BIT(3) -#define RV1126_GMAC_M1_TXCLK_DLY_ENABLE GRF_BIT(2) -#define RV1126_GMAC_M1_TXCLK_DLY_DISABLE GRF_CLR_BIT(2) +#define RV1126_M0_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1) +#define RV1126_M0_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1) +#define RV1126_M0_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0) +#define RV1126_M0_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0) +#define RV1126_M1_GMAC_RXCLK_DLY_ENABLE GRF_BIT(3) +#define RV1126_M1_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(3) +#define RV1126_M1_GMAC_TXCLK_DLY_ENABLE GRF_BIT(2) +#define RV1126_M1_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(2) -/* RV1126_GRF_GMAC_CON1 */ -#define RV1126_GMAC_M0_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) -#define RV1126_GMAC_M0_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) -/* RV1126_GRF_GMAC_CON2 */ -#define RV1126_GMAC_M1_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) -#define RV1126_GMAC_M1_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) +/* RV1126_GRF_GMAC_CON1 && RV1126_GRF_GMAC_CON2 */ +#define RV1126_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) +#define RV1126_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv, int tx_delay, int rx_delay) @@ -1500,18 +1783,14 @@ regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0, RV1126_GMAC_PHY_INTF_SEL_RGMII | - RV1126_GMAC_M0_RXCLK_DLY_ENABLE | - RV1126_GMAC_M0_TXCLK_DLY_ENABLE | - RV1126_GMAC_M1_RXCLK_DLY_ENABLE | - RV1126_GMAC_M1_TXCLK_DLY_ENABLE); + DELAY_ENABLE(RV1126_M0, tx_delay, rx_delay) | + DELAY_ENABLE(RV1126_M1, tx_delay, rx_delay)); regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON1, - RV1126_GMAC_M0_CLK_RX_DL_CFG(rx_delay) | - RV1126_GMAC_M0_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RV1126, tx_delay, rx_delay)); regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON2, - RV1126_GMAC_M1_CLK_RX_DL_CFG(rx_delay) | - RV1126_GMAC_M1_CLK_TX_DL_CFG(tx_delay)); + DELAY_VALUE(RV1126, tx_delay, rx_delay)); } static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv) @@ -1585,50 +1864,6 @@ .set_rmii_speed = rv1126_set_rmii_speed, }; -#define RK_GRF_MACPHY_CON0 0xb00 -#define RK_GRF_MACPHY_CON1 0xb04 -#define RK_GRF_MACPHY_CON2 0xb08 -#define RK_GRF_MACPHY_CON3 0xb0c - -#define RK_MACPHY_ENABLE GRF_BIT(0) -#define RK_MACPHY_DISABLE GRF_CLR_BIT(0) -#define RK_MACPHY_CFG_CLK_50M GRF_BIT(14) -#define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7)) -#define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0) -#define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0) - -static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv) -{ - if (priv->ops->integrated_phy_powerup) - priv->ops->integrated_phy_powerup(priv); - - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M); - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE); - - regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID); - regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID); - - if (priv->phy_reset) { - /* PHY needs to be disabled before trying to reset it */ - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE); - if (priv->phy_reset) - reset_control_assert(priv->phy_reset); - usleep_range(10, 20); - if (priv->phy_reset) - reset_control_deassert(priv->phy_reset); - usleep_range(10, 20); - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE); - msleep(30); - } -} - -static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv) -{ - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE); - if (priv->phy_reset) - reset_control_assert(priv->phy_reset); -} - static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat) { struct rk_priv_data *bsp_priv = plat->bsp_priv; @@ -1679,8 +1914,10 @@ bsp_priv->phy_iface == PHY_INTERFACE_MODE_QSGMII) { bsp_priv->pclk_xpcs = devm_clk_get(dev, "pclk_xpcs"); if (IS_ERR(bsp_priv->pclk_xpcs)) - dev_err(dev, "cannot get clock %s\n", - "pclk_xpcs"); + dev_err(dev, "cannot get clock %s\n", "pclk_xpcs"); + bsp_priv->clk_xpcs_eee = devm_clk_get(dev, "clk_xpcs_eee"); + if (IS_ERR(bsp_priv->clk_xpcs_eee)) + dev_err(dev, "cannot get clock %s\n", "clk_xpcs_eee"); } bsp_priv->clk_mac_speed = devm_clk_get(dev, "clk_mac_speed"); @@ -1748,15 +1985,26 @@ if (!IS_ERR(bsp_priv->pclk_xpcs)) clk_prepare_enable(bsp_priv->pclk_xpcs); + if (!IS_ERR(bsp_priv->clk_xpcs_eee)) + clk_prepare_enable(bsp_priv->clk_xpcs_eee); + + if (bsp_priv->ops && bsp_priv->ops->set_clock_selection) + bsp_priv->ops->set_clock_selection(bsp_priv, bsp_priv->clock_input, + true); + /** * if (!IS_ERR(bsp_priv->clk_mac)) * clk_prepare_enable(bsp_priv->clk_mac); */ - mdelay(5); + usleep_range(100, 200); bsp_priv->clk_enabled = true; } } else { if (bsp_priv->clk_enabled) { + if (bsp_priv->ops && bsp_priv->ops->set_clock_selection) + bsp_priv->ops->set_clock_selection(bsp_priv, bsp_priv->clock_input, + false); + if (phy_iface == PHY_INTERFACE_MODE_RMII) { clk_disable_unprepare(bsp_priv->mac_clk_rx); @@ -1776,6 +2024,8 @@ clk_disable_unprepare(bsp_priv->clk_mac_speed); clk_disable_unprepare(bsp_priv->pclk_xpcs); + + clk_disable_unprepare(bsp_priv->clk_xpcs_eee); /** * if (!IS_ERR(bsp_priv->clk_mac)) @@ -1853,7 +2103,7 @@ ret = of_property_read_u32(dev->of_node, "tx_delay", &value); if (ret) { - bsp_priv->tx_delay = 0x30; + bsp_priv->tx_delay = -1; dev_err(dev, "Can not read property: tx_delay."); dev_err(dev, "set tx_delay to 0x%x\n", bsp_priv->tx_delay); @@ -1864,7 +2114,7 @@ ret = of_property_read_u32(dev->of_node, "rx_delay", &value); if (ret) { - bsp_priv->rx_delay = 0x10; + bsp_priv->rx_delay = -1; dev_err(dev, "Can not read property: rx_delay."); dev_err(dev, "set rx_delay to 0x%x\n", bsp_priv->rx_delay); @@ -1878,24 +2128,45 @@ bsp_priv->xpcs = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,xpcs"); if (!IS_ERR(bsp_priv->xpcs)) { - struct phy *comphy; - - comphy = devm_of_phy_get(&pdev->dev, dev->of_node, NULL); - if (IS_ERR(comphy)) + bsp_priv->comphy = devm_of_phy_get(&pdev->dev, dev->of_node, NULL); + if (IS_ERR(bsp_priv->comphy)) { + bsp_priv->comphy = NULL; dev_err(dev, "devm_of_phy_get error\n"); - ret = phy_init(comphy); - if (ret) - dev_err(dev, "phy_init error\n"); + } } if (plat->phy_node) { bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node, "phy-is-integrated"); if (bsp_priv->integrated_phy) { + unsigned char *efuse_buf; + struct nvmem_cell *cell; + size_t len; + bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL); if (IS_ERR(bsp_priv->phy_reset)) { dev_err(&pdev->dev, "No PHY reset control found.\n"); bsp_priv->phy_reset = NULL; + } + + /* Read bgs from OTP if it exists */ + cell = nvmem_cell_get(dev, "bgs"); + if (IS_ERR(cell)) { + if (PTR_ERR(cell) != -EPROBE_DEFER) + dev_info(dev, "failed to get bgs cell: %ld, use default\n", + PTR_ERR(cell)); + else + return ERR_CAST(cell); + } else { + efuse_buf = nvmem_cell_read(cell, &len); + nvmem_cell_put(cell); + if (!IS_ERR(efuse_buf)) { + if (len == 1) + bsp_priv->otp_data = efuse_buf[0]; + kfree(efuse_buf); + } else { + dev_err(dev, "failed to get efuse buf, use default\n"); + } } } } @@ -1927,17 +2198,17 @@ case PHY_INTERFACE_MODE_RGMII_ID: dev_info(dev, "init for RGMII_ID\n"); if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) - bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0); + bsp_priv->ops->set_to_rgmii(bsp_priv, -1, -1); break; case PHY_INTERFACE_MODE_RGMII_RXID: dev_info(dev, "init for RGMII_RXID\n"); if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) - bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0); + bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, -1); break; case PHY_INTERFACE_MODE_RGMII_TXID: dev_info(dev, "init for RGMII_TXID\n"); if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) - bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay); + bsp_priv->ops->set_to_rgmii(bsp_priv, -1, bsp_priv->rx_delay); break; case PHY_INTERFACE_MODE_RMII: dev_info(dev, "init for RMII\n"); @@ -1946,11 +2217,23 @@ break; case PHY_INTERFACE_MODE_SGMII: dev_info(dev, "init for SGMII\n"); + ret = phy_init(bsp_priv->comphy); + if (ret) { + dev_err(dev, "phy_init error: %d\n", ret); + return ret; + } + if (bsp_priv->ops && bsp_priv->ops->set_to_sgmii) bsp_priv->ops->set_to_sgmii(bsp_priv); break; case PHY_INTERFACE_MODE_QSGMII: dev_info(dev, "init for QSGMII\n"); + ret = phy_init(bsp_priv->comphy); + if (ret) { + dev_err(dev, "phy_init error: %d\n", ret); + return ret; + } + if (bsp_priv->ops && bsp_priv->ops->set_to_qsgmii) bsp_priv->ops->set_to_qsgmii(bsp_priv); break; @@ -1967,9 +2250,6 @@ pm_runtime_enable(dev); pm_runtime_get_sync(dev); - if (bsp_priv->integrated_phy) - rk_gmac_integrated_phy_powerup(bsp_priv); - return 0; } @@ -1977,8 +2257,9 @@ { struct device *dev = &gmac->pdev->dev; - if (gmac->integrated_phy) - rk_gmac_integrated_phy_powerdown(gmac); + if (gmac->phy_iface == PHY_INTERFACE_MODE_SGMII || + gmac->phy_iface == PHY_INTERFACE_MODE_QSGMII) + phy_exit(gmac->comphy); pm_runtime_put_sync(dev); pm_runtime_disable(dev); @@ -2005,11 +2286,26 @@ bsp_priv->ops->set_rmii_speed(bsp_priv, speed); break; case PHY_INTERFACE_MODE_SGMII: + if (bsp_priv->ops && bsp_priv->ops->set_sgmii_speed) + bsp_priv->ops->set_sgmii_speed(bsp_priv, speed); case PHY_INTERFACE_MODE_QSGMII: break; default: dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface); } +} + +static int rk_integrated_phy_power(void *priv, bool up) +{ + struct rk_priv_data *bsp_priv = priv; + + if (!bsp_priv->integrated_phy || !bsp_priv->ops || + !bsp_priv->ops->integrated_phy_power) + return 0; + + bsp_priv->ops->integrated_phy_power(bsp_priv, up); + + return 0; } void dwmac_rk_set_rgmii_delayline(struct stmmac_priv *priv, @@ -2050,24 +2346,17 @@ { } -static unsigned char macaddr[6]; -extern ssize_t at24_mac_read(unsigned char* addr); void rk_get_eth_addr(void *priv, unsigned char *addr) { struct rk_priv_data *bsp_priv = priv; struct device *dev = &bsp_priv->pdev->dev; - int i; - //unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0}; - //int ret, id = bsp_priv->bus_id; + unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0}; + int ret, id = bsp_priv->bus_id; - //ben - printk("nk-debug:enter rk_get_eth_addr.. \n"); - - #if 0 rk_devinfo_get_eth_mac(addr); if (is_valid_ether_addr(addr)) goto out; - + if (id < 0 || id >= MAX_ETH) { dev_err(dev, "%s: Invalid ethernet bus id %d\n", __func__, id); return; @@ -2094,35 +2383,7 @@ } else { memcpy(addr, ðaddr[id * ETH_ALEN], ETH_ALEN); } - #endif - - #if 0 - macaddr[0] = 0xee; - macaddr[1] = 0x31; - macaddr[2] = 0x32; - macaddr[3] = 0x33; - macaddr[4] = 0x34; - macaddr[5] = 0x35; - - memcpy(addr, macaddr, 6); - #endif - - #if 1 - if (at24_mac_read(macaddr) > 0) { - printk("ben %s: at24_mac_read Success!! \n", __func__); - memcpy(addr, macaddr, 6); - printk("Read the Ethernet MAC address from :"); - for (i = 0; i < 5; i++) - printk("%2.2x:", addr[i]); - - printk("%2.2x\n", addr[i]); - } else { - printk("ben %s: at24_mac_read Failed!! \n", __func__); - goto out; - } - #endif - out: dev_err(dev, "%s: mac address: %pM\n", __func__, addr); } @@ -2134,7 +2395,6 @@ const struct rk_gmac_ops *data; int ret; - printk("nk-debug:enter rk_gmac_probe 1.. \n"); data = of_device_get_match_data(&pdev->dev); if (!data) { dev_err(&pdev->dev, "no of match data provided\n"); @@ -2154,6 +2414,7 @@ plat_dat->fix_mac_speed = rk_fix_speed; plat_dat->get_eth_addr = rk_get_eth_addr; + plat_dat->integrated_phy_power = rk_integrated_phy_power; plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data); if (IS_ERR(plat_dat->bsp_priv)) { @@ -2161,7 +2422,6 @@ goto err_remove_config_dt; } - printk("nk-debug:enter rk_gmac_probe 2.. \n"); ret = rk_gmac_clk_init(plat_dat); if (ret) goto err_remove_config_dt; @@ -2231,19 +2491,48 @@ static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume); static const struct of_device_id rk_gmac_dwmac_match[] = { +#ifdef CONFIG_CPU_PX30 { .compatible = "rockchip,px30-gmac", .data = &px30_ops }, +#endif +#ifdef CONFIG_CPU_RK1808 { .compatible = "rockchip,rk1808-gmac", .data = &rk1808_ops }, +#endif +#ifdef CONFIG_CPU_RK312X { .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops }, +#endif +#ifdef CONFIG_CPU_RK322X { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops }, +#endif +#ifdef CONFIG_CPU_RK3288 { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops }, +#endif +#ifdef CONFIG_CPU_RK3308 { .compatible = "rockchip,rk3308-mac", .data = &rk3308_ops }, +#endif +#ifdef CONFIG_CPU_RK3328 { .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops }, +#endif +#ifdef CONFIG_CPU_RK3366 { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops }, +#endif +#ifdef CONFIG_CPU_RK3368 { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops }, +#endif +#ifdef CONFIG_CPU_RK3399 { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops }, +#endif +#ifdef CONFIG_CPU_RK3528 + { .compatible = "rockchip,rk3528-gmac", .data = &rk3528_ops }, +#endif +#ifdef CONFIG_CPU_RK3568 { .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops }, +#endif +#ifdef CONFIG_CPU_RV110X { .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops }, +#endif +#ifdef CONFIG_CPU_RV1126 { .compatible = "rockchip,rv1126-gmac", .data = &rv1126_ops }, +#endif { } }; MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match); @@ -2257,8 +2546,7 @@ .of_match_table = rk_gmac_dwmac_match, }, }; -//module_platform_driver(rk_gmac_dwmac_driver); - module_platform_driver1(rk_gmac_dwmac_driver); +module_platform_driver(rk_gmac_dwmac_driver); MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>"); MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer"); diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h index 184ca13..1a84cf4 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h @@ -86,10 +86,10 @@ #define LPI_CTRL_STATUS_TLPIEN 0x00000001 /* Transmit LPI Entry */ /* GMAC HW ADDR regs */ -#define GMAC_ADDR_HIGH(reg) (((reg > 15) ? 0x00000800 : 0x00000040) + \ - (reg * 8)) -#define GMAC_ADDR_LOW(reg) (((reg > 15) ? 0x00000804 : 0x00000044) + \ - (reg * 8)) +#define GMAC_ADDR_HIGH(reg) ((reg > 15) ? 0x00000800 + (reg - 16) * 8 : \ + 0x00000040 + (reg * 8)) +#define GMAC_ADDR_LOW(reg) ((reg > 15) ? 0x00000804 + (reg - 16) * 8 : \ + 0x00000044 + (reg * 8)) #define GMAC_MAX_PERFECT_ADDRESSES 1 #define GMAC_PCS_BASE 0x000000c0 /* PCS register base */ diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c index bc8871e..da5d9e5 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c @@ -715,6 +715,7 @@ x->mac_gmii_rx_proto_engine++; } +#ifdef CONFIG_STMMAC_FULL const struct stmmac_ops dwmac4_ops = { .core_init = dwmac4_core_init, .set_mac = stmmac_set_mac, @@ -745,6 +746,7 @@ .debug = dwmac4_debug, .set_filter = dwmac4_set_filter, }; +#endif const struct stmmac_ops dwmac410_ops = { .core_init = dwmac4_core_init, @@ -777,6 +779,7 @@ .set_filter = dwmac4_set_filter, }; +#ifdef CONFIG_STMMAC_FULL const struct stmmac_ops dwmac510_ops = { .core_init = dwmac4_core_init, .set_mac = stmmac_dwmac4_set_mac, @@ -812,6 +815,7 @@ .rxp_config = dwmac5_rxp_config, .flex_pps_config = dwmac5_flex_pps_config, }; +#endif int dwmac4_setup(struct stmmac_priv *priv) { diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c index edb6053..232efe1 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c @@ -119,6 +119,23 @@ ioaddr + DMA_CHAN_INTR_ENA(chan)); } +static void dwmac410_dma_init_channel(void __iomem *ioaddr, + struct stmmac_dma_cfg *dma_cfg, u32 chan) +{ + u32 value; + + /* common channel control register config */ + value = readl(ioaddr + DMA_CHAN_CONTROL(chan)); + if (dma_cfg->pblx8) + value = value | DMA_BUS_MODE_PBL; + + writel(value, ioaddr + DMA_CHAN_CONTROL(chan)); + + /* Mask interrupts by writing to CSR7 */ + writel(DMA_CHAN_INTR_DEFAULT_MASK_4_10, + ioaddr + DMA_CHAN_INTR_ENA(chan)); +} + static void dwmac4_dma_init(void __iomem *ioaddr, struct stmmac_dma_cfg *dma_cfg, int atds) { @@ -197,7 +214,7 @@ u32 channel, int fifosz, u8 qmode) { unsigned int rqs = fifosz / 256 - 1; - u32 mtl_rx_op, mtl_rx_int; + u32 mtl_rx_op; mtl_rx_op = readl(ioaddr + MTL_CHAN_RX_OP_MODE(channel)); @@ -268,11 +285,6 @@ } writel(mtl_rx_op, ioaddr + MTL_CHAN_RX_OP_MODE(channel)); - - /* Enable MTL RX overflow */ - mtl_rx_int = readl(ioaddr + MTL_CHAN_INT_CTRL(channel)); - writel(mtl_rx_int | MTL_RX_OVERFLOW_INT_EN, - ioaddr + MTL_CHAN_INT_CTRL(channel)); } static void dwmac4_dma_tx_chan_op_mode(void __iomem *ioaddr, int mode, @@ -461,7 +473,7 @@ const struct stmmac_dma_ops dwmac410_dma_ops = { .reset = dwmac4_dma_reset, .init = dwmac4_dma_init, - .init_chan = dwmac4_dma_init_channel, + .init_chan = dwmac410_dma_init_channel, .init_rx_chan = dwmac4_dma_init_rx_chan, .init_tx_chan = dwmac4_dma_init_tx_chan, .axi = dwmac4_dma_axi, diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c index 49f5687..3246190 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c @@ -63,10 +63,6 @@ value &= ~DMA_CONTROL_ST; writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan)); - - value = readl(ioaddr + GMAC_CONFIG); - value &= ~GMAC_CONFIG_TE; - writel(value, ioaddr + GMAC_CONFIG); } void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan) diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c b/kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c index 357309a..c6b88cd 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c @@ -23,6 +23,7 @@ return reg & GENMASK(7, 0); } +#ifdef CONFIG_STMMAC_FULL static void stmmac_dwmac_mode_quirk(struct stmmac_priv *priv) { struct mac_device_info *mac = priv->hw; @@ -68,6 +69,7 @@ stmmac_dwmac_mode_quirk(priv); return 0; } +#endif static const struct stmmac_hwif_entry { bool gmac; @@ -78,13 +80,16 @@ const void *desc; const void *dma; const void *mac; +#ifdef CONFIG_STMMAC_PTP const void *hwtimestamp; +#endif const void *mode; const void *tc; int (*setup)(struct stmmac_priv *priv); int (*quirks)(struct stmmac_priv *priv); } stmmac_hw[] = { /* NOTE: New HW versions shall go to the end of this table */ +#ifdef CONFIG_STMMAC_FULL { .gmac = false, .gmac4 = false, @@ -97,7 +102,9 @@ .desc = NULL, .dma = &dwmac100_dma_ops, .mac = &dwmac100_ops, +#ifdef CONFIG_STMMAC_PTP .hwtimestamp = &stmmac_ptp, +#endif .mode = NULL, .tc = NULL, .setup = dwmac100_setup, @@ -114,7 +121,9 @@ .desc = NULL, .dma = &dwmac1000_dma_ops, .mac = &dwmac1000_ops, +#ifdef CONFIG_STMMAC_PTP .hwtimestamp = &stmmac_ptp, +#endif .mode = NULL, .tc = NULL, .setup = dwmac1000_setup, @@ -131,7 +140,9 @@ .desc = &dwmac4_desc_ops, .dma = &dwmac4_dma_ops, .mac = &dwmac4_ops, +#ifdef CONFIG_STMMAC_PTP .hwtimestamp = &stmmac_ptp, +#endif .mode = NULL, .tc = NULL, .setup = dwmac4_setup, @@ -148,12 +159,16 @@ .desc = &dwmac4_desc_ops, .dma = &dwmac4_dma_ops, .mac = &dwmac410_ops, +#ifdef CONFIG_STMMAC_PTP .hwtimestamp = &stmmac_ptp, +#endif .mode = &dwmac4_ring_mode_ops, .tc = NULL, .setup = dwmac4_setup, .quirks = NULL, - }, { + }, +#endif /* CONFIG_STMMAC_FULL */ + { .gmac = false, .gmac4 = true, .xgmac = false, @@ -165,12 +180,16 @@ .desc = &dwmac4_desc_ops, .dma = &dwmac410_dma_ops, .mac = &dwmac410_ops, +#ifdef CONFIG_STMMAC_PTP .hwtimestamp = &stmmac_ptp, +#endif .mode = &dwmac4_ring_mode_ops, .tc = NULL, .setup = dwmac4_setup, .quirks = NULL, - }, { + }, +#ifdef CONFIG_STMMAC_FULL + { .gmac = false, .gmac4 = true, .xgmac = false, @@ -182,7 +201,9 @@ .desc = &dwmac4_desc_ops, .dma = &dwmac410_dma_ops, .mac = &dwmac510_ops, +#ifdef CONFIG_STMMAC_PTP .hwtimestamp = &stmmac_ptp, +#endif .mode = &dwmac4_ring_mode_ops, .tc = &dwmac510_tc_ops, .setup = dwmac4_setup, @@ -199,12 +220,15 @@ .desc = &dwxgmac210_desc_ops, .dma = &dwxgmac210_dma_ops, .mac = &dwxgmac210_ops, +#ifdef CONFIG_STMMAC_PTP .hwtimestamp = &stmmac_ptp, +#endif .mode = NULL, .tc = NULL, .setup = dwxgmac2_setup, .quirks = NULL, }, +#endif }; int stmmac_hwif_init(struct stmmac_priv *priv) @@ -264,7 +288,9 @@ mac->desc = mac->desc ? : entry->desc; mac->dma = mac->dma ? : entry->dma; mac->mac = mac->mac ? : entry->mac; +#ifdef CONFIG_STMMAC_PTP mac->ptp = mac->ptp ? : entry->hwtimestamp; +#endif mac->mode = mac->mode ? : entry->mode; mac->tc = mac->tc ? : entry->tc; diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c b/kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c index e9b04c2..787f725 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c @@ -139,6 +139,7 @@ pr_debug("stmmac: MMC ctrl register (offset 0x%x): 0x%08x\n", MMC_CNTRL, value); } +EXPORT_SYMBOL(dwmac_mmc_ctrl); /* To mask all all interrupts.*/ void dwmac_mmc_intr_all_mask(void __iomem *mmcaddr) @@ -147,6 +148,7 @@ writel(MMC_DEFAULT_MASK, mmcaddr + MMC_TX_INTR_MASK); writel(MMC_DEFAULT_MASK, mmcaddr + MMC_RX_IPC_INTR_MASK); } +EXPORT_SYMBOL(dwmac_mmc_intr_all_mask); /* This reads the MAC core counters (if actaully supported). * by default the MMC core is programmed to reset each diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h index f9b42b0..1eaa1f8 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -217,10 +217,27 @@ int stmmac_mdio_unregister(struct net_device *ndev); int stmmac_mdio_register(struct net_device *ndev); int stmmac_mdio_reset(struct mii_bus *mii); -void stmmac_set_ethtool_ops(struct net_device *netdev); +#ifdef CONFIG_STMMAC_ETHTOOL +void stmmac_set_ethtool_ops(struct net_device *netdev); +#else +static inline void stmmac_set_ethtool_ops(struct net_device *netdev) +{ +} +#endif + +#ifdef CONFIG_STMMAC_PTP void stmmac_ptp_register(struct stmmac_priv *priv); void stmmac_ptp_unregister(struct stmmac_priv *priv); +#else +static inline void stmmac_ptp_register(struct stmmac_priv *priv) +{ +} + +static inline void stmmac_ptp_unregister(struct stmmac_priv *priv) +{ +} +#endif int stmmac_resume(struct device *dev); int stmmac_suspend(struct device *dev); int stmmac_dvr_remove(struct device *dev); diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c index e1fbd7c..08a058e 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c @@ -159,15 +159,20 @@ static void get_systime(void __iomem *ioaddr, u64 *systime) { - u64 ns; + u64 ns, sec0, sec1; - /* Get the TSSS value */ - ns = readl(ioaddr + PTP_STNSR); - /* Get the TSS and convert sec time value to nanosecond */ - ns += readl(ioaddr + PTP_STSR) * 1000000000ULL; + /* Get the TSS value */ + sec1 = readl_relaxed(ioaddr + PTP_STSR); + do { + sec0 = sec1; + /* Get the TSSS value */ + ns = readl_relaxed(ioaddr + PTP_STNSR); + /* Get the TSS value */ + sec1 = readl_relaxed(ioaddr + PTP_STSR); + } while (sec0 != sec1); if (systime) - *systime = ns; + *systime = ns + (sec1 * 1000000000ULL); } const struct stmmac_hwtimestamp stmmac_ptp = { diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 29bffa7..0511062 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -228,7 +228,7 @@ priv->clk_csr = STMMAC_CSR_100_150M; else if ((clk_rate >= CSR_F_150M) && (clk_rate < CSR_F_250M)) priv->clk_csr = STMMAC_CSR_150_250M; - else if ((clk_rate >= CSR_F_250M) && (clk_rate < CSR_F_300M)) + else if ((clk_rate >= CSR_F_250M) && (clk_rate <= CSR_F_300M)) priv->clk_csr = STMMAC_CSR_250_300M; } @@ -508,6 +508,7 @@ } } +#ifdef CONFIG_STMMAC_PTP /** * stmmac_hwtstamp_set - control hardware timestamping. * @dev: device pointer. @@ -760,6 +761,7 @@ return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ? -EFAULT : 0; } +#endif /* CONFIG_STMMAC_PTP */ /** * stmmac_init_ptp - init PTP @@ -800,7 +802,7 @@ static void stmmac_release_ptp(struct stmmac_priv *priv) { - if (priv->plat->clk_ptp_ref) + if (priv->plat->clk_ptp_ref && IS_ENABLED(CONFIG_STMMAC_PTP)) clk_disable_unprepare(priv->plat->clk_ptp_ref); stmmac_ptp_unregister(priv); } @@ -934,23 +936,6 @@ } } -static void rtl8211F_led_control(struct phy_device *phydev) -{ - printk("ben debug:rtl8211F_led_control...1 \n"); - - if(!phydev) return; - if(phydev->phy_id!=0x001cc916) return; /* only for 8211E*/ - - /*switch to extension page44*/ - phy_write(phydev, 31, 0x0d04); -//add hc 1000M --> orange -// 100M --> green - phy_write(phydev, 16, 0x6D02); -//add hc 1000M&100M --> green -// phy_write(phydev, 16, 0x6C0A); - printk("ben debug:rtl8211F_led_control...2 \n"); -} - /** * stmmac_init_phy - PHY initialization * @dev: net device structure @@ -971,6 +956,9 @@ priv->oldlink = false; priv->speed = SPEED_UNKNOWN; priv->oldduplex = DUPLEX_UNKNOWN; + + if (priv->plat->integrated_phy_power) + priv->plat->integrated_phy_power(priv->plat->bsp_priv, true); if (priv->plat->phy_node) { phydev = of_phy_connect(dev, priv->plat->phy_node, @@ -1032,9 +1020,6 @@ phydev->irq = PHY_POLL; phy_attached_info(phydev); - - //add ben - rtl8211F_led_control(phydev); return 0; } @@ -2174,8 +2159,7 @@ */ static void stmmac_check_ether_addr(struct stmmac_priv *priv) { - //if (!is_valid_ether_addr(priv->dev->dev_addr)) { - if (1) { + if (!is_valid_ether_addr(priv->dev->dev_addr)) { stmmac_get_umac_addr(priv, priv->hw, priv->dev->dev_addr, 0); if (likely(priv->plat->get_eth_addr)) priv->plat->get_eth_addr(priv->plat->bsp_priv, @@ -2568,7 +2552,7 @@ stmmac_mmc_setup(priv); - if (init_ptp) { + if (IS_ENABLED(CONFIG_STMMAC_PTP) && init_ptp) { ret = clk_prepare_enable(priv->plat->clk_ptp_ref); if (ret < 0) netdev_warn(priv->dev, "failed to enable PTP reference clock: %d\n", ret); @@ -2610,7 +2594,8 @@ { struct stmmac_priv *priv = netdev_priv(dev); - clk_disable_unprepare(priv->plat->clk_ptp_ref); + if (IS_ENABLED(CONFIG_STMMAC_PTP)) + clk_disable_unprepare(priv->plat->clk_ptp_ref); } /** @@ -2748,6 +2733,9 @@ if (dev->phydev) { phy_stop(dev->phydev); phy_disconnect(dev->phydev); + if (priv->plat->integrated_phy_power) + priv->plat->integrated_phy_power(priv->plat->bsp_priv, + false); } stmmac_disable_all_queues(priv); @@ -2778,7 +2766,8 @@ netif_carrier_off(dev); - stmmac_release_ptp(priv); + if (IS_ENABLED(CONFIG_STMMAC_PTP)) + stmmac_release_ptp(priv); return 0; } @@ -3757,7 +3746,6 @@ /* To handle GMAC own interrupts */ if ((priv->plat->has_gmac) || xmac) { int status = stmmac_host_irq_status(priv, priv->hw, &priv->xstats); - int mtl_status; if (unlikely(status)) { /* For LPI we need to save the tx status */ @@ -3768,17 +3756,8 @@ } for (queue = 0; queue < queues_count; queue++) { - struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; - - mtl_status = stmmac_host_mtl_irq_status(priv, priv->hw, - queue); - if (mtl_status != -EINVAL) - status |= mtl_status; - - if (status & CORE_IRQ_MTL_RX_OVERFLOW) - stmmac_set_rx_tail_ptr(priv, priv->ioaddr, - rx_q->rx_tail_addr, - queue); + status = stmmac_host_mtl_irq_status(priv, priv->hw, + queue); } /* PCS link status */ @@ -3832,12 +3811,14 @@ return -EINVAL; ret = phy_mii_ioctl(dev->phydev, rq, cmd); break; +#ifdef CONFIG_STMMAC_PTP case SIOCSHWTSTAMP: ret = stmmac_hwtstamp_set(dev, rq); break; case SIOCGHWTSTAMP: ret = stmmac_hwtstamp_get(dev, rq); break; +#endif default: break; } @@ -4584,10 +4565,13 @@ stmmac_pmt(priv, priv->hw, priv->wolopts); priv->irq_wake = 1; } else { + if (priv->plat->integrated_phy_power) + priv->plat->integrated_phy_power(priv->plat->bsp_priv, + false); stmmac_mac_set(priv, priv->ioaddr, false); pinctrl_pm_select_sleep_state(priv->device); /* Disable clock in case of PWM is off */ - if (priv->plat->clk_ptp_ref) + if (priv->plat->clk_ptp_ref && IS_ENABLED(CONFIG_STMMAC_PTP)) clk_disable_unprepare(priv->plat->clk_ptp_ref); clk_disable_unprepare(priv->plat->pclk); clk_disable_unprepare(priv->plat->stmmac_clk); @@ -4624,6 +4608,8 @@ tx_q->cur_tx = 0; tx_q->dirty_tx = 0; tx_q->mss = 0; + + netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue)); } } @@ -4641,7 +4627,6 @@ if (!netif_running(ndev)) return 0; - printk("troy test %s start .... \n",__func__); /* Power Down bit, into the PM register, is cleared * automatically as soon as a magic packet or a Wake-up frame * is received. Anyway, it's better to manually clear @@ -4658,11 +4643,14 @@ /* enable the clk previously disabled */ clk_prepare_enable(priv->plat->stmmac_clk); clk_prepare_enable(priv->plat->pclk); - if (priv->plat->clk_ptp_ref) + if (priv->plat->clk_ptp_ref && IS_ENABLED(CONFIG_STMMAC_PTP)) clk_prepare_enable(priv->plat->clk_ptp_ref); /* reset the phy so that it's ready */ if (priv->mii) stmmac_mdio_reset(priv->mii); + if (priv->plat->integrated_phy_power) + priv->plat->integrated_phy_power(priv->plat->bsp_priv, + true); } mutex_lock(&priv->lock); @@ -4684,8 +4672,6 @@ if (ndev->phydev) phy_start(ndev->phydev); - printk("troy test %s end .... \n",__func__); - rtl8211F_led_control(ndev->phydev); return 0; } diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c index 093a223..12a5f99 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c @@ -302,6 +302,7 @@ #endif return 0; } +EXPORT_SYMBOL(stmmac_mdio_reset); /** * stmmac_mdio_register diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 46f8754..9d47311 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -469,6 +469,14 @@ plat->pmt = 1; } + if (of_device_is_compatible(np, "snps,dwmac-3.40a")) { + plat->has_gmac = 1; + plat->enh_desc = 1; + plat->tx_coe = 1; + plat->bugged_jumbo = 1; + plat->pmt = 1; + } + if (of_device_is_compatible(np, "snps,dwmac-4.00") || of_device_is_compatible(np, "snps,dwmac-4.10a") || of_device_is_compatible(np, "snps,dwmac-4.20a")) { diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c index 37c0bc6..cc1895a 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c @@ -314,7 +314,12 @@ priv->plat->tx_queues_cfg[queue].mode_to_use = MTL_QUEUE_AVB; } else if (!qopt->enable) { - return stmmac_dma_qmode(priv, priv->ioaddr, queue, MTL_QUEUE_DCB); + ret = stmmac_dma_qmode(priv, priv->ioaddr, queue, + MTL_QUEUE_DCB); + if (ret) + return ret; + + priv->plat->tx_queues_cfg[queue].mode_to_use = MTL_QUEUE_DCB; } /* Port Transmit Rate and Speed Divider */ diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c new file mode 100644 index 0000000..b241bd9 --- /dev/null +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c @@ -0,0 +1,1178 @@ +// SPDX-License-Identifier: GPL-2.0 +/** + * Copyright 2023 ROCKCHIP + */ + +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/of_address.h> +#include <linux/of_platform.h> +#include <linux/of_net.h> +#include <linux/uio_driver.h> +#include <linux/list.h> + +#include <linux/clk.h> +#include <linux/kernel.h> +#include <linux/interrupt.h> +#include <linux/ip.h> +#include <linux/tcp.h> +#include <linux/skbuff.h> +#include <linux/ethtool.h> +#include <linux/if_ether.h> +#include <linux/crc32.h> +#include <linux/mii.h> +#include <linux/if.h> +#include <linux/if_vlan.h> +#include <linux/dma-mapping.h> +#include <linux/slab.h> +#include <linux/prefetch.h> +#include <linux/pinctrl/consumer.h> +#ifdef CONFIG_DEBUG_FS +#include <linux/debugfs.h> +#include <linux/seq_file.h> +#endif /* CONFIG_DEBUG_FS */ +#include <linux/net_tstamp.h> +#include <linux/udp.h> +#include <net/pkt_cls.h> +#include "stmmac_ptp.h" +#include "stmmac.h" +#include <linux/reset.h> +#include <linux/of_mdio.h> +#include "dwmac1000.h" +#include "dwxgmac2.h" +#include "hwif.h" +#include "mmc.h" + +#define DRIVER_NAME "rockchip_gmac_uio_drv" +#define DRIVER_VERSION "0.1" +#define STMMAC_ALIGN(x) ALIGN(ALIGN(x, SMP_CACHE_BYTES), 16) + +#define TC_DEFAULT 64 +#define DEFAULT_BUFSIZE 1536 +#define STMMAC_RX_COPYBREAK 256 + +static int buf_sz = DEFAULT_BUFSIZE; +static int tc = TC_DEFAULT; + +/** + * rockchip_gmac_uio_pdev_info + * local information for uio module driver + * + * @dev: device pointer + * @ndev: network device pointer + * @name: uio name + * @uio: uio information + * @map_num: number of uio memory regions + */ +struct rockchip_gmac_uio_pdev_info { + struct device *dev; + struct net_device *ndev; + char name[16]; + struct uio_info uio; + int map_num; +}; + +static int rockchip_gmac_uio_open(struct uio_info *info, struct inode *inode) +{ + return 0; +} + +static int rockchip_gmac_uio_release(struct uio_info *info, + struct inode *inode) +{ + return 0; +} + +static int rockchip_gmac_uio_mmap(struct uio_info *info, + struct vm_area_struct *vma) +{ + u32 ret; + u32 pfn; + + pfn = (info->mem[vma->vm_pgoff].addr) >> PAGE_SHIFT; + + if (vma->vm_pgoff) + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + else + vma->vm_page_prot = pgprot_device(vma->vm_page_prot); + + ret = remap_pfn_range(vma, vma->vm_start, pfn, + vma->vm_end - vma->vm_start, vma->vm_page_prot); + if (ret) { + /* Error Handle */ + pr_err("remap_pfn_range failed"); + } + return ret; +} + +/** + * uio_free_dma_rx_desc_resources - free RX dma desc resources + * @priv: private structure + */ +static void uio_free_dma_rx_desc_resources(struct stmmac_priv *priv) +{ + u32 rx_count = priv->plat->rx_queues_to_use; + u32 queue; + + /* Free RX queue resources */ + for (queue = 0; queue < rx_count; queue++) { + struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; + + /* Free DMA regions of consistent memory previously allocated */ + if (!priv->extend_desc) + dma_free_coherent(priv->device, + DMA_RX_SIZE * sizeof(struct dma_desc), + rx_q->dma_rx, rx_q->dma_rx_phy); + else + dma_free_coherent(priv->device, DMA_RX_SIZE * + sizeof(struct dma_extended_desc), + rx_q->dma_erx, rx_q->dma_rx_phy); + } +} + +/** + * uio_free_dma_tx_desc_resources - free TX dma desc resources + * @priv: private structure + */ +static void uio_free_dma_tx_desc_resources(struct stmmac_priv *priv) +{ + u32 tx_count = priv->plat->tx_queues_to_use; + u32 queue; + + /* Free TX queue resources */ + for (queue = 0; queue < tx_count; queue++) { + struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; + + /* Free DMA regions of consistent memory previously allocated */ + if (!priv->extend_desc) + dma_free_coherent(priv->device, + DMA_TX_SIZE * sizeof(struct dma_desc), + tx_q->dma_tx, tx_q->dma_tx_phy); + else + dma_free_coherent(priv->device, DMA_TX_SIZE * + sizeof(struct dma_extended_desc), + tx_q->dma_etx, tx_q->dma_tx_phy); + } +} + +/** + * uio_alloc_dma_rx_desc_resources - alloc RX resources. + * @priv: private structure + * Description: according to which descriptor can be used (extend or basic) + * this function allocates the resources for TX and RX paths. In case of + * reception, for example, it pre-allocated the RX socket buffer in order to + * allow zero-copy mechanism. + */ +static int uio_alloc_dma_rx_desc_resources(struct stmmac_priv *priv) +{ + u32 rx_count = priv->plat->rx_queues_to_use; + int ret = -ENOMEM; + u32 queue; + + /* RX queues buffers and DMA */ + for (queue = 0; queue < rx_count; queue++) { + struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; + + rx_q->queue_index = queue; + rx_q->priv_data = priv; + + if (priv->extend_desc) { + rx_q->dma_erx = dma_zalloc_coherent(priv->device, + DMA_RX_SIZE * + sizeof(struct + dma_extended_desc), + &rx_q->dma_rx_phy, + GFP_KERNEL); + if (!rx_q->dma_erx) + goto err_dma; + + } else { + rx_q->dma_rx = dma_zalloc_coherent(priv->device, + DMA_RX_SIZE * + sizeof(struct + dma_desc), + &rx_q->dma_rx_phy, + GFP_KERNEL); + if (!rx_q->dma_rx) + goto err_dma; + } + } + + return 0; + +err_dma: + uio_free_dma_rx_desc_resources(priv); + + return ret; +} + +/** + * uio_alloc_dma_tx_desc_resources - alloc TX resources. + * @priv: private structure + * Description: according to which descriptor can be used (extend or basic) + * this function allocates the resources for TX and RX paths. In case of + * reception, for example, it pre-allocated the RX socket buffer in order to + * allow zero-copy mechanism. + */ +static int uio_alloc_dma_tx_desc_resources(struct stmmac_priv *priv) +{ + u32 tx_count = priv->plat->tx_queues_to_use; + int ret = -ENOMEM; + u32 queue; + + /* TX queues buffers and DMA */ + for (queue = 0; queue < tx_count; queue++) { + struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; + + tx_q->queue_index = queue; + tx_q->priv_data = priv; + + if (priv->extend_desc) { + tx_q->dma_etx = dma_zalloc_coherent(priv->device, + DMA_TX_SIZE * + sizeof(struct + dma_extended_desc), + &tx_q->dma_tx_phy, + GFP_KERNEL); + if (!tx_q->dma_etx) + goto err_dma; + } else { + tx_q->dma_tx = dma_zalloc_coherent(priv->device, + DMA_TX_SIZE * + sizeof(struct + dma_desc), + &tx_q->dma_tx_phy, + GFP_KERNEL); + if (!tx_q->dma_tx) + goto err_dma; + } + } + + return 0; + +err_dma: + uio_free_dma_tx_desc_resources(priv); + + return ret; +} + +/** + * uio_alloc_dma_desc_resources - alloc TX/RX resources. + * @priv: private structure + * Description: according to which descriptor can be used (extend or basic) + * this function allocates the resources for TX and RX paths. In case of + * reception, for example, it pre-allocated the RX socket buffer in order to + * allow zero-copy mechanism. + */ +static int uio_alloc_dma_desc_resources(struct stmmac_priv *priv) +{ + /* RX Allocation */ + int ret = uio_alloc_dma_rx_desc_resources(priv); + + if (ret) + return ret; + + ret = uio_alloc_dma_tx_desc_resources(priv); + + return ret; +} + +/** + * uio_free_dma_desc_resources - free dma desc resources + * @priv: private structure + */ +static void uio_free_dma_desc_resources(struct stmmac_priv *priv) +{ + /* Release the DMA RX socket buffers */ + uio_free_dma_rx_desc_resources(priv); + + /* Release the DMA TX socket buffers */ + uio_free_dma_tx_desc_resources(priv); +} + +/** + * uio_hw_fix_mac_speed - callback for speed selection + * @priv: driver private structure + * Description: on some platforms (e.g. ST), some HW system configuration + * registers have to be set according to the link speed negotiated. + */ +static inline void uio_hw_fix_mac_speed(struct stmmac_priv *priv) +{ + struct net_device *ndev = priv->dev; + struct phy_device *phydev = ndev->phydev; + + if (likely(priv->plat->fix_mac_speed)) + priv->plat->fix_mac_speed(priv->plat->bsp_priv, phydev->speed); +} + +/** + * uio_mac_flow_ctrl - Configure flow control in all queues + * @priv: driver private structure + * Description: It is used for configuring the flow control in all queues + */ +static void uio_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex) +{ + u32 tx_cnt = priv->plat->tx_queues_to_use; + + stmmac_flow_ctrl(priv, priv->hw, duplex, priv->flow_ctrl, + priv->pause, tx_cnt); +} + +/** + * uio_adjust_link - adjusts the link parameters + * @dev: net device structure + * Description: this is the helper called by the physical abstraction layer + * drivers to communicate the phy link status. According the speed and duplex + * this driver can invoke registered glue-logic as well. + * It also invoke the eee initialization because it could happen when switch + * on different networks (that are eee capable). + */ +static void uio_adjust_link(struct net_device *dev) +{ + struct stmmac_priv *priv = netdev_priv(dev); + struct phy_device *phydev = dev->phydev; + bool new_state = false; + + if (!phydev) + return; + + mutex_lock(&priv->lock); + + if (phydev->link) { + u32 ctrl = readl(priv->ioaddr + MAC_CTRL_REG); + + /* Now we make sure that we can be in full duplex mode. + * If not, we operate in half-duplex mode. + */ + if (phydev->duplex != priv->oldduplex) { + new_state = true; + if (!phydev->duplex) + ctrl &= ~priv->hw->link.duplex; + else + ctrl |= priv->hw->link.duplex; + priv->oldduplex = phydev->duplex; + } + /* Flow Control operation */ + if (phydev->pause) + uio_mac_flow_ctrl(priv, phydev->duplex); + + if (phydev->speed != priv->speed) { + new_state = true; + ctrl &= ~priv->hw->link.speed_mask; + switch (phydev->speed) { + case SPEED_1000: + ctrl |= priv->hw->link.speed1000; + break; + case SPEED_100: + ctrl |= priv->hw->link.speed100; + break; + case SPEED_10: + ctrl |= priv->hw->link.speed10; + break; + default: + netif_warn(priv, link, priv->dev, + "broken speed: %d\n", phydev->speed); + phydev->speed = SPEED_UNKNOWN; + break; + } + if (phydev->speed != SPEED_UNKNOWN) + uio_hw_fix_mac_speed(priv); + priv->speed = phydev->speed; + } + + writel(ctrl, priv->ioaddr + MAC_CTRL_REG); + + if (!priv->oldlink) { + new_state = true; + priv->oldlink = true; + } + } else if (priv->oldlink) { + new_state = true; + priv->oldlink = false; + priv->speed = SPEED_UNKNOWN; + priv->oldduplex = DUPLEX_UNKNOWN; + } + + if (new_state && netif_msg_link(priv)) + phy_print_status(phydev); + + mutex_unlock(&priv->lock); + + if (phydev->is_pseudo_fixed_link) + /* Stop PHY layer to call the hook to adjust the link in case + * of a switch is attached to the stmmac driver. + */ + phydev->irq = PHY_IGNORE_INTERRUPT; +} + +/** + * rockchip_gmac_uio_init_phy - PHY initialization + * @dev: net device structure + * Description: it initializes the driver's PHY state, and attaches the PHY + * to the mac driver. + * Return value: + * 0 on success + */ +static int rockchip_gmac_uio_init_phy(struct net_device *dev) +{ + struct stmmac_priv *priv = netdev_priv(dev); + u32 tx_cnt = priv->plat->tx_queues_to_use; + struct phy_device *phydev; + char phy_id_fmt[MII_BUS_ID_SIZE + 3]; + char bus_id[MII_BUS_ID_SIZE]; + int interface = priv->plat->interface; + int max_speed = priv->plat->max_speed; + + priv->oldlink = false; + priv->speed = SPEED_UNKNOWN; + priv->oldduplex = DUPLEX_UNKNOWN; + + if (priv->plat->integrated_phy_power) + priv->plat->integrated_phy_power(priv->plat->bsp_priv, true); + + if (priv->mii) + stmmac_mdio_reset(priv->mii); + + if (priv->plat->phy_node) { + phydev = of_phy_connect(dev, priv->plat->phy_node, + &uio_adjust_link, 0, interface); + } else { + snprintf(bus_id, MII_BUS_ID_SIZE, "stmmac-%x", + priv->plat->bus_id); + + snprintf(phy_id_fmt, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, bus_id, + priv->plat->phy_addr); + netdev_dbg(priv->dev, "%s: trying to attach to %s\n", __func__, + phy_id_fmt); + + phydev = phy_connect(dev, phy_id_fmt, &uio_adjust_link, + interface); + } + + if (IS_ERR_OR_NULL(phydev)) { + netdev_err(priv->dev, "Could not attach to PHY\n"); + if (!phydev) + return -ENODEV; + + return PTR_ERR(phydev); + } + + /* Stop Advertising 1000BASE Capability if interface is not GMII */ + if (interface == PHY_INTERFACE_MODE_MII || + interface == PHY_INTERFACE_MODE_RMII || + (max_speed < 1000 && max_speed > 0)) + phydev->advertising &= ~(SUPPORTED_1000baseT_Half | + SUPPORTED_1000baseT_Full); + + /* Half-duplex mode not supported with multiqueue + * half-duplex can only works with single queue + */ + if (tx_cnt > 1) + phydev->supported &= ~(SUPPORTED_1000baseT_Half | + SUPPORTED_100baseT_Half | + SUPPORTED_10baseT_Half); + + /* Broken HW is sometimes missing the pull-up resistor on the + * MDIO line, which results in reads to non-existent devices returning + * 0 rather than 0xffff. Catch this here and treat 0 as a non-existent + * device as well. + * Note: phydev->phy_id is the result of reading the UID PHY registers. + */ + if (!priv->plat->phy_node && phydev->phy_id == 0) { + phy_disconnect(phydev); + return -ENODEV; + } + + /* uio_adjust_link will change this to PHY_IGNORE_INTERRUPT to avoid + * subsequent PHY polling, make sure we force a link transition if + * we have a UP/DOWN/UP transition + */ + if (phydev->is_pseudo_fixed_link) + phydev->irq = PHY_POLL; + + phy_attached_info(phydev); + return 0; +} + +/** + * rockchip_gmac_uio_init_dma_engine - DMA init. + * @priv: driver private structure + * Description: + * It inits the DMA invoking the specific MAC/GMAC callback. + * Some DMA parameters can be passed from the platform; + * in case of these are not passed a default is kept for the MAC or GMAC. + */ +static int rockchip_gmac_uio_init_dma_engine(struct stmmac_priv *priv) +{ + u32 rx_channels_count = priv->plat->rx_queues_to_use; + u32 tx_channels_count = priv->plat->tx_queues_to_use; + u32 dma_csr_ch = max(rx_channels_count, tx_channels_count); + struct stmmac_rx_queue *rx_q; + struct stmmac_tx_queue *tx_q; + u32 chan = 0; + int atds = 0; + int ret = 0; + + if (!priv->plat->dma_cfg || !priv->plat->dma_cfg->pbl) { + dev_err(priv->device, "Invalid DMA configuration\n"); + return -EINVAL; + } + + if (priv->extend_desc && priv->mode == STMMAC_RING_MODE) + atds = 1; + + ret = stmmac_reset(priv, priv->ioaddr); + if (ret) { + dev_err(priv->device, "Failed to reset the dma\n"); + return ret; + } + + /* DMA Configuration */ + stmmac_dma_init(priv, priv->ioaddr, priv->plat->dma_cfg, atds); + + if (priv->plat->axi) + stmmac_axi(priv, priv->ioaddr, priv->plat->axi); + + /* DMA CSR Channel configuration */ + for (chan = 0; chan < dma_csr_ch; chan++) + stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan); + + /* DMA RX Channel Configuration */ + for (chan = 0; chan < rx_channels_count; chan++) { + rx_q = &priv->rx_queue[chan]; + + stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + rx_q->dma_rx_phy, chan); + + rx_q->rx_tail_addr = rx_q->dma_rx_phy + + (DMA_RX_SIZE * sizeof(struct dma_desc)); + stmmac_set_rx_tail_ptr(priv, priv->ioaddr, + rx_q->rx_tail_addr, chan); + } + + /* DMA TX Channel Configuration */ + for (chan = 0; chan < tx_channels_count; chan++) { + tx_q = &priv->tx_queue[chan]; + + stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, + tx_q->dma_tx_phy, chan); + + tx_q->tx_tail_addr = tx_q->dma_tx_phy; + stmmac_set_tx_tail_ptr(priv, priv->ioaddr, + tx_q->tx_tail_addr, chan); + } + + return ret; +} + +static void uio_set_rings_length(struct stmmac_priv *priv) +{ + u32 rx_channels_count = priv->plat->rx_queues_to_use; + u32 tx_channels_count = priv->plat->tx_queues_to_use; + u32 chan; + + /* set TX ring length */ + for (chan = 0; chan < tx_channels_count; chan++) + stmmac_set_tx_ring_len(priv, priv->ioaddr, + (DMA_TX_SIZE - 1), chan); + + /* set RX ring length */ + for (chan = 0; chan < rx_channels_count; chan++) + stmmac_set_rx_ring_len(priv, priv->ioaddr, + (DMA_RX_SIZE - 1), chan); +} + +/** + * uio_set_tx_queue_weight - Set TX queue weight + * @priv: driver private structure + * Description: It is used for setting TX queues weight + */ +static void uio_set_tx_queue_weight(struct stmmac_priv *priv) +{ + u32 tx_queues_count = priv->plat->tx_queues_to_use; + u32 weight; + u32 queue; + + for (queue = 0; queue < tx_queues_count; queue++) { + weight = priv->plat->tx_queues_cfg[queue].weight; + stmmac_set_mtl_tx_queue_weight(priv, priv->hw, weight, queue); + } +} + +/** + * uio_configure_cbs - Configure CBS in TX queue + * @priv: driver private structure + * Description: It is used for configuring CBS in AVB TX queues + */ +static void uio_configure_cbs(struct stmmac_priv *priv) +{ + u32 tx_queues_count = priv->plat->tx_queues_to_use; + u32 mode_to_use; + u32 queue; + + /* queue 0 is reserved for legacy traffic */ + for (queue = 1; queue < tx_queues_count; queue++) { + mode_to_use = priv->plat->tx_queues_cfg[queue].mode_to_use; + if (mode_to_use == MTL_QUEUE_DCB) + continue; + + stmmac_config_cbs(priv, priv->hw, + priv->plat->tx_queues_cfg[queue].send_slope, + priv->plat->tx_queues_cfg[queue].idle_slope, + priv->plat->tx_queues_cfg[queue].high_credit, + priv->plat->tx_queues_cfg[queue].low_credit, + queue); + } +} + +/** + * uio_rx_queue_dma_chan_map - Map RX queue to RX dma channel + * @priv: driver private structure + * Description: It is used for mapping RX queues to RX dma channels + */ +static void uio_rx_queue_dma_chan_map(struct stmmac_priv *priv) +{ + u32 rx_queues_count = priv->plat->rx_queues_to_use; + u32 queue; + u32 chan; + + for (queue = 0; queue < rx_queues_count; queue++) { + chan = priv->plat->rx_queues_cfg[queue].chan; + stmmac_map_mtl_to_dma(priv, priv->hw, queue, chan); + } +} + +/** + * uio_mac_config_rx_queues_prio - Configure RX Queue priority + * @priv: driver private structure + * Description: It is used for configuring the RX Queue Priority + */ +static void uio_mac_config_rx_queues_prio(struct stmmac_priv *priv) +{ + u32 rx_queues_count = priv->plat->rx_queues_to_use; + u32 queue; + u32 prio; + + for (queue = 0; queue < rx_queues_count; queue++) { + if (!priv->plat->rx_queues_cfg[queue].use_prio) + continue; + + prio = priv->plat->rx_queues_cfg[queue].prio; + stmmac_rx_queue_prio(priv, priv->hw, prio, queue); + } +} + +/** + * uio_mac_config_tx_queues_prio - Configure TX Queue priority + * @priv: driver private structure + * Description: It is used for configuring the TX Queue Priority + */ +static void uio_mac_config_tx_queues_prio(struct stmmac_priv *priv) +{ + u32 tx_queues_count = priv->plat->tx_queues_to_use; + u32 queue; + u32 prio; + + for (queue = 0; queue < tx_queues_count; queue++) { + if (!priv->plat->tx_queues_cfg[queue].use_prio) + continue; + + prio = priv->plat->tx_queues_cfg[queue].prio; + stmmac_tx_queue_prio(priv, priv->hw, prio, queue); + } +} + +/** + * uio_mac_config_rx_queues_routing - Configure RX Queue Routing + * @priv: driver private structure + * Description: It is used for configuring the RX queue routing + */ +static void uio_mac_config_rx_queues_routing(struct stmmac_priv *priv) +{ + u32 rx_queues_count = priv->plat->rx_queues_to_use; + u32 queue; + u8 packet; + + for (queue = 0; queue < rx_queues_count; queue++) { + /* no specific packet type routing specified for the queue */ + if (priv->plat->rx_queues_cfg[queue].pkt_route == 0x0) + continue; + + packet = priv->plat->rx_queues_cfg[queue].pkt_route; + stmmac_rx_queue_routing(priv, priv->hw, packet, queue); + } +} + +/** + * uio_mac_enable_rx_queues - Enable MAC rx queues + * @priv: driver private structure + * Description: It is used for enabling the rx queues in the MAC + */ +static void uio_mac_enable_rx_queues(struct stmmac_priv *priv) +{ + u32 rx_queues_count = priv->plat->rx_queues_to_use; + int queue; + u8 mode; + + for (queue = 0; queue < rx_queues_count; queue++) { + mode = priv->plat->rx_queues_cfg[queue].mode_to_use; + stmmac_rx_queue_enable(priv, priv->hw, mode, queue); + } +} + +/** + * rockchip_gmac_uio_mtl_configuration - Configure MTL + * @priv: driver private structure + * Description: It is used for configuring MTL + */ +static void rockchip_gmac_uio_mtl_configuration(struct stmmac_priv *priv) +{ + u32 rx_queues_count = priv->plat->rx_queues_to_use; + u32 tx_queues_count = priv->plat->tx_queues_to_use; + + if (tx_queues_count > 1) + uio_set_tx_queue_weight(priv); + + /* Configure MTL RX algorithms */ + if (rx_queues_count > 1) + stmmac_prog_mtl_rx_algorithms(priv, priv->hw, + priv->plat->rx_sched_algorithm); + + /* Configure MTL TX algorithms */ + if (tx_queues_count > 1) + stmmac_prog_mtl_tx_algorithms(priv, priv->hw, + priv->plat->tx_sched_algorithm); + + /* Configure CBS in AVB TX queues */ + if (tx_queues_count > 1) + uio_configure_cbs(priv); + + /* Map RX MTL to DMA channels */ + uio_rx_queue_dma_chan_map(priv); + + /* Enable MAC RX Queues */ + uio_mac_enable_rx_queues(priv); + + /* Set RX priorities */ + if (rx_queues_count > 1) + uio_mac_config_rx_queues_prio(priv); + + /* Set TX priorities */ + if (tx_queues_count > 1) + uio_mac_config_tx_queues_prio(priv); + + /* Set RX routing */ + if (rx_queues_count > 1) + uio_mac_config_rx_queues_routing(priv); +} + +static void uio_safety_feat_configuration(struct stmmac_priv *priv) +{ + if (priv->dma_cap.asp) { + netdev_info(priv->dev, "Enabling Safety Features\n"); + stmmac_safety_feat_config(priv, priv->ioaddr, + priv->dma_cap.asp); + } else { + netdev_info(priv->dev, "No Safety Features support found\n"); + } +} + +/** + * uio_dma_operation_mode - HW DMA operation mode + * @priv: driver private structure + * Description: it is used for configuring the DMA operation mode register in + * order to program the tx/rx DMA thresholds or Store-And-Forward mode. + */ +static void uio_dma_operation_mode(struct stmmac_priv *priv) +{ + u32 rx_channels_count = priv->plat->rx_queues_to_use; + u32 tx_channels_count = priv->plat->tx_queues_to_use; + int rxfifosz = priv->plat->rx_fifo_size; + int txfifosz = priv->plat->tx_fifo_size; + u32 txmode = 0; + u32 rxmode = 0; + u32 chan = 0; + u8 qmode = 0; + + if (rxfifosz == 0) + rxfifosz = priv->dma_cap.rx_fifo_size; + if (txfifosz == 0) + txfifosz = priv->dma_cap.tx_fifo_size; + + /* Adjust for real per queue fifo size */ + rxfifosz /= rx_channels_count; + txfifosz /= tx_channels_count; + + if (priv->plat->force_thresh_dma_mode) { + txmode = tc; + rxmode = tc; + } else if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) { + /* In case of GMAC, SF mode can be enabled + * to perform the TX COE in HW. This depends on: + * 1) TX COE if actually supported + * 2) There is no bugged Jumbo frame support + * that needs to not insert csum in the TDES. + */ + txmode = SF_DMA_MODE; + rxmode = SF_DMA_MODE; + priv->xstats.threshold = SF_DMA_MODE; + } else { + txmode = tc; + rxmode = SF_DMA_MODE; + } + + /* configure all channels */ + for (chan = 0; chan < rx_channels_count; chan++) { + qmode = priv->plat->rx_queues_cfg[chan].mode_to_use; + + stmmac_dma_rx_mode(priv, priv->ioaddr, rxmode, chan, + rxfifosz, qmode); + stmmac_set_dma_bfsize(priv, priv->ioaddr, priv->dma_buf_sz, + chan); + } + + for (chan = 0; chan < tx_channels_count; chan++) { + qmode = priv->plat->tx_queues_cfg[chan].mode_to_use; + + stmmac_dma_tx_mode(priv, priv->ioaddr, txmode, chan, + txfifosz, qmode); + } +} + +/** + * rockchip_gmac_uio_mmc_setup: setup the Mac Management Counters (MMC) + * @priv: driver private structure + * Description: this masks the MMC irq, in fact, the counters are managed in SW. + */ +static void rockchip_gmac_uio_mmc_setup(struct stmmac_priv *priv) +{ + unsigned int mode = MMC_CNTRL_RESET_ON_READ | MMC_CNTRL_COUNTER_RESET | + MMC_CNTRL_PRESET | MMC_CNTRL_FULL_HALF_PRESET; + + dwmac_mmc_intr_all_mask(priv->mmcaddr); + + if (priv->dma_cap.rmon) { + dwmac_mmc_ctrl(priv->mmcaddr, mode); + memset(&priv->mmc, 0, sizeof(struct stmmac_counters)); + } else { + netdev_info(priv->dev, "No MAC Management Counters available\n"); + } +} + +/** + * rockchip_gmac_uio_hw_setup - setup mac in a usable state. + * @dev : pointer to the device structure. + * @init_ptp: initialize PTP if set + * Description: + * this is the main function to setup the HW in a usable state because the + * dma engine is reset, the core registers are configured (e.g. AXI, + * Checksum features, timers). The DMA is ready to start receiving and + * transmitting. + * Return value: + * 0 on success and an appropriate (-)ve integer as defined in errno.h + * file on failure. + */ +static int rockchip_gmac_uio_hw_setup(struct net_device *dev, bool init_ptp) +{ + struct stmmac_priv *priv = netdev_priv(dev); + int ret; + + /* DMA initialization and SW reset */ + ret = rockchip_gmac_uio_init_dma_engine(priv); + if (ret < 0) { + netdev_err(priv->dev, "%s: DMA engine initialization failed\n", + __func__); + return ret; + } + + /* Copy the MAC addr into the HW */ + stmmac_set_umac_addr(priv, priv->hw, dev->dev_addr, 0); + + /* PS and related bits will be programmed according to the speed */ + if (priv->hw->pcs) { + int speed = priv->plat->mac_port_sel_speed; + + if (speed == SPEED_10 || speed == SPEED_100 || + speed == SPEED_1000) { + priv->hw->ps = speed; + } else { + dev_warn(priv->device, "invalid port speed\n"); + priv->hw->ps = 0; + } + } + + /* Initialize the MAC Core */ + stmmac_core_init(priv, priv->hw, dev); + + /* Initialize MTL*/ + rockchip_gmac_uio_mtl_configuration(priv); + + /* Initialize Safety Features */ + uio_safety_feat_configuration(priv); + + ret = stmmac_rx_ipc(priv, priv->hw); + if (!ret) { + netdev_warn(priv->dev, "RX IPC Checksum Offload disabled\n"); + priv->plat->rx_coe = STMMAC_RX_COE_NONE; + priv->hw->rx_csum = 0; + } + + /* Enable the MAC Rx/Tx */ + stmmac_mac_set(priv, priv->ioaddr, true); + + /* Set the HW DMA mode and the COE */ + uio_dma_operation_mode(priv); + + rockchip_gmac_uio_mmc_setup(priv); + + if (priv->hw->pcs) + stmmac_pcs_ctrl_ane(priv, priv->hw, 1, priv->hw->ps, 0); + + /* set TX and RX rings length */ + uio_set_rings_length(priv); + + return ret; +} + +/** + * uio_open - open entry point of the driver + * @dev : pointer to the device structure. + * Description: + * This function is the open entry point of the driver. + * Return value: + * 0 on success and an appropriate (-)ve integer as defined in errno.h + * file on failure. + */ +static int uio_open(struct net_device *dev) +{ + struct stmmac_priv *priv = netdev_priv(dev); + int ret; + + if (priv->hw->pcs != STMMAC_PCS_RGMII && + priv->hw->pcs != STMMAC_PCS_TBI && + priv->hw->pcs != STMMAC_PCS_RTBI) { + ret = rockchip_gmac_uio_init_phy(dev); + if (ret) { + netdev_err(priv->dev, + "%s: Cannot attach to PHY (error: %d)\n", + __func__, ret); + return ret; + } + } + + /* Extra statistics */ + memset(&priv->xstats, 0, sizeof(struct stmmac_extra_stats)); + priv->xstats.threshold = tc; + + priv->dma_buf_sz = STMMAC_ALIGN(buf_sz); + priv->rx_copybreak = STMMAC_RX_COPYBREAK; + + ret = uio_alloc_dma_desc_resources(priv); + if (ret < 0) { + netdev_err(priv->dev, "%s: DMA descriptors allocation failed\n", + __func__); + goto dma_desc_error; + } + + ret = rockchip_gmac_uio_hw_setup(dev, true); + if (ret < 0) { + netdev_err(priv->dev, "%s: Hw setup failed\n", __func__); + goto init_error; + } + + if (dev->phydev) + phy_start(dev->phydev); + + return 0; + +init_error: + uio_free_dma_desc_resources(priv); +dma_desc_error: + if (dev->phydev) + phy_disconnect(dev->phydev); + return ret; +} + +/** + * uio_release - close entry point of the driver + * @dev : device pointer. + * Description: + * This is the stop entry point of the driver. + */ +static int uio_release(struct net_device *dev) +{ + struct stmmac_priv *priv = netdev_priv(dev); + + /* Stop and disconnect the PHY */ + if (dev->phydev) { + phy_stop(dev->phydev); + phy_disconnect(dev->phydev); + if (priv->plat->integrated_phy_power) + priv->plat->integrated_phy_power(priv->plat->bsp_priv, + false); + } + + /* Release and free the Rx/Tx resources */ + uio_free_dma_desc_resources(priv); + + /* Disable the MAC Rx/Tx */ + stmmac_mac_set(priv, priv->ioaddr, false); + + netif_carrier_off(dev); + + return 0; +} + +/** + * rockchip_gmac_uio_probe() platform driver probe routine + * - register uio devices filled with memory maps retrieved + * from device tree + */ +static int rockchip_gmac_uio_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *np = dev->of_node, *mac_node; + struct rockchip_gmac_uio_pdev_info *pdev_info; + struct net_device *netdev; + struct stmmac_priv *priv; + struct uio_info *uio; + struct resource *res; + int err = 0; + + pdev_info = devm_kzalloc(dev, sizeof(struct rockchip_gmac_uio_pdev_info), + GFP_KERNEL); + if (!pdev_info) + return -ENOMEM; + + uio = &pdev_info->uio; + pdev_info->dev = dev; + mac_node = of_parse_phandle(np, "rockchip,ethernet", 0); + if (!mac_node) + return -ENODEV; + + if (of_device_is_available(mac_node)) { + netdev = of_find_net_device_by_node(mac_node); + of_node_put(mac_node); + if (!netdev) + return -ENODEV; + } else { + of_node_put(mac_node); + return -EINVAL; + } + + pdev_info->ndev = netdev; + rtnl_lock(); + dev_close(netdev); + rtnl_unlock(); + + rtnl_lock(); + err = uio_open(netdev); + if (err) { + rtnl_unlock(); + dev_err(dev, "Failed to open stmmac resource: %d\n", err); + return err; + } + rtnl_unlock(); + + priv = netdev_priv(netdev); + snprintf(pdev_info->name, sizeof(pdev_info->name), "uio_%s", + netdev->name); + uio->name = pdev_info->name; + uio->version = DRIVER_VERSION; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENODEV; + + uio->mem[0].name = "eth_regs"; + uio->mem[0].addr = res->start & PAGE_MASK; + uio->mem[0].size = PAGE_ALIGN(resource_size(res)); + uio->mem[0].memtype = UIO_MEM_PHYS; + + uio->mem[1].name = "eth_rx_bd"; + uio->mem[1].addr = priv->rx_queue[0].dma_rx_phy; + uio->mem[1].size = DMA_RX_SIZE * sizeof(struct dma_desc); + uio->mem[1].memtype = UIO_MEM_PHYS; + + uio->mem[2].name = "eth_tx_bd"; + uio->mem[2].addr = priv->tx_queue[0].dma_tx_phy; + uio->mem[2].size = DMA_TX_SIZE * sizeof(struct dma_desc); + uio->mem[2].memtype = UIO_MEM_PHYS; + + uio->open = rockchip_gmac_uio_open; + uio->release = rockchip_gmac_uio_release; + /* Custom mmap function. */ + uio->mmap = rockchip_gmac_uio_mmap; + uio->priv = pdev_info; + + err = uio_register_device(dev, uio); + if (err) { + dev_err(dev, "Failed to register uio device: %d\n", err); + return err; + } + + pdev_info->map_num = 3; + + dev_info(dev, "Registered %s uio devices, %d register maps attached\n", + pdev_info->name, pdev_info->map_num); + + platform_set_drvdata(pdev, pdev_info); + + return 0; +} + +/** + * rockchip_gmac_uio_remove() - ROCKCHIP ETH UIO platform driver release + * routine - unregister uio devices + */ +static int rockchip_gmac_uio_remove(struct platform_device *pdev) +{ + struct rockchip_gmac_uio_pdev_info *pdev_info = + platform_get_drvdata(pdev); + struct net_device *netdev; + + if (!pdev_info) + return -EINVAL; + + netdev = pdev_info->ndev; + + uio_unregister_device(&pdev_info->uio); + + if (netdev) { + rtnl_lock(); + uio_release(netdev); + rtnl_unlock(); + } + + platform_set_drvdata(pdev, NULL); + + if (netdev) { + rtnl_lock(); + dev_open(netdev); + rtnl_unlock(); + } + + return 0; +} + +static const struct of_device_id rockchip_gmac_uio_of_match[] = { + { .compatible = "rockchip,uio-gmac", }, + { } +}; + +static struct platform_driver rockchip_gmac_uio_driver = { + .driver = { + .owner = THIS_MODULE, + .name = DRIVER_NAME, + .of_match_table = rockchip_gmac_uio_of_match, + }, + .probe = rockchip_gmac_uio_probe, + .remove = rockchip_gmac_uio_remove, +}; + +module_platform_driver(rockchip_gmac_uio_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("ROCKCHIP"); +MODULE_DESCRIPTION("ROCKCHIP GMAC UIO Driver"); + diff --git a/kernel/drivers/net/phy/fixed_phy.c b/kernel/drivers/net/phy/fixed_phy.c index 5982016..953ff54 100644 --- a/kernel/drivers/net/phy/fixed_phy.c +++ b/kernel/drivers/net/phy/fixed_phy.c @@ -23,7 +23,6 @@ #include <linux/slab.h> #include <linux/of.h> #include <linux/gpio.h> -#include <linux/seqlock.h> #include <linux/idr.h> #include "swphy.h" @@ -36,7 +35,6 @@ struct fixed_phy { int addr; struct phy_device *phydev; - seqcount_t seqcount; struct fixed_phy_status status; int (*link_update)(struct net_device *, struct fixed_phy_status *); struct list_head node; @@ -62,18 +60,15 @@ list_for_each_entry(fp, &fmb->phys, node) { if (fp->addr == phy_addr) { struct fixed_phy_status state; - int s; - do { - s = read_seqcount_begin(&fp->seqcount); - /* Issue callback if user registered it. */ - if (fp->link_update) - fp->link_update(fp->phydev->attached_dev, - &fp->status); - /* Check the GPIO for change in status */ - fixed_phy_update(fp); - state = fp->status; - } while (read_seqcount_retry(&fp->seqcount, s)); + /* Issue callback if user registered it. */ + if (fp->link_update) + fp->link_update(fp->phydev->attached_dev, + &fp->status); + + /* Check the GPIO for change in status */ + fixed_phy_update(fp); + state = fp->status; return swphy_read_reg(reg_num, &state); } @@ -130,8 +125,6 @@ fp = kzalloc(sizeof(*fp), GFP_KERNEL); if (!fp) return -ENOMEM; - - seqcount_init(&fp->seqcount); if (irq != PHY_POLL) fmb->mii_bus->irq[phy_addr] = irq; diff --git a/kernel/drivers/net/phy/motorcomm.c b/kernel/drivers/net/phy/motorcomm.c index 2469a6a..5ec298a 100644 --- a/kernel/drivers/net/phy/motorcomm.c +++ b/kernel/drivers/net/phy/motorcomm.c @@ -573,7 +573,7 @@ static int yt8531_config_init(struct phy_device *phydev) { - int ret = 0; + int ret = 0, val; #if (YTPHY8531A_XTAL_INIT) ret = yt8531a_xtal_init(phydev); @@ -591,10 +591,17 @@ return ret; /* RXC, PHY_CLK_OUT and RXData Drive strength: - * Drive strength of RXC = 4, PHY_CLK_OUT = 3, RXD0 = 4 (default) - * If the io voltage is 3.3v, PHY_CLK_OUT = 2, set 0xa010 = 0x9acf + * Drive strength of RXC = 6, PHY_CLK_OUT = 3, RXD0 = 4 (default 1.8v) + * If the io voltage is 3.3v, PHY_CLK_OUT = 2, set 0xa010 = 0xdacf */ - ret = ytphy_write_ext(phydev, 0xa010, 0x9bcf); + ret = ytphy_write_ext(phydev, 0xa010, 0xdbcf); + if (ret < 0) + return ret; + + /* Change 100M default BGS voltage from 0x294c to 0x274c */ + val = ytphy_read_ext(phydev, 0x57); + val = (val & ~(0xf << 8)) | (7 << 8); + ret = ytphy_write_ext(phydev, 0x57, val); if (ret < 0) return ret; diff --git a/kernel/drivers/net/phy/phy_device.c b/kernel/drivers/net/phy/phy_device.c index 6655447..47e80d8 100644 --- a/kernel/drivers/net/phy/phy_device.c +++ b/kernel/drivers/net/phy/phy_device.c @@ -505,6 +505,15 @@ INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); INIT_WORK(&dev->phy_queue, phy_change_work); + /* Try to avoid __request_module warning */ +#define RK630_PHY_ID 0x00441400 +#define PHY_ID_YT8511 0x0000010a +#define PHY_ID_YT8531S 0x4f51e91a +#define PHY_ID_YT8531 0x4f51e91b + if ((IS_BUILTIN(CONFIG_RK630_PHY) && phy_id == RK630_PHY_ID) || + (IS_BUILTIN(CONFIG_MOTORCOMM_PHY) && (phy_id == PHY_ID_YT8511 || phy_id == PHY_ID_YT8531S || phy_id == PHY_ID_YT8531))) + goto skip_request_module; + /* Request the appropriate module unconditionally; don't * bother trying to do so only if it isn't already loaded, * because that gets complicated. A hotplug event would have @@ -517,6 +526,7 @@ */ request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id)); +skip_request_module: device_initialize(&mdiodev->dev); return dev; diff --git a/kernel/drivers/net/phy/rk630phy.c b/kernel/drivers/net/phy/rk630phy.c index f0128a5..327301d 100644 --- a/kernel/drivers/net/phy/rk630phy.c +++ b/kernel/drivers/net/phy/rk630phy.c @@ -16,6 +16,7 @@ #include <linux/mfd/core.h> #include <linux/mii.h> #include <linux/netdevice.h> +#include <linux/nvmem-consumer.h> #include <linux/of_irq.h> #include <linux/phy.h> #include <linux/platform_device.h> @@ -24,6 +25,8 @@ #define RK630_PHY_ID 0x00441400 /* PAGE 0 */ +#define REG_MMD_ACCESS_CONTROL 0x0d +#define REG_MMD_ACCESS_DATA_ADDRESS 0x0e #define REG_INTERRUPT_STATUS 0X10 #define REG_INTERRUPT_MASK 0X11 #define REG_GLOBAL_CONFIGURATION 0X13 @@ -50,6 +53,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 */ @@ -61,15 +65,51 @@ * Addr: 1 --- RK630@S40 * 2 --- RV1106@T22 */ -#define PHY_ADDR_S40 1 -#define PHY_ADDR_T22 2 +#define PHY_ADDR_S40 1 +#define PHY_ADDR_T22 2 + +#define T22_TX_LEVEL_100M 0x2d +#define T22_TX_LEVEL_10M 0x32 struct rk630_phy_priv { struct phy_device *phydev; bool ieee; int wol_irq; struct wake_lock wol_wake_lock; + int tx_level_100M; + int tx_level_10M; }; + +static void rk630_phy_t22_get_tx_level_from_efuse(struct phy_device *phydev) +{ + struct rk630_phy_priv *priv = phydev->priv; + unsigned int tx_level_100M = T22_TX_LEVEL_100M; + unsigned int tx_level_10M = T22_TX_LEVEL_10M; + unsigned char *efuse_buf; + struct nvmem_cell *cell; + size_t len; + + cell = nvmem_cell_get(&phydev->mdio.dev, "txlevel"); + if (IS_ERR(cell)) { + phydev_err(phydev, "failed to get txlevel cell: %ld, use default\n", + PTR_ERR(cell)); + } else { + efuse_buf = nvmem_cell_read(cell, &len); + nvmem_cell_put(cell); + if (!IS_ERR(efuse_buf)) { + if (len == 2 && efuse_buf[0] > 0 && efuse_buf[1] > 0) { + tx_level_100M = efuse_buf[1]; + tx_level_10M = efuse_buf[0]; + } + kfree(efuse_buf); + } else { + phydev_err(phydev, "failed to get efuse buf, use default\n"); + } + } + + priv->tx_level_100M = tx_level_100M; + priv->tx_level_10M = tx_level_10M; +} static void rk630_phy_wol_enable(struct phy_device *phydev) { @@ -164,6 +204,8 @@ static void rk630_phy_t22_config_init(struct phy_device *phydev) { + struct rk630_phy_priv *priv = phydev->priv; + /* Switch to page 1 */ phy_write(phydev, REG_PAGE_SEL, 0x0100); /* Disable APS */ @@ -180,8 +222,13 @@ phy_write(phydev, REG_PAGE6_GAIN_ANONTROL, 0x0400); /* PHYAFE EQ optimization */ phy_write(phydev, REG_PAGE6_AFE_TX_CTRL, 0x1088); + + if (priv->tx_level_100M <= 0 || priv->tx_level_10M <= 0) + rk630_phy_t22_get_tx_level_from_efuse(phydev); + /* PHYAFE TX optimization */ - phy_write(phydev, REG_PAGE6_AFE_DRIVER2, 0x3030); + phy_write(phydev, REG_PAGE6_AFE_DRIVER2, + (priv->tx_level_100M << 8) | priv->tx_level_10M); /* PHYAFE CP current optimization */ phy_write(phydev, REG_PAGE6_CP_CURRENT, 0x0575); /* ADC OP BIAS optimization */ @@ -190,6 +237,8 @@ phy_write(phydev, REG_PAGE6_RX_DECTOR, 0x0408); /* PHYAFE PDCW optimization */ phy_write(phydev, REG_PAGE6_AFE_PDCW, 0x8880); + /* Add PHY Tx mos drive, reduce power noise/jitter */ + phy_write(phydev, REG_PAGE6_TX_MOS_DRV, 0x888e); /* Switch to page 8 */ phy_write(phydev, REG_PAGE_SEL, 0x0800); @@ -198,6 +247,12 @@ /* Switch to page 0 */ phy_write(phydev, REG_PAGE_SEL, 0x0000); + + /* Disable eee mode advertised */ + phy_write(phydev, REG_MMD_ACCESS_CONTROL, 0x0007); + phy_write(phydev, REG_MMD_ACCESS_DATA_ADDRESS, 0x003c); + phy_write(phydev, REG_MMD_ACCESS_CONTROL, 0x4007); + phy_write(phydev, REG_MMD_ACCESS_DATA_ADDRESS, 0x0000); } static int rk630_phy_config_init(struct phy_device *phydev) @@ -205,6 +260,11 @@ switch (phydev->mdio.addr) { case PHY_ADDR_S40: rk630_phy_s40_config_init(phydev); + /* + * Ultra Auto-Power Saving Mode (UAPS) is designed to + * save power when cable is not plugged into PHY. + */ + rk630_phy_set_uaps(phydev); break; case PHY_ADDR_T22: rk630_phy_t22_config_init(phydev); @@ -216,11 +276,6 @@ } rk630_phy_ieee_set(phydev, true); - /* - * Ultra Auto-Power Saving Mode (UAPS) is designed to - * save power when cable is not plugged into PHY. - */ - rk630_phy_set_uaps(phydev); return 0; } diff --git a/kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c b/kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c index a04d598..e0046c3 100644 --- a/kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c +++ b/kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c @@ -697,8 +697,8 @@ while (!ctx->done.done && msecs--) udelay(1000); } else { - wait_event_interruptible(ctx->done.wait, - ctx->done.done); + swait_event_interruptible_exclusive(ctx->done.wait, + ctx->done.done); } break; default: diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile index aecfc06..071b8d4 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile @@ -2,7 +2,7 @@ # bcmdhd MODULE_NAME := bcmdhd -CONFIG_BCMDHD ?= m +CONFIG_AP6XXX ?= m CONFIG_BCMDHD_SDIO := y #CONFIG_BCMDHD_PCIE := y @@ -44,7 +44,7 @@ -DDHD_DONOT_FORWARD_BCMEVENT_AS_NETWORK_PKT -DOEM_ANDROID \ -DMULTIPLE_SUPPLICANT -DTSQ_MULTIPLIER -DMFP -DDHD_8021X_DUMP \ -DPOWERUP_MAX_RETRY=0 -DIFACE_HANG_FORCE_DEV_CLOSE -DWAIT_DEQUEUE \ - -DUSE_NEW_RSPEC_DEFS -DBCM_USE_PLATFORM_STRLCPY \ + -DUSE_NEW_RSPEC_DEFS \ -DWL_EXT_IAPSTA -DWL_ESCAN -DCCODE_LIST -DSUSPEND_EVENT \ -DKEY_INSTALL_CHECK \ -DENABLE_INSMOD_NO_FW_LOAD @@ -69,6 +69,7 @@ DHDOFILES += wl_linux_mon.o wl_cfg_btcoex.o wl_cfgvendor.o DHDOFILES += dhd_cfg80211.o wl_cfgvif.o wl_roam.o DHDCFLAGS += -DWL_CFG80211 -DWLP2P -DWL_CFG80211_STA_EVENT + DHDCFLAGS += -DWL_CAP_HE # DHDCFLAGS += -DWL_IFACE_COMB_NUM_CHANNELS DHDCFLAGS += -DCUSTOM_PNO_EVENT_LOCK_xTIME=10 DHDCFLAGS += -DWL_SUPPORT_AUTO_CHANNEL @@ -76,13 +77,17 @@ DHDCFLAGS += -DESCAN_RESULT_PATCH -DESCAN_BUF_OVERFLOW_MGMT DHDCFLAGS += -DVSDB -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST DHDCFLAGS += -DWLTDLS -DMIRACAST_AMPDU_SIZE=8 +# DHDCFLAGS += -DHOSTAPD_BW_SUPPORT +# DHDCFLAGS += -DHOSTAPD_EID_EXTENSION_SUPPORT DHDCFLAGS += -DWL_VIRTUAL_APSTA -DSTA_MGMT DHDCFLAGS += -DPNO_SUPPORT -DEXPLICIT_DISCIF_CLEANUP DHDCFLAGS += -DDHD_USE_SCAN_WAKELOCK DHDCFLAGS += -DSPECIFIC_MAC_GEN_SCHEME DHDCFLAGS += -DWL_IFACE_MGMT + DHDCFLAGS += -DSUPPORT_RSSI_SUM_REPORT DHDCFLAGS += -DWLFBT -DWL_GCMP_SUPPORT DHDCFLAGS += -DROAM_CHANNEL_CACHE -DDHD_LOSSLESS_ROAMING -DWL_ROAM_WAR +# DHDCFLAGS += -DVNDR_IE_WAR -DGET_FW_IE_DATA DHDCFLAGS += -DGTK_OFFLOAD_SUPPORT DHDCFLAGS += -DRESTART_AP_WAR # DHDCFLAGS += -DWL_STATIC_IF @@ -92,7 +97,7 @@ #BCMDHD_SDIO ifneq ($(CONFIG_BCMDHD_SDIO),) BUS_TYPE := sdio -DHDCFLAGS += -DBCMSDIO -DMMC_SDIO_ABORT -DBCMLXSDMMC \ +DHDCFLAGS += -DBCMSDIO -DMMC_SDIO_ABORT -DMMC_HW_RESET -DBCMLXSDMMC \ -DUSE_SDIOFIFO_IOVAR -DSDTEST \ -DBDC -DDHD_USE_IDLECOUNT -DCUSTOM_SDIO_F2_BLKSIZE=256 \ -DBCMSDIOH_TXGLOM -DBCMSDIOH_TXGLOM_EXT -DBCMSDIOH_STATIC_COPY_BUF \ @@ -119,7 +124,8 @@ DHDCFLAGS += -DDHD_LB -DDHD_LB_RXP -DDHD_LB_STATS -DDHD_LB_TXP DHDCFLAGS += -DDHD_PKTID_AUDIT_ENABLED DHDCFLAGS += -DINSMOD_FW_LOAD -DHDCFLAGS += -DCONFIG_HAS_WAKELOCK +DHDCFLAGS += -DCONFIG_HAS_WAKELOCK #-DDHD_DEBUG_WAKE_LOCK +DHDCFLAGS += -DDHD_PACKET_TIMEOUT_MS=50 -DMAX_TX_TIMEOUT=50 #DHDCFLAGS += -DDHD_PCIE_RUNTIMEPM -DMAX_IDLE_COUNT=11 -DCUSTOM_DHD_RUNTIME_MS=100 ifeq ($(CONFIG_BCMDHD_OOB),y) DHDCFLAGS += -DCUSTOMER_OOB -DBCMPCIE_OOB_HOST_WAKE -DHW_OOB @@ -139,6 +145,7 @@ DHDCFLAGS += -DINSMOD_FW_LOAD DHDCFLAGS += -DBCM_REQUEST_FW DHDCFLAGS += -DSHOW_LOGTRACE +DHDCFLAGS += -DWL_EXT_WOWL ifneq ($(CONFIG_BCMDHD_REQUEST_FW),y) DHDCFLAGS += -DEXTERNAL_FW_PATH endif @@ -282,7 +289,7 @@ ifneq ($(CONFIG_CFG80211),) DHDCFLAGS += -DWL_EXT_RECONNECT -DWL_REASSOC_BCAST DHDCFLAGS += -DWL_EXT_DISCONNECT_RECONNECT -endif +endif endif # For TPUT_IMPROVE @@ -339,7 +346,11 @@ endif endif -ifeq ($(CONFIG_BCMDHD),m) +ifeq ($(CONFIG_AP6XXX),y) + DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC + DHDCFLAGS += -DBCM_USE_PLATFORM_STRLCPY +endif +ifeq ($(CONFIG_AP6XXX),m) DHDCFLAGS += -DBCMDHD_MODULAR endif @@ -350,6 +361,14 @@ endif DHDCFLAGS += -DCUSTOMER_HW -DDHD_OF_SUPPORT DHDCFLAGS += -DCUSTOMER_HW_ROCKCHIP +# DHDCFLAGS += -DCUSTOMER_HW_ROCKCHIP_RK3588 + DHDCFLAGS += -DBCM_USE_PLATFORM_STRLCPY +endif + +ifneq ($(CONFIG_BCMDHD_PCIE),) +ifneq ($(filter -DCUSTOMER_HW_ROCKCHIP_RK3588, $(DHDCFLAGS)),) + DHDCFLAGS += -DDHD_CONTROL_PCIE_ASPM_WIFI_TURNON +endif endif ifeq ($(CONFIG_BCMDHD_REQUEST_FW),y) @@ -391,7 +410,7 @@ EXTRA_CFLAGS = $(DHDCFLAGS) EXTRA_CFLAGS += -DDHD_COMPILED=\"$(BCMDHD_ROOT)\" EXTRA_CFLAGS += -I$(BCMDHD_ROOT)/include/ -I$(BCMDHD_ROOT)/ -ifeq ($(CONFIG_BCMDHD),m) +ifeq ($(CONFIG_AP6XXX),m) EXTRA_LDFLAGS += --strip-debug endif diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c index dc38371..ba31570 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c @@ -83,8 +83,18 @@ #endif /* !defined(OOB_INTR_ONLY) */ static int sdioh_sdmmc_get_cisaddr(sdioh_info_t *sd, uint32 regaddr); #if defined(ENABLE_INSMOD_NO_FW_LOAD) && !defined(BUS_POWER_RESTORE) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) && defined(MMC_SW_RESET) +#if defined(MMC_SW_RESET) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0) +extern int mmc_sw_reset(struct mmc_card *card); +#else extern int mmc_sw_reset(struct mmc_host *host); +#endif +#elif defined(MMC_HW_RESET) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) +extern int mmc_hw_reset(struct mmc_card *card); +#else +extern int mmc_hw_reset(struct mmc_host *host); +#endif #else extern int sdio_reset_comm(struct mmc_card *card); #endif @@ -184,7 +194,7 @@ err_ret = sdio_enable_func(sd->func[1]); sdio_release_host(sd->func[1]); if (err_ret) { - sd_err(("bcmsdh_sdmmc: Failed to enable F1 Err: 0x%08x\n", err_ret)); + sd_err(("bcmsdh_sdmmc: Failed to enable F1 Err: %d\n", err_ret)); } return FALSE; @@ -1222,7 +1232,7 @@ if (err_ret) #endif /* MMC_SDIO_ABORT */ { - sd_err(("bcmsdh_sdmmc: Failed to %s word F%d:@0x%05x=%02x, Err: 0x%08x\n", + sd_err(("bcmsdh_sdmmc: Failed to %s word F%d:@0x%05x=%02x, Err: %d\n", rw ? "Write" : "Read", func, addr, *word, err_ret)); } } @@ -1772,18 +1782,37 @@ #if defined(ENABLE_INSMOD_NO_FW_LOAD) && !defined(BUS_POWER_RESTORE) static int sdio_sw_reset(sdioh_info_t *sd) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) && defined(MMC_SW_RESET) - struct mmc_host *host = sd->func[0]->card->host; -#endif + struct mmc_card *card = sd->func[0]->card; int err = 0; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) && defined(MMC_SW_RESET) - printf("%s: Enter\n", __FUNCTION__); +#if defined(MMC_SW_RESET) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + /* MMC_SW_RESET */ + printf("%s: call mmc_sw_reset\n", __FUNCTION__); sdio_claim_host(sd->func[0]); - err = mmc_sw_reset(host); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0) + err = mmc_sw_reset(card); +#else + err = mmc_sw_reset(card->host); +#endif + sdio_release_host(sd->func[0]); +#elif defined(MMC_HW_RESET) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) + /* MMC_HW_RESET */ + printf("%s: call mmc_hw_reset\n", __FUNCTION__); + sdio_claim_host(sd->func[0]); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) + while (atomic_read(&card->sdio_funcs_probed) > 1) { + atomic_dec(&card->sdio_funcs_probed); + } +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) + err = mmc_hw_reset(card); +#else + err = mmc_hw_reset(card->host); +#endif sdio_release_host(sd->func[0]); #else - err = sdio_reset_comm(sd->func[0]->card); + /* sdio_reset_comm */ + err = sdio_reset_comm(card); #endif if (err) diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c index a3da591..d15b758 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c @@ -2452,14 +2452,19 @@ dhd_pub_t *dhd = (dhd_pub_t *)handle; unsigned long flags; wifi_adapter_info_t *adapter; + int wowl_dngldown = 0; if (dhd == NULL) { DBUSERR(("%s: dhd is NULL\n", __FUNCTION__)); return; } adapter = (wifi_adapter_info_t *)dhd->adapter; +#ifdef WL_EXT_WOWL + wowl_dngldown = dhd_conf_wowl_dngldown(dhd); +#endif - if (dhd->busstate == DHD_BUS_SUSPEND && state == DBUS_STATE_DOWN) { + if ((dhd->busstate == DHD_BUS_SUSPEND && state == DBUS_STATE_DOWN) || + (dhd->hostsleep && wowl_dngldown)) { DBUSERR(("%s: switch state %d to %d\n", __FUNCTION__, state, DBUS_STATE_SLEEP)); state = DBUS_STATE_SLEEP; } @@ -3059,6 +3064,7 @@ } DBUSTRACE(("%s: Exit\n", __FUNCTION__)); + wifi_clr_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED); if (net_attached) { wifi_set_adapter_status(adapter, WIFI_STATUS_NET_ATTACHED); wake_up_interruptible(&adapter->status_event); @@ -3112,6 +3118,7 @@ dhd_dbus_advertise_bus_remove(bus->dhd); dbus_detach(pub->bus); pub->bus = NULL; + wifi_set_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED); wake_up_interruptible(&adapter->status_event); } else { osh = pub->osh; @@ -3133,6 +3140,24 @@ DBUSTRACE(("%s: Exit\n", __FUNCTION__)); } +int +dhd_bus_sleep(dhd_pub_t *dhdp, bool sleep, uint32 *intstatus) +{ + wifi_adapter_info_t *adapter = (wifi_adapter_info_t *)dhdp->adapter; + s32 timeout = -1; + int err = 0; + + timeout = wait_event_interruptible_timeout(adapter->status_event, + wifi_get_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED), + msecs_to_jiffies(12000)); + if (timeout <= 0) { + err = -1; + DBUSERR(("%s: bus disconnected timeout\n", __FUNCTION__)); + } + + return err; +} + #ifdef LINUX_EXTERNAL_MODULE_DBUS static int __init diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c index 3630bfc..96a25ce 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c @@ -476,7 +476,7 @@ /** functions called by the Linux kernel USB subsystem */ static struct usb_driver dbus_usbdev = { - name: "dbus_usbdev", + name: "dbus_usbdev"BUS_TYPE, probe: dbus_usbos_probe, disconnect: dbus_usbos_disconnect, id_table: devid_table, @@ -1332,6 +1332,7 @@ usb->portnum, WIFI_STATUS_POWER_ON); if (adapter == NULL) { DBUSERR(("%s: can't find adapter info for this chip\n", __FUNCTION__)); + ret = -ENOMEM; goto fail; } @@ -2648,8 +2649,13 @@ } if (usbos_info->tx_pipe) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0)) + usbos_info->maxps = usb_maxpacket(usbos_info->usb, + usbos_info->tx_pipe); +#else usbos_info->maxps = usb_maxpacket(usbos_info->usb, usbos_info->tx_pipe, usb_pipeout(usbos_info->tx_pipe)); +#endif /* #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 19, 0)) */ INIT_LIST_HEAD(&usbos_info->req_rxfreeq); INIT_LIST_HEAD(&usbos_info->req_txfreeq); @@ -3452,4 +3458,4 @@ { return &g_probe_info.usb->dev; } -#endif /* LINUX */ \ No newline at end of file +#endif /* LINUX */ diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h index d51fe1a..8a42530 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h @@ -2213,7 +2213,7 @@ } while (0) #define DHD_TXFL_WAKE_LOCK_TIMEOUT(pub, val) \ do { \ - printf("call pm_wake_timeout enable\n"); \ + printf("call txfl_wake_timeout enable\n"); \ dhd_txfl_wake_lock_timeout(pub, val); \ } while (0) #define DHD_TXFL_WAKE_UNLOCK(pub) \ @@ -2366,10 +2366,14 @@ #define DHD_OS_OOB_IRQ_WAKE_UNLOCK(pub) dhd_os_oob_irq_wake_unlock(pub) #endif /* BCMPCIE_OOB_HOST_WAKE */ +#ifndef DHD_PACKET_TIMEOUT_MS #define DHD_PACKET_TIMEOUT_MS 500 +#endif #define DHD_EVENT_TIMEOUT_MS 1500 #define SCAN_WAKE_LOCK_TIMEOUT 10000 +#ifndef MAX_TX_TIMEOUT #define MAX_TX_TIMEOUT 500 +#endif /* Enum for IOCTL recieved status */ typedef enum dhd_ioctl_recieved_status @@ -3703,8 +3707,8 @@ #ifdef DBG_PKT_MON /* Enable DHD PKT MON spin lock/unlock */ -#define DHD_PKT_MON_LOCK(lock, flags) (flags) = osl_mutex_lock(lock) -#define DHD_PKT_MON_UNLOCK(lock, flags) osl_mutex_unlock(lock, (flags)) +#define DHD_PKT_MON_LOCK(lock, flags) (flags) = osl_spin_lock(lock) +#define DHD_PKT_MON_UNLOCK(lock, flags) osl_spin_unlock(lock, (flags)) #endif /* DBG_PKT_MON */ #ifdef DHD_PKT_LOGGING @@ -4723,7 +4727,7 @@ #define DHD_VFS_UNLINK(dir, b, c) 0 static INLINE struct file *dhd_filp_open(const char *filename, int flags, int mode) - { return NULL; } + { printf("%s: DHD_SUPPORT_VFS_CALL not defined\n", __FUNCTION__); return NULL; } static INLINE int dhd_filp_close(void *image, void *id) { return 0; } static INLINE int dhd_i_size_read(const struct inode *inode) diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c index 33307c8..f05a119 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c @@ -141,7 +141,7 @@ {BCM43751_CHIP_ID, 1, DONT_CARE, "bcm43751a1_pcie_ag", ""}, {BCM43751_CHIP_ID, 2, DONT_CARE, "bcm43751a2_pcie_ag", ""}, {BCM43752_CHIP_ID, 1, DONT_CARE, "bcm43752a1_pcie_ag", ""}, - {BCM43752_CHIP_ID, 2, DONT_CARE, "bcm43752a2_pcie_ag", "AP6275P"}, + {BCM43752_CHIP_ID, 2, DONT_CARE, "bcm43752a2_pcie_ag", "ap6275p"}, {BCM4375_CHIP_ID, 5, DONT_CARE, "bcm4375b4_pcie_ag", ""}, #endif #ifdef BCMDBUS @@ -271,7 +271,6 @@ chip == BCM4334_CHIP_ID || chip == BCM43340_CHIP_ID || chip == BCM43341_CHIP_ID || chip == BCM4324_CHIP_ID || chip == BCM4335_CHIP_ID || chip == BCM4339_CHIP_ID || - chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID || chip == BCM43143_CHIP_ID || chip == BCM43242_CHIP_ID || chip == BCM43569_CHIP_ID) { return false; @@ -282,7 +281,7 @@ #endif #ifdef BCMSDIO -bool +static void dhd_conf_disable_slpauto(dhd_pub_t *dhd) { uint chip = dhd->conf->chip; @@ -296,10 +295,9 @@ chip == BCM43430_CHIP_ID || chip == BCM4345_CHIP_ID || chip == BCM43454_CHIP_ID || chip == BCM4359_CHIP_ID) { - return false; + dhd_slpauto = FALSE; } - - return true; + CONFIG_MSG("dhd_slpauto = %d\n", dhd_slpauto); } #endif @@ -1377,7 +1375,6 @@ return; } - #endif /* DHD_LINUX_STD_FW_API */ void @@ -1415,7 +1412,6 @@ #endif #ifdef DHD_LINUX_STD_FW_API - // preprocess the filename to only left 'name' dhd_conf_add_filepath(dhd, fw_path); dhd_conf_add_filepath(dhd, nv_path); dhd_conf_add_filepath(dhd, dhd->clm_path); @@ -2464,12 +2460,24 @@ int *hostsleep_set, int *hostsleep_val, int *ret) { if (dhd->conf->insuspend & (NO_TXCTL_IN_SUSPEND | WOWL_IN_SUSPEND)) { + int wowl_dngldown = 0; +#ifdef WL_EXT_WOWL + wowl_dngldown = dhd_conf_wowl_dngldown(dhd); +#endif if (cmd == WLC_SET_VAR) { char *psleep = NULL; - psleep = strstr(buf, "hostsleep"); - if (psleep) { - *hostsleep_set = 1; - memcpy(hostsleep_val, psleep+strlen("hostsleep")+1, sizeof(int)); + if (wowl_dngldown) { + psleep = strstr(buf, "wowl_activate"); + if (psleep) { + *hostsleep_set = 1; + memcpy(hostsleep_val, psleep+strlen("wowl_activate")+1, sizeof(int)); + } + } else { + psleep = strstr(buf, "hostsleep"); + if (psleep) { + *hostsleep_set = 1; + memcpy(hostsleep_val, psleep+strlen("hostsleep")+1, sizeof(int)); + } } } if (dhd->hostsleep && (!*hostsleep_set || *hostsleep_val)) { @@ -2710,6 +2718,21 @@ } return ret; +} + +int +dhd_conf_wowl_dngldown(dhd_pub_t *dhd) +{ + int wowl_dngldown = 0; +#ifdef BCMDBUS + uint insuspend = 0; + insuspend = dhd_conf_get_insuspend(dhd, ALL_IN_SUSPEND); + if ((insuspend & WOWL_IN_SUSPEND) && dhd_master_mode) { + wowl_dngldown = dhd->conf->wowl_dngldown; + } +#endif + + return wowl_dngldown; } #endif @@ -2971,8 +2994,12 @@ for(i=0; i<conf->pkt_filter_add.count; i++) { dhd_conf_wowl_pattern(dhd, ifidx, TRUE, conf->pkt_filter_add.filter[i]); } + CONFIG_MSG("wowl = 0x%x\n", conf->wowl); dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl", conf->wowl, 0, FALSE); - dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl_activate", 1, 0, FALSE); +#ifdef BCMDBUS + CONFIG_MSG("wowl_dngldown = %d\n", conf->wowl_dngldown); + dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl_dngldown", conf->wowl_dngldown, 1, FALSE); +#endif dhd_conf_wowl_wakeind(dhd, ifidx, TRUE); } #endif @@ -2988,7 +3015,7 @@ #ifdef WL_EXT_WOWL if (insuspend & WOWL_IN_SUSPEND) { dhd_conf_wowl_wakeind(dhd, ifidx, FALSE); - dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl_activate", 0, 0, FALSE); +// dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl_activate", 0, 0, FALSE); dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl", 0, 0, FALSE); dhd_conf_wowl_pattern(dhd, ifidx, FALSE, "clr"); } @@ -3038,19 +3065,32 @@ if (suspend) { if (insuspend & (WOWL_IN_SUSPEND | NO_TXCTL_IN_SUSPEND)) { -#ifdef BCMSDIO uint32 intstatus = 0; - int ret = 0; -#endif - int hostsleep = 2; + int ret = 0, hostsleep = 2, wowl_dngldown = 0; #ifdef WL_EXT_WOWL hostsleep = 1; + if ((insuspend & WOWL_IN_SUSPEND) && dhd_master_mode) { + dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "wowl_activate", 1, 0, FALSE); +#ifdef BCMDBUS + wowl_dngldown = dhd->conf->wowl_dngldown; #endif - dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "hostsleep", hostsleep, 0, FALSE); + } +#endif + if (!wowl_dngldown) { + dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "hostsleep", hostsleep, 0, FALSE); + } #ifdef BCMSDIO ret = dhd_bus_sleep(dhd, TRUE, &intstatus); - CONFIG_TRACE("ret = %d, intstatus = 0x%x\n", ret, intstatus); #endif +#ifdef BCMPCIE + ret = dhd_bus_sleep(dhd, TRUE, NULL); +#endif +#ifdef BCMDBUS + if (wowl_dngldown) { + ret = dhd_bus_sleep(dhd, TRUE, NULL); + } +#endif + CONFIG_MSG("ret = %d, intstatus = 0x%x\n", ret, intstatus); } } else { if (insuspend & (WOWL_IN_SUSPEND | NO_TXCTL_IN_SUSPEND)) { @@ -3976,9 +4016,9 @@ CONFIG_MSG("dhd_doflow = %d\n", dhd_doflow); } else if (!strncmp("dhd_slpauto=", full_param, len_param)) { - if (!strncmp(data, "0", 1)) - dhd_slpauto = FALSE; - else if (dhd_conf_disable_slpauto(dhd)) + if (!strncmp(data, "0", 1)) { + dhd_conf_disable_slpauto(dhd); + } else dhd_slpauto = TRUE; CONFIG_MSG("dhd_slpauto = %d\n", dhd_slpauto); } @@ -4150,6 +4190,14 @@ conf->enq_hdr_pkt = (int)simple_strtol(data, NULL, 0); CONFIG_MSG("enq_hdr_pkt = 0x%x\n", conf->enq_hdr_pkt); } + else if (!strncmp("aspm=", full_param, len_param)) { + conf->aspm = (int)simple_strtol(data, NULL, 0); + CONFIG_MSG("aspm = %d\n", conf->aspm); + } + else if (!strncmp("l1ss=", full_param, len_param)) { + conf->l1ss = (int)simple_strtol(data, NULL, 0); + CONFIG_MSG("l1ss = %d\n", conf->l1ss); + } else return false; @@ -4208,6 +4256,12 @@ conf->wowl = (int)simple_strtol(data, NULL, 0); CONFIG_MSG("wowl = 0x%x\n", conf->wowl); } +#ifdef BCMDBUS + else if (!strncmp("wowl_dngldown=", full_param, len_param)) { + conf->wowl_dngldown = (int)simple_strtol(data, NULL, 0); + CONFIG_MSG("wowl_dngldown = 0x%x\n", conf->wowl_dngldown); + } +#endif #endif else if (!strncmp("rekey_offload=", full_param, len_param)) { if (!strncmp(data, "1", 1)) @@ -4819,7 +4873,108 @@ } } + +static void +dhd_conf_set_ampdu_mpdu(dhd_pub_t *dhd) +{ + uint chip = dhd->conf->chip; + char ampdu_mpdu[32] = "ampdu_mpdu="; + int val = -1; + + if (chip == BCM43362_CHIP_ID || chip == BCM4330_CHIP_ID || + chip == BCM4334_CHIP_ID || chip == BCM43340_CHIP_ID || + chip == BCM43341_CHIP_ID || chip == BCM4324_CHIP_ID || + chip == BCM4335_CHIP_ID || chip == BCM4339_CHIP_ID || + chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID || + chip == BCM4371_CHIP_ID || + chip == BCM43430_CHIP_ID || + chip == BCM4345_CHIP_ID || chip == BCM43454_CHIP_ID || + chip == BCM4359_CHIP_ID || chip == BCM43012_CHIP_ID) { + val = 16; + } else if (chip == BCM43751_CHIP_ID || chip == BCM43752_CHIP_ID) { + val = 32; + } + + if (val > 0) { + snprintf(ampdu_mpdu+strlen(ampdu_mpdu), sizeof(ampdu_mpdu), "%d", val); + dhd_conf_set_wl_cmd(dhd, ampdu_mpdu, TRUE); + } +} + +#if defined(SDIO_ISR_THREAD) +static void +dhd_conf_set_intr_extn(dhd_pub_t *dhd) +{ + uint chip = dhd->conf->chip; + + if (chip == BCM43012_CHIP_ID || + chip == BCM4335_CHIP_ID || chip == BCM4339_CHIP_ID || + chip == BCM43454_CHIP_ID || chip == BCM4345_CHIP_ID || + chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID || + chip == BCM4345_CHIP_ID || chip == BCM4371_CHIP_ID || + chip == BCM4359_CHIP_ID || + chip == BCM43751_CHIP_ID || chip == BCM43752_CHIP_ID || + chip == BCM4375_CHIP_ID) { + CONFIG_TRACE("enable intr_extn\n"); + dhd->conf->intr_extn = TRUE; + } +} +#endif /* SDIO_ISR_THREAD */ #endif + +static void +dhd_conf_set_txbf(dhd_pub_t *dhd) +{ + uint chip = dhd->conf->chip; + + if (chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID || + chip == BCM4371_CHIP_ID || chip == BCM4359_CHIP_ID || + chip == BCM43569_CHIP_ID || + chip == BCM43751_CHIP_ID || chip == BCM43752_CHIP_ID || + chip == BCM4375_CHIP_ID) { + CONFIG_TRACE("enable txbf\n"); + dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "txbf", 1, 0, FALSE); + } +} + +static void +dhd_conf_tput_improve(dhd_pub_t *dhd) +{ + struct dhd_conf *conf = dhd->conf; + uint chip = conf->chip; + uint chiprev = conf->chiprev; + + if ((chip == BCM43430_CHIP_ID && chiprev == 2) || + chip == BCM43012_CHIP_ID || + chip == BCM4335_CHIP_ID || chip == BCM4339_CHIP_ID || + chip == BCM43454_CHIP_ID || chip == BCM4345_CHIP_ID || + chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID || + chip == BCM4345_CHIP_ID || chip == BCM4371_CHIP_ID || + chip == BCM43569_CHIP_ID || chip == BCM4359_CHIP_ID || + chip == BCM43751_CHIP_ID || chip == BCM43752_CHIP_ID || + chip == BCM4375_CHIP_ID) { + CONFIG_TRACE("enable tput parameters\n"); +#ifdef DHDTCPACK_SUPPRESS +#ifdef BCMSDIO + conf->tcpack_sup_mode = TCPACK_SUP_REPLACE; +#endif +#endif +#if defined(BCMSDIO) || defined(BCMPCIE) + dhd_rxbound = 128; + dhd_txbound = 64; +#endif + conf->frameburst = 1; +#ifdef BCMSDIO + conf->dhd_txminmax = -1; + conf->txinrx_thres = 128; +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) + conf->orphan_move = 1; +#else + conf->orphan_move = 0; +#endif + } +} #ifdef UPDATE_MODULE_NAME #if defined(BCMSDIO) || defined(BCMPCIE) @@ -4915,26 +5070,14 @@ dhd_conf_preinit_ioctls_sta(dhd, 0); dhd_conf_set_wl_cmd(dhd, wl_preinit, TRUE); #if defined(BCMSDIO) - if (conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID) { - char ampdu_mpdu[] = "ampdu_mpdu=32"; - dhd_conf_set_wl_cmd(dhd, ampdu_mpdu, TRUE); - } else { - char ampdu_mpdu[] = "ampdu_mpdu=16"; - dhd_conf_set_wl_cmd(dhd, ampdu_mpdu, TRUE); - } + dhd_conf_set_ampdu_mpdu(dhd); #endif #ifdef DHD_TPUT_PATCH if (dhd->conf->mtu) dhd_change_mtu(dhd, dhd->conf->mtu, 0); #endif - if (conf->chip == BCM4354_CHIP_ID || conf->chip == BCM4356_CHIP_ID || - conf->chip == BCM4371_CHIP_ID || conf->chip == BCM4359_CHIP_ID || - conf->chip == BCM43569_CHIP_ID || - conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID || - conf->chip == BCM4375_CHIP_ID) { - dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "txbf", 1, 0, FALSE); - } + dhd_conf_set_txbf(dhd); if (conf->chip == BCM4375_CHIP_ID) { char he_cmd[] = "110=1, nmode=1, vhtmode=1, he=enab 1"; dhd_conf_set_wl_cmd(dhd, he_cmd, TRUE); @@ -5115,10 +5258,12 @@ #endif #endif #ifdef BCMPCIE - conf->bus_deepsleep_disable = 1; + conf->bus_deepsleep_disable = -1; conf->flow_ring_queue_threshold = FLOW_RING_QUEUE_THRESHOLD; conf->d2h_intr_method = -1; conf->d2h_intr_control = -1; + conf->aspm = -1; + conf->l1ss = -1; conf->enq_hdr_pkt = 0; #endif conf->dpc_cpucore = -1; @@ -5135,6 +5280,9 @@ #ifdef WL_EXT_WOWL dhd_master_mode = TRUE; conf->wowl = WL_WOWL_NET|WL_WOWL_DIS|WL_WOWL_BCN; +#ifdef BCMDBUS + conf->wowl_dngldown = 0; +#endif conf->insuspend |= (WOWL_IN_SUSPEND | NO_TXDATA_IN_SUSPEND); #endif if (conf->suspend_mode == PM_NOTIFIER || conf->suspend_mode == SUSPEND_MODE_2) @@ -5226,46 +5374,9 @@ memset(conf->isam_enable, 0, sizeof(conf->isam_enable)); #endif #if defined(SDIO_ISR_THREAD) - if (conf->chip == BCM43012_CHIP_ID || - conf->chip == BCM4335_CHIP_ID || conf->chip == BCM4339_CHIP_ID || - conf->chip == BCM43454_CHIP_ID || conf->chip == BCM4345_CHIP_ID || - conf->chip == BCM4354_CHIP_ID || conf->chip == BCM4356_CHIP_ID || - conf->chip == BCM4345_CHIP_ID || conf->chip == BCM4371_CHIP_ID || - conf->chip == BCM4359_CHIP_ID || - conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID || - conf->chip == BCM4375_CHIP_ID) { - conf->intr_extn = TRUE; - } + dhd_conf_set_intr_extn(dhd); #endif - if ((conf->chip == BCM43430_CHIP_ID && conf->chiprev == 2) || - conf->chip == BCM43012_CHIP_ID || - conf->chip == BCM4335_CHIP_ID || conf->chip == BCM4339_CHIP_ID || - conf->chip == BCM43454_CHIP_ID || conf->chip == BCM4345_CHIP_ID || - conf->chip == BCM4354_CHIP_ID || conf->chip == BCM4356_CHIP_ID || - conf->chip == BCM4345_CHIP_ID || conf->chip == BCM4371_CHIP_ID || - conf->chip == BCM43569_CHIP_ID || conf->chip == BCM4359_CHIP_ID || - conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID || - conf->chip == BCM4375_CHIP_ID) { -#ifdef DHDTCPACK_SUPPRESS -#ifdef BCMSDIO - conf->tcpack_sup_mode = TCPACK_SUP_REPLACE; -#endif -#endif -#if defined(BCMSDIO) || defined(BCMPCIE) - dhd_rxbound = 128; - dhd_txbound = 64; -#endif - conf->frameburst = 1; -#ifdef BCMSDIO - conf->dhd_txminmax = -1; - conf->txinrx_thres = 128; -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - conf->orphan_move = 1; -#else - conf->orphan_move = 0; -#endif - } + dhd_conf_tput_improve(dhd); #ifdef DHD_TPUT_PATCH if (conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID || conf->chip == BCM4375_CHIP_ID) { diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h index 2ca7035..b33ba02 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h @@ -299,6 +299,8 @@ int d2h_intr_method; int d2h_intr_control; int enq_hdr_pkt; + int aspm; + int l1ss; #endif int dpc_cpucore; int rxf_cpucore; @@ -347,6 +349,9 @@ uint war; #ifdef WL_EXT_WOWL uint wowl; +#ifdef BCMDBUS + uint wowl_dngldown; +#endif #endif #ifdef GET_CUSTOM_MAC_FROM_CONFIG char hw_ether[62]; @@ -458,7 +463,10 @@ int dhd_conf_suspend_resume_sta(dhd_pub_t *dhd, int ifidx, int suspend); /* Add to adjust 802.1x priority */ extern void pktset8021xprio(void *pkt, int prio); -#ifdef BCMSDIO +#if defined(BCMSDIO) || defined(BCMPCIE) || defined(BCMDBUS) extern int dhd_bus_sleep(dhd_pub_t *dhdp, bool sleep, uint32 *intstatus); #endif +#ifdef WL_EXT_WOWL +int dhd_conf_wowl_dngldown(dhd_pub_t *dhd); +#endif #endif /* _dhd_config_ */ diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c index ac77b20..6381513 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c @@ -1259,7 +1259,7 @@ ret = dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); if (ret) { - /* DHD_ERROR(("%s set log tag iovar failed %d\n", __FUNCTION__, ret)); */ +// DHD_ERROR(("%s set log tag iovar failed %d\n", __FUNCTION__, ret)); } } diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c index 714afe2..fe3ef3b 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c @@ -3,6 +3,12 @@ #include <osl.h> #include <dhd_linux.h> #include <linux/gpio.h> +#ifdef BCMDHD_DTS +#include <linux/of_gpio.h> +#endif +#ifdef BCMDHD_PLATDEV +#include <linux/platform_device.h> +#endif #ifdef CUSTOMER_HW_ROCKCHIP #include <linux/rfkill-wlan.h> #endif @@ -34,7 +40,7 @@ #ifdef BCMDHD_DTS /* This is sample code in dts file. -bcmdhd { +bcmdhd_wlan { compatible = "android,bcmdhd_wlan"; gpio_wl_reg_on = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>; gpio_wl_host_wake = <&gpio GPIOZ_15 GPIO_ACTIVE_HIGH>; @@ -159,7 +165,7 @@ err = sdhci_force_presence_change(&sdmmc_channel, 0); #endif /* CUSTOMER_HW_PLATFORM */ #ifdef CUSTOMER_HW_ROCKCHIP - rockchip_wifi_set_carddetect(0); + rockchip_wifi_set_carddetect(0); #endif #elif defined(BCMPCIE) printf("======== Card detection to remove PCIE card! ========\n"); @@ -277,9 +283,9 @@ struct device_node *root_node = NULL; #endif int err = 0; - int gpio_wl_reg_on; + int gpio_wl_reg_on = -1; #ifdef CUSTOMER_OOB - int gpio_wl_host_wake; + int gpio_wl_host_wake = -1; int host_oob_irq = -1; uint host_oob_irq_flags = 0; #ifdef CUSTOMER_HW_ROCKCHIP @@ -293,9 +299,19 @@ * WL_REG_ON and WL_HOST_WAKE. */ #ifdef BCMDHD_DTS +#ifdef BCMDHD_PLATDEV + if (adapter->pdev) { + root_node = adapter->pdev->dev.of_node; + strcpy(wlan_node, root_node->name); + } else { + printf("%s: adapter->pdev is NULL\n", __FUNCTION__); + return -1; + } +#else strcpy(wlan_node, DHD_DT_COMPAT_ENTRY); - printf("======== Get GPIO from DTS(%s) ========\n", wlan_node); root_node = of_find_compatible_node(NULL, NULL, wlan_node); +#endif + printf("======== Get GPIO from DTS(%s) ========\n", wlan_node); if (root_node) { gpio_wl_reg_on = of_get_named_gpio(root_node, GPIO_WL_REG_ON_PROPNAME, 0); #ifdef CUSTOMER_OOB diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c index 4f86b66..57d93cf 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c @@ -65,6 +65,11 @@ #include <asm/uaccess.h> #include <asm/unaligned.h> #include <dhd_linux_priv.h> +#ifdef BCMPCIE +#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588) +#include <rk_dhd_pcie_linux.h> +#endif /* CUSTOMER_HW_ROCKCHIP && CUSTOMER_HW_ROCKCHIP_RK3588 */ +#endif /* BCMPCIE */ #include <epivers.h> #include <bcmutils.h> @@ -1142,9 +1147,16 @@ dhd_pub_t *dhd = &dhdinfo->pub; struct dhd_conf *conf = dhd->conf; int suspend_mode = conf->suspend_mode; +#if defined(BCMDBUS) && defined(WL_EXT_WOWL) + int wowl_dngldown = 0; +#endif BCM_REFERENCE(dhdinfo); BCM_REFERENCE(suspend); + +#if defined(BCMDBUS) && defined(WL_EXT_WOWL) + wowl_dngldown = dhd_conf_wowl_dngldown(dhd); +#endif switch (action) { case PM_HIBERNATION_PREPARE: @@ -1189,7 +1201,16 @@ dhd_suspend_resume_helper(dhdinfo, suspend, 0); #ifdef BCMDBUS } else { - printf("%s: skip resume since bus suspeneded\n", __FUNCTION__); +#if defined(BCMDBUS) && defined(WL_EXT_WOWL) + if (wowl_dngldown) { + printf("%s: reset power\n", __FUNCTION__); + dhd_wifi_platform_set_power(dhd, FALSE); + dhd_wifi_platform_set_power(dhd, TRUE); + } else +#endif + { + printf("%s: skip resume since bus suspeneded\n", __FUNCTION__); + } } #endif } @@ -3545,6 +3566,9 @@ return; } +#ifdef DHD_NOTIFY_MAC_CHANGED + rtnl_lock(); +#endif /* DHD_NOTIFY_MAC_CHANGED */ dhd_net_if_lock_local(dhd); DHD_OS_WAKE_LOCK(&dhd->pub); @@ -3559,22 +3583,17 @@ ifp->set_macaddress = FALSE; -#ifdef DHD_NOTIFY_MAC_CHANGED - rtnl_lock(); -#endif /* DHD_NOTIFY_MAC_CHANGED */ - if (_dhd_set_mac_address(dhd, ifp->idx, ifp->mac_addr, TRUE) == 0) DHD_INFO(("%s: MACID is overwritten\n", __FUNCTION__)); else DHD_ERROR(("%s: _dhd_set_mac_address() failed\n", __FUNCTION__)); -#ifdef DHD_NOTIFY_MAC_CHANGED - rtnl_unlock(); -#endif /* DHD_NOTIFY_MAC_CHANGED */ - done: DHD_OS_WAKE_UNLOCK(&dhd->pub); dhd_net_if_unlock_local(dhd); +#ifdef DHD_NOTIFY_MAC_CHANGED + rtnl_unlock(); +#endif /* DHD_NOTIFY_MAC_CHANGED */ } static void @@ -4413,24 +4432,13 @@ #endif /* Make sure there's enough room for any header */ #if !defined(BCM_ROUTER_DHD) - if (skb_headroom(skb) < dhd->pub.hdrlen + htsfdlystat_sz) { - struct sk_buff *skb2; - - DHD_INFO(("%s: insufficient headroom\n", - dhd_ifname(&dhd->pub, ifidx))); - dhd->pub.tx_realloc++; - + if (skb_cow(skb, (dhd->pub.hdrlen + htsfdlystat_sz))) { + DHD_ERROR(("%s: skb_cow failed\n", + dhd_ifname(&dhd->pub, ifidx))); bcm_object_trace_opr(skb, BCM_OBJDBG_REMOVE, __FUNCTION__, __LINE__); - skb2 = skb_realloc_headroom(skb, dhd->pub.hdrlen + htsfdlystat_sz); - - dev_kfree_skb(skb); - if ((skb = skb2) == NULL) { - DHD_ERROR(("%s: skb_realloc_headroom failed\n", - dhd_ifname(&dhd->pub, ifidx))); - ret = -ENOMEM; - goto done; - } - bcm_object_trace_opr(skb, BCM_OBJDBG_ADD_PKT, __FUNCTION__, __LINE__); + dev_kfree_skb_any(skb); + ret = -ENOMEM; + goto done; } #endif /* !BCM_ROUTER_DHD */ @@ -8705,16 +8713,6 @@ } #endif /* DHD_PCIE_NATIVE_RUNTIMEPM */ -#ifdef CONFIG_HAS_WAKELOCK -#define dhd_wake_lock_unlock_destroy(wlock) \ -{ \ - if (dhd_wake_lock_active(wlock)) { \ - dhd_wake_unlock(wlock); \ - } \ - dhd_wake_lock_destroy(wlock); \ -} -#endif /* CONFIG_HAS_WAKELOCK */ - #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) && defined(DHD_TCP_LIMIT_OUTPUT) #define DHD_TCP_LIMIT_OUTPUT_BYTES (4 * 1024 * 1024) #ifndef TCP_DEFAULT_LIMIT_OUTPUT @@ -8784,7 +8782,7 @@ #if defined(WL_STATIC_IF) && defined(WL_CFG80211) /* If static if is operational, don't reset the chip */ - if (wl_cfg80211_static_if_active(cfg)) { + if ((!dhd->pub.hang_was_sent) && wl_cfg80211_static_if_active(cfg)) { WL_MSG(net->name, "static if operational. skip chip reset.\n"); skip_reset = true; wl_cfg80211_sta_ifdown(net); @@ -8792,7 +8790,7 @@ } #endif /* WL_STATIC_IF && WL_CFG80211 */ #ifdef DHD_NOTIFY_MAC_CHANGED - if (dhd->pub.skip_dhd_stop) { + if (!dhd->pub.hang_was_sent && dhd->pub.skip_dhd_stop) { WL_MSG(net->name, "skip chip reset.\n"); skip_reset = true; #if defined(WL_CFG80211) @@ -10448,8 +10446,13 @@ #endif /* DHDTCPACK_SUPPRESS && BCMPCIE */ if (need_rtnl_lock) unregister_netdev(ifp->net); - else + else { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) && defined(WL_CFG80211) + cfg80211_unregister_netdevice(ifp->net); +#else unregister_netdevice(ifp->net); +#endif + } #if defined(WLDWDS) && defined(WL_EXT_IAPSTA) if (ifp->dwds) { wl_ext_iapsta_dettach_dwds_netdev(ifp->net, ifidx, ifp->bssidx); @@ -11649,9 +11652,7 @@ dhd->wakelock_counter = 0; /* wakelocks prevent a system from going into a low power state */ #ifdef CONFIG_HAS_WAKELOCK - // terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry - dhd_wake_lock_init(&dhd->wl_wifi, WAKE_LOCK_SUSPEND, "wlan_wake"); - dhd_wake_lock_init(&dhd->wl_wdwake, WAKE_LOCK_SUSPEND, "wlan_wd_wake"); + dhd_wake_lock_init(dhd->wl_wdwake, dhd_bus_to_dev(bus), "wlan_wd_wake"); #endif /* CONFIG_HAS_WAKELOCK */ #if defined(OEM_ANDROID) @@ -11757,11 +11758,7 @@ dhd_os_start_logging(&dhd->pub, BT_LOG_RING_NAME, 3, 0, 0, 0); #endif /* !OEM_ANDROID && BTLOG */ #ifdef DBG_PKT_MON - dhd->pub.dbg->pkt_mon_lock = osl_mutex_lock_init(dhd->pub.osh); - if (!dhd->pub.dbg->pkt_mon_lock) { - DHD_ERROR(("%s: pkt_mon_lock init failed !\n", __FUNCTION__)); - goto fail; - } + dhd->pub.dbg->pkt_mon_lock = osl_spin_lock_init(dhd->pub.osh); #ifdef DBG_PKT_MON_INIT_DEFAULT dhd_os_dbg_attach_pkt_monitor(&dhd->pub); #endif /* DBG_PKT_MON_INIT_DEFAULT */ @@ -12790,6 +12787,13 @@ /* Enable L1SS of RC and EP */ dhd_bus_l1ss_enable_rc_ep(dhdp->bus, TRUE); #endif /* BT_OVER_PCIE */ + +#ifdef BCMPCIE +#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588) + if (IS_ENABLED(CONFIG_PCIEASPM_ROCKCHIP_WIFI_EXTENSION)) + rk_dhd_bus_l1ss_enable_rc_ep(dhdp->bus, TRUE); +#endif /* CUSTOMER_HW_ROCKCHIP && BCMPCIE */ +#endif /* BCMPCIE */ #if defined(CONFIG_ARCH_EXYNOS) && defined(BCMPCIE) #if !defined(CONFIG_SOC_EXYNOS8890) && !defined(SUPPORT_EXYNOS7420) @@ -17455,7 +17459,7 @@ if (dhdp->dbg) { #ifdef DBG_PKT_MON dhd_os_dbg_detach_pkt_monitor(dhdp); - osl_mutex_lock_deinit(dhd->pub.osh, dhd->pub.dbg->pkt_mon_lock); + osl_spin_lock_deinit(dhd->pub.osh, dhd->pub.dbg->pkt_mon_lock); #endif /* DBG_PKT_MON */ } #endif /* DEBUGABILITY */ @@ -17541,9 +17545,7 @@ DHD_TRACE(("wd wakelock count:%d\n", dhd->wakelock_wd_counter)); #ifdef CONFIG_HAS_WAKELOCK dhd->wakelock_wd_counter = 0; - dhd_wake_lock_unlock_destroy(&dhd->wl_wdwake); - // terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry - dhd_wake_lock_unlock_destroy(&dhd->wl_wifi); + dhd_wake_lock_destroy(dhd->wl_wdwake); #endif /* CONFIG_HAS_WAKELOCK */ if (dhd->dhd_state & DHD_ATTACH_STATE_WAKELOCKS_INIT) { DHD_OS_WAKE_LOCK_DESTROY(dhd); @@ -18423,7 +18425,7 @@ /* convert to BCME_NOTFOUND error for error handling */ ret = BCME_NOTFOUND; } else - DHD_ERROR(("%s: %s (%zu bytes) open success\n", __FUNCTION__, file_path, (*fw)->size)); + DHD_ERROR(("%s: %s (%zu bytes) open success\n", __FUNCTION__, file_path, (*fw)->size)); return ret; } @@ -21151,11 +21153,15 @@ ret = dhd->wakelock_rx_timeout_enable > dhd->wakelock_ctrl_timeout_enable ? dhd->wakelock_rx_timeout_enable : dhd->wakelock_ctrl_timeout_enable; #ifdef CONFIG_HAS_WAKELOCK +#ifdef DHD_DEBUG_WAKE_LOCK + printf("%s: rx_timeout=%dms, ctrl_timeout=%dms\n", __FUNCTION__, + dhd->wakelock_rx_timeout_enable, dhd->wakelock_ctrl_timeout_enable); +#endif if (dhd->wakelock_rx_timeout_enable) - dhd_wake_lock_timeout(&dhd->wl_rxwake, + dhd_wake_lock_timeout(dhd->wl_rxwake, msecs_to_jiffies(dhd->wakelock_rx_timeout_enable)); if (dhd->wakelock_ctrl_timeout_enable) - dhd_wake_lock_timeout(&dhd->wl_ctrlwake, + dhd_wake_lock_timeout(dhd->wl_ctrlwake, msecs_to_jiffies(dhd->wakelock_ctrl_timeout_enable)); #endif dhd->wakelock_rx_timeout_enable = 0; @@ -21212,8 +21218,8 @@ DHD_WAKE_SPIN_LOCK(&dhd->wakelock_spinlock, flags); dhd->wakelock_ctrl_timeout_enable = 0; #ifdef CONFIG_HAS_WAKELOCK - if (dhd_wake_lock_active(&dhd->wl_ctrlwake)) - dhd_wake_unlock(&dhd->wl_ctrlwake); + if (dhd_wake_lock_active(dhd->wl_ctrlwake)) + dhd_wake_unlock(dhd->wl_ctrlwake); #endif DHD_WAKE_SPIN_UNLOCK(&dhd->wakelock_spinlock, flags); } @@ -21447,7 +21453,7 @@ DHD_WAKE_SPIN_LOCK(&dhd->wakelock_spinlock, flags); if (dhd->wakelock_counter == 0 && !dhd->waive_wakelock) { #ifdef CONFIG_HAS_WAKELOCK - dhd_wake_lock(&dhd->wl_wifi); + dhd_wake_lock(dhd->wl_wifi); #elif defined(BCMSDIO) dhd_bus_dev_pm_stay_awake(pub); #endif @@ -21471,7 +21477,7 @@ if (dhd) { #ifdef CONFIG_HAS_WAKELOCK - dhd_wake_lock(&dhd->wl_evtwake); + dhd_wake_lock(dhd->wl_evtwake); #elif defined(BCMSDIO) dhd_bus_dev_pm_stay_awake(pub); #endif @@ -21485,7 +21491,7 @@ dhd_info_t *dhd = (dhd_info_t *)(pub->info); if (dhd) { - dhd_wake_lock_timeout(&dhd->wl_pmwake, msecs_to_jiffies(val)); + dhd_wake_lock_timeout(dhd->wl_pmwake, msecs_to_jiffies(val)); } #endif /* CONFIG_HAS_WAKE_LOCK */ } @@ -21497,7 +21503,7 @@ dhd_info_t *dhd = (dhd_info_t *)(pub->info); if (dhd) { - dhd_wake_lock_timeout(&dhd->wl_txflwake, msecs_to_jiffies(val)); + dhd_wake_lock_timeout(dhd->wl_txflwake, msecs_to_jiffies(val)); } #endif /* CONFIG_HAS_WAKE_LOCK */ } @@ -21509,7 +21515,7 @@ dhd_info_t *dhd = (dhd_info_t *)(pub->info); if (dhd) { - dhd_wake_lock_timeout(&dhd->wl_nanwake, msecs_to_jiffies(val)); + dhd_wake_lock_timeout(dhd->wl_nanwake, msecs_to_jiffies(val)); } #endif /* CONFIG_HAS_WAKE_LOCK */ } @@ -21543,7 +21549,7 @@ #endif /* DHD_TRACE_WAKE_LOCK */ if (dhd->wakelock_counter == 0 && !dhd->waive_wakelock) { #ifdef CONFIG_HAS_WAKELOCK - dhd_wake_unlock(&dhd->wl_wifi); + dhd_wake_unlock(dhd->wl_wifi); #elif defined(BCMSDIO) dhd_bus_dev_pm_relax(pub); #endif @@ -21561,7 +21567,7 @@ if (dhd) { #ifdef CONFIG_HAS_WAKELOCK - dhd_wake_unlock(&dhd->wl_evtwake); + dhd_wake_unlock(dhd->wl_evtwake); #elif defined(BCMSDIO) dhd_bus_dev_pm_relax(pub); #endif @@ -21575,8 +21581,8 @@ if (dhd) { /* if wl_pmwake is active, unlock it */ - if (dhd_wake_lock_active(&dhd->wl_pmwake)) { - dhd_wake_unlock(&dhd->wl_pmwake); + if (dhd_wake_lock_active(dhd->wl_pmwake)) { + dhd_wake_unlock(dhd->wl_pmwake); } } #endif /* CONFIG_HAS_WAKELOCK */ @@ -21589,8 +21595,8 @@ if (dhd) { /* if wl_txflwake is active, unlock it */ - if (dhd_wake_lock_active(&dhd->wl_txflwake)) { - dhd_wake_unlock(&dhd->wl_txflwake); + if (dhd_wake_lock_active(dhd->wl_txflwake)) { + dhd_wake_unlock(dhd->wl_txflwake); } } #endif /* CONFIG_HAS_WAKELOCK */ @@ -21603,8 +21609,8 @@ if (dhd) { /* if wl_nanwake is active, unlock it */ - if (dhd_wake_lock_active(&dhd->wl_nanwake)) { - dhd_wake_unlock(&dhd->wl_nanwake); + if (dhd_wake_lock_active(dhd->wl_nanwake)) { + dhd_wake_unlock(dhd->wl_nanwake); } } #endif /* CONFIG_HAS_WAKELOCK */ @@ -21629,8 +21635,8 @@ #ifdef CONFIG_HAS_WAKELOCK c = dhd->wakelock_counter; - l1 = dhd_wake_lock_active(&dhd->wl_wifi); - l2 = dhd_wake_lock_active(&dhd->wl_wdwake); + l1 = dhd_wake_lock_active(dhd->wl_wifi); + l2 = dhd_wake_lock_active(dhd->wl_wdwake); lock_active = (l1 || l2); /* Indicate to the SD Host to avoid going to suspend if internal locks are up */ if (lock_active) { @@ -21673,20 +21679,20 @@ #ifdef CONFIG_HAS_WAKELOCK c = dhd->wakelock_counter; - l1 = dhd_wake_lock_active(&dhd->wl_wifi); - l2 = dhd_wake_lock_active(&dhd->wl_wdwake); - l3 = dhd_wake_lock_active(&dhd->wl_rxwake); - l4 = dhd_wake_lock_active(&dhd->wl_ctrlwake); - l7 = dhd_wake_lock_active(&dhd->wl_evtwake); + l1 = dhd_wake_lock_active(dhd->wl_wifi); + l2 = dhd_wake_lock_active(dhd->wl_wdwake); + l3 = dhd_wake_lock_active(dhd->wl_rxwake); + l4 = dhd_wake_lock_active(dhd->wl_ctrlwake); + l7 = dhd_wake_lock_active(dhd->wl_evtwake); #ifdef BCMPCIE_OOB_HOST_WAKE - l5 = dhd_wake_lock_active(&dhd->wl_intrwake); + l5 = dhd_wake_lock_active(dhd->wl_intrwake); #endif /* BCMPCIE_OOB_HOST_WAKE */ #ifdef DHD_USE_SCAN_WAKELOCK - l6 = dhd_wake_lock_active(&dhd->wl_scanwake); + l6 = dhd_wake_lock_active(dhd->wl_scanwake); #endif /* DHD_USE_SCAN_WAKELOCK */ - l8 = dhd_wake_lock_active(&dhd->wl_pmwake); - l9 = dhd_wake_lock_active(&dhd->wl_txflwake); - l10 = dhd_wake_lock_active(&dhd->wl_nanwake); + l8 = dhd_wake_lock_active(dhd->wl_pmwake); + l9 = dhd_wake_lock_active(dhd->wl_txflwake); + l10 = dhd_wake_lock_active(dhd->wl_nanwake); lock_active = (l1 || l2 || l3 || l4 || l5 || l6 || l7 || l8 || l9 || l10); /* Indicate to the Host to avoid going to suspend if internal locks are up */ @@ -21726,7 +21732,7 @@ if (dhd->wakelock_wd_counter == 0 && !dhd->waive_wakelock) { #ifdef CONFIG_HAS_WAKELOCK /* if wakelock_wd_counter was never used : lock it at once */ - dhd_wake_lock(&dhd->wl_wdwake); + dhd_wake_lock(dhd->wl_wdwake); #endif } dhd->wakelock_wd_counter++; @@ -21748,7 +21754,7 @@ dhd->wakelock_wd_counter = 0; if (!dhd->waive_wakelock) { #ifdef CONFIG_HAS_WAKELOCK - dhd_wake_unlock(&dhd->wl_wdwake); + dhd_wake_unlock(dhd->wl_wdwake); #endif } } @@ -21765,7 +21771,7 @@ dhd_info_t *dhd = (dhd_info_t *)(pub->info); if (dhd) { - dhd_wake_lock_timeout(&dhd->wl_intrwake, msecs_to_jiffies(val)); + dhd_wake_lock_timeout(dhd->wl_intrwake, msecs_to_jiffies(val)); } #endif /* CONFIG_HAS_WAKELOCK */ } @@ -21778,8 +21784,8 @@ if (dhd) { /* if wl_intrwake is active, unlock it */ - if (dhd_wake_lock_active(&dhd->wl_intrwake)) { - dhd_wake_unlock(&dhd->wl_intrwake); + if (dhd_wake_lock_active(dhd->wl_intrwake)) { + dhd_wake_unlock(dhd->wl_intrwake); } } #endif /* CONFIG_HAS_WAKELOCK */ @@ -21794,7 +21800,7 @@ dhd_info_t *dhd = (dhd_info_t *)(pub->info); if (dhd) { - dhd_wake_lock_timeout(&dhd->wl_scanwake, msecs_to_jiffies(val)); + dhd_wake_lock_timeout(dhd->wl_scanwake, msecs_to_jiffies(val)); } #endif /* CONFIG_HAS_WAKELOCK */ } @@ -21807,8 +21813,8 @@ if (dhd) { /* if wl_scanwake is active, unlock it */ - if (dhd_wake_lock_active(&dhd->wl_scanwake)) { - dhd_wake_unlock(&dhd->wl_scanwake); + if (dhd_wake_lock_active(dhd->wl_scanwake)) { + dhd_wake_unlock(dhd->wl_scanwake); } } #endif /* CONFIG_HAS_WAKELOCK */ @@ -21874,13 +21880,13 @@ if (dhd->wakelock_before_waive == 0 && dhd->wakelock_counter > 0) { #ifdef CONFIG_HAS_WAKELOCK - dhd_wake_lock(&dhd->wl_wifi); + dhd_wake_lock(dhd->wl_wifi); #elif defined(BCMSDIO) dhd_bus_dev_pm_stay_awake(&dhd->pub); #endif } else if (dhd->wakelock_before_waive > 0 && dhd->wakelock_counter == 0) { #ifdef CONFIG_HAS_WAKELOCK - dhd_wake_unlock(&dhd->wl_wifi); + dhd_wake_unlock(dhd->wl_wifi); #elif defined(BCMSDIO) dhd_bus_dev_pm_relax(&dhd->pub); #endif @@ -21900,19 +21906,19 @@ dhd->wakelock_ctrl_timeout_enable = 0; /* wakelocks prevent a system from going into a low power state */ #ifdef CONFIG_HAS_WAKELOCK - // terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry - dhd_wake_lock_init(&dhd->wl_rxwake, WAKE_LOCK_SUSPEND, "wlan_rx_wake"); - dhd_wake_lock_init(&dhd->wl_ctrlwake, WAKE_LOCK_SUSPEND, "wlan_ctrl_wake"); - dhd_wake_lock_init(&dhd->wl_evtwake, WAKE_LOCK_SUSPEND, "wlan_evt_wake"); - dhd_wake_lock_init(&dhd->wl_pmwake, WAKE_LOCK_SUSPEND, "wlan_pm_wake"); - dhd_wake_lock_init(&dhd->wl_txflwake, WAKE_LOCK_SUSPEND, "wlan_txfl_wake"); + dhd_wake_lock_init(dhd->wl_wifi, dhd_bus_to_dev(dhd->pub.bus), "wlan_wake"); + dhd_wake_lock_init(dhd->wl_rxwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_rx_wake"); + dhd_wake_lock_init(dhd->wl_ctrlwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_ctrl_wake"); + dhd_wake_lock_init(dhd->wl_evtwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_evt_wake"); + dhd_wake_lock_init(dhd->wl_pmwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_pm_wake"); + dhd_wake_lock_init(dhd->wl_txflwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_txfl_wake"); #ifdef BCMPCIE_OOB_HOST_WAKE - dhd_wake_lock_init(&dhd->wl_intrwake, WAKE_LOCK_SUSPEND, "wlan_oob_irq_wake"); + dhd_wake_lock_init(dhd->wl_intrwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_oob_irq_wake"); #endif /* BCMPCIE_OOB_HOST_WAKE */ #ifdef DHD_USE_SCAN_WAKELOCK - dhd_wake_lock_init(&dhd->wl_scanwake, WAKE_LOCK_SUSPEND, "wlan_scan_wake"); + dhd_wake_lock_init(dhd->wl_scanwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_scan_wake"); #endif /* DHD_USE_SCAN_WAKELOCK */ - dhd_wake_lock_init(&dhd->wl_nanwake, WAKE_LOCK_SUSPEND, "wlan_nan_wake"); + dhd_wake_lock_init(dhd->wl_nanwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_nan_wake"); #endif /* CONFIG_HAS_WAKELOCK */ #ifdef DHD_TRACE_WAKE_LOCK dhd_wk_lock_trace_init(dhd); @@ -21926,19 +21932,19 @@ dhd->wakelock_counter = 0; dhd->wakelock_rx_timeout_enable = 0; dhd->wakelock_ctrl_timeout_enable = 0; - // terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry - dhd_wake_lock_unlock_destroy(&dhd->wl_rxwake); - dhd_wake_lock_unlock_destroy(&dhd->wl_ctrlwake); - dhd_wake_lock_unlock_destroy(&dhd->wl_evtwake); - dhd_wake_lock_unlock_destroy(&dhd->wl_pmwake); - dhd_wake_lock_unlock_destroy(&dhd->wl_txflwake); + dhd_wake_lock_destroy(dhd->wl_wifi); + dhd_wake_lock_destroy(dhd->wl_rxwake); + dhd_wake_lock_destroy(dhd->wl_ctrlwake); + dhd_wake_lock_destroy(dhd->wl_evtwake); + dhd_wake_lock_destroy(dhd->wl_pmwake); + dhd_wake_lock_destroy(dhd->wl_txflwake); #ifdef BCMPCIE_OOB_HOST_WAKE - dhd_wake_lock_unlock_destroy(&dhd->wl_intrwake); + dhd_wake_lock_destroy(dhd->wl_intrwake); #endif /* BCMPCIE_OOB_HOST_WAKE */ #ifdef DHD_USE_SCAN_WAKELOCK - dhd_wake_lock_unlock_destroy(&dhd->wl_scanwake); + dhd_wake_lock_destroy(dhd->wl_scanwake); #endif /* DHD_USE_SCAN_WAKELOCK */ - dhd_wake_lock_unlock_destroy(&dhd->wl_nanwake); + dhd_wake_lock_destroy(dhd->wl_nanwake); #ifdef DHD_TRACE_WAKE_LOCK dhd_wk_lock_trace_deinit(dhd); #endif /* DHD_TRACE_WAKE_LOCK */ @@ -27166,15 +27172,7 @@ dhd_get_random_bytes(uint8 *buf, uint len) { #ifdef BCMPCIE -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - int rndlen = get_random_bytes_arch(buf, len); - if (rndlen != len) { - bzero(buf, len); - get_random_bytes(buf, len); - } -#else - get_random_bytes_arch(buf, len); -#endif + get_random_bytes(buf, len); #endif /* BCMPCIE */ return BCME_OK; } diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h index 565b1a4..e94787d 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h @@ -68,7 +68,8 @@ enum wifi_adapter_status { WIFI_STATUS_POWER_ON = 0, WIFI_STATUS_FW_READY, - WIFI_STATUS_NET_ATTACHED + WIFI_STATUS_NET_ATTACHED, + WIFI_STATUS_BUS_DISCONNECTED }; #define wifi_chk_adapter_status(adapter, stat) (test_bit(stat, &(adapter)->status)) #define wifi_get_adapter_status(adapter, stat) (test_bit(stat, &(adapter)->status)) @@ -108,6 +109,9 @@ struct pci_dev *pci_dev; struct pci_saved_state *pci_saved_state; #endif /* BCMPCIE */ +#ifdef BCMDHD_PLATDEV + struct platform_device *pdev; +#endif /* BCMDHD_PLATDEV */ } wifi_adapter_info_t; #if defined(CONFIG_WIFI_CONTROL_FUNC) || defined(CUSTOMER_HW4) diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c index 7377f4e..b74df3d 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c @@ -59,7 +59,9 @@ { int ret = BCME_ERROR; if (inode) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)) + ret = single_open(file, 0, pde_data(inode)); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) ret = single_open(file, 0, PDE_DATA(inode)); #else /* This feature is not supported for lower kernel versions */ diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c index 1f630ae..1de6616 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c @@ -47,7 +47,7 @@ #include<linux/of_gpio.h> #endif /* CONFIG_DTS */ -#if defined(CUSTOMER_HW) +#if defined(CUSTOMER_HW) || defined(BCMDHD_PLATDEV) extern int dhd_wlan_init_plat_data(wifi_adapter_info_t *adapter); extern void dhd_wlan_deinit_plat_data(wifi_adapter_info_t *adapter); #endif /* CUSTOMER_HW */ @@ -85,7 +85,7 @@ #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif struct resource dhd_wlan_resources = {0}; -struct wifi_platform_data dhd_wlan_control = {0}; +extern struct wifi_platform_data dhd_wlan_control; #if defined(STRICT_GCC_WARNINGS) && defined(__GNUC__) #pragma GCC diagnostic pop #endif @@ -378,6 +378,14 @@ adapter->wifi_plat_data = (void *)&dhd_wlan_control; #endif +#ifdef BCMDHD_PLATDEV + adapter->pdev = pdev; + wifi_plat_dev_probe_ret = dhd_wlan_init_plat_data(adapter); + if (!wifi_plat_dev_probe_ret) + wifi_plat_dev_probe_ret = dhd_wifi_platform_load(); + return wifi_plat_dev_probe_ret; +#endif + resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq"); if (resource == NULL) resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcm4329_wlan_irq"); @@ -449,6 +457,9 @@ #ifdef CONFIG_DTS regulator_put(wifi_regulator); #endif /* CONFIG_DTS */ +#ifdef BCMDHD_PLATDEV + dhd_wlan_deinit_plat_data(adapter); +#endif return 0; } diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h index 1eeb27e..019884b 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h @@ -128,20 +128,20 @@ /* Wakelocks */ #if defined(CONFIG_HAS_WAKELOCK) - struct wakeup_source wl_wifi; /* Wifi wakelock */ - struct wakeup_source wl_rxwake; /* Wifi rx wakelock */ - struct wakeup_source wl_ctrlwake; /* Wifi ctrl wakelock */ - struct wakeup_source wl_wdwake; /* Wifi wd wakelock */ - struct wakeup_source wl_evtwake; /* Wifi event wakelock */ - struct wakeup_source wl_pmwake; /* Wifi pm handler wakelock */ - struct wakeup_source wl_txflwake; /* Wifi tx flow wakelock */ + struct wakeup_source *wl_wifi; /* Wifi wakelock */ + struct wakeup_source *wl_rxwake; /* Wifi rx wakelock */ + struct wakeup_source *wl_ctrlwake; /* Wifi ctrl wakelock */ + struct wakeup_source *wl_wdwake; /* Wifi wd wakelock */ + struct wakeup_source *wl_evtwake; /* Wifi event wakelock */ + struct wakeup_source *wl_pmwake; /* Wifi pm handler wakelock */ + struct wakeup_source *wl_txflwake; /* Wifi tx flow wakelock */ #ifdef BCMPCIE_OOB_HOST_WAKE - struct wakeup_source wl_intrwake; /* Host wakeup wakelock */ + struct wakeup_source *wl_intrwake; /* Host wakeup wakelock */ #endif /* BCMPCIE_OOB_HOST_WAKE */ #ifdef DHD_USE_SCAN_WAKELOCK - struct wakeup_source wl_scanwake; /* Wifi scan wakelock */ + struct wakeup_source *wl_scanwake; /* Wifi scan wakelock */ #endif /* DHD_USE_SCAN_WAKELOCK */ - struct wakeup_source wl_nanwake; /* NAN wakelock */ + struct wakeup_source *wl_nanwake; /* NAN wakelock */ #endif /* CONFIG_HAS_WAKELOCK */ #if defined(OEM_ANDROID) @@ -501,16 +501,29 @@ extern uint fis_enab; #endif /* DHD_SSSR_DUMP */ +#if defined(ANDROID_VERSION) && (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) +#define WAKELOCK_BACKPORT +#endif + #ifdef CONFIG_HAS_WAKELOCK -enum { - WAKE_LOCK_SUSPEND, /* Prevent suspend */ - WAKE_LOCK_TYPE_COUNT -}; -#define dhd_wake_lock_init(wakeup_source, type, name) wakeup_source_add(wakeup_source) -#define dhd_wake_lock_destroy(wakeup_source) wakeup_source_remove(wakeup_source) +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) || defined(WAKELOCK_BACKPORT)) +#define dhd_wake_lock_init(wakeup_source, dev, name) \ +do { \ + wakeup_source = wakeup_source_register(dev, name); \ +} while (0); +#else +#define dhd_wake_lock_init(wakeup_source, dev, name) \ +do { \ + wakeup_source = wakeup_source_register(name); \ +} while (0); +#endif /* LINUX_VERSION >= 5.4.0 */ +#define dhd_wake_lock_destroy(wakeup_source) \ +do { \ + wakeup_source_unregister(wakeup_source); \ +} while (0); #define dhd_wake_lock(wakeup_source) __pm_stay_awake(wakeup_source) #define dhd_wake_unlock(wakeup_source) __pm_relax(wakeup_source) -#define dhd_wake_lock_active(wakeup_source) ((wakeup_source)->active) +#define dhd_wake_lock_active(wakeup_source) ((wakeup_source)?((wakeup_source)->active):0) #define dhd_wake_lock_timeout(wakeup_source, timeout) \ __pm_wakeup_event(wakeup_source, jiffies_to_msecs(timeout)) #endif /* CONFIG_HAS_WAKELOCK */ diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c index 96bc798..5c10144 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c @@ -3557,17 +3557,28 @@ void dhd_set_bus_params(struct dhd_bus *bus) { - if (bus->dhd->conf->dhd_poll >= 0) { - bus->poll = bus->dhd->conf->dhd_poll; + struct dhd_conf *conf = bus->dhd->conf; + + if (conf->dhd_poll >= 0) { + bus->poll = conf->dhd_poll; if (!bus->pollrate) bus->pollrate = 1; - printf("%s: set polling mode %d\n", __FUNCTION__, bus->dhd->conf->dhd_poll); + printf("%s: set polling mode %d\n", __FUNCTION__, conf->dhd_poll); } - if (bus->dhd->conf->d2h_intr_control >= 0) - bus->d2h_intr_control = bus->dhd->conf->d2h_intr_control; + if (conf->d2h_intr_control >= 0) + bus->d2h_intr_control = conf->d2h_intr_control; printf("d2h_intr_method -> %s(%d); d2h_intr_control -> %s(%d)\n", bus->d2h_intr_method ? "PCIE_MSI" : "PCIE_INTX", bus->d2h_intr_method, bus->d2h_intr_control ? "HOST_IRQ" : "D2H_INTMASK", bus->d2h_intr_control); + + if (conf->aspm != -1) { + bool aspm = conf->aspm ? TRUE : FALSE; + dhd_bus_aspm_enable_rc_ep(bus, aspm); + } + if (conf->l1ss != -1) { + bool l1ss = conf->l1ss ? TRUE : FALSE; + dhd_bus_l1ss_enable_rc_ep(bus, l1ss); + } } /** @@ -17803,3 +17814,25 @@ val = 1; dhd_sbreg_op(dhd, addr, &val, FALSE); } + +#define BUS_SLEEP_WAIT_CNT 3 +#define BUS_SLEEP_WAIT_MS 20 +int +dhd_bus_sleep(dhd_pub_t *dhdp, bool sleep, uint32 *intstatus) +{ + dhd_bus_t *bus = dhdp->bus; + int active, cnt = 0; + + if (bus) { + while ((active = dhd_os_check_wakelock_all(bus->dhd)) && + (cnt < BUS_SLEEP_WAIT_CNT)) { + OSL_SLEEP(BUS_SLEEP_WAIT_MS); + cnt++; + } + } else { + DHD_ERROR(("bus is NULL\n")); + active = -1; + } + + return active; +} diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c index dbeab68..786e208 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c @@ -47,6 +47,9 @@ #include <pcicfg.h> #include <dhd_pcie.h> #include <dhd_linux.h> +#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588) +#include <rk_dhd_pcie_linux.h> +#endif /* CUSTOMER_HW_ROCKCHIP && CUSTOMER_HW_ROCKCHIP_RK3588 */ #ifdef OEM_ANDROID #ifdef CONFIG_ARCH_MSM #if defined(CONFIG_PCI_MSM) || defined(CONFIG_ARCH_MSM8996) @@ -616,6 +619,18 @@ { uint32 rc_l1ss_cap; uint32 ep_l1ss_cap; + +#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588) + if (IS_ENABLED(CONFIG_PCIEASPM_ROCKCHIP_WIFI_EXTENSION)) { + if (rk_dhd_bus_is_rc_ep_l1ss_capable(bus)) { + DHD_ERROR(("%s L1ss is capable\n", __FUNCTION__)); + return TRUE; + } else { + DHD_ERROR(("%s L1ss is not capable\n", __FUNCTION__)); + return FALSE; + } + } +#endif /* CUSTOMER_HW_ROCKCHIP && CUSTOMER_HW_ROCKCHIP_RK3588 */ /* RC Extendend Capacility */ rc_l1ss_cap = dhdpcie_access_cap(bus->rc_dev, PCIE_EXTCAP_ID_L1SS, @@ -1576,7 +1591,7 @@ goto exit; } - printf("PCI_PROBE: bus %X, slot %X,vendor %X, device %X" + printf("PCI_PROBE: bus 0x%X, slot 0x%X,vendor 0x%X, device 0x%X" "(good PCI location)\n", pdev->bus->number, PCI_SLOT(pdev->devfn), pdev->vendor, pdev->device); diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c index e002405..5ba5df6 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c @@ -3472,7 +3472,7 @@ wake_up(&_pno_state->get_batch_done); } #else - if (waitqueue_active(&_pno_state->get_batch_done.wait)) + if (swait_active(&_pno_state->get_batch_done.wait)) complete(&_pno_state->get_batch_done); #endif return err; diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c index 1c46920..2bb49e0 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c @@ -2008,7 +2008,8 @@ #if defined(WL_EXT_IAPSTA) && defined(DHD_LOSSLESS_ROAMING) state = wl_ext_any_sta_handshaking(bus->dhd); if (state) { - DHD_ERROR(("handshaking %d\n", state)); + if (dump_msg_level & DUMP_EAPOL_VAL) + DHD_ERROR(("handshaking %d\n", state)); return BCME_BUSY; } #endif /* WL_EXT_IAPSTA && DHD_LOSSLESS_ROAMING */ diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c index d288788..f1c44f0 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c @@ -7,7 +7,7 @@ #include <linux/err.h> #include <linux/skbuff.h> -#define DHD_STATIC_VERSION_STR "101.10.361.24 (wlan=r892223-20220916-1)" +#define DHD_STATIC_VERSION_STR "101.10.361.26 (wlan=r892223-20221011-1)" #define STATIC_ERROR_LEVEL BIT(0) #define STATIC_TRACE_LEVEL BIT(1) #define STATIC_MSG_LEVEL BIT(0) @@ -32,12 +32,19 @@ } \ } while (0) -#define BCMDHD_SDIO -#define BCMDHD_PCIE -//#define BCMDHD_USB +#ifdef DHD_STATIC_IN_DRIVER +#if ANDROID_VERSION > 0 +#define CONFIG_BCMDHD_VTS { : = y} +#define CONFIG_BCMDHD_DEBUG { : = y} +#endif +#else +#define BCMSDIO +#define BCMPCIE +//#define BCMDBUS #define CONFIG_BCMDHD_VTS { : = y} #define CONFIG_BCMDHD_DEBUG { : = y} //#define BCMDHD_UNUSE_MEM +#endif #ifndef MAX_NUM_ADAPTERS #define MAX_NUM_ADAPTERS 1 @@ -45,28 +52,28 @@ enum dhd_prealloc_index { DHD_PREALLOC_PROT = 0, -#if defined(BCMDHD_SDIO) +#if defined(BCMSDIO) DHD_PREALLOC_RXBUF = 1, DHD_PREALLOC_DATABUF = 2, -#endif /* BCMDHD_SDIO */ +#endif /* BCMSDIO */ DHD_PREALLOC_OSL_BUF = 3, DHD_PREALLOC_SKB_BUF = 4, DHD_PREALLOC_WIPHY_ESCAN0 = 5, DHD_PREALLOC_WIPHY_ESCAN1 = 6, DHD_PREALLOC_DHD_INFO = 7, -#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB) +#if defined(BCMSDIO) || defined(BCMDBUS) DHD_PREALLOC_DHD_WLFC_INFO = 8, -#endif /* BCMDHD_SDIO | BCMDHD_USB */ -#ifdef BCMDHD_PCIE +#endif /* BCMSDIO | BCMDBUS */ +#ifdef BCMPCIE DHD_PREALLOC_IF_FLOW_LKUP = 9, -#endif /* BCMDHD_PCIE */ +#endif /* BCMPCIE */ DHD_PREALLOC_MEMDUMP_BUF = 10, #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) DHD_PREALLOC_MEMDUMP_RAM = 11, #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */ -#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB) +#if defined(BCMSDIO) || defined(BCMDBUS) DHD_PREALLOC_DHD_WLFC_HANGER = 12, -#endif /* BCMDHD_SDIO | BCMDHD_USB */ +#endif /* BCMSDIO | BCMDBUS */ DHD_PREALLOC_PKTID_MAP = 13, DHD_PREALLOC_PKTID_MAP_IOCTL = 14, #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) @@ -98,7 +105,7 @@ #define DHD_PREALLOC_DATABUF_SIZE (64 * 1024) #define DHD_PREALLOC_OSL_BUF_SIZE (STATIC_BUF_MAX_NUM * STATIC_BUF_SIZE) #define DHD_PREALLOC_WIPHY_ESCAN0_SIZE (64 * 1024) -#define DHD_PREALLOC_DHD_INFO_SIZE (42 * 1024) +#define DHD_PREALLOC_DHD_INFO_SIZE (43 * 1024) #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) #define DHD_PREALLOC_MEMDUMP_RAM_SIZE (1290 * 1024) #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */ @@ -133,20 +140,20 @@ #define DHD_SKB_2PAGE_BUFSIZE (PAGE_SIZE * 2) #define DHD_SKB_4PAGE_BUFSIZE (PAGE_SIZE * 4) -#ifdef BCMDHD_PCIE +#ifdef BCMPCIE #define DHD_SKB_1PAGE_BUF_NUM 0 #define DHD_SKB_2PAGE_BUF_NUM 192 -#elif defined(BCMDHD_SDIO) +#elif defined(BCMSDIO) #define DHD_SKB_1PAGE_BUF_NUM 8 #define DHD_SKB_2PAGE_BUF_NUM 8 -#endif /* BCMDHD_PCIE */ +#endif /* BCMPCIE */ #define DHD_SKB_4PAGE_BUF_NUM 1 /* The number is defined in linux_osl.c * WLAN_SKB_1_2PAGE_BUF_NUM => STATIC_PKT_1_2PAGE_NUM * WLAN_SKB_BUF_NUM => STATIC_PKT_MAX_NUM */ -#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE) +#if defined(BCMSDIO) || defined(BCMPCIE) #define WLAN_SKB_1_2PAGE_BUF_NUM ((DHD_SKB_1PAGE_BUF_NUM) + \ (DHD_SKB_2PAGE_BUF_NUM)) #define WLAN_SKB_BUF_NUM ((WLAN_SKB_1_2PAGE_BUF_NUM) + (DHD_SKB_4PAGE_BUF_NUM)) @@ -173,9 +180,9 @@ void *wlan_static_dhd_event_ring_buf[MAX_NUM_ADAPTERS] = {}; void *wlan_static_nan_event_ring_buf[MAX_NUM_ADAPTERS] = {}; -#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE) +#if defined(BCMSDIO) || defined(BCMPCIE) static struct sk_buff *wlan_static_skb[MAX_NUM_ADAPTERS][WLAN_SKB_BUF_NUM] = {}; -#endif /* BCMDHD_SDIO | BCMDHD_PCIE */ +#endif /* BCMSDIO | BCMPCIE */ void * dhd_wlan_mem_prealloc( @@ -198,18 +205,18 @@ if (section == DHD_PREALLOC_PROT) return wlan_static_prot[index]; -#if defined(BCMDHD_SDIO) +#if defined(BCMSDIO) if (section == DHD_PREALLOC_RXBUF) return wlan_static_rxbuf[index]; if (section == DHD_PREALLOC_DATABUF) return wlan_static_databuf[index]; -#endif /* BCMDHD_SDIO */ +#endif /* BCMSDIO */ -#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE) +#if defined(BCMSDIO) || defined(BCMPCIE) if (section == DHD_PREALLOC_SKB_BUF) return wlan_static_skb[index]; -#endif /* BCMDHD_SDIO | BCMDHD_PCIE */ +#endif /* BCMSDIO | BCMPCIE */ if (section == DHD_PREALLOC_WIPHY_ESCAN0) return wlan_static_scan_buf0[index]; @@ -234,7 +241,7 @@ } return wlan_static_dhd_info_buf[index]; } -#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB) +#if defined(BCMSDIO) || defined(BCMDBUS) if (section == DHD_PREALLOC_DHD_WLFC_INFO) { if (size > WLAN_DHD_WLFC_BUF_SIZE) { DHD_STATIC_ERROR("request DHD_WLFC_INFO(%lu) > %d\n", @@ -243,8 +250,8 @@ } return wlan_static_dhd_wlfc_info_buf[index]; } -#endif /* BCMDHD_SDIO | BCMDHD_USB */ -#ifdef BCMDHD_PCIE +#endif /* BCMSDIO | BCMDBUS */ +#ifdef BCMPCIE if (section == DHD_PREALLOC_IF_FLOW_LKUP) { if (size > DHD_PREALLOC_IF_FLOW_LKUP_SIZE) { DHD_STATIC_ERROR("request DHD_IF_FLOW_LKUP(%lu) > %d\n", @@ -253,7 +260,7 @@ } return wlan_static_if_flow_lkup[index]; } -#endif /* BCMDHD_PCIE */ +#endif /* BCMPCIE */ #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) if (section == DHD_PREALLOC_MEMDUMP_RAM) { if (size > DHD_PREALLOC_MEMDUMP_RAM_SIZE) { @@ -264,7 +271,7 @@ return wlan_static_dhd_memdump_ram_buf[index]; } #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */ -#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB) +#if defined(BCMSDIO) || defined(BCMDBUS) if (section == DHD_PREALLOC_DHD_WLFC_HANGER) { if (size > DHD_PREALLOC_DHD_WLFC_HANGER_SIZE) { DHD_STATIC_ERROR("request DHD_WLFC_HANGER(%lu) > %d\n", @@ -273,7 +280,7 @@ } return wlan_static_dhd_wlfc_hanger_buf[index]; } -#endif /* BCMDHD_SDIO | BCMDHD_USB */ +#endif /* BCMSDIO | BCMDBUS */ #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) if (section == DHD_PREALLOC_DHD_LOG_DUMP_BUF) { if (size > DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE) { @@ -350,18 +357,18 @@ static void dhd_deinit_wlan_mem(int index) { -#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE) +#if defined(BCMSDIO) || defined(BCMPCIE) int i; -#endif /* BCMDHD_SDIO | BCMDHD_PCIE */ +#endif /* BCMSDIO | BCMPCIE */ if (wlan_static_prot[index]) kfree(wlan_static_prot[index]); -#if defined(BCMDHD_SDIO) +#if defined(BCMSDIO) if (wlan_static_rxbuf[index]) kfree(wlan_static_rxbuf[index]); if (wlan_static_databuf[index]) kfree(wlan_static_databuf[index]); -#endif /* BCMDHD_SDIO */ +#endif /* BCMSDIO */ if (wlan_static_osl_buf[index]) kfree(wlan_static_osl_buf[index]); if (wlan_static_scan_buf0[index]) @@ -370,22 +377,22 @@ kfree(wlan_static_scan_buf1[index]); if (wlan_static_dhd_info_buf[index]) kfree(wlan_static_dhd_info_buf[index]); -#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB) +#if defined(BCMSDIO) || defined(BCMDBUS) if (wlan_static_dhd_wlfc_info_buf[index]) kfree(wlan_static_dhd_wlfc_info_buf[index]); -#endif /* BCMDHD_SDIO | BCMDHD_USB */ -#ifdef BCMDHD_PCIE +#endif /* BCMSDIO | BCMDBUS */ +#ifdef BCMPCIE if (wlan_static_if_flow_lkup[index]) kfree(wlan_static_if_flow_lkup[index]); -#endif /* BCMDHD_PCIE */ +#endif /* BCMPCIE */ #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) if (wlan_static_dhd_memdump_ram_buf[index]) kfree(wlan_static_dhd_memdump_ram_buf[index]); #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */ -#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB) +#if defined(BCMSDIO) || defined(BCMDBUS) if (wlan_static_dhd_wlfc_hanger_buf[index]) kfree(wlan_static_dhd_wlfc_hanger_buf[index]); -#endif /* BCMDHD_SDIO | BCMDHD_USB */ +#endif /* BCMSDIO | BCMDBUS */ #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) if (wlan_static_dhd_log_dump_buf[index]) kfree(wlan_static_dhd_log_dump_buf[index]); @@ -405,12 +412,12 @@ kfree(wlan_static_nan_event_ring_buf[index]); #endif /* BCMDHD_UNUSE_MEM */ -#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE) +#if defined(BCMSDIO) || defined(BCMPCIE) for (i=0; i<WLAN_SKB_BUF_NUM; i++) { if (wlan_static_skb[index][i]) dev_kfree_skb(wlan_static_skb[index][i]); } -#endif /* BCMDHD_SDIO | BCMDHD_PCIE */ +#endif /* BCMSDIO | BCMPCIE */ return; } @@ -418,12 +425,12 @@ static int dhd_init_wlan_mem(int index) { -#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE) +#if defined(BCMSDIO) || defined(BCMPCIE) int i; #endif unsigned long size = 0; -#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE) +#if defined(BCMSDIO) || defined(BCMPCIE) for (i = 0; i < WLAN_SKB_BUF_NUM; i++) wlan_static_skb[index][i] = NULL; @@ -444,16 +451,16 @@ DHD_STATIC_TRACE("section %d skb[%d], size=%ld\n", DHD_PREALLOC_SKB_BUF, i, DHD_SKB_2PAGE_BUFSIZE); } -#endif /* BCMDHD_SDIO | BCMDHD_PCIE */ +#endif /* BCMSDIO | BCMPCIE */ -#if defined(BCMDHD_SDIO) +#if defined(BCMSDIO) wlan_static_skb[index][i] = dev_alloc_skb(DHD_SKB_4PAGE_BUFSIZE); if (!wlan_static_skb[index][i]) goto err_mem_alloc; size += DHD_SKB_4PAGE_BUFSIZE; DHD_STATIC_TRACE("section %d skb[%d], size=%ld\n", DHD_PREALLOC_SKB_BUF, i, DHD_SKB_4PAGE_BUFSIZE); -#endif /* BCMDHD_SDIO */ +#endif /* BCMSDIO */ wlan_static_prot[index] = kmalloc(DHD_PREALLOC_PROT_SIZE, GFP_KERNEL); if (!wlan_static_prot[index]) @@ -462,7 +469,7 @@ DHD_STATIC_TRACE("section %d, size=%d\n", DHD_PREALLOC_PROT, DHD_PREALLOC_PROT_SIZE); -#if defined(BCMDHD_SDIO) +#if defined(BCMSDIO) wlan_static_rxbuf[index] = kmalloc(DHD_PREALLOC_RXBUF_SIZE, GFP_KERNEL); if (!wlan_static_rxbuf[index]) goto err_mem_alloc; @@ -476,7 +483,7 @@ size += DHD_PREALLOC_DATABUF_SIZE; DHD_STATIC_TRACE("section %d, size=%d\n", DHD_PREALLOC_DATABUF, DHD_PREALLOC_DATABUF_SIZE); -#endif /* BCMDHD_SDIO */ +#endif /* BCMSDIO */ wlan_static_osl_buf[index] = kmalloc(DHD_PREALLOC_OSL_BUF_SIZE, GFP_KERNEL); if (!wlan_static_osl_buf[index]) @@ -499,23 +506,23 @@ DHD_STATIC_TRACE("section %d, size=%d\n", DHD_PREALLOC_DHD_INFO, DHD_PREALLOC_DHD_INFO_SIZE); -#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB) +#if defined(BCMSDIO) || defined(BCMDBUS) wlan_static_dhd_wlfc_info_buf[index] = kmalloc(WLAN_DHD_WLFC_BUF_SIZE, GFP_KERNEL); if (!wlan_static_dhd_wlfc_info_buf[index]) goto err_mem_alloc; size += WLAN_DHD_WLFC_BUF_SIZE; DHD_STATIC_TRACE("section %d, size=%d\n", DHD_PREALLOC_DHD_WLFC_INFO, WLAN_DHD_WLFC_BUF_SIZE); -#endif /* BCMDHD_SDIO | BCMDHD_USB */ +#endif /* BCMSDIO | BCMDBUS */ -#ifdef BCMDHD_PCIE +#ifdef BCMPCIE wlan_static_if_flow_lkup[index] = kmalloc(DHD_PREALLOC_IF_FLOW_LKUP_SIZE, GFP_KERNEL); if (!wlan_static_if_flow_lkup[index]) goto err_mem_alloc; size += DHD_PREALLOC_IF_FLOW_LKUP_SIZE; DHD_STATIC_TRACE("section %d, size=%d\n", DHD_PREALLOC_IF_FLOW_LKUP, DHD_PREALLOC_IF_FLOW_LKUP_SIZE); -#endif /* BCMDHD_PCIE */ +#endif /* BCMPCIE */ #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) wlan_static_dhd_memdump_ram_buf[index] = kmalloc(DHD_PREALLOC_MEMDUMP_RAM_SIZE, GFP_KERNEL); @@ -526,14 +533,14 @@ DHD_PREALLOC_MEMDUMP_RAM, DHD_PREALLOC_MEMDUMP_RAM_SIZE); #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */ -#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB) +#if defined(BCMSDIO) || defined(BCMDBUS) wlan_static_dhd_wlfc_hanger_buf[index] = kmalloc(DHD_PREALLOC_DHD_WLFC_HANGER_SIZE, GFP_KERNEL); if (!wlan_static_dhd_wlfc_hanger_buf[index]) goto err_mem_alloc; size += DHD_PREALLOC_DHD_WLFC_HANGER_SIZE; DHD_STATIC_TRACE("section %d, size=%d\n", DHD_PREALLOC_DHD_WLFC_HANGER, DHD_PREALLOC_DHD_WLFC_HANGER_SIZE); -#endif /* BCMDHD_SDIO | BCMDHD_USB */ +#endif /* BCMSDIO | BCMDBUS */ #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG) wlan_static_dhd_log_dump_buf[index] = kmalloc(DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE, GFP_KERNEL); diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h index dd72dc3..3d26fc9 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h @@ -45,7 +45,7 @@ #elif (defined (BCMDBG_ASSERT) && !defined (BCMDBG_ASSERT_DISABLED)) #define EPI_VERSION_STR "101.10.361 (wlan=r892223 ASSRT)" #else -#define EPI_VERSION_STR "101.10.361.24 (wlan=r892223-20220913-1)" +#define EPI_VERSION_STR "101.10.361.28 (wlan=r892223-20221116-5)" #endif /* BCMINTERNAL */ #endif /* _epivers_h_ */ diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h index f9bd6c8..f81edab 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h @@ -280,7 +280,6 @@ #define OSL_ENABLE_PREEMPTION(osh) osl_preempt_enable(osh) #if (defined(BCMPCIE) && !defined(DHD_USE_COHERENT_MEM_FOR_RING) && defined(__ARM_ARCH_7A__)) - extern void osl_cache_flush(void *va, uint size); extern void osl_cache_inv(void *va, uint size); extern void osl_prefetch(const void *ptr); diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h index e697349..355eacc 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h @@ -886,7 +886,10 @@ #define KMALLOC_FLAG (CAN_SLEEP() ? GFP_KERNEL: GFP_ATOMIC) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 170)) +#define RANDOM32 get_random_u32 +#define RANDOM_BYTES get_random_bytes +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) #define RANDOM32 prandom_u32 #define RANDOM_BYTES prandom_bytes #else diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h new file mode 100644 index 0000000..80501a3 --- /dev/null +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Rockchip PCIe Apis For WIFI + * + * Copyright (c) 2022, Rockchip Electronics Co., Ltd. + */ + +#ifndef __RK_DHD_PCIE_LINUX_H__ +#define __RK_DHD_PCIE_LINUX_H__ + +#include <typedefs.h> +#include <sbchipc.h> +#include <pcie_core.h> +#include <dhd_pcie.h> +#include <linux/aspm_ext.h> + +static inline void +rk_dhd_bus_l1ss_enable_rc_ep(dhd_bus_t *bus, bool enable) +{ + if (!bus->rc_ep_aspm_cap || !bus->rc_ep_l1ss_cap) { + pr_err("%s: NOT L1SS CAPABLE rc_ep_aspm_cap: %d rc_ep_l1ss_cap: %d\n", + __func__, bus->rc_ep_aspm_cap, bus->rc_ep_l1ss_cap); + return; + } + + /* Disable ASPM of RC and EP */ + printf("%s: %s L1ss\n", __FUNCTION__, enable?"enable":"disable"); + pcie_aspm_ext_l1ss_enable(bus->dev, bus->rc_dev, enable); +} + +static inline bool +rk_dhd_bus_is_rc_ep_l1ss_capable(dhd_bus_t *bus) +{ + return pcie_aspm_ext_is_rc_ep_l1ss_capable(bus->dev, bus->rc_dev); +} + +#endif /* __RK_DHD_PCIE_LINUX_H__ */ diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c index 6fe9efb..ec37154 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c @@ -6840,7 +6840,8 @@ } } - channel = wl_ext_autochannel(dev, ACS_DRV_BIT, band); + chosen = wl_ext_autochannel(dev, ACS_DRV_BIT, band); + channel = wf_chspec_ctlchan(chosen); if (channel) { acs_band = CHSPEC_BAND(channel); goto done2; diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c index 6005a44..18d7714 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c @@ -617,11 +617,11 @@ } param.band = chan_info->band; - err = wl_ext_iovar_getbuf(dev, "bw_cap", ¶m, sizeof(param), + err = wldev_iovar_getbuf(dev, "bw_cap", ¶m, sizeof(param), iovar_buf, WLC_IOCTL_SMLEN, NULL); if (err) { if (err != BCME_UNSUPPORTED) { - AEXT_ERROR(dev->name, "bw_cap failed, %d\n", err); + AEXT_TRACE(dev->name, "bw_cap failed, %d\n", err); return err; } else { err = wl_ext_iovar_getint(dev, "mimo_bw_cap", &bw_cap); @@ -681,48 +681,59 @@ static int wl_ext_channel(struct net_device *dev, char* command, int total_len) { + struct dhd_pub *dhd = dhd_get_pub(dev); struct wl_chan_info chan_info; - int ret; - char band[16]=""; - int channel = 0; - channel_info_t ci; - int bytes_written = 0; - chanspec_t fw_chspec; + char chan[16]=""; + int ret, bytes_written = 0; + chanspec_t chanspec; + u32 fw_chanspec = 0; + + /* get: dhd_priv channel + * set: dhd_priv channel [6|36|2g6|5g36|6g5] + */ AEXT_TRACE(dev->name, "cmd %s", command); - sscanf(command, "%*s %d %s", &channel, band); - if (strnicmp(band, "band=auto", strlen("band=auto")) == 0) { - chan_info.band = WLC_BAND_AUTO; + sscanf(command, "%*s %s", chan); + memset(&chan_info, 0, sizeof(struct wl_chan_info)); + if (strnicmp(chan, "2g", strlen("2g")) == 0) { + chan_info.band = WLC_BAND_2G; + chan_info.chan = (int)simple_strtol(chan+2, NULL, 10); + } + else if (strnicmp(chan, "5g", strlen("5g")) == 0) { + chan_info.band = WLC_BAND_5G; + chan_info.chan = (int)simple_strtol(chan+2, NULL, 10); } #ifdef WL_6G_BAND - else if (strnicmp(band, "band=6g", strlen("band=6g")) == 0) { + else if (strnicmp(chan, "6g", strlen("6g")) == 0) { chan_info.band = WLC_BAND_6G; + chan_info.chan = (int)simple_strtol(chan+2, NULL, 10); } #endif /* WL_6G_BAND */ - else if (strnicmp(band, "band=5g", strlen("band=5g")) == 0) { - chan_info.band = WLC_BAND_5G; + else if (strlen(chan)) { + chan_info.chan = (int)simple_strtol(chan, NULL, 10); + if (chan_info.chan <= CH_MAX_2G_CHANNEL) + chan_info.band = WLC_BAND_2G; + else + chan_info.band = WLC_BAND_5G; } - else if (strnicmp(band, "band=2g", strlen("band=2g")) == 0) { - chan_info.band = WLC_BAND_2G; - } - else if (channel <= CH_MAX_2G_CHANNEL) - chan_info.band = WLC_BAND_2G; - else - chan_info.band = WLC_BAND_5G; - if (channel > 0) { - chan_info.chan = channel; - ret = wl_ext_set_chanspec(dev, &chan_info, &fw_chspec); + if (chan_info.chan > 0) { + ret = wl_ext_set_chanspec(dev, &chan_info, &chanspec); } else { - if (!(ret = wl_ext_ioctl(dev, WLC_GET_CHANNEL, &ci, - sizeof(channel_info_t), FALSE))) { - AEXT_TRACE(dev->name, "hw_channel %d\n", ci.hw_channel); - AEXT_TRACE(dev->name, "target_channel %d\n", ci.target_channel); - AEXT_TRACE(dev->name, "scan_channel %d\n", ci.scan_channel); - bytes_written = snprintf(command, sizeof(channel_info_t)+2, - "channel %d", ci.hw_channel); - AEXT_TRACE(dev->name, "command result is %s\n", command); + ret = wl_ext_iovar_getint(dev, "chanspec", (s32 *)&fw_chanspec); + if (ret == BCME_OK) { + chanspec = fw_chanspec; + chanspec = wl_ext_chspec_driver_to_host(dhd, chanspec); + chan_info.band = CHSPEC2WLC_BAND(chanspec); + chan_info.chan = wf_chspec_ctlchan(chanspec); + if (chan_info.band == WLC_BAND_6G) { + bytes_written = snprintf(command, total_len, + "channel 6g%d", chan_info.chan); + } else { + bytes_written = snprintf(command, total_len, + "channel %d", chan_info.chan); + } ret = bytes_written; } } @@ -735,28 +746,47 @@ { int ret, i; int bytes_written = -1; - u8 valid_chan_list[sizeof(u32)*(WL_NUMCHANNELS + 1)]; - wl_uint32_list_t *list; + wl_uint32_list_t *list = NULL; + chanspec_t chspec; + u32 channel; AEXT_TRACE(dev->name, "cmd %s", command); - memset(valid_chan_list, 0, sizeof(valid_chan_list)); - list = (wl_uint32_list_t *)(void *) valid_chan_list; - list->count = htod32(WL_NUMCHANNELS); - ret = wl_ext_ioctl(dev, WLC_GET_VALID_CHANNELS, valid_chan_list, - sizeof(valid_chan_list), 0); - if (ret<0) { + list = kzalloc(sizeof(u32)*(MAX_CTRL_CHANSPECS + 1), GFP_KERNEL); + if (list == NULL) { + AEXT_ERROR(dev->name, "kzalloc failed\n"); + ret = -ENOMEM; + goto exit; + } + + ret = wl_construct_ctl_chanspec_list(dev, list); + if (ret < 0) { AEXT_ERROR(dev->name, "get channels failed with %d\n", ret); + goto exit; } else { - bytes_written = snprintf(command, total_len, "channels"); - for (i = 0; i < dtoh32(list->count); i++) { - bytes_written += snprintf(command+bytes_written, total_len, " %d", - dtoh32(list->element[i])); + bytes_written = 0; + for (i = 0; i < list->count; i++) { + chspec = list->element[i]; + channel = wf_chspec_ctlchan(chspec); +#ifdef WL_6G_BAND + if (CHSPEC_IS6G(chspec) && (channel >= CH_MIN_6G_CHANNEL) && + (channel <= CH_MAX_6G_CHANNEL)) { + bytes_written += snprintf(command+bytes_written, total_len, "6g%d ", + channel); + } else +#endif + { + bytes_written += snprintf(command+bytes_written, total_len, "%d ", + channel); + } } AEXT_TRACE(dev->name, "command result is %s\n", command); ret = bytes_written; } +exit: + if (list) + kfree(list); return ret; } @@ -3011,11 +3041,11 @@ s32 err = BCME_OK; param.band = band; - err = wl_ext_iovar_getbuf(net, "bw_cap", ¶m, sizeof(param), buf, + err = wldev_iovar_getbuf(net, "bw_cap", ¶m, sizeof(param), buf, sizeof(buf), NULL); if (err) { if (err != BCME_UNSUPPORTED) { - AEXT_ERROR(net->name, "bw_cap failed, %d\n", err); + AEXT_TRACE(net->name, "bw_cap failed, %d\n", err); return err; } else { err = wl_ext_iovar_getint(net, "mimo_bw_cap", &bw_cap); @@ -3066,8 +3096,7 @@ s32 distance_6g; #endif /* WL_6G_BAND */ s32 cen_ch, distance, distance_2g, distance_5g, chanspec, min_ap=999; - u8 valid_chan_list[sizeof(u32)*(MAX_CTRL_CHANSPECS + 1)]; - wl_uint32_list_t *list; + wl_uint32_list_t *list = NULL; int ret; chanspec_t chspec; u32 channel; @@ -3082,13 +3111,17 @@ memset(six_g_band8, -1, sizeof(six_g_band8)); #endif /* WL_6G_BAND */ - memset(valid_chan_list, 0, sizeof(valid_chan_list)); - list = (wl_uint32_list_t *)(void *) valid_chan_list; + list = kzalloc(sizeof(u32)*(MAX_CTRL_CHANSPECS + 1), GFP_KERNEL); + if (list == NULL) { + AEXT_ERROR(net->name, "kzalloc failed\n"); + ret = -ENOMEM; + goto exit; + } ret = wl_construct_ctl_chanspec_list(net, list); if (ret < 0) { AEXT_ERROR(net->name, "get channels failed with %d\n", ret); - return 0; + goto exit; } else { for (i = 0; i < list->count; i++) { chspec = list->element[i]; @@ -3313,7 +3346,9 @@ } exit: - return 0; + if (list) + kfree(list); + return ret; } #endif /* WL_CFG80211 || WL_ESCAN */ @@ -3414,7 +3449,7 @@ kfree(reqbuf); } - return channel; + return chosen; } #endif /* WL_CFG80211 */ @@ -3424,29 +3459,36 @@ { int ret = -1, i, cnt = 0; int retry = 0, retry_max, retry_interval = 250, up = 1; - wl_scan_info_t scan_info; + wl_scan_info_t *scan_info = NULL; + + scan_info = kmalloc(sizeof(wl_scan_info_t), GFP_KERNEL); + if (scan_info == NULL) { + AEXT_ERROR(dev->name, "kzalloc failed\n"); + ret = -ENOMEM; + goto exit; + } retry_max = WL_ESCAN_TIMER_INTERVAL_MS/retry_interval; ret = wldev_ioctl_get(dev, WLC_GET_UP, &up, sizeof(s32)); if (ret < 0 || up == 0) { ret = wldev_ioctl_set(dev, WLC_UP, &up, sizeof(s32)); } - memset(&scan_info, 0, sizeof(wl_scan_info_t)); + memset(scan_info, 0, sizeof(wl_scan_info_t)); if (band == WLC_BAND_2G || band == WLC_BAND_AUTO) { for (i=0; i<13; i++) { - scan_info.channels.channel[i+cnt] = wf_create_chspec_from_primary(i+1, + scan_info->channels.channel[i+cnt] = wf_create_chspec_from_primary(i+1, WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_2G); } cnt += 13; } if (band == WLC_BAND_5G || band == WLC_BAND_AUTO) { for (i=0; i<4; i++) { - scan_info.channels.channel[i+cnt] = wf_create_chspec_from_primary(36+i*4, + scan_info->channels.channel[i+cnt] = wf_create_chspec_from_primary(36+i*4, WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_5G); } cnt += 4; for (i=0; i<4; i++) { - scan_info.channels.channel[i+cnt] = wf_create_chspec_from_primary(149+i*4, + scan_info->channels.channel[i+cnt] = wf_create_chspec_from_primary(149+i*4, WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_5G); } cnt += 4; @@ -3454,7 +3496,7 @@ #ifdef WL_6G_BAND if (band == WLC_BAND_6G || band == WLC_BAND_AUTO) { for (i=0; i<59; i++) { - scan_info.channels.channel[i+cnt] = wf_create_chspec_from_primary(1+i*4, + scan_info->channels.channel[i+cnt] = wf_create_chspec_from_primary(1+i*4, WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_6G); } cnt += 59; @@ -3462,13 +3504,13 @@ #endif /* WL_6G_BAND */ if (band == WLC_BAND_2G) fast_scan = FALSE; - scan_info.channels.count = cnt; + scan_info->channels.count = cnt; if (fast_scan) - scan_info.scan_time = 40; - scan_info.bcast_ssid = TRUE; + scan_info->scan_time = 40; + scan_info->bcast_ssid = TRUE; retry = retry_max; while (retry--) { - ret = wl_escan_set_scan(dev, &scan_info); + ret = wl_escan_set_scan(dev, scan_info); if (!ret) break; OSL_SLEEP(retry_interval); @@ -3478,13 +3520,16 @@ ret = -1; } +exit: + if (scan_info) + kfree(scan_info); return ret; } -int +static int wl_ext_drv_apcs(struct net_device *dev, uint32 band) { - int ret = 0, channel = 0; + int ret = 0, chanspec = 0; struct dhd_pub *dhd = dhd_get_pub(dev); struct wl_escan_info *escan = NULL; int retry = 0, retry_max, retry_interval = 250; @@ -3499,15 +3544,22 @@ retry = retry_max; while (retry--) { if (escan->escan_state == ESCAN_STATE_IDLE) { - if (band == WLC_BAND_5G) - channel = escan->best_5g_ch; + if (band == WLC_BAND_5G) { + chanspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(escan->best_5g_ch), + WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_5G); + } #ifdef WL_6G_BAND - else if (band == WLC_BAND_6G) - channel = escan->best_6g_ch; + else if (band == WLC_BAND_6G) { + chanspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(escan->best_6g_ch), + WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_6G); + } #endif /* WL_6G_BAND */ - else - channel = escan->best_2g_ch; - WL_MSG(dev->name, "selected channel = %d\n", channel); + else { + chanspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(escan->best_2g_ch), + WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_2G); + } + WL_MSG(dev->name, "selected channel = %d(0x%x)\n", + wf_chspec_ctlchan(chanspec), chanspec); goto done; } AEXT_INFO(dev->name, "escan_state=%d, %d tried, ret = %d\n", @@ -3518,46 +3570,51 @@ done: escan->autochannel = 0; - return channel; + return chanspec; } #endif /* WL_ESCAN */ int wl_ext_autochannel(struct net_device *dev, uint acs, uint32 band) { - int channel = 0; - uint16 chan_2g, chan_5g; + int chosen = 0; + uint16 chan_2g, chan_5g, channel; - AEXT_INFO(dev->name, "acs=0x%x, band=%d \n", acs, band); + AEXT_INFO(dev->name, "acs=0x%x, band=%s\n", acs, WLCBAND2STR(band)); #ifdef WL_CFG80211 if (acs & ACS_FW_BIT) { int ret = 0; ret = wldev_ioctl_get(dev, WLC_GET_CHANNEL_SEL, &channel, sizeof(channel)); - channel = 0; + chosen = 0; if (ret != BCME_UNSUPPORTED) - channel = wl_ext_fw_apcs(dev, band); - if (channel) - return channel; + chosen = wl_ext_fw_apcs(dev, band); + if (chosen) + return chosen; } #endif #ifdef WL_ESCAN if (acs & ACS_DRV_BIT) - channel = wl_ext_drv_apcs(dev, band); + chosen = wl_ext_drv_apcs(dev, band); #endif /* WL_ESCAN */ - if (channel == 0) { + if (chosen == 0) { wl_ext_get_default_chan(dev, &chan_2g, &chan_5g, TRUE); if (band == WLC_BAND_5G) { + chosen = wf_create_chspec_from_primary(wf_chspec_primary20_chan(chan_5g), + WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_5G); channel = chan_5g; } else { + chosen = wf_create_chspec_from_primary(wf_chspec_primary20_chan(chan_2g), + WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_2G); channel = chan_2g; } - AEXT_ERROR(dev->name, "ACS failed. Fall back to default channel (%d) \n", channel); + AEXT_ERROR(dev->name, "ACS failed. Fall back to default channel (%s-%d) \n", + CHSPEC2BANDSTR(chosen), channel); } - return channel; + return chosen; } #if defined(RSSIAVG) diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h index 78ce56d..f14e24f 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h @@ -189,4 +189,6 @@ #define WLCBAND2STR(band) ((band == WLC_BAND_2G) ? "2g" : (band == WLC_BAND_5G) ? \ "5g" : "0g") #endif /* WL_6G_BAND */ +#define WLCWIDTH2STR(width) ((width == WL_CHANSPEC_BW_20) ? "20" : (width == WL_CHANSPEC_BW_40) ? \ + "40" : (width == WL_CHANSPEC_BW_80) ? "80" : (width == WL_CHANSPEC_BW_160) ? "160" : "0") #endif diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c index 21d3846..69c8dc3 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c @@ -241,9 +241,9 @@ */ REG_RULE(2484-10, 2484+10, 20, 6, 20, 0), /* IEEE 802.11a, channel 36..64 */ - REG_RULE(5150-10, 5350+10, 40, 6, 20, 0), + REG_RULE(5150-10, 5350+10, 80, 6, 20, 0), /* IEEE 802.11a, channel 100..165 */ - REG_RULE(5470-10, 5850+10, 40, 6, 20, 0), + REG_RULE(5470-10, 5850+10, 80, 6, 20, 0), #ifdef WL_6G_BAND REG_RULE(6025-80, 6985+80, 160, 6, 20, 0), REG_RULE(5935-10, 7115+10, 20, 6, 20, 0), @@ -1089,12 +1089,86 @@ }; #endif /* CFG80211_6G_SUPPORT */ +#ifdef WL_CAP_HE +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) || defined(CONFIG_6GHZ_BKPORT) +static struct ieee80211_sband_iftype_data __wl_he_cap = { + .types_mask = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP), + .he_cap = { + .has_he = true, + .he_cap_elem = { + .mac_cap_info[0] = (IEEE80211_HE_MAC_CAP0_HTC_HE | + IEEE80211_HE_MAC_CAP0_TWT_REQ), + .mac_cap_info[1] = IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US, + .mac_cap_info[2] = IEEE80211_HE_MAC_CAP2_BSR, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)) + .mac_cap_info[5] = IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX, +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) */ + + .phy_cap_info[0] = + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G, + .phy_cap_info[1] = + IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A | + IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD, + .phy_cap_info[2] = + IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US, + .phy_cap_info[3] = + IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER, + .phy_cap_info[4] = + IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE | + IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK | + IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4, + .phy_cap_info[5] = + IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2, + .phy_cap_info[6] = + IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU | + IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU | +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0)) + IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | + IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB | +#else + IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB | + IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB | +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0) */ + IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB | + IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT, + .phy_cap_info[7] = + IEEE80211_HE_PHY_CAP7_MAX_NC_1, + .phy_cap_info[8] = + IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU | + IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)) + .phy_cap_info[9] = + IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | + IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU, +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0) */ + }, + .he_mcs_nss_supp = { + .rx_mcs_80 = cpu_to_le16(0xfffa), + .tx_mcs_80 = cpu_to_le16(0xfffa), + .rx_mcs_160 = cpu_to_le16((0xfffa)), + .tx_mcs_160 = cpu_to_le16((0xfffa)), + } + }, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) + .he_6ghz_capa = {.capa = cpu_to_le16(0x3038)}, +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) */ +}; +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) */ +#endif /* WL_CAP_HE */ + static struct ieee80211_supported_band __wl_band_2ghz = { .band = IEEE80211_BAND_2GHZ, .channels = __wl_2ghz_channels, .n_channels = ARRAY_SIZE(__wl_2ghz_channels), .bitrates = wl_g_rates, - .n_bitrates = wl_g_rates_size + .n_bitrates = wl_g_rates_size, +#ifdef WL_CAP_HE +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) || defined(CONFIG_6GHZ_BKPORT) + .iftype_data = &__wl_he_cap, + .n_iftype_data = 1 +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) */ +#endif /* WL_CAP_HE */ }; static struct ieee80211_supported_band __wl_band_5ghz_a = { @@ -1102,7 +1176,13 @@ .channels = __wl_5ghz_a_channels, .n_channels = ARRAY_SIZE(__wl_5ghz_a_channels), .bitrates = wl_a_rates, - .n_bitrates = wl_a_rates_size + .n_bitrates = wl_a_rates_size, +#ifdef WL_CAP_HE +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) || defined(CONFIG_6GHZ_BKPORT) + .iftype_data = &__wl_he_cap, + .n_iftype_data = 1 +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) */ +#endif /* WL_CAP_HE */ }; #ifdef CFG80211_6G_SUPPORT @@ -1111,7 +1191,13 @@ .channels = __wl_6ghz_channels, .n_channels = ARRAY_SIZE(__wl_6ghz_channels), .bitrates = wl_a_rates, - .n_bitrates = wl_a_rates_size + .n_bitrates = wl_a_rates_size, +#ifdef WL_CAP_HE +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) || defined(CONFIG_6GHZ_BKPORT) + .iftype_data = &__wl_he_cap, + .n_iftype_data = 1 +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) */ +#endif /* WL_CAP_HE */ }; #endif /* CFG80211_6G_SUPPORT */ @@ -6556,11 +6642,11 @@ } if (conn_in_progress || connected || #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) - wdev->u.client.ssid_len + wdev->u.client.ssid_len) #else - wdev->ssid_len -#endif - ) { + wdev->ssid_len) +#endif /* CFG80211_BKPORT_MLO */ + { #ifdef WL_EXT_IAPSTA wl_ext_in4way_sync(dev, 0, WL_EXT_STATUS_PRE_DISCONNECTING, NULL); #endif @@ -6607,13 +6693,11 @@ * disassoc indicates state mismatch with upper layer. Check for state * and issue disconnect indication if required. */ - #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) - // terence 20220911: fix me - if (wdev->links[0].client.current_bss || wdev->u.client.ssid_len) + if (wdev->connected || wdev->u.client.ssid_len) #else if (wdev->current_bss || wdev->ssid_len) -#endif +#endif /* CFG80211_BKPORT_MLO */ { WL_INFORM_MEM(("report disconnect event\n")); CFG80211_DISCONNECTED(dev, 0, NULL, 0, false, GFP_KERNEL); @@ -10183,7 +10267,7 @@ chan = &band->channels[idx]; /* Setting current channel to the requested channel */ if ((err = wl_cfg80211_set_channel(wiphy, ndev, chan, - NL80211_CHAN_HT20) < 0)) { + NL80211_CHAN_WIDTH_20) < 0)) { /* * FIXME: * @@ -13033,8 +13117,14 @@ ndev = cfgdev_to_wlc_ndev(cfgdev, cfg); if (ndev) { wdev = ndev->ieee80211_ptr; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) + wdev->u.client.ssid_len = + min(ssid->SSID_len, (uint32)DOT11_MAX_SSID_LEN); + memcpy(wdev->u.client.ssid, ssid->SSID, wdev->u.client.ssid_len); +#else wdev->ssid_len = min(ssid->SSID_len, (uint32)DOT11_MAX_SSID_LEN); memcpy(wdev->ssid, ssid->SSID, wdev->ssid_len); +#endif /* CFG80211_BKPORT_MLO */ WL_ERR(("SSID is %s\n", ssid->SSID)); wl_update_prof(cfg, ndev, NULL, ssid, WL_PROF_SSID); } else { @@ -13732,13 +13822,13 @@ (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)) || \ defined(WL_FILS_ROAM_OFFLD) || defined(CFG80211_ROAM_API_GE_4_12) memset(&roam_info, 0, sizeof(struct cfg80211_roam_info)); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || defined(CFG80211_BKPORT_MLO) roam_info.links[0].channel = notify_channel; roam_info.links[0].bssid = curbssid; #else roam_info.channel = notify_channel; roam_info.bssid = curbssid; -#endif +#endif /* CFG80211_BKPORT_MLO */ roam_info.req_ie = conn_info->req_ie; roam_info.req_ie_len = conn_info->req_ie_len; roam_info.resp_ie = conn_info->resp_ie; @@ -13935,7 +14025,7 @@ resp_params = (struct cfg80211_connect_resp_params *)params; resp_params->status = status; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || defined(CFG80211_BKPORT_MLO) resp_params->links[0].bssid = curbssid; resp_params->links[0].bss = CFG80211_GET_BSS(wiphy, NULL, curbssid, ssid->SSID, ssid->SSID_len); @@ -13944,11 +14034,11 @@ resp_params->bss = CFG80211_GET_BSS(wiphy, NULL, curbssid, ssid->SSID, ssid->SSID_len); #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || defined(CFG80211_BKPORT_MLO) if (!resp_params->links[0].bss) #else if (!resp_params->bss) -#endif +#endif /* CFG80211_BKPORT_MLO */ { WL_ERR(("null bss\n")); return BCME_ERROR; @@ -14063,7 +14153,7 @@ if (!ndev->ieee80211_ptr->u.client.ssid_len) #else if (!ndev->ieee80211_ptr->ssid_len) -#endif +#endif /* CFG80211_BKPORT_MLO */ { /* In certain cases, the delayed cfg80211 work from * disconnect context will induce race conditions in @@ -16730,7 +16820,8 @@ return err; } -static int wl_construct_reginfo(struct bcm_cfg80211 *cfg, s32 bw_cap) +static int wl_construct_reginfo(struct bcm_cfg80211 *cfg, s32 bw_cap_2g, + s32 bw_cap_5g, s32 bw_cap_6g) { struct net_device *dev = bcmcfg_to_prmry_ndev(cfg); struct ieee80211_channel *band_chan_arr = NULL; @@ -16798,14 +16889,13 @@ (channel <= CH_MAX_2G_CHANNEL)) { band_chan_arr = __wl_2ghz_channels; array_size = ARRAYSIZE(__wl_2ghz_channels); - ht40_allowed = (bw_cap == WLC_N_BW_40ALL)? true : false; } #ifdef CFG80211_6G_SUPPORT else if (CHSPEC_IS6G(chspec) && (channel >= CH_MIN_6G_CHANNEL) && (channel <= CH_MAX_6G_CHANNEL)) { band_chan_arr = __wl_6ghz_channels; array_size = ARRAYSIZE(__wl_6ghz_channels); - ht40_allowed = (bw_cap == WLC_N_BW_20ALL)? false : true; + ht40_allowed = WL_BW_CAP_40MHZ(bw_cap_6g); } #endif /* CFG80211_6G_SUPPORT */ else if ( @@ -16819,7 +16909,7 @@ (CHSPEC_IS5G(chspec) && channel >= CH_MIN_5G_CHANNEL)) { band_chan_arr = __wl_5ghz_a_channels; array_size = ARRAYSIZE(__wl_5ghz_a_channels); - ht40_allowed = (bw_cap == WLC_N_BW_20ALL)? false : true; + ht40_allowed = WL_BW_CAP_40MHZ(bw_cap_5g); } else { WL_ERR(("Invalid channel Sepc. 0x%x.\n", chspec)); continue; @@ -16827,7 +16917,7 @@ if (!ht40_allowed && CHSPEC_IS40(chspec)) continue; for (j = 0; j < array_size; j++) { - if (band_chan_arr[j].hw_value == chspec) { + if (band_chan_arr[j].hw_value == wf_chspec_primary20_chspec(chspec)) { break; } } @@ -16842,7 +16932,7 @@ band_chan_arr[index].center_freq = wl_channel_to_frequency(channel, CHSPEC_BAND(chspec)); #endif - band_chan_arr[index].hw_value = chspec; + band_chan_arr[index].hw_value = wf_chspec_primary20_chspec(chspec); band_chan_arr[index].beacon_found = false; band_chan_arr[index].flags &= ~IEEE80211_CHAN_DISABLED; @@ -16850,12 +16940,14 @@ /* assuming the order is HT20, HT40 Upper, * HT40 lower from chanspecs */ - u32 ht40_flag = band_chan_arr[index].flags & IEEE80211_CHAN_NO_HT40; + u32 ht40_flag = + band_chan_arr[index].flags & IEEE80211_CHAN_NO_HT40; if (CHSPEC_SB_UPPER(chspec)) { if (ht40_flag == IEEE80211_CHAN_NO_HT40) band_chan_arr[index].flags &= ~IEEE80211_CHAN_NO_HT40; - band_chan_arr[index].flags |= IEEE80211_CHAN_NO_HT40PLUS; + band_chan_arr[index].flags |= + IEEE80211_CHAN_NO_HT40PLUS; } else { /* It should be one of * IEEE80211_CHAN_NO_HT40 or IEEE80211_CHAN_NO_HT40PLUS @@ -16880,6 +16972,12 @@ } } + + WL_CHANNEL_COPY_FLAG(__wl_2ghz_channels); + WL_CHANNEL_COPY_FLAG(__wl_5ghz_a_channels); +#ifdef CFG80211_6G_SUPPORT + WL_CHANNEL_COPY_FLAG(__wl_6ghz_channels); +#endif /* CFG80211_6G_SUPPORT */ __wl_band_2ghz.n_channels = ARRAYSIZE(__wl_2ghz_channels); __wl_band_5ghz_a.n_channels = ARRAYSIZE(__wl_5ghz_a_channels); @@ -16919,8 +17017,8 @@ s32 err = 0; s32 index = 0; s32 nmode = 0; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) || defined(CUSTOMER_HW5) u32 j = 0; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) s32 vhtmode = 0; s32 txstreams = 0; s32 rxstreams = 0; @@ -16929,11 +17027,14 @@ s32 stbc_tx = 0; s32 txbf_bfe_cap = 0; s32 txbf_bfr_cap = 0; -#endif /* KERNEL >= 3.6 || CUSTOMER_HW5 */ - s32 bw_cap = 0; +#endif + s32 txchain = 0; + s32 rxchain = 0; + s32 bw_cap_2g = 0, bw_cap_5g = 0, bw_cap_6g = 0; s32 cur_band = -1; struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS] = {NULL, }; + WL_INFORM(("%s: Enter\n", __FUNCTION__)); bzero(bandlist, sizeof(bandlist)); err = wldev_ioctl_get(dev, WLC_GET_BANDLIST, bandlist, sizeof(bandlist)); @@ -16953,7 +17054,7 @@ WL_ERR(("error reading nmode (%d)\n", err)); } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) || defined(CUSTOMER_HW5) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) err = wldev_iovar_getint(dev, "vhtmode", &vhtmode); if (unlikely(err)) { WL_ERR(("error reading vhtmode (%d)\n", err)); @@ -16995,25 +17096,58 @@ WL_ERR(("error reading txbf_bfr_cap (%d)\n", err)); } } -#endif /* KERNEL >= 3.6 || CUSTOMER_HW5 */ +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) */ + + err = wldev_iovar_getint(dev, "txchain", &txchain); + if (unlikely(err)) { + WL_ERR(("error reading txchain (%d)\n", err)); + } else if (txchain == 0x03) { + txchain = 2; + } else { + txchain = 1; + } + err = wldev_iovar_getint(dev, "rxchain", &rxchain); + if (unlikely(err)) { + WL_ERR(("error reading rxchain (%d)\n", err)); + } else if (rxchain == 0x03) { + rxchain = 2; + } else { + rxchain = 1; + } /* For nmode and vhtmode check bw cap */ if (nmode || -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) || defined(CUSTOMER_HW5) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) vhtmode || -#endif /* KERNEL >= 3.6 || CUSTOMER_HW5 */ +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) */ 0) { - err = wldev_iovar_getint(dev, "mimo_bw_cap", &bw_cap); + uint32 value; + + value = WLC_BAND_2G; + err = wldev_iovar_getint(dev, "bw_cap", &value); if (unlikely(err)) { - WL_ERR(("error get mimo_bw_cap (%d)\n", err)); + WL_ERR(("error get bw_cap 2g (%d)\n", err)); } + bw_cap_2g = dtoh32(value); + value = WLC_BAND_5G; + err = wldev_iovar_getint(dev, "bw_cap", &value); + if (unlikely(err)) { + WL_ERR(("error get bw_cap 5g (%d)\n", err)); + } + bw_cap_5g = dtoh32(value); + value = WLC_BAND_6G; + err = wldev_iovar_getint(dev, "bw_cap", &value); + if (unlikely(err)) { + WL_ERR(("error get bw_cap 6g (%d)\n", err)); + } + bw_cap_6g = dtoh32(value); } #ifdef WL_6G_BAND wl_is_6g_supported(cfg, bandlist, bandlist[0]); #endif /* WL_6G_BAND */ - err = wl_construct_reginfo(cfg, bw_cap); + err = wl_construct_reginfo(cfg, bw_cap_2g, bw_cap_5g, bw_cap_6g); if (err) { WL_ERR(("wl_construct_reginfo() fails err=%d\n", err)); if (err != BCME_UNSUPPORTED) @@ -17023,6 +17157,9 @@ wiphy = bcmcfg_to_wiphy(cfg); nband = bandlist[0]; + wiphy->available_antennas_tx = txchain; + wiphy->available_antennas_rx = rxchain; + for (i = 1; i <= nband && i < ARRAYSIZE(bandlist); i++) { index = -1; @@ -17030,8 +17167,18 @@ bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; index = IEEE80211_BAND_2GHZ; - if (bw_cap == WLC_N_BW_40ALL) - bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; + (void)memset_s(bands[index]->ht_cap.mcs.rx_mask, IEEE80211_HT_MCS_MASK_LEN, + 0, IEEE80211_HT_MCS_MASK_LEN); + if (nmode && (WL_BW_CAP_40MHZ(bw_cap_2g))) { + bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + IEEE80211_HT_CAP_SGI_40; + bands[index]->ht_cap.mcs.rx_mask[4] = 0x01; + bands[index]->ht_cap.mcs.rx_highest = + cpu_to_le16(150 * rxchain); /* Mbps */ + } else { + bands[index]->ht_cap.mcs.rx_highest = + cpu_to_le16(72 * rxchain); /* Mbps */ + } } else { if (bandlist[i] == WLC_BAND_6G) { #ifdef CFG80211_6G_SUPPORT @@ -17062,14 +17209,26 @@ continue; } - if (nmode && (bw_cap == WLC_N_BW_40ALL || bw_cap == WLC_N_BW_20IN2G_40IN5G)) - bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; + (void)memset_s(bands[index]->ht_cap.mcs.rx_mask, IEEE80211_HT_MCS_MASK_LEN, + 0, IEEE80211_HT_MCS_MASK_LEN); + if (nmode && (WL_BW_CAP_40MHZ(bw_cap_5g))) { + bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + IEEE80211_HT_CAP_SGI_40; + bands[index]->ht_cap.mcs.rx_mask[4] = 0x01; + bands[index]->ht_cap.mcs.rx_highest = cpu_to_le16(150 * rxchain); + } else { + bands[index]->ht_cap.mcs.rx_highest = cpu_to_le16(72 * rxchain); + } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) || defined(CUSTOMER_HW5) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) /* VHT capabilities. */ if (vhtmode) { /* Supported */ bands[index]->vht_cap.vht_supported = TRUE; + bands[index]->vht_cap.vht_mcs.tx_highest = + cpu_to_le16(433 * txstreams); /* Mbps */ + bands[index]->vht_cap.vht_mcs.rx_highest = + cpu_to_le16(433 * txstreams); /* Mbps */ for (j = 1; j <= VHT_CAP_MCS_MAP_NSS_MAX; j++) { /* TX stream rates. */ @@ -17092,11 +17251,13 @@ } /* Capabilities */ + bands[index]->vht_cap.cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN + | IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN; /* 80 MHz is mandatory */ bands[index]->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_80; - if (WL_BW_CAP_160MHZ(bw_cap)) { + if (WL_BW_CAP_160MHZ(bw_cap_5g)) { bands[index]->vht_cap.cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; bands[index]->vht_cap.cap |= @@ -17148,7 +17309,7 @@ bands[index]->vht_cap.vht_mcs.rx_mcs_map, bands[index]->vht_cap.vht_mcs.tx_mcs_map)); } -#endif /* KERNEL >= 3.6 || CUSTOMER_HW5 */ +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) */ } if ((index >= 0) && nmode) { @@ -17158,7 +17319,10 @@ bands[index]->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; bands[index]->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; /* An HT shall support all EQM rates for one spatial stream */ - bands[index]->ht_cap.mcs.rx_mask[0] = 0xff; + for (j = 0; j < rxchain; j++) { + bands[index]->ht_cap.mcs.rx_mask[j] = 0xff; + } + bands[index]->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; } } @@ -17623,11 +17787,10 @@ struct wireless_dev *wdev = ndev->ieee80211_ptr; struct cfg80211_bss *bss = CFG80211_GET_BSS(wiphy, NULL, latest_bssid, #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) - wdev->u.client.ssid, wdev->u.client.ssid_len + wdev->u.client.ssid, wdev->u.client.ssid_len); #else - wdev->ssid, wdev->ssid_len -#endif - ); + wdev->ssid, wdev->ssid_len); +#endif /* CFG80211_BKPORT_MLO */ BCM_REFERENCE(bss); @@ -19536,7 +19699,12 @@ while (ie) { if (count >= MAX_VNDR_IE_NUMBER) break; - if (ie->id == DOT11_MNG_VS_ID || (ie->id == DOT11_MNG_ID_EXT_ID)) { +#ifdef HOSTAPD_EID_EXTENSION_SUPPORT + if (ie->id == DOT11_MNG_VS_ID || (ie->id == DOT11_MNG_ID_EXT_ID)) +#else + if (ie->id == DOT11_MNG_VS_ID) +#endif + { vndrie = (const vndr_ie_t *) ie; if (ie->id == DOT11_MNG_ID_EXT_ID) { /* len should be bigger than sizeof ID extn field at least */ @@ -19876,6 +20044,40 @@ return 0; } +#ifdef GET_FW_IE_DATA +static void +wl_dump_ie_buf(vndr_ie_buf_t *ie_getbuf) +{ + uchar *iebuf; + uchar *data; + int tot_ie, pktflag, iecount, datalen; + vndr_ie_info_t *ie_info; + vndr_ie_t *ie; + + memcpy(&tot_ie, (void *)&ie_getbuf->iecount, sizeof(int)); + tot_ie = dtoh32(tot_ie); + iebuf = (uchar *)&ie_getbuf->vndr_ie_list[0]; + + printf("-----------------\n"); + printf("Total IEs %d\n", tot_ie); + for (iecount = 0; iecount < tot_ie; iecount++) { + ie_info = (vndr_ie_info_t *) iebuf; + memcpy(&pktflag, (void *)&ie_info->pktflag, sizeof(uint32)); + pktflag = dtoh32(pktflag); + iebuf += sizeof(uint32); + ie = &ie_info->vndr_ie_data; + data = &ie->data[0]; + datalen = ie->len - VNDR_IE_MIN_LEN; + printf("index=%d, pktflag=0x%x\n", iecount, pktflag); + prhex("IE", (u8 *)ie, ie->len+VNDR_IE_HDR_LEN); + + iebuf += ie->len + VNDR_IE_HDR_LEN; + } + printf("-----------------\n"); + printf("\n"); +} +#endif /* GET_FW_IE_DATA */ + static void wl_print_fw_ie_data(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bssidx) { @@ -19887,18 +20089,10 @@ bssidx, &cfg->ioctl_buf_sync); if (ret == BCME_OK) { ies = (vndr_ie_buf_t *)cfg->ioctl_buf; - WL_INFORM_MEM(("FW IE count:%d\n", ies->iecount)); #ifdef GET_FW_IE_DATA - if (wl_dbg_level & WL_DBG_DBG) { - int i = 0; - /* If debug enabled, print each IE */ - for (i = 0; i < ies->iecount; i++) { - vndr_ie_info_t *info = &ies->vndr_ie_list[i]; - WL_DBG_MEM(("pktflag:0x%x\n", info->pktflag)); - prhex("IE:", (u8 *)&info->vndr_ie_data, - info->vndr_ie_data.len + TLV_HDR_LEN); - } - } + wl_dump_ie_buf((vndr_ie_buf_t *)cfg->ioctl_buf); +#else + WL_MSG(ndev->name, "FW IE count:%d\n", ies->iecount); #endif /* GET_FW_IE_DATA */ } else { WL_ERR(("IE retrieval failed! ret:%d\n", ret)); @@ -19922,6 +20116,7 @@ u32 parsed_ie_buf_len = 0; struct parsed_vndr_ies old_vndr_ies; struct parsed_vndr_ies new_vndr_ies; + int del_add_cnt = 0; s32 i; u8 *ptr; s32 remained_buf_len; @@ -20065,6 +20260,7 @@ curr_ie_buf += del_add_ie_buf_len; total_ie_buf_len += del_add_ie_buf_len; + del_add_cnt++; } } @@ -20114,13 +20310,32 @@ *mgmt_ie_len += vndrie_info->ie_len; curr_ie_buf += del_add_ie_buf_len; total_ie_buf_len += del_add_ie_buf_len; + del_add_cnt++; } } if (total_ie_buf_len && cfg->ioctl_buf != NULL) { - ret = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", g_mgmt_ie_buf, +#ifdef VNDR_IE_WAR + curr_ie_buf = g_mgmt_ie_buf; + for (i=0; i<del_add_cnt; i++) { + vndr_ie_setbuf_t *vndr_ie_setbuf = (vndr_ie_setbuf_t *)curr_ie_buf; + u32 curr_ie_buf_len; + curr_ie_buf_len = + (u8*)&vndr_ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.oui[0] - + (u8*)vndr_ie_setbuf; + curr_ie_buf_len += vndr_ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.len; + ret = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", curr_ie_buf, + curr_ie_buf_len, cfg->ioctl_buf, WLC_IOCTL_MAXLEN, + bssidx, &cfg->ioctl_buf_sync); + if (ret) + break; + curr_ie_buf += curr_ie_buf_len; + } +#else + ret = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", g_mgmt_ie_buf, total_ie_buf_len, cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync); +#endif if (ret) { WL_ERR(("vndr_ie set error :%d\n", ret)); if (ret == BCME_NOTFOUND) { diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h index 626fdc8..35ab3af 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h @@ -3045,6 +3045,15 @@ } \ } while (0) +#define WL_CHANNEL_COPY_FLAG(band_chan_arr) \ +do { \ + u32 arr_size, k; \ + arr_size = ARRAYSIZE(band_chan_arr); \ + for (k = 0; k < arr_size; k++) { \ + band_chan_arr[k].orig_flags = band_chan_arr[k].flags; \ + } \ +} while (0) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) #define CFG80211_PUT_BSS(wiphy, bss) cfg80211_put_bss(wiphy, bss); #else diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c index ab7e073..480dc1f 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c @@ -6860,11 +6860,13 @@ cca_congest_ext_channel_req_v2_t *per_chspec_stats = NULL; uint per_chspec_stats_size = 0; cca_congest_ext_channel_req_v3_t *all_chan_results; - cca_congest_ext_channel_req_v3_t all_chan_req; + cca_congest_ext_channel_req_v3_t *all_chan_req = NULL; + uint all_chan_req_size = sizeof(cca_congest_ext_channel_req_v3_t); #else /* cca_get_stats_ext iovar for Wifi channel statics */ struct cca_congest_ext_channel_req_v2 *cca_v2_results; - struct cca_congest_ext_channel_req_v2 cca_v2_req; + struct cca_congest_ext_channel_req_v2 *cca_v2_req = NULL; + uint cca_v2_req_size = sizeof(cca_congest_ext_channel_req_v2_t); #endif /* CHAN_STATS_SUPPORT */ const wl_cnt_wlc_t *wlc_cnt; scb_val_t scbval; @@ -7025,10 +7027,16 @@ #ifdef CHAN_STATS_SUPPORT /* Option to get all channel statistics */ - all_chan_req.num_of_entries = 0; - all_chan_req.ver = WL_CCA_EXT_REQ_VER_V3; + all_chan_req = (void *)MALLOCZ(cfg->osh, all_chan_req_size); + if (all_chan_req == NULL) { + err = BCME_NOMEM; + WL_ERR(("all_chan_req alloc failed\n")); + goto exit; + } + all_chan_req->num_of_entries = 0; + all_chan_req->ver = WL_CCA_EXT_REQ_VER_V3; err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "cca_get_stats_ext", - &all_chan_req, sizeof(all_chan_req), iovar_buf, WLC_IOCTL_MAXLEN, NULL); + all_chan_req, all_chan_req_size, iovar_buf, WLC_IOCTL_MAXLEN, NULL); if (err != BCME_OK && err != BCME_UNSUPPORTED) { WL_ERR(("cca_get_stats_ext iovar err = %d\n", err)); @@ -7089,12 +7097,18 @@ } } #else - cca_v2_req.ver = WL_CCA_EXT_REQ_VER_V2; - cca_v2_req.chanspec = + cca_v2_req = (void *)MALLOCZ(cfg->osh, cca_v2_req_size); + if (cca_v2_req == NULL) { + err = BCME_NOMEM; + WL_ERR(("cca_v2_req alloc failed\n")); + goto exit; + } + cca_v2_req->ver = WL_CCA_EXT_REQ_VER_V2; + cca_v2_req->chanspec = wl_chspec_host_to_driver(wf_chspec_primary20_chspec(cur_chanspec)); - err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "cca_get_stats_ext", &cca_v2_req, - sizeof(cca_v2_req), iovar_buf, WLC_IOCTL_MAXLEN, NULL); + err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "cca_get_stats_ext", cca_v2_req, + cca_v2_req_size, iovar_buf, WLC_IOCTL_MAXLEN, NULL); if (err != BCME_OK && err != BCME_UNSUPPORTED) { WL_ERR(("cca_get_stats_ext iovar err = %d\n", err)); @@ -7300,6 +7314,15 @@ WL_ERR(("Vendor Command reply failed ret:%d \n", err)); exit: +#ifdef CHAN_STATS_SUPPORT + if (all_chan_req) { + MFREE(cfg->osh, all_chan_req, all_chan_req_size); + } +#else + if (cca_v2_req) { + MFREE(cfg->osh, cca_v2_req, cca_v2_req_size); + } +#endif /* CHAN_STATS_SUPPORT */ if (outdata) { MFREE(cfg->osh, outdata, WLC_IOCTL_MAXLEN); } diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c index f5d6910..4980e82 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c @@ -519,7 +519,7 @@ * role to station type while bringing down the interface */ if (p2p_ndev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION) { - WL_DBG_MEM(("%s, Change to GC base role\n", __FUNCTION__)); + WL_DBG_MEM(("%s, Change to GC base role\n", p2p_ndev->name)); return WL_IF_TYPE_P2P_GC; } @@ -888,6 +888,7 @@ WL_DBG(("%s:Mac addr" MACDBG "\n", __FUNCTION__, MAC2STRDBG(mac_addr))); +#if defined(SPECIFIC_MAC_GEN_SCHEME) if ((wl_iftype == WL_IF_TYPE_P2P_DISC) || (wl_iftype == WL_IF_TYPE_AP) || (wl_iftype == WL_IF_TYPE_P2P_GO) || (wl_iftype == WL_IF_TYPE_P2P_GC)) { /* Avoid invoking release mac addr code for interfaces using @@ -895,6 +896,11 @@ */ return BCME_OK; } +#else + if (wl_iftype == WL_IF_TYPE_P2P_DISC) { + return BCME_OK; + } +#endif /* SPECIFIC_MAC_GEN_SCHEME */ /* Fetch last two bytes of mac address */ org_toggle_bytes = ntoh16(*((u16 *)&ndev->dev_addr[4])); @@ -951,7 +957,7 @@ * released. Ensure to call wl_release_vif_macaddress to free up * the mac address. */ -#if defined (SPECIFIC_MAC_GEN_SCHEME) +#if defined(SPECIFIC_MAC_GEN_SCHEME) if (wl_iftype == WL_IF_TYPE_P2P_DISC || wl_iftype == WL_IF_TYPE_AP) { mac_addr[0] |= 0x02; } else if ((wl_iftype == WL_IF_TYPE_P2P_GO) || (wl_iftype == WL_IF_TYPE_P2P_GC)) { @@ -962,7 +968,7 @@ if (wl_iftype == WL_IF_TYPE_P2P_DISC) { mac_addr[0] |= 0x02; } -#endif /* SEPCIFIC_MAC_GEN_SCHEME */ +#endif /* SPECIFIC_MAC_GEN_SCHEME */ else { /* For locally administered mac addresses, we keep the * OUI part constant and just work on the last two bytes. @@ -1331,9 +1337,9 @@ if (is_p2p_group_iface(ndev->ieee80211_ptr) && (type == NL80211_IFTYPE_STATION)) { /* For role downgrade cases, we keep interface role as GC */ netinfo->iftype = WL_IF_TYPE_P2P_GC; - WL_DBG_MEM(("[%s] Set base role to GC, current role" + WL_DBG_MEM(("[%s] Set base role to GC, current role" "ndev->ieee80211_ptr->iftype = %d\n", - __FUNCTION__, ndev->ieee80211_ptr->iftype)); + ndev->name, ndev->ieee80211_ptr->iftype)); } else { netinfo->iftype = wl_iftype; } @@ -1538,11 +1544,16 @@ s32 wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, struct ieee80211_channel *chan, - enum nl80211_channel_type channel_type) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + enum nl80211_channel_type channel_type +#else + enum nl80211_chan_width width +#endif +) { chanspec_t chspec = INVCHANSPEC; chanspec_t cur_chspec = INVCHANSPEC; - u32 bw = WL_CHANSPEC_BW_20; + u32 band_width = WL_CHANSPEC_BW_20, bw = WL_CHANSPEC_BW_20; s32 err = BCME_OK; struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); #if defined(CUSTOM_SET_CPUCORE) || defined(APSTA_RESTRICTED_CHANNEL) @@ -1551,6 +1562,39 @@ u16 center_freq = chan->center_freq; dev = ndev_to_wlc_ndev(dev, cfg); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + switch (channel_type) { + case NL80211_CHAN_HT40MINUS: + /* secondary channel is below the control channel */ + band_width = WL_CHANSPEC_BW_40; + break; + case NL80211_CHAN_HT40PLUS: + /* secondary channel is above the control channel */ + band_width = WL_CHANSPEC_BW_40; + break; + default: + band_width = WL_CHANSPEC_BW_20; + } +#else + switch (width) + { + case NL80211_CHAN_WIDTH_160: + band_width = WL_CHANSPEC_BW_160; + break; + case NL80211_CHAN_WIDTH_80P80: + case NL80211_CHAN_WIDTH_80: + band_width = WL_CHANSPEC_BW_80; + break; + case NL80211_CHAN_WIDTH_40: + band_width = WL_CHANSPEC_BW_40; + break; + default: + band_width = WL_CHANSPEC_BW_20; + break; + } +#endif + #ifdef WL_EXT_IAPSTA if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) { @@ -1571,9 +1615,9 @@ #endif chspec = wl_freq_to_chanspec(center_freq); - WL_MSG(dev->name, "netdev_ifidx(%d) chan_type(%d) target channel(%s-%d %sMHz)\n", - dev->ifindex, channel_type, CHSPEC2BANDSTR(chspec), - CHSPEC_CHANNEL(chspec), wf_chspec_to_bw_str(chspec)); + WL_MSG(dev->name, "netdev_ifidx(%d) chan_width(%d) target channel(%s-%d %sMHz)\n", + dev->ifindex, width, CHSPEC2BANDSTR(chspec), + CHSPEC_CHANNEL(chspec), WLCWIDTH2STR(band_width)); #ifdef WL_P2P_6G if (!(cfg->p2p_6g_enabled)) { @@ -1585,22 +1629,6 @@ #ifdef WL_P2P_6G } #endif /* WL_P2P_6G */ - -#ifdef NOT_YET - switch (channel_type) { - case NL80211_CHAN_HT40MINUS: - /* secondary channel is below the control channel */ - chspec = CH40MHZ_CHSPEC(CHSPEC_CHANNEL(chspec), WL_CHANSPEC_CTL_SB_UPPER); - break; - case NL80211_CHAN_HT40PLUS: - /* secondary channel is above the control channel */ - chspec = CH40MHZ_CHSPEC(CHSPEC_CHANNEL(chspec), WL_CHANSPEC_CTL_SB_LOWER); - break; - default: - chspec = CH20MHZ_CHSPEC(CHSPEC_CHANNEL(chspec)); - - } -#endif /* NOT_YET */ #if defined(APSTA_RESTRICTED_CHANNEL) /* Some customer platform used limited number of channels @@ -1643,7 +1671,18 @@ if (err < 0) { WL_ERR(("Failed to get bandwidth information, err=%d\n", err)); return err; + } else if (bw < band_width) { + WL_ERR(("capability force band_width=0x%X to be 0x%X\n", band_width, bw)); + band_width = bw; } +#ifdef HOSTAPD_BW_SUPPORT + WL_MSG(dev->name, "hostapd bw(%sMHz) <= chip bw(%sMHz)\n", + wf_chspec_to_bw_str(band_width), wf_chspec_to_bw_str(bw)); +#else + WL_MSG(dev->name, "hostapd bw(%sMHz) => chip bw(%sMHz)\n", + wf_chspec_to_bw_str(band_width), wf_chspec_to_bw_str(bw)); + band_width = bw; +#endif /* In case of 5G downgrade BW to 80MHz as 160MHz channels falls in DFS */ if (CHSPEC_IS5G(chspec) && (bw == WL_CHANSPEC_BW_160)) { @@ -1651,7 +1690,7 @@ } set_channel: cur_chspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(chspec), - bw, CHSPEC_BAND(chspec)); + band_width, CHSPEC_BAND(chspec)); #ifdef WL_6G_BAND if (cfg->acs_chspec && CHSPEC_IS6G(cfg->acs_chspec) && @@ -3694,8 +3733,8 @@ dev->ieee80211_ptr->u.ap.preset_chandef.chan, #else dev->ieee80211_ptr->preset_chandef.chan, -#endif - NL80211_CHAN_HT20) < 0)) { +#endif /* CFG80211_BKPORT_MLO */ + info->chandef.width) < 0)) { WL_ERR(("Set channel failed \n")); goto fail; } @@ -3793,7 +3832,7 @@ wl_cfg80211_stop_ap(wiphy, dev, 0); #else wl_cfg80211_stop_ap(wiphy, dev); -#endif +#endif /* CFG80211_BKPORT_MLO */ if (dev_role == NL80211_IFTYPE_AP) { #ifdef WL_EXT_IAPSTA if (!wl_ext_iapsta_iftype_enabled(dev, WL_IF_TYPE_AP)) { @@ -3837,7 +3876,7 @@ struct net_device *dev #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) , unsigned int link_id -#endif +#endif /* CFG80211_BKPORT_MLO */ ) { int err = 0; @@ -5246,7 +5285,7 @@ cfg80211_ch_switch_notify(dev, &chandef, 0); #else cfg80211_ch_switch_notify(dev, &chandef); -#endif +#endif /* CFG80211_BKPORT_MLO */ #elif (LINUX_VERSION_CODE >= KERNEL_VERSION (3, 5, 0) && (LINUX_VERSION_CODE <= (3, 7, 0))) freq = chandef.freq; cfg80211_ch_switch_notify(dev, freq, chandef.chan_type); diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h index e7daeec..a988547 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h @@ -189,7 +189,12 @@ s32 wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, struct ieee80211_channel *chan, - enum nl80211_channel_type channel_type); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + enum nl80211_channel_type channel_type +#else + enum nl80211_chan_width width +#endif +); #endif /* ((LINUX_VERSION < VERSION(3, 6, 0)) || WL_COMPAT_WIRELESS */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || \ defined(WL_COMPAT_WIRELESS) @@ -200,7 +205,7 @@ unsigned int link_id); #else extern s32 wl_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev); -#endif +#endif /* CFG80211_BKPORT_MLO */ extern s32 wl_cfg80211_change_beacon(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_beacon_data *info); #else diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c index 01a9e02..6b6b389 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c @@ -886,8 +886,7 @@ u8 *scan_params = NULL, *params = NULL; s32 params_size; u32 n_channels = 0; - wl_uint32_list_t *list; - u8 valid_chan_list[sizeof(u32)*(MAX_CTRL_CHANSPECS + 1)]; + wl_uint32_list_t *list = NULL; mutex_lock(&escan->usr_sync); if (escan->escan_state == ESCAN_STATE_DOWN) { @@ -920,8 +919,12 @@ } /* if scan request is not empty parse scan request paramters */ - memset(valid_chan_list, 0, sizeof(valid_chan_list)); - list = (wl_uint32_list_t *)(void *) valid_chan_list; + list = kzalloc(sizeof(u32)*(MAX_CTRL_CHANSPECS + 1), GFP_KERNEL); + if (list == NULL) { + ESCAN_ERROR(dev->name, "kzalloc failed\n"); + err = -ENOMEM; + goto exit; + } if (scan_info->channels.count) { memcpy(list, &scan_info->channels, sizeof(wl_channel_list_t)); @@ -984,6 +987,8 @@ } kfree(params); exit: + if (list) + kfree(list); if (unlikely(err)) { wl_escan_reset(escan); } diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c index 2afa1c5..c03b497 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c @@ -154,6 +154,12 @@ ENC_TKIPAES } encmode_t; +typedef enum MAPSTA_MODE { + MCHAN_APSTA_NOT_ALLOW = 0, + MCHAN_APSTA_SBSC, + MCHAN_APSTA_NO_RESTRICT +} mapsta_mode_t; + #ifdef STA_MGMT typedef struct wl_sta_info { int ifidx; @@ -270,12 +276,13 @@ #endif /* WL_EXT_RECONNECT && WL_CFG80211 */ } wl_if_info_t; +u8 *g_ioctl_buf = NULL; + typedef struct wl_apsta_params { struct wl_if_info if_info[MAX_IF_NUM]; #ifdef WLDWDS struct wl_dwds_info dwds_info[MAX_DWDS_IF_NUM]; #endif /* WLDWDS */ - u8 *ioctl_buf; bool init; int rsdb; bool vsdb; @@ -1933,6 +1940,7 @@ if (!auto_chan) { auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT, cur_chan_info->band); + auto_chan = wf_chspec_ctlchan(auto_chan); } if (auto_chan) cur_chan_info->chan = auto_chan; @@ -1954,6 +1962,7 @@ if (!auto_chan) { auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT, cur_chan_info->band); + auto_chan = wf_chspec_ctlchan(auto_chan); } if (auto_chan) { cur_chan_info->chan = auto_chan; @@ -1967,6 +1976,7 @@ } else { auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT, cur_chan_info->band); + auto_chan = wf_chspec_ctlchan(auto_chan); if (auto_chan) { cur_chan_info->chan = auto_chan; } @@ -2005,6 +2015,7 @@ if (!auto_chan) { auto_chan = wl_ext_autochannel(tgt_if->dev, ACS_FW_BIT|ACS_DRV_BIT, tgt_chan_info->band); + auto_chan = wf_chspec_ctlchan(auto_chan); } if (auto_chan) { tgt_chan_info->chan = auto_chan; @@ -2017,6 +2028,7 @@ if (!auto_chan) { auto_chan = wl_ext_autochannel(tgt_if->dev, ACS_FW_BIT|ACS_DRV_BIT, tgt_chan_info->band); + auto_chan = wf_chspec_ctlchan(auto_chan); } } else { tgt_chan_info->chan = 0; @@ -2488,6 +2500,7 @@ if (wl_ext_master_if(cur_if) && apsta_params->acs) { chan_info->chan = wl_ext_autochannel(cur_if->dev, apsta_params->acs, chan_info->band); + chan_info->chan = wf_chspec_ctlchan(chan_info->chan); } chan_info->chan = wl_ext_move_cur_channel(apsta_params, cur_if); if (chan_info->chan) { @@ -4289,7 +4302,8 @@ } } } else { - WL_ERR(("Unknown auth_alg=%d or auth_seq=%d\n", auth_alg, auth_seq)); + IAPSTA_ERROR(dev->name, "Unknown auth_alg=%d or auth_seq=%d\n", + auth_alg, auth_seq); } return; @@ -4395,16 +4409,11 @@ static void wl_ampdu_dump(struct net_device *dev) { - struct dhd_pub *dhd = dhd_get_pub(dev); - struct wl_apsta_params *apsta_params = dhd->iapsta_params; - char *ioctl_buf = apsta_params->ioctl_buf, *buf = NULL; + char *ioctl_buf = g_ioctl_buf, *buf = NULL; char *tx_pch_start, *tx_pch_end, *rx_pch_start, *rx_pch_end; int ret = 0, max_len, tx_len, rx_len; if (!(android_msg_level & ANDROID_AMPDU_LEVEL)) - return; - - if (!ioctl_buf) return; memset(ioctl_buf, 0, WL_DUMP_BUF_LEN); @@ -4470,11 +4479,9 @@ static void wl_tvpm_dump(struct net_device *dev) { - struct dhd_pub *dhd = dhd_get_pub(dev); - struct wl_apsta_params *apsta_params = dhd->iapsta_params; wl_tvpm_req_t* tvpm_req = NULL; size_t reqlen = sizeof(wl_tvpm_req_t) + sizeof(wl_tvpm_status_t); - uint8 *outbuf = apsta_params->ioctl_buf; + uint8 *outbuf = g_ioctl_buf; size_t outlen = WLC_IOCTL_MEDLEN; wl_tvpm_status_t* status; int ret, phy_temp = 0; @@ -4545,6 +4552,8 @@ wldev_ioctl(dev, WLC_GET_RSSI, &scb_val, sizeof(scb_val_t), 0); rssi_ant_p->count = 1; rssi_ant_p->rssi_ant[0] = dtoh32(scb_val.val); + } else { + rssi_ant_p->count = 0; } } for (i=0; i<rssi_ant_p->count && rssi_ant_p->rssi_ant[i]; i++) { @@ -4570,9 +4579,7 @@ static void wl_sta_info_dump(struct net_device *dev, struct ether_addr *mac) { - struct dhd_pub *dhd = dhd_get_pub(dev); - struct wl_apsta_params *apsta_params = dhd->iapsta_params; - void *buf = apsta_params->ioctl_buf; + void *buf = g_ioctl_buf; sta_info_v4_t *sta = NULL; char rssi_buf[16]; int ret; @@ -4723,7 +4730,7 @@ tmp_if = &apsta_params->if_info[i]; if (tmp_if->dev && (tmp_if->ifmode == ISTA_MODE || tmp_if->ifmode == IGC_MODE) && - wl_ext_associated(tmp_if->dev)) { + wl_get_isam_status(tmp_if, STA_CONNECTED)) { wl_tput_monitor(dhd, tmp_if->ifidx, &tmp_if->tput_info); monitor_if[i] = TRUE; } @@ -5112,7 +5119,7 @@ { struct dhd_pub *dhd = dhd_get_pub(cur_if->dev); struct wl_apsta_params *apsta_params = dhd->iapsta_params; - char *iovar_buf = apsta_params->ioctl_buf; + char *iovar_buf = g_ioctl_buf; uint32 corerev = 0; wl_cnt_info_t *cntinfo; uint16 ver; @@ -5971,6 +5978,7 @@ (chan_5g && cur_if->chan_info.band == WLC_BAND_5G)) { cur_if->chan_info.chan = wl_ext_autochannel(cur_if->dev, apsta_params->acs, cur_if->chan_info.band); + cur_if->chan_info.chan = wf_chspec_ctlchan(cur_if->chan_info.chan); } else { IAPSTA_ERROR(ifname, "invalid channel\n"); ret = -1; @@ -6688,6 +6696,28 @@ } static void +wl_ext_iapsta_get_mapsta_mode(struct net_device *net) +{ + struct dhd_pub *dhd = dhd_get_pub(net); + struct wl_apsta_params *apsta_params = dhd->iapsta_params; + int ret, mapsta_mode; + + ret = wldev_iovar_getint(net, "mapsta_mode", &mapsta_mode); + if (ret) { + IAPSTA_INFO(net->name, "not supported %d\n", ret); + mapsta_mode = MCHAN_APSTA_NOT_ALLOW; + } + + if (mapsta_mode == MCHAN_APSTA_SBSC) + apsta_params->rsdb = 1; + else if (mapsta_mode == MCHAN_APSTA_NO_RESTRICT) + apsta_params->vsdb = TRUE; + + IAPSTA_INFO(net->name, "mapsta_mode=%d(rsdb=%d, vsdb=%d)\n", + mapsta_mode, apsta_params->rsdb, apsta_params->vsdb); +} + +static void wl_ext_iapsta_postinit(struct net_device *net, struct wl_if_info *cur_if) { struct dhd_pub *dhd = dhd_get_pub(net); @@ -6698,6 +6728,7 @@ if (cur_if->ifidx == 0) { apsta_params->rsdb = wl_ext_iapsta_get_rsdb(net, dhd); apsta_params->vsdb = FALSE; + wl_ext_iapsta_get_mapsta_mode(net); apsta_params->csa = 0; apsta_params->acs = 0; apsta_params->radar = wl_ext_radar_detect(net); @@ -6873,12 +6904,6 @@ struct dhd_pub *dhd = dhd_get_pub(net); struct wl_apsta_params *apsta_params = dhd->iapsta_params; - if (!apsta_params->ioctl_buf) { - apsta_params->ioctl_buf = kmalloc(WL_DUMP_BUF_LEN, GFP_KERNEL); - if (unlikely(!apsta_params->ioctl_buf)) { - IAPSTA_ERROR(net->name, "Can not allocate ioctl_buf\n"); - } - } init_waitqueue_head(&apsta_params->netif_change_event); mutex_init(&apsta_params->usr_sync); mutex_init(&apsta_params->in4way_sync); @@ -6896,10 +6921,6 @@ struct dhd_pub *dhd = dhd_get_pub(net); struct wl_apsta_params *apsta_params = dhd->iapsta_params; - if (apsta_params->ioctl_buf) { - kfree(apsta_params->ioctl_buf); - apsta_params->ioctl_buf = NULL; - } memset(apsta_params, 0, sizeof(struct wl_apsta_params)); } @@ -7028,24 +7049,6 @@ return 0; } -int -wl_ext_iapsta_attach(struct net_device *net) -{ - struct dhd_pub *dhd = dhd_get_pub(net); - struct wl_apsta_params *iapsta_params; - - IAPSTA_TRACE(net->name, "Enter\n"); - - iapsta_params = kzalloc(sizeof(struct wl_apsta_params), GFP_KERNEL); - if (unlikely(!iapsta_params)) { - IAPSTA_ERROR(net->name, "Can not allocate apsta_params\n"); - return -ENOMEM; - } - dhd->iapsta_params = (void *)iapsta_params; - - return 0; -} - void wl_ext_iapsta_dettach(struct net_device *net) { @@ -7053,10 +7056,47 @@ IAPSTA_TRACE(net->name, "Enter\n"); + if (g_ioctl_buf) { + kfree(g_ioctl_buf); + g_ioctl_buf = NULL; + } + if (dhd->iapsta_params) { wl_ext_iapsta_deinit_priv(net); kfree(dhd->iapsta_params); dhd->iapsta_params = NULL; } } + +int +wl_ext_iapsta_attach(struct net_device *net) +{ + struct dhd_pub *dhd = dhd_get_pub(net); + struct wl_apsta_params *iapsta_params; + int ret = 0; + + IAPSTA_TRACE(net->name, "Enter\n"); + + iapsta_params = kzalloc(sizeof(struct wl_apsta_params), GFP_KERNEL); + if (unlikely(!iapsta_params)) { + IAPSTA_ERROR(net->name, "Can not allocate apsta_params\n"); + ret = -ENOMEM; + goto exit; + } + dhd->iapsta_params = (void *)iapsta_params; + + if (!g_ioctl_buf) { + g_ioctl_buf = kmalloc(WL_DUMP_BUF_LEN, GFP_KERNEL); + if (unlikely(!g_ioctl_buf)) { + IAPSTA_ERROR(net->name, "Can not allocate g_ioctl_buf\n"); + ret = -ENOMEM; + goto exit; + } + } + +exit: + if (ret) + wl_ext_iapsta_dettach(net); + return ret; +} #endif /* WL_EXT_IAPSTA */ diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c index 10e4f34..2497c1f 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c @@ -678,14 +678,16 @@ struct dhd_pub *dhd = dhd_get_pub(dev); struct iw_freq *fwrq = &wrqu->freq; int error; + u32 val; chanspec_t chanspec = 0; int ctl_chan; WL_TRACE(("%s: SIOCGIWFREQ\n", dev->name)); DHD_CHECK(dhd, dev); - if ((error = dev_wlc_intvar_get(dev, "chanspec", (s32 *)&chanspec))) + if ((error = dev_wlc_intvar_get(dev, "chanspec", &val))) return error; + chanspec = val; chanspec = wl_ext_chspec_driver_to_host(dhd, chanspec); ctl_chan = wf_chspec_ctlchan(chanspec); @@ -1379,7 +1381,8 @@ struct dhd_pub *dhd = dhd_get_pub(dev); wlc_ssid_t ssid; #ifdef WL_ESCAN - wl_scan_info_t scan_info; + wl_scan_info_t *scan_info = NULL; + int err; #else wl_wext_info_t *wext_info = NULL; iscan_info_t *iscan; @@ -1403,11 +1406,18 @@ } } #endif - memset(&scan_info, 0, sizeof(wl_scan_info_t)); - scan_info.bcast_ssid = TRUE; - memcpy(scan_info.ssid.SSID, ssid.SSID, ssid.SSID_len); - scan_info.ssid.SSID_len = ssid.SSID_len; - return wl_escan_set_scan(dev, &scan_info); + scan_info = kmalloc(sizeof(wl_scan_info_t), GFP_KERNEL); + if (scan_info == NULL) { + WL_ERROR(("kzalloc failed\n")); + return -ENOMEM; + } + memset(scan_info, 0, sizeof(wl_scan_info_t)); + scan_info->bcast_ssid = TRUE; + memcpy(scan_info->ssid.SSID, ssid.SSID, ssid.SSID_len); + scan_info->ssid.SSID_len = ssid.SSID_len; + err = wl_escan_set_scan(dev, scan_info); + kfree(scan_info); + return err; #else wext_info = dhd->wext_info; iscan = &wext_info->iscan; diff --git a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c index 54f8312..67d3ebc 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c @@ -17,11 +17,13 @@ #include <linux/firmware.h> #include <linux/file.h> #include <linux/kernel.h> +#include <linux/input.h> #include <linux/module.h> #include <linux/mfd/syscon.h> #include <linux/of_gpio.h> #include <linux/of_device.h> #include <linux/platform_device.h> +#include <linux/proc_fs.h> #include <linux/regulator/consumer.h> #include <linux/regmap.h> #include <linux/slab.h> @@ -430,6 +432,14 @@ * 0x5663000x: Marlin3E series * 0: read chipid fail or not unisoc module */ + +#ifdef CONFIG_RK_BOARD +#define PROC_DIR "bluetooth/sleep" +static struct proc_dir_entry *bluetooth_dir, *sleep_dir; +static struct input_dev *power_key_dev; +static unsigned char enable_power_key = 0; +#endif + #define WCN_CHIPID_MASK (0xFFFFF000) unsigned int marlin_get_wcn_chipid(void) { @@ -1418,12 +1428,111 @@ disable_irq(marlin_dev->bt_wake_host_int_num); } +#if defined CONFIG_RK_BOARD +static int rkbt_power_key_up(void) +{ + if (!power_key_dev) + return -ENODEV; + input_report_key(power_key_dev, KEY_POWER, 1); + input_sync(power_key_dev); + msleep(20); + input_report_key(power_key_dev, KEY_POWER, 0); + input_sync(power_key_dev); + + return 0; +} + +static irqreturn_t rkbt_wake_host_irq_thread(int irq, void *dev) +{ + rkbt_power_key_up(); + + return IRQ_HANDLED; +} + +static ssize_t bluesleep_read_proc_powerupkey(struct file *file, + char __user *buffer, size_t count, + loff_t *data) +{ + char src[2]; + + if (*data >= 1) + return 0; + + src[0] = enable_power_key ? '1' : '0'; + src[1] = '\n'; + if (copy_to_user(buffer, src, 2)) + return -EFAULT; + *data = 1; + + return 2; +} + +static ssize_t bluesleep_write_proc_powerupkey(struct file *file, + const char __user *buffer, + size_t count, loff_t *data) +{ + char b; + + if (count < 1) + return -EINVAL; + + if (copy_from_user(&b, buffer, 1)) + return -EFAULT; + + if (b != '0') + enable_power_key = 1; + else + enable_power_key = 0; + + return count; +} + +static const struct file_operations bluesleep_powerupkey = { + .owner = THIS_MODULE, + .read = bluesleep_read_proc_powerupkey, + .write = bluesleep_write_proc_powerupkey, +}; + +static int rkbt_register_power_key(void) +{ + int ret = 0; + + /* register input device */ + power_key_dev = input_allocate_device(); + if (!power_key_dev) { + WCN_ERR("ir_dev: not enough memory for input device\n"); + return -ENOMEM; + } + + power_key_dev->name = "bt-powerkey"; + power_key_dev->id.bustype = BUS_HOST; + + power_key_dev->evbit[0] = BIT_MASK(EV_KEY); + set_bit(KEY_POWER, power_key_dev->keybit); + + ret = input_register_device(power_key_dev); + if (ret) { + input_free_device(power_key_dev); + WCN_ERR("ir_rx_init: register input device exception, exit\n"); + return -EBUSY; + } + + return ret; +} +#endif + static irqreturn_t marlin_bt_wake_int_isr(int irq, void *para) { static int bt_wake_cnt; bt_wake_cnt++; WCN_DEBUG("bt_wake_irq_cnt %d\n", bt_wake_cnt); + + #if defined CONFIG_RK_BOARD + if (enable_power_key) + return IRQ_WAKE_THREAD; + #endif + return IRQ_HANDLED; } @@ -1466,12 +1575,22 @@ return ret; } + #if defined CONFIG_RK_BOARD + ret = request_threaded_irq(marlin_dev->bt_wake_host_int_num, + marlin_bt_wake_int_isr, + rkbt_wake_host_irq_thread, + IRQF_ONESHOT | IRQF_TRIGGER_RISING | + IRQF_NO_SUSPEND, + "bt_wake_isr", + NULL); + #else ret = request_irq(marlin_dev->bt_wake_host_int_num, marlin_bt_wake_int_isr, IRQF_TRIGGER_RISING | IRQF_NO_SUSPEND, "bt_wake_isr", NULL); + #endif if (ret != 0) { WCN_ERR("req bt_hostwake irq-%d err! ret=%d", marlin_dev->bt_wake_host_int_num, ret); @@ -3971,6 +4090,9 @@ static void marlin_reset_notify_init(void); static int marlin_probe(struct platform_device *pdev) { +#if defined CONFIG_RK_BOARD + struct proc_dir_entry *ent; +#endif #ifdef CONFIG_WCN_PMIC struct device_node *regmap_np; struct platform_device *pdev_regmap = NULL; @@ -4074,13 +4196,44 @@ marlin_dev->marlin_probe_status = 1; #endif - WCN_INFO("marlin_probe ok!\n"); +#if defined CONFIG_RK_BOARD + bluetooth_dir = proc_mkdir("bluetooth", NULL); + if (!bluetooth_dir) { + WCN_ERR("Unable to create /proc/bluetooth directory"); + return -ENOMEM; + } + sleep_dir = proc_mkdir("sleep", bluetooth_dir); + if (!sleep_dir) { + WCN_ERR("Unable to create /proc/%s directory", PROC_DIR); + return -ENOMEM; + } + + /* read/write proc entries */ + ent = proc_create("powerupkey", 0, sleep_dir, &bluesleep_powerupkey); + if (!ent) { + WCN_ERR("Unable to create /proc/%s/powerupkey entry", PROC_DIR); + remove_proc_entry("powerupkey", sleep_dir); + return -ENOMEM; + } + + if (rkbt_register_power_key() != 0) { + WCN_ERR("Unable to register power_key"); + return -EBUSY; + } +#endif + + WCN_INFO("marlin_probe ok!\n"); return 0; } static int marlin_remove(struct platform_device *pdev) { +#if defined CONFIG_RK_BOARD + input_unregister_device(power_key_dev); + remove_proc_entry("powerupkey", sleep_dir); +#endif + #if (defined(CONFIG_BT_WAKE_HOST_EN) && defined(CONFIG_AW_BOARD)) \ || defined(CONFIG_RK_BOARD) marlin_unregistsr_bt_wake(); diff --git a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile index a19f92b..8f703ec 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile +++ b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile @@ -53,7 +53,7 @@ #ccflags-y += -DTCP_ACK_DROP_SUPPORT ccflags-y += -DWOW_SUPPORT #ccflags-y += -DCPUFREQ_UPDATE_SUPPORT -#ccflags-y += -DCUSTOM_REGDOMAIN +ccflags-y += -DCUSTOM_REGDOMAIN #####module name ### obj-m += $(MODULE_NAME).o diff --git a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c index a1f6f16..0fdd7fe 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c @@ -26,7 +26,7 @@ #endif /* RTT_SUPPORT */ #define VENDOR_SCAN_RESULT_EXPIRE (7 * HZ) -#define WIFI_SUBCMD_SET_COUNTRY_CODE 0x0006 +#define WIFI_SUBCMD_SET_COUNTRY_CODE 0x100E #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) static const u8 *wpa_scan_get_ie(u8 *res, u8 ie_len, u8 ie) @@ -874,7 +874,7 @@ static int sprdwl_vendor_set_country(struct wiphy *wiphy, struct wireless_dev *wdev, const void *data, int len) { -#define ANDR_WIFI_ATTRIBUTE_COUNTRY 8 +#define ANDR_WIFI_ATTRIBUTE_COUNTRY 4 int err = 0, rem, type; char country_code[2] = {0}; const struct nlattr *iter; diff --git a/kernel/drivers/nvmem/rockchip-otp.c b/kernel/drivers/nvmem/rockchip-otp.c index f6ad074..c7ac716 100644 --- a/kernel/drivers/nvmem/rockchip-otp.c +++ b/kernel/drivers/nvmem/rockchip-otp.c @@ -675,6 +675,17 @@ .reg_read = px30s_otp_read, }; +static const char * const rk3528_otp_clocks[] = { + "usr", "sbpi", "apb", +}; + +static const struct rockchip_data rk3528_data = { + .size = 0x80, + .clocks = rk3528_otp_clocks, + .num_clks = ARRAY_SIZE(rk3528_otp_clocks), + .reg_read = rk3568_otp_read, +}; + static const char * const rk3568_otp_clocks[] = { "usr", "sbpi", "apb", "phy", }; @@ -716,6 +727,12 @@ .data = (void *)&px30_data, }, #endif +#ifdef CONFIG_CPU_RK3528 + { + .compatible = "rockchip,rk3528-otp", + .data = (void *)&rk3528_data, + }, +#endif #ifdef CONFIG_CPU_RK3568 { .compatible = "rockchip,rk3568-otp", diff --git a/kernel/drivers/of/base.c b/kernel/drivers/of/base.c index b28dee2..9a4af2e 100644 --- a/kernel/drivers/of/base.c +++ b/kernel/drivers/of/base.c @@ -130,31 +130,34 @@ /* * Caller must hold devtree_lock. */ -static void __of_free_phandle_cache(void) +static struct device_node** __of_free_phandle_cache(void) { u32 cache_entries = phandle_cache_mask + 1; u32 k; + struct device_node **shadow; if (!phandle_cache) - return; + return NULL; for (k = 0; k < cache_entries; k++) of_node_put(phandle_cache[k]); - kfree(phandle_cache); + shadow = phandle_cache; phandle_cache = NULL; + return shadow; } int of_free_phandle_cache(void) { unsigned long flags; + struct device_node **shadow; raw_spin_lock_irqsave(&devtree_lock, flags); - __of_free_phandle_cache(); + shadow = __of_free_phandle_cache(); raw_spin_unlock_irqrestore(&devtree_lock, flags); - + kfree(shadow); return 0; } #if !defined(CONFIG_MODULES) @@ -189,10 +192,11 @@ u32 cache_entries; struct device_node *np; u32 phandles = 0; + struct device_node **shadow; raw_spin_lock_irqsave(&devtree_lock, flags); - __of_free_phandle_cache(); + shadow = __of_free_phandle_cache(); for_each_of_allnodes(np) if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL) @@ -200,12 +204,14 @@ if (!phandles) goto out; + raw_spin_unlock_irqrestore(&devtree_lock, flags); cache_entries = roundup_pow_of_two(phandles); phandle_cache_mask = cache_entries - 1; phandle_cache = kcalloc(cache_entries, sizeof(*phandle_cache), GFP_ATOMIC); + raw_spin_lock_irqsave(&devtree_lock, flags); if (!phandle_cache) goto out; @@ -217,6 +223,7 @@ out: raw_spin_unlock_irqrestore(&devtree_lock, flags); + kfree(shadow); } void __init of_core_init(void) diff --git a/kernel/drivers/pci/controller/dwc/Kconfig b/kernel/drivers/pci/controller/dwc/Kconfig index d568d06..e7b6441 100644 --- a/kernel/drivers/pci/controller/dwc/Kconfig +++ b/kernel/drivers/pci/controller/dwc/Kconfig @@ -106,6 +106,13 @@ help Enables support for the DW PCIe controller in the Rockchip SoC. +config PCIE_RK_THREADED_INIT + bool "Threaded initialize Rockchip DW based PCIe controller" + depends on PCIE_DW_ROCKCHIP + default y + help + Enables threaded initialize Rockchip DW based PCIe controller. + config PCI_EXYNOS bool "Samsung Exynos PCIe controller" depends on SOC_EXYNOS5440 || COMPILE_TEST diff --git a/kernel/drivers/pci/controller/dwc/pcie-designware-host.c b/kernel/drivers/pci/controller/dwc/pcie-designware-host.c index 0b61d3b..395d72e 100644 --- a/kernel/drivers/pci/controller/dwc/pcie-designware-host.c +++ b/kernel/drivers/pci/controller/dwc/pcie-designware-host.c @@ -82,7 +82,7 @@ u32 status, num_ctrls; irqreturn_t ret = IRQ_NONE; - num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; + num_ctrls = DIV_ROUND_UP(pp->num_vectors, MAX_MSI_IRQS_PER_CTRL); for (i = 0; i < num_ctrls; i++) { dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_STATUS + @@ -679,7 +679,7 @@ dw_pcie_setup(pci); - num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; + num_ctrls = DIV_ROUND_UP(pp->num_vectors, MAX_MSI_IRQS_PER_CTRL); /* Initialize IRQ Status array */ for (ctrl = 0; ctrl < num_ctrls; ctrl++) { diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c index 79af779..4b0d4d3 100644 --- a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c +++ b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c @@ -47,46 +47,16 @@ module_param(test_dev, uint, 0644); MODULE_PARM_DESC(test_dev, "Choose dma_obj device,(default 0)"); +static bool is_rc = true; +module_param_named(is_rc, is_rc, bool, 0644); +MODULE_PARM_DESC(is_rc, "Test port is rc(default true)"); + #define PCIE_DW_MISC_DMATEST_DEV_MAX 5 - -#define PCIE_DMA_OFFSET 0x380000 - -#define PCIE_DMA_CTRL_OFF 0x8 -#define PCIE_DMA_WR_ENB 0xc -#define PCIE_DMA_WR_CTRL_LO 0x200 -#define PCIE_DMA_WR_CTRL_HI 0x204 -#define PCIE_DMA_WR_XFERSIZE 0x208 -#define PCIE_DMA_WR_SAR_PTR_LO 0x20c -#define PCIE_DMA_WR_SAR_PTR_HI 0x210 -#define PCIE_DMA_WR_DAR_PTR_LO 0x214 -#define PCIE_DMA_WR_DAR_PTR_HI 0x218 -#define PCIE_DMA_WR_WEILO 0x18 -#define PCIE_DMA_WR_WEIHI 0x1c -#define PCIE_DMA_WR_DOORBELL 0x10 -#define PCIE_DMA_WR_INT_STATUS 0x4c -#define PCIE_DMA_WR_INT_MASK 0x54 -#define PCIE_DMA_WR_INT_CLEAR 0x58 - -#define PCIE_DMA_RD_ENB 0x2c -#define PCIE_DMA_RD_CTRL_LO 0x300 -#define PCIE_DMA_RD_CTRL_HI 0x304 -#define PCIE_DMA_RD_XFERSIZE 0x308 -#define PCIE_DMA_RD_SAR_PTR_LO 0x30c -#define PCIE_DMA_RD_SAR_PTR_HI 0x310 -#define PCIE_DMA_RD_DAR_PTR_LO 0x314 -#define PCIE_DMA_RD_DAR_PTR_HI 0x318 -#define PCIE_DMA_RD_WEILO 0x38 -#define PCIE_DMA_RD_WEIHI 0x3c -#define PCIE_DMA_RD_DOORBELL 0x30 -#define PCIE_DMA_RD_INT_STATUS 0xa0 -#define PCIE_DMA_RD_INT_MASK 0xa8 -#define PCIE_DMA_RD_INT_CLEAR 0xac #define PCIE_DMA_CHANEL_MAX_NUM 2 struct pcie_dw_dmatest_dev { struct dma_trx_obj *obj; - struct dw_pcie *pci; bool irq_en; struct completion rd_done[PCIE_DMA_CHANEL_MAX_NUM]; @@ -113,66 +83,22 @@ dev_info(s_dmatest_dev[test_dev].obj->dev, " is current test_dev\n"); } -static int rk_pcie_get_dma_status(struct dw_pcie *pci, u8 chn, enum dma_dir dir) -{ - union int_status status; - union int_clear clears; - int ret = 0; - - dev_dbg(pci->dev, "%s %x %x\n", __func__, dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS), - dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS)); - - if (dir == DMA_TO_BUS) { - status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS); - if (status.donesta & BIT(chn)) { - clears.doneclr = 0x1 << chn; - dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword); - ret = 1; - } - - if (status.abortsta & BIT(chn)) { - dev_err(pci->dev, "%s, write abort\n", __func__); - clears.abortclr = 0x1 << chn; - dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword); - ret = -1; - } - } else { - status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS); - - if (status.donesta & BIT(chn)) { - clears.doneclr = 0x1 << chn; - dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword); - ret = 1; - } - - if (status.abortsta & BIT(chn)) { - dev_err(pci->dev, "%s, read abort %x\n", __func__, status.asdword); - clears.abortclr = 0x1 << chn; - dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword); - ret = -1; - } - } - - return ret; -} - -static int rk_pcie_dma_wait_for_finised(struct dma_trx_obj *obj, struct dw_pcie *pci, struct dma_table *table) +static int rk_pcie_dma_wait_for_finised(struct dma_trx_obj *obj, struct dma_table *table) { int ret; do { - ret = rk_pcie_get_dma_status(pci, table->chn, table->dir); + ret = obj->get_dma_status(obj, table->chn, table->dir); } while (!ret); return ret; } -static int rk_pcie_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn, - u32 local_paddr, u32 bus_paddr, u32 size) +static int rk_pcie_ep_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn, + u32 local_paddr, u32 bus_paddr, u32 size) { struct dma_table *table; struct dma_trx_obj *obj = dmatest_dev->obj; - struct dw_pcie *pci = dmatest_dev->pci; int ret; if (chn >= PCIE_DMA_CHANEL_MAX_NUM) @@ -202,7 +128,7 @@ else if (ret == 0) dev_err(obj->dev, "%s timed out\n", __func__); } else { - ret = rk_pcie_dma_wait_for_finised(obj, pci, table); + ret = rk_pcie_dma_wait_for_finised(obj, table); } mutex_unlock(&dmatest_dev->rd_lock[chn]); @@ -211,12 +137,11 @@ return ret; } -static int rk_pcie_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn, - u32 bus_paddr, u32 local_paddr, u32 size) +static int rk_pcie_ep_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn, + u32 bus_paddr, u32 local_paddr, u32 size) { struct dma_table *table; struct dma_trx_obj *obj = dmatest_dev->obj; - struct dw_pcie *pci = dmatest_dev->pci; int ret; if (chn >= PCIE_DMA_CHANEL_MAX_NUM) @@ -246,13 +171,25 @@ else if (ret == 0) dev_err(obj->dev, "%s timed out\n", __func__); } else { - ret = rk_pcie_dma_wait_for_finised(obj, pci, table); + ret = rk_pcie_dma_wait_for_finised(obj, table); } mutex_unlock(&dmatest_dev->wr_lock[chn]); kfree(table); return ret; +} + +static int rk_pcie_rc_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn, + u32 local_paddr, u32 bus_paddr, u32 size) +{ + return rk_pcie_ep_dma_tobus(dmatest_dev, chn, local_paddr, bus_paddr, size); +} + +static int rk_pcie_rc_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn, + u32 bus_paddr, u32 local_paddr, u32 size) +{ + return rk_pcie_ep_dma_frombus(dmatest_dev, chn, bus_paddr, local_paddr, size); } static int rk_pcie_dma_interrupt_handler_call_back(struct dma_trx_obj *obj, u32 chn, enum dma_dir dir) @@ -270,23 +207,22 @@ return 0; } -struct dma_trx_obj *pcie_dw_dmatest_register(struct dw_pcie *pci, bool irq_en) +struct dma_trx_obj *pcie_dw_dmatest_register(struct device *dev, bool irq_en) { struct dma_trx_obj *obj; struct pcie_dw_dmatest_dev *dmatest_dev = &s_dmatest_dev[cur_dmatest_dev]; int i; - obj = devm_kzalloc(pci->dev, sizeof(struct dma_trx_obj), GFP_KERNEL); + obj = devm_kzalloc(dev, sizeof(struct dma_trx_obj), GFP_KERNEL); if (!obj) return ERR_PTR(-ENOMEM); - obj->dev = pci->dev; + obj->dev = dev; obj->priv = dmatest_dev; obj->cb = rk_pcie_dma_interrupt_handler_call_back; /* Save for dmatest */ dmatest_dev->obj = obj; - dmatest_dev->pci = pci; for (i = 0; i < PCIE_DMA_CHANEL_MAX_NUM; i++) { init_completion(&dmatest_dev->rd_done[i]); init_completion(&dmatest_dev->wr_done[i]); @@ -323,13 +259,19 @@ start_time = ktime_get(); for (i = 0; i < loop; i++) { if (rd_en) { - rk_pcie_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size); + if (is_rc) + rk_pcie_rc_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size); + else + rk_pcie_ep_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size); dma_sync_single_for_cpu(obj->dev, local_paddr, size, DMA_FROM_DEVICE); } if (wr_en) { dma_sync_single_for_device(obj->dev, local_paddr, size, DMA_TO_DEVICE); - rk_pcie_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size); + if (is_rc) + rk_pcie_rc_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size); + else + rk_pcie_ep_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size); } } end_time = ktime_get(); diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h index 524f5b5..cfed7aa 100644 --- a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h +++ b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h @@ -5,10 +5,13 @@ #ifndef __PCIE_DW_DMATEST_H #define __PCIE_DW_DMATEST_H +struct dma_trx_obj; +struct device; + #if IS_ENABLED(CONFIG_PCIE_DW_DMATEST) -struct dma_trx_obj *pcie_dw_dmatest_register(struct dw_pcie *pci, bool irq_en); +struct dma_trx_obj *pcie_dw_dmatest_register(struct device *dev, bool irq_en); #else -static inline struct dma_trx_obj *pcie_dw_dmatest_register(struct dw_pcie *pci, bool irq_en) +static inline struct dma_trx_obj *pcie_dw_dmatest_register(struct device *dev, bool irq_en) { return NULL; } diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c b/kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c index 9c6966f..09a5dc9 100644 --- a/kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c +++ b/kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c @@ -10,6 +10,7 @@ #include <linux/clk.h> #include <linux/gpio/consumer.h> +#include <linux/iopoll.h> #include <linux/miscdevice.h> #include <linux/mfd/syscon.h> #include <linux/module.h> @@ -81,7 +82,15 @@ #define PCIE_CLIENT_HOT_RESET_CTRL 0x180 #define PCIE_CLIENT_LTSSM_STATUS 0x300 #define PCIE_CLIENT_INTR_MASK 0x24 +#define PCIE_LTSSM_APP_DLY1_EN BIT(0) +#define PCIE_LTSSM_APP_DLY2_EN BIT(1) +#define PCIE_LTSSM_APP_DLY1_DONE BIT(2) +#define PCIE_LTSSM_APP_DLY2_DONE BIT(3) #define PCIE_LTSSM_ENABLE_ENHANCE BIT(4) +#define PCIE_CLIENT_MSI_GEN_CON 0x38 + +#define PCIe_CLIENT_MSI_OBJ_IRQ 0 /* rockchip ep object special irq */ + #define PCIE_ELBI_REG_NUM 0x2 #define PCIE_ELBI_LOCAL_BASE 0x200e00 @@ -99,6 +108,11 @@ #define PCIE_DBI_SIZE 0x400000 +#define PCIE_EP_OBJ_INFO_DRV_VERSION 0x00000001 + +#define PCIE_BAR_MAX_NUM 6 +#define PCIE_HOTRESET_TMOUT_US 10000 + struct rockchip_pcie { struct dw_pcie pci; void __iomem *apb_base; @@ -113,13 +127,17 @@ u32 num_ib_windows; u32 num_ob_windows; phys_addr_t *outbound_addr; - u8 bar_to_atu[6]; - dma_addr_t ib_target_address; - u32 ib_target_size; - void *ib_target_base; + u8 bar_to_atu[PCIE_BAR_MAX_NUM]; + dma_addr_t ib_target_address[PCIE_BAR_MAX_NUM]; + u32 ib_target_size[PCIE_BAR_MAX_NUM]; + void *ib_target_base[PCIE_BAR_MAX_NUM]; struct dma_trx_obj *dma_obj; struct fasync_struct *async; phys_addr_t dbi_base_physical; + struct pcie_ep_obj_info *obj_info; + enum pcie_ep_mmap_resource cur_mmap_res; + struct workqueue_struct *hot_rst_wq; + struct work_struct hot_rst_work; }; struct rockchip_pcie_misc_dev { @@ -138,6 +156,12 @@ }; MODULE_DEVICE_TABLE(of, rockchip_pcie_ep_of_match); + +static void rockchip_pcie_devmode_update(struct rockchip_pcie *rockchip, int mode, int submode) +{ + rockchip->obj_info->devmode.mode = mode; + rockchip->obj_info->devmode.submode = submode; +} static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip, u32 reg) { @@ -186,6 +210,8 @@ struct resource *apb_base; struct device_node *mem; struct resource reg; + char name[8]; + int i, idx; dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcie-dbi"); @@ -255,22 +281,42 @@ rockchip->outbound_addr = addr; - mem = of_parse_phandle(np, "memory-region", 0); - if (!mem) { - dev_err(dev, "missing \"memory-region\" property\n"); - return -ENODEV; + for (i = 0; i < PCIE_BAR_MAX_NUM; i++) { + snprintf(name, sizeof(name), "bar%d", i); + idx = of_property_match_string(np, "memory-region-names", name); + if (idx < 0) + continue; + + mem = of_parse_phandle(np, "memory-region", idx); + if (!mem) { + dev_err(dev, "missing \"memory-region\" %s property\n", name); + return -ENODEV; + } + + ret = of_address_to_resource(mem, 0, ®); + if (ret < 0) { + dev_err(dev, "missing \"reg\" %s property\n", name); + return -ENODEV; + } + + rockchip->ib_target_address[i] = reg.start; + rockchip->ib_target_size[i] = resource_size(®); + rockchip->ib_target_base[i] = rockchip_pcie_map_kernel(reg.start, + resource_size(®)); + dev_info(dev, "%s: assigned [0x%llx-%llx]\n", name, rockchip->ib_target_address[i], + rockchip->ib_target_address[i] + rockchip->ib_target_size[i] - 1); } - ret = of_address_to_resource(mem, 0, ®); - if (ret < 0) { - dev_err(dev, "missing \"reg\" property\n"); + if (rockchip->ib_target_size[0]) { + rockchip->obj_info = (struct pcie_ep_obj_info *)rockchip->ib_target_base[0]; + memset_io(rockchip->obj_info, 0, sizeof(struct pcie_ep_obj_info)); + rockchip->obj_info->magic = PCIE_EP_OBJ_INFO_MAGIC; + rockchip->obj_info->version = PCIE_EP_OBJ_INFO_DRV_VERSION; + rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_INIT); + } else { + dev_err(dev, "missing bar0 memory region\n"); return -ENODEV; } - - rockchip->ib_target_address = reg.start; - rockchip->ib_target_size = resource_size(®); - rockchip->ib_target_base = rockchip_pcie_map_kernel(reg.start, - resource_size(®)); return 0; } @@ -485,24 +531,27 @@ resbar_base = rockchip_pci_find_resbar_capability(rockchip); - /* Resize BAR0 4M 32bits, BAR2 64M 64bits-pref */ - bar = 0; + /* Resize BAR0 4M 32bits, BAR2 64M 64bits-pref, BAR4 1MB 32bits */ + bar = BAR_0; dw_pcie_writel_dbi(pci, resbar_base + 0x4 + bar * 0x8, 0xfffff0); dw_pcie_writel_dbi(pci, resbar_base + 0x8 + bar * 0x8, 0x2c0); - rockchip_pcie_ep_set_bar_flag(rockchip, BAR_0, PCI_BASE_ADDRESS_MEM_TYPE_32); + rockchip_pcie_ep_set_bar_flag(rockchip, bar, PCI_BASE_ADDRESS_MEM_TYPE_32); - bar = 2; + bar = BAR_2; dw_pcie_writel_dbi(pci, resbar_base + 0x4 + bar * 0x8, 0xfffff0); dw_pcie_writel_dbi(pci, resbar_base + 0x8 + bar * 0x8, 0x6c0); - rockchip_pcie_ep_set_bar_flag(rockchip, BAR_2, + rockchip_pcie_ep_set_bar_flag(rockchip, bar, PCI_BASE_ADDRESS_MEM_PREFETCH | PCI_BASE_ADDRESS_MEM_TYPE_64); - /* Disable BAR1 BAR4 BAR5*/ - bar = 1; + bar = BAR_4; + dw_pcie_writel_dbi(pci, resbar_base + 0x4 + bar * 0x8, 0xfffff0); + dw_pcie_writel_dbi(pci, resbar_base + 0x8 + bar * 0x8, 0xc0); + rockchip_pcie_ep_set_bar_flag(rockchip, bar, PCI_BASE_ADDRESS_MEM_TYPE_32); + + /* Disable BAR1 BAR5*/ + bar = BAR_1; dw_pcie_writel_dbi(pci, PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + bar * 4, 0); - bar = 4; - dw_pcie_writel_dbi(pci, PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + bar * 4, 0); - bar = 5; + bar = BAR_5; dw_pcie_writel_dbi(pci, PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + bar * 4, 0); } @@ -514,14 +563,13 @@ dw_pcie_writew_dbi(pci, PCI_CLASS_DEVICE, 0x0580); } -static int rockchip_pcie_ep_set_bar(struct rockchip_pcie *rockchip) +static int rockchip_pcie_ep_set_bar(struct rockchip_pcie *rockchip, enum pci_barno bar, + dma_addr_t cpu_addr) { int ret; u32 free_win; struct dw_pcie *pci = &rockchip->pci; - enum pci_barno bar; enum dw_pcie_as_type as_type; - dma_addr_t cpu_addr; free_win = find_first_zero_bit(rockchip->ib_window_map, rockchip->num_ib_windows); @@ -531,8 +579,6 @@ } as_type = DW_PCIE_AS_MEM; - bar = BAR_0; - cpu_addr = rockchip->ib_target_address; ret = dw_pcie_prog_inbound_atu(pci, free_win, bar, cpu_addr, as_type); if (ret < 0) { @@ -544,7 +590,6 @@ set_bit(free_win, rockchip->ib_window_map); return 0; - } static void rockchip_pcie_fast_link_setup(struct rockchip_pcie *rockchip) @@ -553,7 +598,8 @@ /* LTSSM EN ctrl mode */ val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL); - val |= PCIE_LTSSM_ENABLE_ENHANCE | (PCIE_LTSSM_ENABLE_ENHANCE << 16); + val |= (PCIE_LTSSM_ENABLE_ENHANCE | PCIE_LTSSM_APP_DLY2_EN) | + ((PCIE_LTSSM_ENABLE_ENHANCE | PCIE_LTSSM_APP_DLY2_EN) << 16); rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL); } @@ -571,98 +617,117 @@ static void rockchip_pcie_local_elbi_enable(struct rockchip_pcie *rockchip) { int i; - u32 dlbi_reg; + u32 elbi_reg; struct dw_pcie *pci = &rockchip->pci; for (i = 0; i < PCIE_ELBI_REG_NUM; i++) { - dlbi_reg = PCIE_ELBI_LOCAL_BASE + PCIE_ELBI_LOCAL_ENABLE_OFF + + elbi_reg = PCIE_ELBI_LOCAL_BASE + PCIE_ELBI_LOCAL_ENABLE_OFF + i * 4; - dw_pcie_writel_dbi(pci, dlbi_reg, 0xffff0000); + dw_pcie_writel_dbi(pci, elbi_reg, 0xffff0000); } } static void rockchip_pcie_elbi_clear(struct rockchip_pcie *rockchip) { int i; - u32 dlbi_reg; + u32 elbi_reg; struct dw_pcie *pci = &rockchip->pci; u32 val; for (i = 0; i < PCIE_ELBI_REG_NUM; i++) { - dlbi_reg = PCIE_ELBI_LOCAL_BASE + i * 4; - val = dw_pcie_readl_dbi(pci, dlbi_reg); + elbi_reg = PCIE_ELBI_LOCAL_BASE + i * 4; + val = dw_pcie_readl_dbi(pci, elbi_reg); val <<= 16; - dw_pcie_writel_dbi(pci, dlbi_reg, val); + dw_pcie_writel_dbi(pci, elbi_reg, val); } +} + +static void rockchip_pcie_raise_msi_irq(struct rockchip_pcie *rockchip, u8 interrupt_num) +{ + rockchip_pcie_writel_apb(rockchip, BIT(interrupt_num), PCIE_CLIENT_MSI_GEN_CON); } static irqreturn_t rockchip_pcie_sys_irq_handler(int irq, void *arg) { struct rockchip_pcie *rockchip = arg; struct dw_pcie *pci = &rockchip->pci; - u32 dlbi_reg; + u32 elbi_reg; u32 chn; - union int_status status; + union int_status wr_status, rd_status; union int_clear clears; - u32 reg, val; + u32 reg, mask; + bool sigio = false; /* ELBI helper, only check the valid bits, and discard the rest interrupts */ - dlbi_reg = dw_pcie_readl_dbi(pci, PCIE_ELBI_LOCAL_BASE + PCIE_ELBI_APP_ELBI_INT_GEN0); - if (dlbi_reg & PCIE_ELBI_APP_ELBI_INT_GEN0_SIGIO) { - dev_dbg(rockchip->pci.dev, "SIGIO\n"); - kill_fasync(&rockchip->async, SIGIO, POLL_IN); + elbi_reg = dw_pcie_readl_dbi(pci, PCIE_ELBI_LOCAL_BASE + PCIE_ELBI_APP_ELBI_INT_GEN0); + if (elbi_reg & PCIE_ELBI_APP_ELBI_INT_GEN0_SIGIO) { + sigio = true; + rockchip->obj_info->irq_type_ep = OBJ_IRQ_ELBI; + rockchip_pcie_elbi_clear(rockchip); + goto out; } - rockchip_pcie_elbi_clear(rockchip); - /* DMA helper */ - status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + - PCIE_DMA_WR_INT_STATUS); + mask = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_MASK); + wr_status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS) & (~mask); + mask = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_MASK); + rd_status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS) & (~mask); + for (chn = 0; chn < PCIE_DMA_CHANEL_MAX_NUM; chn++) { - if (status.donesta & BIT(chn)) { - clears.doneclr = 0x1 << chn; + if (wr_status.donesta & BIT(chn)) { + clears.doneclr = BIT(chn); dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword); if (rockchip->dma_obj && rockchip->dma_obj->cb) rockchip->dma_obj->cb(rockchip->dma_obj, chn, DMA_TO_BUS); } - if (status.abortsta & BIT(chn)) { + if (wr_status.abortsta & BIT(chn)) { dev_err(pci->dev, "%s, abort\n", __func__); - clears.abortclr = 0x1 << chn; + clears.abortclr = BIT(chn); dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword); } } - status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + - PCIE_DMA_RD_INT_STATUS); for (chn = 0; chn < PCIE_DMA_CHANEL_MAX_NUM; chn++) { - if (status.donesta & BIT(chn)) { - clears.doneclr = 0x1 << chn; + if (rd_status.donesta & BIT(chn)) { + clears.doneclr = BIT(chn); dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword); if (rockchip->dma_obj && rockchip->dma_obj->cb) rockchip->dma_obj->cb(rockchip->dma_obj, chn, DMA_FROM_BUS); } - if (status.abortsta & BIT(chn)) { + if (rd_status.abortsta & BIT(chn)) { dev_err(pci->dev, "%s, abort\n", __func__); - clears.abortclr = 0x1 << chn; + clears.abortclr = BIT(chn); dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword); } } - reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC); - if (reg & BIT(2)) { - /* Setup command register */ - val = dw_pcie_readl_dbi(pci, PCI_COMMAND); - val &= 0xffff0000; - val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | - PCI_COMMAND_MASTER | PCI_COMMAND_SERR; - dw_pcie_writel_dbi(pci, PCI_COMMAND, val); + if (wr_status.asdword || rd_status.asdword) { + rockchip->obj_info->irq_type_rc = OBJ_IRQ_DMA; + rockchip->obj_info->dma_status_rc.wr |= wr_status.asdword; + rockchip->obj_info->dma_status_rc.rd |= rd_status.asdword; + rockchip_pcie_raise_msi_irq(rockchip, PCIe_CLIENT_MSI_OBJ_IRQ); + + rockchip->obj_info->irq_type_ep = OBJ_IRQ_DMA; + rockchip->obj_info->dma_status_ep.wr |= wr_status.asdword; + rockchip->obj_info->dma_status_ep.rd |= rd_status.asdword; + sigio = true; } + +out: + if (sigio) { + dev_dbg(rockchip->pci.dev, "SIGIO\n"); + kill_fasync(&rockchip->async, SIGIO, POLL_IN); + } + + reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC); + if (reg & BIT(2)) + queue_work(rockchip->hot_rst_wq, &rockchip->hot_rst_work); rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC); @@ -706,7 +771,7 @@ if (!rockchip_pcie_udma_enabled(rockchip)) return 0; - rockchip->dma_obj = pcie_dw_dmatest_register(pci, true); + rockchip->dma_obj = pcie_dw_dmatest_register(pci->dev, true); if (IS_ERR(rockchip->dma_obj)) { dev_err(rockchip->pci.dev, "failed to prepare dmatest\n"); return -EINVAL; @@ -812,6 +877,73 @@ table->start.chnl = table->chn; } +static void rockchip_pcie_hot_rst_work(struct work_struct *work) +{ + struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie, hot_rst_work); + u32 status; + int ret; + + if (rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL) & PCIE_LTSSM_APP_DLY2_EN) { + ret = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_LTSSM_STATUS, + status, ((status & 0x3F) == 0), 100, PCIE_HOTRESET_TMOUT_US); + if (ret) + dev_err(rockchip->pci.dev, "wait for detect quiet failed!\n"); + + rockchip_pcie_writel_apb(rockchip, (PCIE_LTSSM_APP_DLY2_DONE) | ((PCIE_LTSSM_APP_DLY2_DONE) << 16), + PCIE_CLIENT_HOT_RESET_CTRL); + } +} + +static int rockchip_pcie_get_dma_status(struct dma_trx_obj *obj, u8 chn, enum dma_dir dir) +{ + struct rockchip_pcie *rockchip = dev_get_drvdata(obj->dev); + struct dw_pcie *pci = &rockchip->pci; + union int_status status; + union int_clear clears; + int ret = 0; + + dev_dbg(pci->dev, "%s %x %x\n", __func__, + dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS), + dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS)); + + if (dir == DMA_TO_BUS) { + status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS); + if (status.donesta & BIT(chn)) { + clears.doneclr = BIT(chn); + dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + + PCIE_DMA_WR_INT_CLEAR, clears.asdword); + ret = 1; + } + + if (status.abortsta & BIT(chn)) { + dev_err(pci->dev, "%s, write abort\n", __func__); + clears.abortclr = BIT(chn); + dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + + PCIE_DMA_WR_INT_CLEAR, clears.asdword); + ret = -1; + } + } else { + status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS); + + if (status.donesta & BIT(chn)) { + clears.doneclr = BIT(chn); + dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + + PCIE_DMA_RD_INT_CLEAR, clears.asdword); + ret = 1; + } + + if (status.abortsta & BIT(chn)) { + dev_err(pci->dev, "%s, read abort %x\n", __func__, status.asdword); + clears.abortclr = BIT(chn); + dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + + PCIE_DMA_RD_INT_CLEAR, clears.asdword); + ret = -1; + } + } + + return ret; +} + static const struct dw_pcie_ops dw_pcie_ops = { .start_link = rockchip_pcie_start_link, .link_up = rockchip_pcie_link_up, @@ -847,6 +979,7 @@ struct pcie_ep_dma_cache_cfg cfg; void __user *uarg = (void __user *)arg; int i, ret; + enum pcie_ep_mmap_resource mmap_res; switch (cmd) { case PCIE_DMA_GET_ELBI_DATA: @@ -885,6 +1018,33 @@ dw_pcie_writel_dbi(&rockchip->pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_MASK, 0xffffffff); break; + case PCIE_DMA_RAISE_MSI_OBJ_IRQ_USER: + rockchip->obj_info->irq_type_rc = OBJ_IRQ_USER; + rockchip_pcie_raise_msi_irq(rockchip, PCIe_CLIENT_MSI_OBJ_IRQ); + break; + case PCIE_EP_GET_USER_INFO: + msg.bar0_phys_addr = rockchip->ib_target_address[0]; + + ret = copy_to_user(uarg, &msg, sizeof(msg)); + if (ret) { + dev_err(rockchip->pci.dev, "failed to get elbi data\n"); + return -EFAULT; + } + break; + case PCIE_EP_SET_MMAP_RESOURCE: + ret = copy_from_user(&mmap_res, uarg, sizeof(mmap_res)); + if (ret) { + dev_err(rockchip->pci.dev, "failed to get copy from\n"); + return -EFAULT; + } + + if (mmap_res >= PCIE_EP_MMAP_RESOURCE_MAX) { + dev_err(rockchip->pci.dev, "mmap index %d is out of number\n", mmap_res); + return -EINVAL; + } + + rockchip->cur_mmap_res = mmap_res; + break; default: break; } @@ -896,18 +1056,45 @@ struct rockchip_pcie *rockchip = (struct rockchip_pcie *)file->private_data; size_t size = vma->vm_end - vma->vm_start; int err; + unsigned long addr; - if (size > PCIE_DBI_SIZE) { - dev_warn(rockchip->pci.dev, "mmap size is out of limitation\n"); + switch (rockchip->cur_mmap_res) { + case PCIE_EP_MMAP_RESOURCE_DBI: + if (size > PCIE_DBI_SIZE) { + dev_warn(rockchip->pci.dev, "dbi mmap size is out of limitation\n"); + return -EINVAL; + } + addr = rockchip->dbi_base_physical; + break; + case PCIE_EP_MMAP_RESOURCE_BAR0: + if (size > rockchip->ib_target_size[0]) { + dev_warn(rockchip->pci.dev, "bar0 mmap size is out of limitation\n"); + return -EINVAL; + } + addr = rockchip->ib_target_address[0]; + break; + case PCIE_EP_MMAP_RESOURCE_BAR2: + if (size > rockchip->ib_target_size[2]) { + dev_warn(rockchip->pci.dev, "bar2 mmap size is out of limitation\n"); + return -EINVAL; + } + addr = rockchip->ib_target_address[2]; + break; + default: + dev_err(rockchip->pci.dev, "cur mmap_res %d is unsurreport\n", rockchip->cur_mmap_res); return -EINVAL; } vma->vm_flags |= VM_IO; vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP); - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + + if (rockchip->cur_mmap_res == PCIE_EP_MMAP_RESOURCE_BAR2) + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); + else + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); err = remap_pfn_range(vma, vma->vm_start, - __phys_to_pfn(rockchip->dbi_base_physical), + __phys_to_pfn(addr), size, vma->vm_page_prot); if (err) return -EAGAIN; @@ -941,13 +1128,13 @@ ret = misc_register(&pcie_dev->dev); if (ret) { - pr_err("pcie: failed to register misc device.\n"); + dev_err(rockchip->pci.dev, "pcie: failed to register misc device.\n"); return ret; } pcie_dev->pcie = rockchip; - pr_info("register misc device pcie-dev\n"); + dev_info(rockchip->pci.dev, "register misc device pcie_ep\n"); return 0; } @@ -957,7 +1144,8 @@ struct device *dev = &pdev->dev; struct rockchip_pcie *rockchip; int ret; - int retry; + int retry, i; + u32 reg; rockchip = devm_kzalloc(dev, sizeof(*rockchip), GFP_KERNEL); if (!rockchip) @@ -993,8 +1181,10 @@ goto disable_regulator; if (dw_pcie_link_up(&rockchip->pci)) { - pr_info("%s, %d, already linkup\n", __func__, __LINE__); + dev_info(dev, "already linkup\n"); goto already_linkup; + } else { + dev_info(dev, "initial\n"); } ret = rockchip_pcie_phy_init(rockchip); @@ -1015,6 +1205,27 @@ rockchip_pcie_fast_link_setup(rockchip); rockchip_pcie_start_link(&rockchip->pci); + rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_LNKRDY); + + rockchip->hot_rst_wq = create_singlethread_workqueue("rkep_hot_rst_wq"); + if (!rockchip->hot_rst_wq) { + dev_err(dev, "failed to create hot_rst workqueue\n"); + ret = -ENOMEM; + goto deinit_phy; + } + INIT_WORK(&rockchip->hot_rst_work, rockchip_pcie_hot_rst_work); + + reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC); + if ((reg & BIT(2)) && + (rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL) & PCIE_LTSSM_APP_DLY2_EN)) { + rockchip_pcie_writel_apb(rockchip, PCIE_LTSSM_APP_DLY2_DONE | (PCIE_LTSSM_APP_DLY2_DONE << 16), + PCIE_CLIENT_HOT_RESET_CTRL); + dev_info(dev, "hot reset ever\n"); + } + rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC); + + /* Enable client reset or link down interrupt */ + rockchip_pcie_writel_apb(rockchip, 0x40000, PCIE_CLIENT_INTR_MASK); for (retry = 0; retry < 10000; retry++) { if (dw_pcie_link_up(&rockchip->pci)) { @@ -1042,8 +1253,11 @@ } already_linkup: + rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_LNKUP); rockchip->pci.iatu_unroll_enabled = rockchip_pcie_iatu_unroll_enabled(&rockchip->pci); - rockchip_pcie_ep_set_bar(rockchip); + for (i = 0; i < PCIE_BAR_MAX_NUM; i++) + if (rockchip->ib_target_size[i]) + rockchip_pcie_ep_set_bar(rockchip, i, rockchip->ib_target_address[i]); ret = rockchip_pcie_init_dma_trx(rockchip); if (ret) { @@ -1054,6 +1268,7 @@ if (rockchip->dma_obj) { rockchip->dma_obj->start_dma_func = rockchip_pcie_start_dma_dwc; rockchip->dma_obj->config_dma_func = rockchip_pcie_config_dma_dwc; + rockchip->dma_obj->get_dma_status = rockchip_pcie_get_dma_status; } /* Enable client ELBI interrupt */ @@ -1086,9 +1301,10 @@ .of_match_table = rockchip_pcie_ep_of_match, .suppress_bind_attrs = true, }, + .probe = rockchip_pcie_ep_probe, }; -module_platform_driver_probe(rk_plat_pcie_driver, rockchip_pcie_ep_probe); +module_platform_driver(rk_plat_pcie_driver); MODULE_AUTHOR("Simon Xue <xxm@rock-chips.com>"); MODULE_DESCRIPTION("RockChip PCIe Controller EP driver"); diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c index 0dce4b6..33b6dc3 100644 --- a/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c +++ b/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c @@ -34,6 +34,7 @@ #include <linux/regmap.h> #include <linux/reset.h> #include <linux/resource.h> +#include <linux/rfkill-wlan.h> #include <linux/signal.h> #include <linux/types.h> #include <linux/uaccess.h> @@ -53,6 +54,8 @@ const char *id; struct reset_control *rst; }; + +#define RK_PCIE_DBG 0 #define PCIE_DMA_OFFSET 0x380000 @@ -120,7 +123,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 #define PCIE_PHY_LINKUP BIT(0) #define PCIE_DATA_LINKUP BIT(1) @@ -147,6 +149,7 @@ unsigned int clk_cnt; struct reset_bulk_data *rsts; struct gpio_desc *rst_gpio; + struct gpio_desc *prsnt_gpio; phys_addr_t mem_start; size_t mem_size; struct pcie_port pp; @@ -154,6 +157,7 @@ struct regmap *pmu_grf; struct dma_trx_obj *dma_obj; bool in_suspend; + bool skip_scan_in_resume; bool is_rk1808; bool is_signal_test; bool bifurcation; @@ -161,10 +165,12 @@ struct irq_domain *irq_domain; raw_spinlock_t intx_lock; struct dentry *debugfs; + u32 msi_vector_num; }; struct rk_pcie_of_data { enum rk_pcie_device_mode mode; + u32 msi_vector_num; }; #define to_rk_pcie(x) dev_get_drvdata((x)->dev) @@ -410,8 +416,7 @@ return 1; } else { val = rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_LTSSM_STATUS); - if ((val & (RDLH_LINKUP | SMLH_LINKUP)) == 0x30000 && - (val & GENMASK(5, 0)) == 0x11) + if ((val & (RDLH_LINKUP | SMLH_LINKUP)) == 0x30000) return 1; } @@ -453,10 +458,16 @@ static int rk_pcie_establish_link(struct dw_pcie *pci) { - int retries; + int retries, power; struct rk_pcie *rk_pcie = to_rk_pcie(pci); + bool std_rc = rk_pcie->mode == RK_PCIE_RC_TYPE && !rk_pcie->dma_obj; - if (dw_pcie_link_up(pci)) { + /* + * For standard RC, even if the link has been setup by firmware, + * we still need to reset link as we need to remove all resource info + * from devices, for instance BAR, as it wasn't assigned by kernel. + */ + if (dw_pcie_link_up(pci) && !std_rc) { dev_err(pci->dev, "link is already up\n"); return 0; } @@ -472,6 +483,21 @@ rk_pcie_enable_ltssm(rk_pcie); /* + * In resume routine, function devices' resume function must be late after + * controllers'. Some devices, such as Wi-Fi, need special IO setting before + * finishing training. So there must be timeout here. These kinds of devices + * need rescan devices by its driver when used. So no need to waste time waiting + * for training pass. + */ + if (rk_pcie->in_suspend && rk_pcie->skip_scan_in_resume) { + rfkill_get_wifi_power_state(&power); + if (!power) { + gpiod_set_value_cansleep(rk_pcie->rst_gpio, 1); + return 0; + } + } + + /* * PCIe requires the refclk to be stable for 100µs prior to releasing * PERST and T_PVPERL (Power stable to PERST# inactive) should be a * minimum of 100ms. See table 2-4 in section 2.6.2 AC, the PCI Express @@ -480,6 +506,12 @@ */ msleep(1000); gpiod_set_value_cansleep(rk_pcie->rst_gpio, 1); + + /* + * Add this 1ms delay because we observe link is always up stably after it and + * could help us save 20ms for scanning devices. + */ + usleep_range(1000, 1100); for (retries = 0; retries < 10; retries++) { if (dw_pcie_link_up(pci)) { @@ -516,7 +548,7 @@ return -EINVAL; } - rk_pcie->dma_obj = pcie_dw_dmatest_register(rk_pcie->pci, true); + rk_pcie->dma_obj = pcie_dw_dmatest_register(rk_pcie->pci->dev, true); if (IS_ERR(rk_pcie->dma_obj)) { dev_err(rk_pcie->pci->dev, "failed to prepare dmatest\n"); return -EINVAL; @@ -675,6 +707,14 @@ return 0; } +static void rk_pcie_msi_set_num_vectors(struct pcie_port *pp) +{ + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); + struct rk_pcie *rk_pcie = to_rk_pcie(pci); + + pp->num_vectors = rk_pcie->msi_vector_num; +} + static int rk_pcie_host_init(struct pcie_port *pp) { int ret; @@ -707,6 +747,9 @@ if (pp->msi_irq < 0) { dev_info(dev, "use outband MSI support"); rk_pcie_host_ops.msi_host_init = rk_pcie_msi_host_init; + } else { + dev_info(dev, "max MSI vector is %d\n", rk_pcie->msi_vector_num); + rk_pcie_host_ops.set_num_vectors = rk_pcie_msi_set_num_vectors; } } @@ -864,6 +907,10 @@ dev_err(&pdev->dev, "invalid reset-gpios property in node\n"); return PTR_ERR(rk_pcie->rst_gpio); } + + rk_pcie->prsnt_gpio = devm_gpiod_get_optional(&pdev->dev, "prsnt", GPIOD_IN); + if (IS_ERR_OR_NULL(rk_pcie->prsnt_gpio)) + dev_info(&pdev->dev, "invalid prsnt-gpios property in node\n"); return 0; } @@ -1149,6 +1196,11 @@ .mode = RK_PCIE_EP_TYPE, }; +static const struct rk_pcie_of_data rk3528_pcie_rc_of_data = { + .mode = RK_PCIE_RC_TYPE, + .msi_vector_num = 8, +}; + static const struct of_device_id rk_pcie_of_match[] = { { .compatible = "rockchip,rk1808-pcie", @@ -1157,6 +1209,10 @@ { .compatible = "rockchip,rk1808-pcie-ep", .data = &rk_pcie_ep_of_data, + }, + { + .compatible = "rockchip,rk3528-pcie", + .data = &rk3528_pcie_rc_of_data, }, { .compatible = "rockchip,rk3568-pcie", @@ -1529,28 +1585,35 @@ enum rk_pcie_device_mode mode; struct device_node *np = pdev->dev.of_node; struct platform_driver *drv = to_platform_driver(dev->driver); - u32 val; + u32 val = 0; int irq; match = of_match_device(rk_pcie_of_match, dev); - if (!match) - return -EINVAL; + if (!match) { + ret = -EINVAL; + goto release_driver; + } data = (struct rk_pcie_of_data *)match->data; mode = (enum rk_pcie_device_mode)data->mode; rk_pcie = devm_kzalloc(dev, sizeof(*rk_pcie), GFP_KERNEL); - if (!rk_pcie) - return -ENOMEM; + if (!rk_pcie) { + ret = -ENOMEM; + goto release_driver; + } pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL); - if (!pci) - return -ENOMEM; + if (!pci) { + ret = -ENOMEM; + goto release_driver; + } pci->dev = dev; pci->ops = &dw_pcie_ops; rk_pcie->mode = mode; + rk_pcie->msi_vector_num = data->msi_vector_num; rk_pcie->pci = pci; if (of_device_is_compatible(np, "rockchip,rk1808-pcie") || @@ -1565,20 +1628,38 @@ ret = rk_pcie_resource_get(pdev, rk_pcie); if (ret) { dev_err(dev, "resource init failed\n"); - return ret; + goto release_driver; } + if (!IS_ERR_OR_NULL(rk_pcie->prsnt_gpio)) { + if (!gpiod_get_value(rk_pcie->prsnt_gpio)) { + ret = -ENODEV; + goto release_driver; + } + } + +retry_regulator: /* DON'T MOVE ME: must be enable before phy init */ rk_pcie->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3"); if (IS_ERR(rk_pcie->vpcie3v3)) { - if (PTR_ERR(rk_pcie->vpcie3v3) != -ENODEV) - return PTR_ERR(rk_pcie->vpcie3v3); + if (PTR_ERR(rk_pcie->vpcie3v3) != -ENODEV) { + if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT)) { + /* Deferred but in threaded context for most 10s */ + msleep(20); + if (++val < 500) + goto retry_regulator; + } + + ret = PTR_ERR(rk_pcie->vpcie3v3); + goto release_driver; + } + dev_info(dev, "no vpcie3v3 regulator found\n"); } ret = rk_pcie_enable_power(rk_pcie); if (ret) - return ret; + goto release_driver; ret = rk_pcie_phy_init(rk_pcie); if (ret) { @@ -1589,13 +1670,13 @@ ret = rk_pcie_reset_control_release(rk_pcie); if (ret) { dev_err(dev, "reset control init failed\n"); - goto disable_vpcie3v3; + goto disable_phy; } ret = rk_pcie_request_sys_irq(rk_pcie, pdev); if (ret) { dev_err(dev, "pcie irq init failed\n"); - goto disable_vpcie3v3; + goto disable_phy; } platform_set_drvdata(pdev, rk_pcie); @@ -1603,7 +1684,7 @@ ret = rk_pcie_clk_init(rk_pcie); if (ret) { dev_err(dev, "clock init failed\n"); - goto disable_vpcie3v3; + goto disable_phy; } dw_pcie_dbi_ro_wr_en(pci); @@ -1626,9 +1707,9 @@ /* Unmask all legacy interrupt from INTA~INTD */ rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_INTR_MASK_LEGACY, UNMASK_ALL_LEGACY_INT); + } else { + dev_info(dev, "missing legacy IRQ resource\n"); } - - dev_info(dev, "missing legacy IRQ resource\n"); } /* Set PCIe mode */ @@ -1649,6 +1730,10 @@ dw_pcie_writel_dbi(pci, PCIE_CAP_LINK_CONTROL2_LINK_STATUS, val); rk_pcie->is_signal_test = true; } + + /* Skip waiting for training to pass in system PM routine */ + if (device_property_read_bool(dev, "rockchip,skip-scan-in-resume")) + rk_pcie->skip_scan_in_resume = true; switch (rk_pcie->mode) { case RK_PCIE_RC_TYPE: @@ -1709,24 +1794,36 @@ remove_irq_domain: if (rk_pcie->irq_domain) irq_domain_remove(rk_pcie->irq_domain); +disable_phy: + phy_power_off(rk_pcie->phy); + phy_exit(rk_pcie->phy); deinit_clk: rk_pcie_clk_deinit(rk_pcie); disable_vpcie3v3: rk_pcie_disable_power(rk_pcie); + +release_driver: + if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT)) + device_release_driver(dev); return ret; } static int rk_pcie_probe(struct platform_device *pdev) { - struct task_struct *tsk; + if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT)) { + struct task_struct *tsk; - tsk = kthread_run(rk_pcie_really_probe, pdev, "rk-pcie"); - if (IS_ERR(tsk)) { - dev_err(&pdev->dev, "start rk-pcie thread failed\n"); - return PTR_ERR(tsk); + tsk = kthread_run(rk_pcie_really_probe, pdev, "rk-pcie"); + if (IS_ERR(tsk)) { + dev_err(&pdev->dev, "start rk-pcie thread failed\n"); + return PTR_ERR(tsk); + } + + return 0; } - return 0; + + return rk_pcie_really_probe(pdev); } static int __maybe_unused rockchip_dw_pcie_suspend(struct device *dev) @@ -1749,9 +1846,6 @@ gpiod_set_value_cansleep(rk_pcie->rst_gpio, 0); ret = rk_pcie_disable_power(rk_pcie); - - if (rk_pcie->pci->pp.msi_irq > 0) - dw_pcie_free_msi(&rk_pcie->pci->pp); return ret; } @@ -1811,9 +1905,6 @@ goto err; } - if (rk_pcie->pci->pp.msi_irq > 0) - dw_pcie_msi_init(&rk_pcie->pci->pp); - if (std_rc) goto std_rc_done; @@ -1836,6 +1927,9 @@ goto err; } + if (rk_pcie->pci->pp.msi_irq > 0) + dw_pcie_msi_init(&rk_pcie->pci->pp); + return 0; err: rk_pcie_disable_power(rk_pcie); diff --git a/kernel/drivers/pci/controller/rockchip-pcie-dma.h b/kernel/drivers/pci/controller/rockchip-pcie-dma.h index 8ac55f0..e9da2d0 100644 --- a/kernel/drivers/pci/controller/rockchip-pcie-dma.h +++ b/kernel/drivers/pci/controller/rockchip-pcie-dma.h @@ -190,6 +190,7 @@ struct pcie_misc_dev *pcie_dev; void (*start_dma_func)(struct dma_trx_obj *obj, struct dma_table *table); void (*config_dma_func)(struct dma_table *table); + int (*get_dma_status)(struct dma_trx_obj *obj, u8 chn, enum dma_dir dir); int (*cb)(struct dma_trx_obj *obj, u32 chn, enum dma_dir dir); ktime_t begin; ktime_t end; diff --git a/kernel/drivers/pci/switch/switchtec.c b/kernel/drivers/pci/switch/switchtec.c index 291c007..25d1f96 100644 --- a/kernel/drivers/pci/switch/switchtec.c +++ b/kernel/drivers/pci/switch/switchtec.c @@ -43,10 +43,11 @@ enum mrpc_state state; - struct completion comp; + wait_queue_head_t cmd_comp; struct kref kref; struct list_head list; + bool cmd_done; u32 cmd; u32 status; u32 return_code; @@ -68,7 +69,7 @@ stuser->stdev = stdev; kref_init(&stuser->kref); INIT_LIST_HEAD(&stuser->list); - init_completion(&stuser->comp); + init_waitqueue_head(&stuser->cmd_comp); stuser->event_cnt = atomic_read(&stdev->event_cnt); dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); @@ -147,7 +148,7 @@ kref_get(&stuser->kref); stuser->read_len = sizeof(stuser->data); stuser_set_state(stuser, MRPC_QUEUED); - reinit_completion(&stuser->comp); + stuser->cmd_done = false; list_add_tail(&stuser->list, &stdev->mrpc_queue); mrpc_cmd_submit(stdev); @@ -184,7 +185,8 @@ stuser->read_len); out: - complete_all(&stuser->comp); + stuser->cmd_done = true; + wake_up_interruptible(&stuser->cmd_comp); list_del_init(&stuser->list); stuser_put(stuser); stdev->mrpc_busy = 0; @@ -354,7 +356,7 @@ return PTR_ERR(stuser); filp->private_data = stuser; - nonseekable_open(inode, filp); + stream_open(inode, filp); dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); @@ -454,10 +456,11 @@ mutex_unlock(&stdev->mrpc_mutex); if (filp->f_flags & O_NONBLOCK) { - if (!try_wait_for_completion(&stuser->comp)) + if (!READ_ONCE(stuser->cmd_done)) return -EAGAIN; } else { - rc = wait_for_completion_interruptible(&stuser->comp); + rc = wait_event_interruptible(stuser->cmd_comp, + stuser->cmd_done); if (rc < 0) return rc; } @@ -505,7 +508,7 @@ struct switchtec_dev *stdev = stuser->stdev; __poll_t ret = 0; - poll_wait(filp, &stuser->comp.wait, wait); + poll_wait(filp, &stuser->cmd_comp, wait); poll_wait(filp, &stdev->event_wq, wait); if (lock_mutex_and_test_alive(stdev)) @@ -513,7 +516,7 @@ mutex_unlock(&stdev->mrpc_mutex); - if (try_wait_for_completion(&stuser->comp)) + if (READ_ONCE(stuser->cmd_done)) ret |= EPOLLIN | EPOLLRDNORM; if (stuser->event_cnt != atomic_read(&stdev->event_cnt)) @@ -1037,7 +1040,8 @@ /* Wake up and kill any users waiting on an MRPC request */ list_for_each_entry_safe(stuser, tmpuser, &stdev->mrpc_queue, list) { - complete_all(&stuser->comp); + stuser->cmd_done = true; + wake_up_interruptible(&stuser->cmd_comp); list_del_init(&stuser->list); stuser_put(stuser); } diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c b/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c index 4bbdc15..23f1e5d 100644 --- a/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c +++ b/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c @@ -153,7 +153,8 @@ enum inno_hdmi_phy_type { INNO_HDMI_PHY_RK3228, - INNO_HDMI_PHY_RK3328 + INNO_HDMI_PHY_RK3328, + INNO_HDMI_PHY_RK3528 }; struct phy_config { @@ -287,9 +288,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} }; @@ -330,6 +335,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, { @@ -462,6 +491,8 @@ else if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3228 && tmdsclock <= 33750000 && inno->efuse_flag) chipversion = 4; + else if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3528) + chipversion = 8; for (; cfg->tmdsclock != ~0UL; cfg++) if (tmdsclock <= cfg->tmdsclock && @@ -631,10 +662,17 @@ { struct device *dev = inno->dev; struct device_node *np = dev->of_node; + struct device_node *clk_np = NULL; struct clk_init_data init = {}; struct clk *refclk; const char *parent_name; int ret; + + if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3528) + clk_np = of_get_child_by_name(np, "clk-port"); + + if (!clk_np) + clk_np = np; refclk = devm_clk_get(dev, "refclk"); if (IS_ERR(refclk)) { @@ -651,7 +689,7 @@ init.ops = &inno_hdmi_phy_clk_ops; /* optional override of the clock name */ - of_property_read_string(np, "clock-output-names", &init.name); + of_property_read_string(clk_np, "clock-output-names", &init.name); inno->hw.init = &init; @@ -662,7 +700,7 @@ return ret; } - ret = of_clk_add_provider(np, of_clk_src_simple_get, inno->pclk); + ret = of_clk_add_provider(clk_np, of_clk_src_simple_get, inno->pclk); if (ret) { dev_err(dev, "failed to register OF clock provider: %d\n", ret); return ret; @@ -1078,6 +1116,245 @@ return frac; } +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; + + /* 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 = 47520000000; + do_div(temp, inno->tmdsclock); + inno_write(inno, 0xd8, (temp >> 8) & 0xff); + inno_write(inno, 0xd9, temp & 0xff); + + /* Power up post PLL */ + inno_update_bits(inno, 0xaa, 1, 0); + /* Power up tmds driver */ + inno_update_bits(inno, 0xb0, 4, 4); + inno_write(inno, 0xb2, 0x0f); + + if (phy_cfg->tmdsclock > 340000000) + msleep(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 serializer */ + inno_write(inno, 0xbe, 0); + /* Power off post pll */ + inno_update_bits(inno, 0xaa, 1, 1); + /* Power off rxsense detection circuit */ + inno_write(inno, 0xcc, 0); + /* Power off band gap */ + inno_update_bits(inno, 0xb0, 4, 0); + /* 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); + + /* if phy had been set in uboot, pll is locked */ + if (inno_read(inno, 0xa9) & BIT(0)) { + dev_info(inno->dev, "phy had been powered up\n"); + inno->phy->power_count = 1; + } else { + /* manual power down post-PLL */ + inno_hdmi_phy_rk3528_power_off(inno); + } +} + +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; + usleep_range(1000, 2000); + } + 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; +} + static unsigned long inno_hdmi_rk3228_phy_pll_recalc_rate(struct inno_hdmi_phy *inno, unsigned long parent_rate) @@ -1128,6 +1405,14 @@ .recalc_rate = inno_hdmi_rk3328_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, @@ -1140,12 +1425,21 @@ .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 of_device_id inno_hdmi_phy_of_match[] = { { .compatible = "rockchip,rk3228-hdmi-phy", .data = &rk3228_hdmi_phy_drv_data }, { .compatible = "rockchip,rk3328-hdmi-phy", .data = &rk3328_hdmi_phy_drv_data + }, + { .compatible = "rockchip,rk3528-hdmi-phy", + .data = &rk3528_hdmi_phy_drv_data }, {} }; @@ -1244,13 +1538,15 @@ if (of_get_property(np, "rockchip,phy-table", &val)) { if (val % PHY_TAB_LEN || !val) { dev_err(dev, "Invalid phy cfg table format!\n"); - return -EINVAL; + ret = -EINVAL; + goto err_regsmap; } phy_config = kmalloc(val, GFP_KERNEL); if (!phy_config) { dev_err(dev, "kmalloc phy table failed\n"); - return -ENOMEM; + ret = -ENOMEM; + goto err_regsmap; } phy_table_size = val / PHY_TAB_LEN; @@ -1259,7 +1555,8 @@ GFP_KERNEL); if (!inno->phy_cfg) { kfree(phy_config); - return -ENOMEM; + ret = -ENOMEM; + goto err_regsmap; } of_property_read_u32_array(np, "rockchip,phy-table", phy_config, val / sizeof(u32)); @@ -1268,7 +1565,7 @@ phy_table_size); if (ret) { kfree(phy_config); - return ret; + goto err_regsmap; } kfree(phy_config); } else { diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c index 207e314..9d6dbbf 100644 --- a/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c +++ b/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c @@ -59,6 +59,7 @@ PHY_STATE_DISCONNECT = 1, PHY_STATE_CONNECT = 2, PHY_STATE_FS_LS_ONLINE = 4, + PHY_STATE_SE1 = 6, }; /** @@ -158,6 +159,7 @@ * @utmi_ls: utmi linestate state register. * @utmi_hstdet: utmi host disconnect register. * @vbus_det_en: vbus detect function power down register. + * @port_ls_filter_con: set linestate filter time for otg port or host port. */ struct rockchip_usb2phy_port_cfg { struct usb2phy_reg phy_sus; @@ -188,6 +190,7 @@ struct usb2phy_reg utmi_ls; struct usb2phy_reg utmi_hstdet; struct usb2phy_reg vbus_det_en; + struct usb2phy_reg port_ls_filter_con; }; /** @@ -196,7 +199,9 @@ * @num_ports: specify how many ports that the phy has. * @phy_tuning: phy default parameters tunning. * @vbus_detect: vbus voltage level detection function. - * @clkout_ctl: keep on/turn off output clk of phy. + * @clkout_ctl: keep on/turn off output clk of phy via commonon bit. + * @clkout_ctl_phy: keep on/turn off output clk of phy via phy inner + * debug register. * @ls_filter_con: set linestate filter time. * @chg_det: charger detection registers. */ @@ -204,8 +209,11 @@ unsigned int reg; unsigned int num_ports; int (*phy_tuning)(struct rockchip_usb2phy *); - int (*vbus_detect)(struct rockchip_usb2phy *rphy, bool en); + int (*vbus_detect)(struct rockchip_usb2phy *rphy, + const struct usb2phy_reg *vbus_det_en, + bool en); struct usb2phy_reg clkout_ctl; + struct usb2phy_reg clkout_ctl_phy; struct usb2phy_reg ls_filter_con; const struct rockchip_usb2phy_port_cfg port_cfgs[USB2PHY_NUM_PORTS]; const struct rockchip_chg_det_reg chg_det; @@ -253,6 +261,7 @@ bool vbus_always_on; bool vbus_enabled; bool bypass_uart_en; + bool dis_u2_susphy; int bvalid_irq; int ls_irq; int id_irq; @@ -275,9 +284,10 @@ * @grf: General Register Files regmap. * @usbgrf: USB General Register Files regmap. * *phy_base: the base address of USB PHY. - * @clk: clock struct of phy input clk. + * @clks: array of phy input clocks. * @clk480m: clock struct of phy output clk. * @clk_hw: clock struct of phy output clk management. + * @num_clks: number of phy input clocks. * @chg_state: states involved in USB charger detection. * @chg_type: USB charger types. * @dcd_retries: The retry count used to track Data contact @@ -297,9 +307,10 @@ struct regmap *grf; struct regmap *usbgrf; void __iomem *phy_base; - struct clk *clk; + struct clk_bulk_data *clks; struct clk *clk480m; struct clk_hw clk480m_hw; + int num_clks; enum usb_chg_state chg_state; enum power_supply_type chg_type; u8 dcd_retries; @@ -344,6 +355,29 @@ return tmp == reg->enable; } +static inline void phy_property_enable(void __iomem *base, + const struct usb2phy_reg *reg, bool en) +{ + unsigned int val, tmp; + + val = readl(base + reg->offset); + tmp = en ? reg->enable : reg->disable; + val &= ~GENMASK(reg->bitend, reg->bitstart); + val |= tmp << reg->bitstart; + writel(val, base + reg->offset); +} + +static inline bool phy_property_enabled(void __iomem *base, + const struct usb2phy_reg *reg) +{ + unsigned int orig, tmp; + unsigned int mask = GENMASK(reg->bitend, reg->bitstart); + + orig = readl(base + reg->offset); + tmp = (orig & mask) >> reg->bitstart; + return tmp == reg->enable; +} + static int rockchip_usb2phy_clk480m_prepare(struct clk_hw *hw) { struct rockchip_usb2phy *rphy = @@ -352,7 +386,14 @@ int ret; /* turn on 480m clk output if it is off */ - if (!property_enabled(base, &rphy->phy_cfg->clkout_ctl)) { + if (rphy->phy_cfg->clkout_ctl_phy.enable) { + if (!phy_property_enabled(rphy->phy_base, &rphy->phy_cfg->clkout_ctl_phy)) { + phy_property_enable(rphy->phy_base, &rphy->phy_cfg->clkout_ctl_phy, true); + + /* waiting for the clk become stable */ + usleep_range(1200, 1300); + } + } else if (!property_enabled(base, &rphy->phy_cfg->clkout_ctl)) { ret = property_enable(base, &rphy->phy_cfg->clkout_ctl, true); if (ret) return ret; @@ -371,7 +412,10 @@ struct regmap *base = get_reg_base(rphy); /* turn off 480m clk output */ - property_enable(base, &rphy->phy_cfg->clkout_ctl, false); + if (rphy->phy_cfg->clkout_ctl_phy.enable) + phy_property_enable(rphy->phy_base, &rphy->phy_cfg->clkout_ctl_phy, false); + else + property_enable(base, &rphy->phy_cfg->clkout_ctl, false); } static int rockchip_usb2phy_clk480m_prepared(struct clk_hw *hw) @@ -380,7 +424,10 @@ container_of(hw, struct rockchip_usb2phy, clk480m_hw); struct regmap *base = get_reg_base(rphy); - return property_enabled(base, &rphy->phy_cfg->clkout_ctl); + if (rphy->phy_cfg->clkout_ctl_phy.enable) + return phy_property_enabled(rphy->phy_base, &rphy->phy_cfg->clkout_ctl_phy); + else + return property_enabled(base, &rphy->phy_cfg->clkout_ctl); } static unsigned long @@ -410,6 +457,7 @@ { struct device_node *node = rphy->dev->of_node; struct clk_init_data init = {}; + struct clk *refclk = of_clk_get_by_name(node, "phyclk"); const char *clk_name; int ret; @@ -420,8 +468,8 @@ /* optional override of the clockname */ of_property_read_string(node, "clock-output-names", &init.name); - if (rphy->clk) { - clk_name = __clk_get_name(rphy->clk); + if (!IS_ERR(refclk)) { + clk_name = __clk_get_name(refclk); init.parent_names = &clk_name; init.num_parents = 1; } else { @@ -855,7 +903,8 @@ } if (rphy->phy_cfg->vbus_detect) - rphy->phy_cfg->vbus_detect(rphy, vbus_det_en); + rphy->phy_cfg->vbus_detect(rphy, &rport->port_cfg->vbus_det_en, + vbus_det_en); else ret = property_enable(rphy->grf, &rport->port_cfg->vbus_det_en, vbus_det_en); @@ -1029,7 +1078,8 @@ rport->state = OTG_STATE_B_IDLE; if (!rport->vbus_attached) { mutex_unlock(&rport->mutex); - rockchip_usb2phy_power_off(rport->phy); + if (!rport->dis_u2_susphy) + rockchip_usb2phy_power_off(rport->phy); mutex_lock(&rport->mutex); } /* fall through */ @@ -1090,7 +1140,8 @@ rphy->chg_state = USB_CHG_STATE_UNDEFINED; rphy->chg_type = POWER_SUPPLY_TYPE_UNKNOWN; mutex_unlock(&rport->mutex); - rockchip_usb2phy_power_off(rport->phy); + if (!rport->dis_u2_susphy) + rockchip_usb2phy_power_off(rport->phy); mutex_lock(&rport->mutex); } break; @@ -1434,6 +1485,15 @@ dev_dbg(&rport->phy->dev, "FS/LS online\n"); } break; + case PHY_STATE_SE1: + if (rport->suspended) { + dev_dbg(&rport->phy->dev, "linestate is SE1, power on phy\n"); + mutex_unlock(&rport->mutex); + rockchip_usb2phy_power_on(rport->phy); + mutex_lock(&rport->mutex); + rport->suspended = false; + } + break; case PHY_STATE_DISCONNECT: if (!rport->suspended) { dev_dbg(&rport->phy->dev, "Disconnected\n"); @@ -1764,6 +1824,11 @@ return NOTIFY_DONE; } +static void rockchip_otg_wake_lock_destroy(void *data) +{ + wake_lock_destroy((struct wake_lock *)(data)); +} + static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy, struct rockchip_usb2phy_port *rport, struct device_node *child_np) @@ -1789,6 +1854,8 @@ of_property_read_bool(child_np, "rockchip,vbus-always-on"); rport->utmi_avalid = of_property_read_bool(child_np, "rockchip,utmi-avalid"); + rport->dis_u2_susphy = + of_property_read_bool(child_np, "rockchip,dis-u2-susphy"); /* enter lower power state when suspend */ rport->low_power_en = @@ -1833,6 +1900,11 @@ property_enable(base, &rport->port_cfg->bvalid_set, false); wake_lock_init(&rport->wakelock, WAKE_LOCK_SUSPEND, "rockchip_otg"); + ret = devm_add_action_or_reset(rphy->dev, rockchip_otg_wake_lock_destroy, + &rport->wakelock); + if (ret) + return ret; + INIT_DELAYED_WORK(&rport->bypass_uart_work, rockchip_usb_bypass_uart_work); INIT_DELAYED_WORK(&rport->chg_work, rockchip_chg_detect_work); @@ -1845,7 +1917,7 @@ EXTCON_USB_HOST, &rport->event_nb); if (ret) { dev_err(rphy->dev, "register USB HOST notifier failed\n"); - goto err; + return ret; } } @@ -1861,10 +1933,6 @@ rport->suspended = true; return 0; - -err: - wake_lock_destroy(&rport->wakelock); - return ret; } static int rockchip_usb2phy_probe(struct platform_device *pdev) @@ -1963,13 +2031,19 @@ pm_runtime_enable(dev); pm_runtime_get_sync(dev); - rphy->clk = of_clk_get_by_name(np, "phyclk"); - if (!IS_ERR(rphy->clk)) { - clk_prepare_enable(rphy->clk); - } else { - dev_info(&pdev->dev, "no phyclk specified\n"); - rphy->clk = NULL; - } + ret = devm_clk_bulk_get_all(dev, &rphy->clks); + if (ret == -EPROBE_DEFER) + return ret; + + /* Clocks are optional */ + if (ret < 0) + rphy->num_clks = 0; + else + rphy->num_clks = ret; + + ret = clk_bulk_prepare_enable(rphy->num_clks, rphy->clks); + if (ret) + return ret; if (rphy->phy_cfg->phy_tuning) { ret = rphy->phy_cfg->phy_tuning(rphy); @@ -2061,10 +2135,8 @@ disable_clks: pm_runtime_put_sync(dev); pm_runtime_disable(dev); - if (rphy->clk) { - clk_disable_unprepare(rphy->clk); - clk_put(rphy->clk); - } + clk_bulk_disable_unprepare(rphy->num_clks, rphy->clks); + return ret; } @@ -2305,6 +2377,43 @@ return ret; } +static int rk3528_usb2phy_tuning(struct rockchip_usb2phy *rphy) +{ + u32 reg; + int ret = 0; + + /* 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); + + /* Enable otg and host ports phy irq to pmu wakeup source */ + ret |= regmap_write(rphy->grf, 0x80004, 0x00030003); + + return ret; +} + static int rk3568_usb2phy_tuning(struct rockchip_usb2phy *rphy) { u32 reg; @@ -2352,18 +2461,20 @@ return ret; } -static int rk3568_vbus_detect_control(struct rockchip_usb2phy *rphy, bool en) +static int rockchip_usb2phy_vbus_det_control(struct rockchip_usb2phy *rphy, + const struct usb2phy_reg *vbus_det_en, + bool en) { u32 reg; if (en) { - reg = readl(rphy->phy_base + 0x3c); + reg = readl(rphy->phy_base + vbus_det_en->offset); /* Enable vbus voltage level detection function */ - writel(reg & ~BIT(7), rphy->phy_base + 0x3c); + writel(reg & ~BIT(7), rphy->phy_base + vbus_det_en->offset); } else { - reg = readl(rphy->phy_base + 0x3c); + reg = readl(rphy->phy_base + vbus_det_en->offset); /* Disable vbus voltage level detection function */ - writel(reg | BIT(7), rphy->phy_base + 0x3c); + writel(reg | BIT(7), rphy->phy_base + vbus_det_en->offset); } return 0; @@ -2397,6 +2508,14 @@ rport = &rphy->ports[index]; if (!rport->phy) continue; + + if (rport->port_cfg->port_ls_filter_con.enable) { + ret = regmap_write(rphy->grf, + rport->port_cfg->port_ls_filter_con.offset, + rport->port_cfg->port_ls_filter_con.enable); + if (ret) + dev_err(rphy->dev, "failed to set port ls filter %d\n", ret); + } if (rport->port_id == USB2PHY_PORT_OTG && (rport->id_irq > 0 || rphy->irq > 0)) { @@ -2466,6 +2585,14 @@ rport = &rphy->ports[index]; if (!rport->phy) continue; + + if (rport->port_cfg->port_ls_filter_con.disable) { + ret = regmap_write(rphy->grf, + rport->port_cfg->port_ls_filter_con.offset, + rport->port_cfg->port_ls_filter_con.disable); + if (ret) + dev_err(rphy->dev, "failed to set port ls filter %d\n", ret); + } if (rport->port_id == USB2PHY_PORT_OTG && (rport->id_irq > 0 || rphy->irq > 0)) { @@ -2988,12 +3115,69 @@ { /* sentinel */ } }; +static const struct rockchip_usb2phy_cfg rk3528_phy_cfgs[] = { + { + .reg = 0xffdf0000, + .num_ports = 2, + .phy_tuning = rk3528_usb2phy_tuning, + .vbus_detect = rockchip_usb2phy_vbus_det_control, + .clkout_ctl_phy = { 0x041c, 7, 2, 0, 0x27 }, + .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 }, + .bvalid_set = { 0x6004c, 15, 14, 0, 3 }, + .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 }, + .vbus_det_en = { 0x003c, 7, 7, 0, 1 }, + .port_ls_filter_con = { 0x60080, 19, 0, 0x30100, 0x20 }, + }, + [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 }, + .port_ls_filter_con = { 0x6009c, 19, 0, 0x30100, 0x20 }, + } + }, + .chg_det = { + .chg_mode = { 0x6004c, 8, 0, 0, 0x1d7 }, + .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 rk3568_phy_cfgs[] = { { .reg = 0xfe8a0000, .num_ports = 2, .phy_tuning = rk3568_usb2phy_tuning, - .vbus_detect = rk3568_vbus_detect_control, + .vbus_detect = rockchip_usb2phy_vbus_det_control, .clkout_ctl = { 0x0008, 4, 4, 1, 0 }, .ls_filter_con = { 0x0040, 19, 0, 0x30100, 0x00020 }, .port_cfgs = { @@ -3020,6 +3204,7 @@ .utmi_bvalid = { 0x00c0, 9, 9, 0, 1 }, .utmi_iddig = { 0x00c0, 6, 6, 0, 1 }, .utmi_ls = { 0x00c0, 5, 4, 0, 1 }, + .vbus_det_en = { 0x003c, 7, 7, 0, 1 }, }, [USB2PHY_PORT_HOST] = { /* Select suspend control from controller */ @@ -3123,6 +3308,7 @@ { .compatible = "rockchip,rk3366-usb2phy", .data = &rk3366_phy_cfgs }, { .compatible = "rockchip,rk3368-usb2phy", .data = &rk3368_phy_cfgs }, { .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs }, + { .compatible = "rockchip,rk3528-usb2phy", .data = &rk3528_phy_cfgs }, { .compatible = "rockchip,rk3568-usb2phy", .data = &rk3568_phy_cfgs }, { .compatible = "rockchip,rv1108-usb2phy", .data = &rv1108_phy_cfgs }, {} diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c index 0964d3c..d18a886 100644 --- a/kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c +++ b/kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c @@ -23,7 +23,7 @@ struct rockchip_combphy_priv; struct combphy_reg { - u16 offset; + u32 offset; u16 bitend; u16 bitstart; u16 disable; @@ -38,6 +38,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; @@ -152,7 +153,18 @@ static int rockchip_combphy_usb3_init(struct rockchip_combphy_priv *priv) { + const struct rockchip_combphy_cfg *phy_cfg = priv->cfg; int ret = 0; + + if (device_property_present(priv->dev, "rockchip,dis-u3otg0-port")) { + ret = param_write(priv->pipe_grf, &phy_cfg->grfcfg->u3otg0_port_en, + false); + return ret; + } else if (device_property_present(priv->dev, "rockchip,dis-u3otg1-port")) { + ret = param_write(priv->pipe_grf, &phy_cfg->grfcfg->u3otg1_port_en, + false); + return ret; + } if (priv->cfg->combphy_cfg) { ret = priv->cfg->combphy_cfg(priv); @@ -409,6 +421,175 @@ return PTR_ERR_OR_ZERO(phy_provider); } +static int rk3528_combphy_cfg(struct rockchip_combphy_priv *priv) +{ + const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; + struct clk *refclk = NULL; + unsigned long rate; + int i; + u32 val; + + /* Configure PHY reference clock frequency */ + for (i = 0; i < priv->num_clks; i++) { + if (!strncmp(priv->clks[i].id, "refclk", 6)) { + refclk = priv->clks[i].clk; + break; + } + } + + if (!refclk) { + dev_err(priv->dev, "No refclk found\n"); + return -EINVAL; + } + + 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 << 17; + writel(val, priv->mmio + 0x200); + + /* Set Rx squelch input filler bandwidth */ + val = readl(priv->mmio + 0x20c); + val &= ~GENMASK(2, 0); + val |= 0x06; + writel(val, priv->mmio + 0x20c); + + 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; + } + + rate = clk_get_rate(refclk); + + switch (rate) { + case 24000000: + param_write(priv->phy_grf, &cfg->pipe_clk_24m, true); + if (priv->mode == PHY_TYPE_USB3) { + /* Set ssc_cnt[10:0]=00101111101 & 31.5KHz */ + val = readl(priv->mmio + 0x100); + val &= ~GENMASK(10, 0); + val |= 0x17d; + writel(val, priv->mmio + 0x100); + } else if (priv->mode == PHY_TYPE_PCIE) { + /* Set ssc_cnt[10:0]=00101111101 & 31.5KHz */ + val = readl(priv->mmio + 0x100); + val &= ~GENMASK(10, 0); + val |= 0x17d; + writel(val, priv->mmio + 0x100); + + /* tx_trim[14]=1, Enable the counting clock of the rterm detect */ + val = readl(priv->mmio + 0x218); + val |= (1 << 14); + writel(val, priv->mmio + 0x218); + + /* 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); + } + break; + case 100000000: + param_write(priv->phy_grf, &cfg->pipe_clk_100m, true); + if (priv->mode == PHY_TYPE_PCIE) { + /* Set ssc_cnt[10:0]=11000110011 & 31.5KHz */ + val = readl(priv->mmio + 0x100); + val &= ~GENMASK(10, 0); + val |= 0x633; + writel(val, priv->mmio + 0x100); + + /* 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, swing 650mv */ + val = 0x570804f0; + writel(val, priv->mmio + 0x108); + } + break; + default: + dev_err(priv->dev, "Unsupported rate: %lu\n", rate); + return -EINVAL; + } + + if (priv->mode == PHY_TYPE_PCIE) { + if (device_property_read_bool(priv->dev, "rockchip,enable-ssc")) { + val = readl(priv->mmio + 0x100); + val |= BIT(20); + writel(val, priv->mmio + 0x100); + } + } + + 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 clk_bulk_data rk3528_clks[] = { + { .id = "refclk" }, + { .id = "apbclk" }, + { .id = "pipe_clk" }, +}; + +static const struct rockchip_combphy_cfg rk3528_combphy_cfgs = { + .num_clks = ARRAY_SIZE(rk3528_clks), + .clks = rk3528_clks, + .grfcfg = &rk3528_combphy_grfcfgs, + .combphy_cfg = rk3528_combphy_cfg, +}; + static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv) { const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; @@ -476,6 +657,9 @@ /* Set PLL KVCO to min and set PLL charge pump current to max */ writel(0xf0, priv->mmio + (0xa << 2)); + + /* Set Rx squelch input filler bandwidth */ + writel(0x0e, priv->mmio + (0x14 << 2)); param_write(priv->phy_grf, &cfg->pipe_sel_usb, true); param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false); @@ -635,6 +819,10 @@ static const struct of_device_id rockchip_combphy_of_match[] = { { + .compatible = "rockchip,rk3528-naneng-combphy", + .data = &rk3528_combphy_cfgs, + }, + { .compatible = "rockchip,rk3568-naneng-combphy", .data = &rk3568_combphy_cfgs, }, diff --git a/kernel/drivers/pinctrl/pinctrl-rockchip.c b/kernel/drivers/pinctrl/pinctrl-rockchip.c index c742901..939a29c 100644 --- a/kernel/drivers/pinctrl/pinctrl-rockchip.c +++ b/kernel/drivers/pinctrl/pinctrl-rockchip.c @@ -725,15 +725,17 @@ }; static struct rockchip_mux_route_data rv1126_mux_route_data[] = { - RK_MUXROUTE_GRF(3, RK_PD2, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */ - RK_MUXROUTE_GRF(3, RK_PB0, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */ + RK_MUXROUTE_GRF(3, RK_PD1, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_RX_M0 */ + RK_MUXROUTE_GRF(3, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_TX_M0 */ + RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_RX_M1 */ + RK_MUXROUTE_GRF(3, RK_PA4, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_TX_M1 */ - RK_MUXROUTE_GRF(0, RK_PD4, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */ - RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */ - RK_MUXROUTE_GRF(2, RK_PC7, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */ + RK_MUXROUTE_GRF(1, RK_PA1, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_SCLK_M0 */ + RK_MUXROUTE_GRF(1, RK_PD6, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_SCLK_M1 */ + RK_MUXROUTE_GRF(2, RK_PD1, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_SCLK_M2 */ - RK_MUXROUTE_GRF(1, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */ - RK_MUXROUTE_GRF(2, RK_PB3, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */ + RK_MUXROUTE_GRF(1, RK_PC6, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_SCLK_M0 */ + RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_SCLK_M1 */ RK_MUXROUTE_GRF(3, RK_PD4, 2, 0x10260, WRITE_MASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */ RK_MUXROUTE_GRF(3, RK_PC0, 3, 0x10260, WRITE_MASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */ @@ -2010,6 +2012,146 @@ *bit = (pin_num % 8) * 2; } +#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 *info = bank->drvdata; + + *regmap = info->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: + dev_err(info->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; +} + +#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 *info = bank->drvdata; + + *regmap = info->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: + dev_err(info->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; +} + +#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 *info = bank->drvdata; + + *regmap = info->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: + dev_err(info->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; +} + #define RK3568_SR_PMU_OFFSET 0x60 #define RK3568_SR_GRF_OFFSET 0x0180 #define RK3568_SR_BANK_STRIDE 0x10 @@ -2226,7 +2368,7 @@ rmask_bits = RV1126_DRV_BITS_PER_PIN; ret = strength; goto config; - } else if (ctrl->type == RK3568) { + } else if (ctrl->type == RK3568 || ctrl->type == RK3528) { rmask_bits = RK3568_DRV_BITS_PER_PIN; ret = (1 << (strength + 1)) - 1; goto config; @@ -2396,6 +2538,7 @@ case RK3308: case RK3368: case RK3399: + case RK3528: case RK3568: pull_type = bank->pull_type[pin_num / 8]; data >>= bit; @@ -2444,6 +2587,7 @@ case RK3308: case RK3368: case RK3399: + case RK3528: case RK3568: pull_type = bank->pull_type[pin_num / 8]; ret = -EINVAL; @@ -2796,6 +2940,7 @@ case RK3308: case RK3368: case RK3399: + case RK3528: case RK3568: return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); } @@ -4025,6 +4170,49 @@ .drv_calc_reg = rk3399_calc_drv_reg_and_bit, }; +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 struct rockchip_pin_ctrl rk3528_pin_ctrl __maybe_unused = { + .pin_banks = rk3528_pin_banks, + .nr_banks = ARRAY_SIZE(rk3528_pin_banks), + .label = "RK3528-GPIO", + .type = RK3528, + .pull_calc_reg = rk3528_calc_pull_reg_and_bit, + .drv_calc_reg = rk3528_calc_drv_reg_and_bit, + .schmitt_calc_reg = rk3528_calc_schmitt_reg_and_bit, +}; + static struct rockchip_pin_bank rk3568_pin_banks[] = { PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, @@ -4128,6 +4316,10 @@ { .compatible = "rockchip,rk3399-pinctrl", .data = &rk3399_pin_ctrl }, #endif +#ifdef CONFIG_CPU_RK3528 + { .compatible = "rockchip,rk3528-pinctrl", + .data = &rk3528_pin_ctrl }, +#endif #ifdef CONFIG_CPU_RK3568 { .compatible = "rockchip,rk3568-pinctrl", .data = &rk3568_pin_ctrl }, diff --git a/kernel/drivers/pinctrl/pinctrl-rockchip.h b/kernel/drivers/pinctrl/pinctrl-rockchip.h index a6e7862..6f7a627 100644 --- a/kernel/drivers/pinctrl/pinctrl-rockchip.h +++ b/kernel/drivers/pinctrl/pinctrl-rockchip.h @@ -19,6 +19,7 @@ RK3308, RK3368, RK3399, + RK3528, RK3568, }; diff --git a/kernel/drivers/pwm/pwm-rockchip.c b/kernel/drivers/pwm/pwm-rockchip.c index e505d58..b37ad84 100644 --- a/kernel/drivers/pwm/pwm-rockchip.c +++ b/kernel/drivers/pwm/pwm-rockchip.c @@ -411,13 +411,15 @@ pc->pinctrl = devm_pinctrl_get(&pdev->dev); if (IS_ERR(pc->pinctrl)) { dev_err(&pdev->dev, "Get pinctrl failed!\n"); - return PTR_ERR(pc->pinctrl); + ret = PTR_ERR(pc->pinctrl); + goto err_pclk; } pc->active_state = pinctrl_lookup_state(pc->pinctrl, "active"); if (IS_ERR(pc->active_state)) { dev_err(&pdev->dev, "No active pinctrl state\n"); - return PTR_ERR(pc->active_state); + ret = PTR_ERR(pc->active_state); + goto err_pclk; } platform_set_drvdata(pdev, pc); diff --git a/kernel/drivers/rkflash/sfc.c b/kernel/drivers/rkflash/sfc.c index 8237e76..bec4e06 100644 --- a/kernel/drivers/rkflash/sfc.c +++ b/kernel/drivers/rkflash/sfc.c @@ -42,7 +42,9 @@ u32 sfc_get_max_dll_cells(void) { - if (sfc_get_version() == SFC_VER_5) + if (sfc_get_version() == SFC_VER_8) + return SCLK_SMP_SEL_MAX_V5; + else if (sfc_get_version() == SFC_VER_5) return SCLK_SMP_SEL_MAX_V5; else if (sfc_get_version() == SFC_VER_4) return SCLK_SMP_SEL_MAX_V4; diff --git a/kernel/drivers/rkflash/sfc.h b/kernel/drivers/rkflash/sfc.h index 703072d..7ca37df 100644 --- a/kernel/drivers/rkflash/sfc.h +++ b/kernel/drivers/rkflash/sfc.h @@ -8,6 +8,7 @@ #define SFC_VER_3 0x3 #define SFC_VER_4 0x4 #define SFC_VER_5 0x5 +#define SFC_VER_8 0x8 #define SFC_EN_INT (0) /* enable interrupt */ #define SFC_EN_DMA (1) /* enable dma */ @@ -68,8 +69,8 @@ /* SFC_DLL_CTRL Register */ #define SCLK_SMP_SEL_EN BIT(15) /* SCLK Sampling Selection */ -#define SCLK_SMP_SEL_MAX_V4 0x1FF -#define SCLK_SMP_SEL_MAX_V5 0xFF +#define SCLK_SMP_SEL_MAX_V4 0xFF +#define SCLK_SMP_SEL_MAX_V5 0x1FF #define SFC_DLL_TRANING_STEP 10 /* Training step */ #define SFC_DLL_TRANING_VALID_WINDOW 80 /* Valid DLL winbow */ diff --git a/kernel/drivers/rkflash/sfc_nand.c b/kernel/drivers/rkflash/sfc_nand.c index 085267a..81f58c9 100644 --- a/kernel/drivers/rkflash/sfc_nand.c +++ b/kernel/drivers/rkflash/sfc_nand.c @@ -52,6 +52,8 @@ { 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 }, @@ -110,7 +112,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 }, @@ -129,7 +135,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 }, @@ -147,6 +153,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 }, @@ -204,8 +214,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; @@ -928,6 +946,9 @@ sfc_nand_rw_preset(); sfc_nand_wait_busy(&status, 1000 * 1000); + if (sfc_nand_dev.manufacturer == 0x01 && status) + sfc_nand_wait_busy(&status, 1000 * 1000); + ecc_result = p_nand_info->ecc_status(); op.sfcmd.d32 = 0; diff --git a/kernel/drivers/rkflash/sfc_nor.c b/kernel/drivers/rkflash/sfc_nor.c index 7cbb400..feec84c 100644 --- a/kernel/drivers/rkflash/sfc_nor.c +++ b/kernel/drivers/rkflash/sfc_nor.c @@ -37,6 +37,8 @@ { 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 }, + /* GD55B01GE */ + { 0xc8471B, 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 }, @@ -113,6 +115,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 }, @@ -125,7 +131,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 }, @@ -135,8 +145,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 }, @@ -154,6 +168,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 }, @@ -175,6 +191,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/kernel/drivers/rknpu/rknpu_debugger.c b/kernel/drivers/rknpu/rknpu_debugger.c index 4d5bebd..146aa7d 100644 --- a/kernel/drivers/rknpu/rknpu_debugger.c +++ b/kernel/drivers/rknpu/rknpu_debugger.c @@ -14,7 +14,9 @@ #include <asm/div64.h> #ifndef FPGA_PLATFORM +#ifdef CONFIG_PM_DEVFREQ #include <../drivers/devfreq/governor.h> +#endif #endif #include "rknpu_drv.h" @@ -191,6 +193,7 @@ return 0; } +#ifdef CONFIG_PM_DEVFREQ static ssize_t rknpu_freq_set(struct file *file, const char __user *ubuf, size_t len, loff_t *offp) { @@ -233,6 +236,13 @@ return len; } +#else +static ssize_t rknpu_freq_set(struct file *file, const char __user *ubuf, + size_t len, loff_t *offp) +{ + return -EFAULT; +} +#endif static int rknpu_volt_show(struct seq_file *m, void *data) { diff --git a/kernel/drivers/rknpu/rknpu_drv.c b/kernel/drivers/rknpu/rknpu_drv.c index a153ec3..30dfc38 100644 --- a/kernel/drivers/rknpu/rknpu_drv.c +++ b/kernel/drivers/rknpu/rknpu_drv.c @@ -41,7 +41,9 @@ #include <soc/rockchip/rockchip_opp_select.h> #include <soc/rockchip/rockchip_system_monitor.h> #include <soc/rockchip/rockchip_ipa.h> +#ifdef CONFIG_PM_DEVFREQ #include <../drivers/devfreq/governor.h> +#endif #endif #include "rknpu_ioctl.h" @@ -1062,6 +1064,7 @@ .get_cur_freq = npu_devfreq_get_cur_freq, }; +#ifdef CONFIG_PM_DEVFREQ static int devfreq_rknpu_ondemand_func(struct devfreq *df, unsigned long *freq) { struct rknpu_device *rknpu_dev = df->data; @@ -1085,6 +1088,7 @@ .get_target_freq = devfreq_rknpu_ondemand_func, .event_handler = devfreq_rknpu_ondemand_handler, }; +#endif static unsigned long npu_get_static_power(struct devfreq *devfreq, unsigned long voltage) @@ -1191,11 +1195,13 @@ dev_pm_opp_put(opp); dp->initial_freq = rknpu_dev->current_freq; +#ifdef CONFIG_PM_DEVFREQ ret = devfreq_add_governor(&devfreq_rknpu_ondemand); if (ret) { LOG_DEV_ERROR(dev, "failed to add rknpu_ondemand governor\n"); goto err_remove_table; } +#endif rknpu_dev->devfreq = devm_devfreq_add_device(dev, dp, "rknpu_ondemand", (void *)rknpu_dev); @@ -1247,7 +1253,9 @@ return 0; err_remove_governor: +#ifdef CONFIG_PM_DEVFREQ devfreq_remove_governor(&devfreq_rknpu_ondemand); +#endif err_remove_table: dev_pm_opp_of_remove_table(dev); @@ -1325,11 +1333,13 @@ } dp->initial_freq = rknpu_dev->current_freq; +#ifdef CONFIG_PM_DEVFREQ ret = devfreq_add_governor(&devfreq_rknpu_ondemand); if (ret) { LOG_DEV_ERROR(dev, "failed to add rknpu_ondemand governor\n"); goto err_remove_table; } +#endif rknpu_dev->devfreq = devm_devfreq_add_device(dev, dp, "rknpu_ondemand", (void *)rknpu_dev); @@ -1380,7 +1390,9 @@ return 0; err_remove_governor: +#ifdef CONFIG_PM_DEVFREQ devfreq_remove_governor(&devfreq_rknpu_ondemand); +#endif err_remove_table: dev_pm_opp_of_remove_table(dev); @@ -1396,7 +1408,9 @@ devfreq_unregister_opp_notifier(rknpu_dev->dev, rknpu_dev->devfreq); dev_pm_opp_of_remove_table(rknpu_dev->dev); +#ifdef CONFIG_PM_DEVFREQ devfreq_remove_governor(&devfreq_rknpu_ondemand); +#endif } return 0; diff --git a/kernel/drivers/rknpu/rknpu_job.c b/kernel/drivers/rknpu/rknpu_job.c index 6f601ab..9e50467 100644 --- a/kernel/drivers/rknpu/rknpu_job.c +++ b/kernel/drivers/rknpu/rknpu_job.c @@ -166,10 +166,10 @@ subcore_data = &rknpu_dev->subcore_datas[core_index]; do { - ret = wait_event_interruptible_timeout( - subcore_data->job_done_wq, - job->flags & RKNPU_JOB_DONE || rknpu_dev->soft_reseting, - msecs_to_jiffies(args->timeout)); + ret = wait_event_timeout(subcore_data->job_done_wq, + job->flags & RKNPU_JOB_DONE || + rknpu_dev->soft_reseting, + msecs_to_jiffies(args->timeout)); if (++wait_count >= 3) break; } while (ret == 0 && job->in_queue[core_index]); diff --git a/kernel/drivers/rtc/rtc-rk808.c b/kernel/drivers/rtc/rtc-rk808.c index 67e5a94..142118d 100644 --- a/kernel/drivers/rtc/rtc-rk808.c +++ b/kernel/drivers/rtc/rtc-rk808.c @@ -36,6 +36,7 @@ #define BIT_RTC_CTRL_REG_RTC_READSEL_M BIT(7) #define BIT_RTC_INTERRUPTS_REG_IT_ALARM_M BIT(3) #define RTC_STATUS_MASK 0xFE +#define RTC_ALARM_STATUS BIT(6) #define SECONDS_REG_MSK 0x7F #define MINUTES_REG_MAK 0x7F @@ -258,6 +259,12 @@ ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg, BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 0); + /* + * The rtc alarm status(BIT(6)) must be cleared after alarm 1s or + * after the alarm is disabled. + */ + ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg, + RTC_ALARM_STATUS); return ret; } diff --git a/kernel/drivers/scsi/fcoe/fcoe.c b/kernel/drivers/scsi/fcoe/fcoe.c index 6768b2e..c20f51a 100644 --- a/kernel/drivers/scsi/fcoe/fcoe.c +++ b/kernel/drivers/scsi/fcoe/fcoe.c @@ -1459,11 +1459,11 @@ static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen) { struct fcoe_percpu_s *fps; - int rc; + int rc, cpu = get_cpu_light(); - fps = &get_cpu_var(fcoe_percpu); + fps = &per_cpu(fcoe_percpu, cpu); rc = fcoe_get_paged_crc_eof(skb, tlen, fps); - put_cpu_var(fcoe_percpu); + put_cpu_light(); return rc; } @@ -1650,11 +1650,11 @@ return 0; } - stats = per_cpu_ptr(lport->stats, get_cpu()); + stats = per_cpu_ptr(lport->stats, get_cpu_light()); stats->InvalidCRCCount++; if (stats->InvalidCRCCount < 5) printk(KERN_WARNING "fcoe: dropping frame with CRC error\n"); - put_cpu(); + put_cpu_light(); return -EINVAL; } @@ -1697,7 +1697,7 @@ */ hp = (struct fcoe_hdr *) skb_network_header(skb); - stats = per_cpu_ptr(lport->stats, get_cpu()); + stats = per_cpu_ptr(lport->stats, get_cpu_light()); if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) { if (stats->ErrorFrames < 5) printk(KERN_WARNING "fcoe: FCoE version " @@ -1729,13 +1729,13 @@ goto drop; if (!fcoe_filter_frames(lport, fp)) { - put_cpu(); + put_cpu_light(); fc_exch_recv(lport, fp); return; } drop: stats->ErrorFrames++; - put_cpu(); + put_cpu_light(); kfree_skb(skb); } diff --git a/kernel/drivers/scsi/fcoe/fcoe_ctlr.c b/kernel/drivers/scsi/fcoe/fcoe_ctlr.c index 658c072..bceab74 100644 --- a/kernel/drivers/scsi/fcoe/fcoe_ctlr.c +++ b/kernel/drivers/scsi/fcoe/fcoe_ctlr.c @@ -838,7 +838,7 @@ INIT_LIST_HEAD(&del_list); - stats = per_cpu_ptr(fip->lp->stats, get_cpu()); + stats = per_cpu_ptr(fip->lp->stats, get_cpu_light()); list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2; @@ -874,7 +874,7 @@ sel_time = fcf->time; } } - put_cpu(); + put_cpu_light(); list_for_each_entry_safe(fcf, next, &del_list, list) { /* Removes fcf from current list */ diff --git a/kernel/drivers/scsi/libfc/fc_exch.c b/kernel/drivers/scsi/libfc/fc_exch.c index 384458d..0271115 100644 --- a/kernel/drivers/scsi/libfc/fc_exch.c +++ b/kernel/drivers/scsi/libfc/fc_exch.c @@ -833,10 +833,10 @@ } memset(ep, 0, sizeof(*ep)); - cpu = get_cpu(); + cpu = get_cpu_light(); pool = per_cpu_ptr(mp->pool, cpu); spin_lock_bh(&pool->lock); - put_cpu(); + put_cpu_light(); /* peek cache of free slot */ if (pool->left != FC_XID_UNKNOWN) { diff --git a/kernel/drivers/soc/rockchip/Kconfig b/kernel/drivers/soc/rockchip/Kconfig index 2b07177..1c8d89a 100644 --- a/kernel/drivers/soc/rockchip/Kconfig +++ b/kernel/drivers/soc/rockchip/Kconfig @@ -3,6 +3,19 @@ source "drivers/soc/rockchip/Kconfig.cpu" # +# Rockchip Android Features +# + +config NO_GKI + bool "Disable Android GKI support" + default y if !GKI_HACKS_TO_FIX + help + Say y here to disable Android GKI support. Then + all the ABI compatibilities are not applicable. + + If unsure, say Y. + +# # Rockchip Soc drivers # diff --git a/kernel/drivers/soc/rockchip/Kconfig.cpu b/kernel/drivers/soc/rockchip/Kconfig.cpu index 027a87e..f7e97c1 100644 --- a/kernel/drivers/soc/rockchip/Kconfig.cpu +++ b/kernel/drivers/soc/rockchip/Kconfig.cpu @@ -53,6 +53,9 @@ config CPU_RK3399 bool "RK3399" +config CPU_RK3528 + bool "RK3528" + config CPU_RK3568 bool "RK3566/8" diff --git a/kernel/drivers/soc/rockchip/flash_vendor_storage.c b/kernel/drivers/soc/rockchip/flash_vendor_storage.c index 831f7b0..51b83b8 100644 --- a/kernel/drivers/soc/rockchip/flash_vendor_storage.c +++ b/kernel/drivers/soc/rockchip/flash_vendor_storage.c @@ -23,34 +23,13 @@ #define DLOG(x...) #endif -struct vendor_item { - u16 id; - u16 offset; - u16 size; - u16 flag; -}; - #define FLASH_VENDOR_PART_START 8 -#define FLASH_VENDOR_PART_SIZE 8 #define FLASH_VENDOR_PART_NUM 4 -#define FLASH_VENDOR_TAG 0x524B5644 - -struct tag_vendor_info { - u32 tag; - u32 version; - u16 next_index; - u16 item_num; - u16 free_offset; - u16 free_size; - struct vendor_item item[62]; /* 62 * 8 */ - u8 data[FLASH_VENDOR_PART_SIZE * 512 - 512 - 8]; - u32 hash; - u32 version2; -}; +#define FLASH_VENDOR_TAG VENDOR_HEAD_TAG static int (*_flash_read)(u32 sec, u32 n_sec, void *p_data); static int (*_flash_write)(u32 sec, u32 n_sec, void *p_data); -static struct tag_vendor_info *g_vendor; +static struct flash_vendor_info *g_vendor; int flash_vendor_dev_ops_register(int (*read)(u32 sec, u32 n_sec, diff --git a/kernel/drivers/soc/rockchip/mtd_vendor_storage.c b/kernel/drivers/soc/rockchip/mtd_vendor_storage.c index c840ead..970db37 100644 --- a/kernel/drivers/soc/rockchip/mtd_vendor_storage.c +++ b/kernel/drivers/soc/rockchip/mtd_vendor_storage.c @@ -16,38 +16,13 @@ #include <linux/soc/rockchip/rk_vendor_storage.h> #include <linux/uaccess.h> #include <linux/vmalloc.h> +#include <misc/rkflash_vendor_storage.h> #define MTD_VENDOR_PART_START 0 -#define MTD_VENDOR_PART_SIZE 8 +#define MTD_VENDOR_PART_SIZE FLASH_VENDOR_PART_SIZE +#define MTD_VENDOR_NOR_BLOCK_SIZE 128 #define MTD_VENDOR_PART_NUM 1 -#define MTD_VENDOR_TAG 0x524B5644 - -struct rk_vendor_req { - u32 tag; - u16 id; - u16 len; - u8 data[1024]; -}; - -struct vendor_item { - u16 id; - u16 offset; - u16 size; - u16 flag; -}; - -struct vendor_info { - u32 tag; - u32 version; - u16 next_index; - u16 item_num; - u16 free_offset; - u16 free_size; - struct vendor_item item[62]; - u8 data[MTD_VENDOR_PART_SIZE * 512 - 512 - 8]; - u32 hash; - u32 version2; -}; +#define MTD_VENDOR_TAG VENDOR_HEAD_TAG struct mtd_nand_info { u32 blk_offset; @@ -65,14 +40,11 @@ #define GET_LOCK_FLAG_IO _IOW('r', 0x53, unsigned int) #endif -#define VENDOR_REQ_TAG 0x56524551 -#define VENDOR_READ_IO _IOW('v', 0x01, unsigned int) -#define VENDOR_WRITE_IO _IOW('v', 0x02, unsigned int) - static u8 *g_idb_buffer; -static struct vendor_info *g_vendor; +static struct flash_vendor_info *g_vendor; static DEFINE_MUTEX(vendor_ops_mutex); static struct mtd_info *mtd; +static u32 mtd_erase_size; static const char *vendor_mtd_name = "vnvm"; static struct mtd_nand_info nand_info; @@ -83,8 +55,8 @@ struct erase_info ei; re_write: - if (nand_info.page_offset >= mtd->erasesize) { - nand_info.blk_offset += mtd->erasesize; + if (nand_info.page_offset >= mtd_erase_size) { + nand_info.blk_offset += mtd_erase_size; if (nand_info.blk_offset >= mtd->size) nand_info.blk_offset = 0; if (mtd_block_isbad(mtd, nand_info.blk_offset)) @@ -92,7 +64,7 @@ memset(&ei, 0, sizeof(struct erase_info)); ei.addr = nand_info.blk_offset; - ei.len = mtd->erasesize; + ei.len = mtd_erase_size; if (mtd_erase(mtd, &ei)) goto re_write; @@ -129,7 +101,15 @@ nand_info.ops_size = (sizeof(*g_vendor) + mtd->writesize - 1) / mtd->writesize; nand_info.ops_size *= mtd->writesize; - for (offset = 0; offset < mtd->size; offset += mtd->erasesize) { + /* + * The NOR FLASH erase size maybe config as 4KB, need to re-define + * and maintain consistency with uboot. + */ + mtd_erase_size = mtd->erasesize; + if (mtd_erase_size <= MTD_VENDOR_NOR_BLOCK_SIZE * 512) + mtd_erase_size = MTD_VENDOR_NOR_BLOCK_SIZE * 512; + + for (offset = 0; offset < mtd->size; offset += mtd_erase_size) { if (!mtd_block_isbad(mtd, offset)) { err = mtd_read(mtd, offset, sizeof(*g_vendor), &bytes_read, (u8 *)g_vendor); @@ -144,11 +124,11 @@ } } } else if (nand_info.blk_offset == offset) - nand_info.blk_offset += mtd->erasesize; + nand_info.blk_offset += mtd_erase_size; } if (nand_info.version) { - for (offset = mtd->erasesize - nand_info.ops_size; + for (offset = mtd_erase_size - nand_info.ops_size; offset >= 0; offset -= nand_info.ops_size) { err = mtd_read(mtd, nand_info.blk_offset + offset, @@ -174,7 +154,10 @@ if (bytes_read == sizeof(*g_vendor) && g_vendor->tag == MTD_VENDOR_TAG && g_vendor->version == g_vendor->version2) { - nand_info.version = g_vendor->version; + if (nand_info.version > g_vendor->version) + g_vendor->version = nand_info.version; + else + nand_info.version = g_vendor->version; break; } } @@ -184,11 +167,11 @@ g_vendor->tag = MTD_VENDOR_TAG; g_vendor->free_size = sizeof(g_vendor->data); g_vendor->version2 = g_vendor->version; - for (offset = 0; offset < mtd->size; offset += mtd->erasesize) { + for (offset = 0; offset < mtd->size; offset += mtd_erase_size) { if (!mtd_block_isbad(mtd, offset)) { memset(&ei, 0, sizeof(struct erase_info)); ei.addr = nand_info.blk_offset + offset; - ei.len = mtd->erasesize; + ei.len = mtd_erase_size; mtd_erase(mtd, &ei); } } @@ -305,7 +288,7 @@ { long ret = -1; int size; - struct rk_vendor_req *v_req; + struct RK_VENDOR_REQ *v_req; u32 *page_buf; page_buf = kmalloc(4096, GFP_KERNEL); @@ -314,7 +297,7 @@ mutex_lock(&vendor_ops_mutex); - v_req = (struct rk_vendor_req *)page_buf; + v_req = (struct RK_VENDOR_REQ *)page_buf; switch (cmd) { case VENDOR_READ_IO: diff --git a/kernel/drivers/soc/rockchip/pm_domains.c b/kernel/drivers/soc/rockchip/pm_domains.c index 6c5aa46..d5cc4f0 100644 --- a/kernel/drivers/soc/rockchip/pm_domains.c +++ b/kernel/drivers/soc/rockchip/pm_domains.c @@ -37,6 +37,7 @@ #include <dt-bindings/power/rk3366-power.h> #include <dt-bindings/power/rk3368-power.h> #include <dt-bindings/power/rk3399-power.h> +#include <dt-bindings/power/rk3528-power.h> #include <dt-bindings/power/rk3568-power.h> struct rockchip_domain_info { @@ -146,6 +147,20 @@ .keepon_startup = keepon, \ } +#define DOMAIN_M_A(pwr, status, req, idle, ack, always, wakeup, keepon) \ +{ \ + .pwr_w_mask = (pwr) << 16, \ + .pwr_mask = (pwr), \ + .status_mask = (status), \ + .req_w_mask = (req) << 16, \ + .req_mask = (req), \ + .idle_mask = (idle), \ + .ack_mask = (ack), \ + .always_on = always, \ + .active_wakeup = wakeup, \ + .keepon_startup = keepon, \ +} + #define DOMAIN_M_O(pwr, status, p_offset, req, idle, ack, r_offset, wakeup, keepon) \ { \ .pwr_w_mask = (pwr) << 16, \ @@ -205,6 +220,9 @@ #define DOMAIN_RK3399_PROTECT(pwr, status, req, wakeup) \ DOMAIN(pwr, status, req, req, req, wakeup, true) + +#define DOMAIN_RK3528(pwr, req, always, wakeup) \ + DOMAIN_M_A(pwr, pwr, req, req, req, always, wakeup, false) #define DOMAIN_RK3568(pwr, req, wakeup) \ DOMAIN_M(pwr, pwr, req, req, req, wakeup, false) @@ -1357,6 +1375,18 @@ [RK3399_PD_SDIOAUDIO] = DOMAIN_RK3399(BIT(31), BIT(31), BIT(29), true), }; +static const struct rockchip_domain_info rk3528_pm_domains[] = { + [RK3528_PD_PMU] = DOMAIN_RK3528(0, BIT(0), true, false), + [RK3528_PD_BUS] = DOMAIN_RK3528(0, BIT(1), true, false), + [RK3528_PD_DDR] = DOMAIN_RK3528(0, BIT(2), true, false), + [RK3528_PD_MSCH] = DOMAIN_RK3528(0, BIT(3), true, false), + [RK3528_PD_GPU] = DOMAIN_RK3528(BIT(0), BIT(4), true, false), + [RK3528_PD_RKVDEC] = DOMAIN_RK3528(0, BIT(5), true, false), + [RK3528_PD_RKVENC] = DOMAIN_RK3528(0, BIT(6), true, false), + [RK3528_PD_VO] = DOMAIN_RK3528(0, BIT(7), true, false), + [RK3528_PD_VPU] = DOMAIN_RK3528(0, BIT(8), true, false), +}; + static const struct rockchip_domain_info rk3568_pm_domains[] = { [RK3568_PD_NPU] = DOMAIN_RK3568(BIT(1), BIT(2), false), [RK3568_PD_GPU] = DOMAIN_RK3568(BIT(0), BIT(1), false), @@ -1508,6 +1538,17 @@ .domain_info = rk3399_pm_domains, }; +static const struct rockchip_pmu_info rk3528_pmu = { + .pwr_offset = 0x1210, + .status_offset = 0x1230, + .req_offset = 0x1110, + .idle_offset = 0x1128, + .ack_offset = 0x1120, + + .num_domains = ARRAY_SIZE(rk3528_pm_domains), + .domain_info = rk3528_pm_domains, +}; + static const struct rockchip_pmu_info rk3568_pmu = { .pwr_offset = 0xa0, .status_offset = 0x98, @@ -1586,6 +1627,12 @@ .data = (void *)&rk3399_pmu, }, #endif +#ifdef CONFIG_CPU_RK3528 + { + .compatible = "rockchip,rk3528-power-controller", + .data = (void *)&rk3528_pmu, + }, +#endif #ifdef CONFIG_CPU_RK3568 { .compatible = "rockchip,rk3568-power-controller", diff --git a/kernel/drivers/soc/rockchip/rk_fiq_debugger.c b/kernel/drivers/soc/rockchip/rk_fiq_debugger.c index 375375c..7cd77c3 100644 --- a/kernel/drivers/soc/rockchip/rk_fiq_debugger.c +++ b/kernel/drivers/soc/rockchip/rk_fiq_debugger.c @@ -45,14 +45,14 @@ #ifdef CONFIG_FIQ_DEBUGGER_TRUST_ZONE #include <linux/rockchip/rockchip_sip.h> #endif - -#define UART_USR 0x1f /* In: UART Status Register */ +#define UART_USR 0x1f /* In: UART Status Register */ #define UART_USR_RX_FIFO_FULL 0x10 /* Receive FIFO full */ #define UART_USR_RX_FIFO_NOT_EMPTY 0x08 /* Receive FIFO not empty */ #define UART_USR_TX_FIFO_EMPTY 0x04 /* Transmit FIFO empty */ #define UART_USR_TX_FIFO_NOT_FULL 0x02 /* Transmit FIFO not full */ #define UART_USR_BUSY 0x01 /* UART busy indicator */ #define UART_SRR 0x22 /* software reset register */ +#define RK_UART_RFL 0x21 /* UART Receive Fifo Level Register */ struct rk_fiq_debugger { int irq; @@ -150,7 +150,7 @@ static int debug_getc(struct platform_device *pdev) { - unsigned int lsr; + unsigned int lsr, usr, rfl, iir; struct rk_fiq_debugger *t; unsigned int temp; static unsigned int n; @@ -160,8 +160,22 @@ /* * Clear uart interrupt status */ - rk_fiq_read(t, UART_USR); + iir = rk_fiq_read(t, UART_IIR); + usr = rk_fiq_read(t, UART_USR); lsr = rk_fiq_read_lsr(t); + + /* + * There are ways to get Designware-based UARTs into a state where + * they are asserting UART_IIR_RX_TIMEOUT but there is no actual + * data available. If we see such a case then we'll do a bogus + * read. If we don't do this then the "RX TIMEOUT" interrupt will + * fire forever. + */ + if ((iir & 0x3f) == UART_IIR_RX_TIMEOUT) { + rfl = rk_fiq_read(t, RK_UART_RFL); + if (!(lsr & (UART_LSR_DR | UART_LSR_BI)) && !(usr & 0x1) && (rfl == 0)) + rk_fiq_read(t, UART_RX); + } if (lsr & UART_LSR_DR) { temp = rk_fiq_read(t, UART_RX); @@ -215,22 +229,32 @@ #ifdef CONFIG_RK_CONSOLE_THREAD #define FIFO_SIZE SZ_64K -#define LINE_MAX 1024 +#define TTY_FIFO_SIZE SZ_64K static DEFINE_KFIFO(fifo, unsigned char, FIFO_SIZE); -static char console_buf[LINE_MAX]; /* avoid FRAME WARN */ -static bool console_thread_stop; +static DEFINE_KFIFO(tty_fifo, unsigned char, TTY_FIFO_SIZE); +static bool console_thread_stop; /* write on console_write */ +static bool console_thread_running; /* write on console_thread */ static unsigned int console_dropped_messages; + +static int write_room(struct platform_device *pdev) +{ + return (TTY_FIFO_SIZE - kfifo_len(&tty_fifo)); +} static void console_putc(struct platform_device *pdev, unsigned int c) { struct rk_fiq_debugger *t; - unsigned int count = 500; + unsigned int count = 2; /* loop 2 times is enough */ + unsigned long us = 400; /* the time to send 60 byte for baudrate 1500000 */ t = container_of(dev_get_platdata(&pdev->dev), typeof(*t), pdata); + if (t->baudrate == 115200) + us = 5160; /* the time to send 60 byte for baudrate 115200 */ + while (!(rk_fiq_read(t, UART_USR) & UART_USR_TX_FIFO_NOT_FULL) && count--) - usleep_range(200, 210); + usleep_range(us, us + us / 20); rk_fiq_write(t, c, UART_TX); } @@ -238,12 +262,16 @@ static void console_flush(struct platform_device *pdev) { struct rk_fiq_debugger *t; - unsigned int count = 500; + unsigned int count = 2; /* loop 2 times is enough */ + unsigned long us = 428; /* the time to send 64 byte for baudrate 1500000 */ t = container_of(dev_get_platdata(&pdev->dev), typeof(*t), pdata); + if (t->baudrate == 115200) + us = 5500; /* the time to send 64 byte for baudrate 115200 */ + while (!(rk_fiq_read_lsr(t) & UART_LSR_TEMT) && count--) - usleep_range(200, 210); + usleep_range(us, us + us / 20); } static void console_put(struct platform_device *pdev, @@ -266,33 +294,79 @@ } } +static void wake_up_console_thread(struct task_struct *console_task) +{ + /* + * Avoid dead lock on console_task->pi_lock and console_lock + * when call printk() in try_to_wake_up(). + * + * cpu0 hold console_lock, then try lock pi_lock fail: + * printk()->vprintk_emit()->console_unlock()->try_to_wake_up() + * ->lock(pi_lock)->deadlock + * + * cpu1 hold pi_lock, then try lock console_lock fail: + * console_thread()->console_put()->usleep_range()->run_hrtimer() + * ->hrtimer_wakeup()->try_to_wake_up()[hold_pi_lock]->printk() + * ->vprintk_emit()->console_trylock_spining()->cpu_relax()->deadlock + * + * if cpu0 does not hold console_lock, cpu1 also deadlock on pi_lock: + * ...->hrtimer_wakeup()->try_to_wake_up()[hold_pi_lock]->printk() + * ->vprintk_emit()->console_unlock()->try_to_wake_up() + * ->lock(pi_lock)->deadlock + * + * so when console_task is running on usleep_range(), printk() + * should not wakeup console_task to avoid lock(pi_lock) again, + * as run_hrtimer() will wakeup console_task later. + * console_thread_running==false guarantee that console_task + * is not running on usleep_range(). + */ + if (!READ_ONCE(console_thread_running)) + wake_up_process(console_task); +} + static int console_thread(void *data) { struct platform_device *pdev = data; - char *buf = console_buf; - unsigned int len; + char buf[64], c = 0; + unsigned int len = 0, len_tty = 0; while (1) { unsigned int dropped; set_current_state(TASK_INTERRUPTIBLE); - if (kfifo_is_empty(&fifo)) + if (console_thread_stop || (kfifo_is_empty(&fifo) && kfifo_is_empty(&tty_fifo))) { + smp_store_mb(console_thread_running, false); schedule(); + smp_store_mb(console_thread_running, true); + } if (kthread_should_stop()) break; set_current_state(TASK_RUNNING); - while (!console_thread_stop) { - len = kfifo_out(&fifo, buf, LINE_MAX); - if (!len) - break; - console_put(pdev, buf, len); + + while (!console_thread_stop && (!kfifo_is_empty(&fifo) || !kfifo_is_empty(&tty_fifo))) { + while (!console_thread_stop && kfifo_get(&fifo, &c)) { + console_put(pdev, &c, 1); + if (c == '\n') + break; + } + + while (!console_thread_stop && kfifo_get(&tty_fifo, &c)) { + console_putc(pdev, c); + len_tty++; + if (c == '\n') + break; + } } + + if (len_tty > 0) + fiq_tty_wake_up(pdev); + len_tty = 0; + dropped = console_dropped_messages; if (dropped && !console_thread_stop) { console_dropped_messages = 0; smp_wmb(); - len = snprintf(buf, LINE_MAX, - "** %u console messages dropped **\n", + len = sprintf(buf, "** %u console messages dropped **\n", dropped); console_put(pdev, buf, len); } @@ -328,18 +402,37 @@ } else if (count) { unsigned int ret = 0; - if (kfifo_len(&fifo) + count < FIFO_SIZE) + if (kfifo_len(&fifo) + count <= FIFO_SIZE) ret = kfifo_in(&fifo, s, count); if (!ret) { console_dropped_messages++; smp_wmb(); } else { - wake_up_process(t->console_task); + wake_up_console_thread(t->console_task); } } } -#endif +static int tty_write(struct platform_device *pdev, const char *s, int count) +{ + unsigned int ret = 0; + struct rk_fiq_debugger *t; + + if (console_thread_stop) + return count; + t = container_of(dev_get_platdata(&pdev->dev), typeof(*t), pdata); + + if (count > 0) { + if (kfifo_len(&tty_fifo) + count <= TTY_FIFO_SIZE) + ret = kfifo_in(&tty_fifo, s, count); + + if (ret <= 0) + return 0; + wake_up_console_thread(t->console_task); + } + return count; +} +#endif static void fiq_enable(struct platform_device *pdev, unsigned int irq, bool on) { @@ -371,7 +464,7 @@ return rk_fiq_sdei.fiq_en; } -int fiq_sdei_event_callback(u32 event, struct pt_regs *regs, void *arg) +static int fiq_sdei_event_callback(u32 event, struct pt_regs *regs, void *arg) { int cpu_id = get_logical_index(read_cpuid_mpidr() & MPIDR_HWID_BITMASK); @@ -380,7 +473,7 @@ return 0; } -void rk_fiq_sdei_event_sw_cpu(int wait_disable) +static void rk_fiq_sdei_event_sw_cpu(int wait_disable) { unsigned long affinity; int cnt = 100000; @@ -402,7 +495,7 @@ rk_fiq_sdei.cur_cpu = rk_fiq_sdei.sw_cpu; } -int fiq_sdei_sw_cpu_event_callback(u32 event, struct pt_regs *regs, void *arg) +static int fiq_sdei_sw_cpu_event_callback(u32 event, struct pt_regs *regs, void *arg) { int cnt = 10000; int ret = 0; @@ -454,7 +547,7 @@ int cnt = 10000; if (rk_fiq_sdei.cur_cpu == cpu) { - target_cpu = cpumask_first(cpu_online_mask); + target_cpu = cpumask_any_but(cpu_online_mask, cpu); _rk_fiq_dbg_sdei_switch_cpu(target_cpu, 1); while (rk_fiq_sdei.cur_cpu == cpu && cnt) { @@ -495,6 +588,7 @@ static int fiq_debugger_sdei_enable(struct rk_fiq_debugger *t) { int ret, cpu, i; + int is_dyn_event = false; ret = sip_fiq_debugger_sdei_get_event_id(&rk_fiq_sdei.event_id, &rk_fiq_sdei.cpu_sw_event_id, @@ -503,6 +597,17 @@ if (ret) { pr_err("%s: get event id error!\n", __func__); return ret; + } + + /* If we can't get a valid fiq event, use dynamic event instead */ + if (rk_fiq_sdei.event_id == 0) { + ret = sdei_interrupt_bind(serial_hwirq, &rk_fiq_sdei.event_id); + if (ret) { + pr_err("%s: bind intr:%d error!\n", __func__, serial_hwirq); + return ret; + } + + is_dyn_event = true; } ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, @@ -583,6 +688,9 @@ unregister_pm_notifier(&fiq_dbg_sdei_pm_nb); sdei_event_unregister(rk_fiq_sdei.event_id); + if (is_dyn_event) + sdei_interrupt_release(rk_fiq_sdei.event_id); + return ret; } @@ -604,7 +712,7 @@ sip_fiq_debugger_enable_debug(val); } -static void fiq_debugger_uart_irq_tf(struct pt_regs *_pt_regs, uint32_t cpu) +static void fiq_debugger_uart_irq_tf(struct pt_regs *_pt_regs, unsigned long cpu) { fiq_debugger_fiq(_pt_regs, cpu); } @@ -652,7 +760,7 @@ if ((sip_fiq_debugger_is_enabled()) && (sip_fiq_debugger_get_target_cpu() == cpu)) { - target_cpu = cpumask_first(cpu_online_mask); + target_cpu = cpumask_any_but(cpu_online_mask, cpu); sip_fiq_debugger_switch_cpu(target_cpu); } @@ -730,9 +838,9 @@ } #endif -void rk_serial_debug_init(void __iomem *base, phys_addr_t phy_base, - int irq, int signal_irq, - int wakeup_irq, unsigned int baudrate) +static void rk_serial_debug_init(void __iomem *base, phys_addr_t phy_base, + int irq, int signal_irq, + int wakeup_irq, unsigned int baudrate) { struct rk_fiq_debugger *t = NULL; struct platform_device *pdev = NULL; @@ -831,8 +939,11 @@ #ifdef CONFIG_RK_CONSOLE_THREAD t->console_task = kthread_run(console_thread, pdev, "kconsole"); - if (!IS_ERR(t->console_task)) + if (!IS_ERR(t->console_task)) { t->pdata.console_write = console_write; + t->pdata.tty_write = tty_write; + t->pdata.write_room = write_room; + } #endif pdev->name = "fiq_debugger"; @@ -854,7 +965,7 @@ kfree(t); } -void rk_serial_debug_init_dummy(void) +static void rk_serial_debug_init_dummy(void) { struct rk_fiq_debugger *t = NULL; struct platform_device *pdev = NULL; diff --git a/kernel/drivers/soc/rockchip/rockchip-cpuinfo.c b/kernel/drivers/soc/rockchip/rockchip-cpuinfo.c index eae9cb5..69c2077 100644 --- a/kernel/drivers/soc/rockchip/rockchip-cpuinfo.c +++ b/kernel/drivers/soc/rockchip/rockchip-cpuinfo.c @@ -182,6 +182,11 @@ } } +static void rk3528_init(void) +{ + rockchip_soc_id = ROCKCHIP_SOC_RK3528; +} + #define RK356X_PMU_GRF_PHYS 0xfdc20000 #define RK356X_PMU_GRF_SOC_CON0 0x00000100 #define RK356X_CHIP_VERSION_MASK 0x00008000 @@ -227,7 +232,9 @@ rv1109_init(); } else if (cpu_is_rv1126()) { rv1126_init(); - } else if (cpu_is_rk3566()) { + } else if (cpu_is_rk3528()) { + rk3528_init(); + } else if (cpu_is_rk3566()) { rk3566_init(); } else if (cpu_is_rk3568()) { rk3568_init(); diff --git a/kernel/drivers/soc/rockchip/rockchip_debug.c b/kernel/drivers/soc/rockchip/rockchip_debug.c index f6777de..97002bc 100644 --- a/kernel/drivers/soc/rockchip/rockchip_debug.c +++ b/kernel/drivers/soc/rockchip/rockchip_debug.c @@ -425,7 +425,7 @@ struct irq_desc *desc; if (i > nr_irqs) - return 0; + return -EINVAL; /* print header and calculate the width of the first column */ if (i == 0) { @@ -433,24 +433,24 @@ j *= 10; buf += sprintf(buf, "%*s", prec + 8, ""); - for_each_online_cpu(j) + for_each_possible_cpu(j) buf += sprintf(buf, "CPU%-8d", j); buf += sprintf(buf, "\n"); } desc = irq_to_desc(i); if (!desc) - goto outsparse; + return -EINVAL; if (desc->kstat_irqs) - for_each_online_cpu(j) + for_each_possible_cpu(j) any_count |= *per_cpu_ptr(desc->kstat_irqs, j); if ((!desc->action || (desc->action && desc->action == &chained_action)) && !any_count) - goto outsparse; + return -EINVAL; buf += sprintf(buf, "%*d: ", prec, i); - for_each_online_cpu(j) + for_each_possible_cpu(j) buf += sprintf(buf, "%10u ", desc->kstat_irqs ? *per_cpu_ptr(desc->kstat_irqs, j) : 0); @@ -480,7 +480,6 @@ } sprintf(buf, "\n"); -outsparse: return 0; } diff --git a/kernel/drivers/soc/rockchip/rockchip_opp_select.c b/kernel/drivers/soc/rockchip/rockchip_opp_select.c index 1520e2f..02bcf82 100644 --- a/kernel/drivers/soc/rockchip/rockchip_opp_select.c +++ b/kernel/drivers/soc/rockchip/rockchip_opp_select.c @@ -6,8 +6,10 @@ #include <linux/clk.h> #include <linux/cpufreq.h> #include <linux/devfreq.h> +#include <linux/mfd/syscon.h> #include <linux/module.h> #include <linux/nvmem-consumer.h> +#include <linux/regmap.h> #include <linux/regulator/consumer.h> #include <linux/slab.h> #include <linux/soc/rockchip/pvtm.h> @@ -51,15 +53,24 @@ unsigned int num; unsigned int err; unsigned int ref_temp; + unsigned int offset; int temp_prop[2]; const char *tz_name; struct thermal_zone_device *tz; + struct regmap *grf; }; struct lkg_conversion_table { int temp; int conv; }; + +struct otp_opp_info { + u16 min_freq; + u16 max_freq; + u8 volt; + u8 length; +} __packed; #define PVTM_CH_MAX 8 #define PVTM_SUB_CH_MAX 8 @@ -298,16 +309,8 @@ return -EINVAL; if (of_property_read_u32(np, "rockchip,pvtm-volt", &pvtm->volt)) return -EINVAL; - if (of_property_read_u32_array(np, "rockchip,pvtm-ch", pvtm->ch, 2)) - return -EINVAL; - if (pvtm->ch[0] >= PVTM_CH_MAX || pvtm->ch[1] >= PVTM_SUB_CH_MAX) - return -EINVAL; if (of_property_read_u32(np, "rockchip,pvtm-sample-time", &pvtm->sample_time)) - return -EINVAL; - if (of_property_read_u32(np, "rockchip,pvtm-number", &pvtm->num)) - return -EINVAL; - if (of_property_read_u32(np, "rockchip,pvtm-error", &pvtm->err)) return -EINVAL; if (of_property_read_u32(np, "rockchip,pvtm-ref-temp", &pvtm->ref_temp)) return -EINVAL; @@ -324,6 +327,23 @@ if (IS_ERR(pvtm->tz)) return -EINVAL; if (!pvtm->tz->ops->get_temp) + return -EINVAL; + if (of_property_read_bool(np, "rockchip,pvtm-pvtpll")) { + if (of_property_read_u32(np, "rockchip,pvtm-offset", + &pvtm->offset)) + return -EINVAL; + pvtm->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); + if (IS_ERR(pvtm->grf)) + return -EINVAL; + return 0; + } + if (of_property_read_u32_array(np, "rockchip,pvtm-ch", pvtm->ch, 2)) + return -EINVAL; + if (pvtm->ch[0] >= PVTM_CH_MAX || pvtm->ch[1] >= PVTM_SUB_CH_MAX) + return -EINVAL; + if (of_property_read_u32(np, "rockchip,pvtm-number", &pvtm->num)) + return -EINVAL; + if (of_property_read_u32(np, "rockchip,pvtm-error", &pvtm->err)) return -EINVAL; return 0; @@ -415,7 +435,7 @@ cur_temp, *target_value, avg_value, diff_value); resetore_volt: - regulator_set_voltage(reg, old_volt, old_volt); + regulator_set_voltage(reg, old_volt, INT_MAX); restore_clk: clk_set_rate(clk, old_freq); pvtm_value_out: @@ -694,6 +714,81 @@ } EXPORT_SYMBOL(rockchip_of_get_lkg_sel); +static int rockchip_get_pvtm_pvtpll(struct device *dev, struct device_node *np, + char *reg_name) +{ + struct regulator *reg; + struct clk *clk; + struct pvtm_config *pvtm; + unsigned long old_freq; + unsigned int old_volt; + int cur_temp, diff_temp, prop_temp, diff_value; + int pvtm_value = 0; + int ret = 0; + + pvtm = kzalloc(sizeof(*pvtm), GFP_KERNEL); + if (!pvtm) + return -ENOMEM; + + ret = rockchip_parse_pvtm_config(np, pvtm); + if (ret) + goto out; + + clk = clk_get(dev, NULL); + if (IS_ERR_OR_NULL(clk)) { + dev_warn(dev, "Failed to get clk\n"); + goto out; + } + + reg = regulator_get_optional(dev, reg_name); + if (IS_ERR_OR_NULL(reg)) { + dev_warn(dev, "Failed to get reg\n"); + clk_put(clk); + goto out; + } + old_freq = clk_get_rate(clk); + old_volt = regulator_get_voltage(reg); + + ret = clk_set_rate(clk, pvtm->freq * 1000); + if (ret) { + dev_err(dev, "Failed to set pvtm freq\n"); + goto put_reg; + } + ret = regulator_set_voltage(reg, pvtm->volt, INT_MAX); + if (ret) { + dev_err(dev, "Failed to set pvtm_volt\n"); + goto restore_clk; + } + usleep_range(pvtm->sample_time, pvtm->sample_time + 100); + + ret = regmap_read(pvtm->grf, pvtm->offset, &pvtm_value); + if (ret < 0) { + dev_err(dev, "failed to get pvtm from 0x%x\n", pvtm->offset); + goto resetore_volt; + } + pvtm->tz->ops->get_temp(pvtm->tz, &cur_temp); + diff_temp = (cur_temp / 1000 - pvtm->ref_temp); + if (diff_temp < 0) + prop_temp = pvtm->temp_prop[0]; + else + prop_temp = pvtm->temp_prop[1]; + diff_value = diff_temp * prop_temp / 1000; + pvtm_value += diff_value; + + dev_info(dev, "pvtm=%d\n", pvtm_value); + +resetore_volt: + regulator_set_voltage(reg, old_volt, INT_MAX); +restore_clk: + clk_set_rate(clk, old_freq); +put_reg: + regulator_put(reg); + clk_put(clk); +out: + kfree(pvtm); + + return pvtm_value; +} static int rockchip_get_pvtm(struct device *dev, struct device_node *np, char *reg_name) @@ -750,7 +845,10 @@ char name[NAME_MAX]; int pvtm, ret; - pvtm = rockchip_get_pvtm(dev, np, reg_name); + if (of_property_read_bool(np, "rockchip,pvtm-pvtpll")) + pvtm = rockchip_get_pvtm_pvtpll(dev, np, reg_name); + else + pvtm = rockchip_get_pvtm(dev, np, reg_name); if (pvtm <= 0) return; @@ -910,8 +1008,9 @@ struct sel_table *irdrop_table = NULL; struct opp_table *opp_table; struct dev_pm_opp *opp; + unsigned long tmp_safe_rate = 0; int evb_irdrop = 0, board_irdrop, delta_irdrop; - int tmp_safe_rate = 0, opp_rate, i, ret = 0; + int opp_rate, i, ret = 0; u32 max_volt = UINT_MAX; bool reach_max_volt = false; @@ -1003,6 +1102,44 @@ mutex_unlock(&opp_table->lock); } +static void rockchip_adjust_opp_by_otp(struct device *dev, + struct device_node *np) +{ + struct dev_pm_opp *opp; + struct opp_table *opp_table; + struct otp_opp_info opp_info = {}; + int ret; + + ret = rockchip_nvmem_cell_read_common(np, "opp-info", &opp_info, + sizeof(opp_info)); + if (ret || !opp_info.volt) + return; + + dev_info(dev, "adjust opp-table by otp: min=%uM, max=%uM, volt=%umV\n", + opp_info.min_freq, opp_info.max_freq, opp_info.volt); + + opp_table = dev_pm_opp_get_opp_table(dev); + if (!opp_table) + return; + + mutex_lock(&opp_table->lock); + list_for_each_entry(opp, &opp_table->opp_list, node) { + if (!opp->available) + continue; + if (opp->rate < opp_info.min_freq * 1000000) + continue; + if (opp->rate > opp_info.max_freq * 1000000) + continue; + + opp->supplies->u_volt += opp_info.volt * 1000; + if (opp->supplies->u_volt > opp->supplies->u_volt_max) + opp->supplies->u_volt = opp->supplies->u_volt_max; + } + mutex_unlock(&opp_table->lock); + + dev_pm_opp_put_opp_table(opp_table); +} + static int rockchip_adjust_opp_table(struct device *dev, unsigned long scale_rate) { @@ -1049,6 +1186,7 @@ of_property_read_u32(np, "rockchip,avs-enable", &avs); of_property_read_u32(np, "rockchip,avs", &avs); of_property_read_u32(np, "rockchip,avs-scale", &avs_scale); + rockchip_adjust_opp_by_otp(dev, np); rockchip_adjust_opp_by_mbist_vmin(dev, np); rockchip_adjust_opp_by_irdrop(dev, np, &safe_rate, &max_rate); diff --git a/kernel/drivers/soc/rockchip/rockchip_pm_config.c b/kernel/drivers/soc/rockchip/rockchip_pm_config.c index 659bab2..6c12ef8 100644 --- a/kernel/drivers/soc/rockchip/rockchip_pm_config.c +++ b/kernel/drivers/soc/rockchip/rockchip_pm_config.c @@ -59,6 +59,7 @@ { .compatible = "rockchip,pm-rk3328",}, { .compatible = "rockchip,pm-rk3368",}, { .compatible = "rockchip,pm-rk3399",}, + { .compatible = "rockchip,pm-rk3528",}, { .compatible = "rockchip,pm-rk3568",}, { .compatible = "rockchip,pm-rv1126",}, { }, diff --git a/kernel/drivers/soc/rockchip/rockchip_system_monitor.c b/kernel/drivers/soc/rockchip/rockchip_system_monitor.c index 8a84d02..ffb95c0 100644 --- a/kernel/drivers/soc/rockchip/rockchip_system_monitor.c +++ b/kernel/drivers/soc/rockchip/rockchip_system_monitor.c @@ -68,6 +68,7 @@ int temp_hysteresis; unsigned int delay; bool is_temp_offline; + bool boosted; }; static unsigned long system_status; @@ -288,6 +289,7 @@ { struct video_info *video_info; unsigned int max_res = 0, max_stream_bitrate = 0, res = 0; + unsigned int max_video_framerate = 0; mutex_lock(&video_info_mutex); if (list_empty(&video_info_list)) { @@ -302,6 +304,8 @@ max_res = res; if (video_info->streamBitrate > max_stream_bitrate) max_stream_bitrate = video_info->streamBitrate; + if (video_info->videoFramerate > max_video_framerate) + max_video_framerate = video_info->videoFramerate; } mutex_unlock(&video_info_mutex); @@ -310,8 +314,9 @@ } else { if (max_stream_bitrate == 10) rockchip_set_system_status(SYS_STATUS_VIDEO_4K_10B); - else - rockchip_set_system_status(SYS_STATUS_VIDEO_4K); + if (max_video_framerate == 60) + rockchip_set_system_status(SYS_STATUS_VIDEO_4K_60P); + rockchip_set_system_status(SYS_STATUS_VIDEO_4K); } } @@ -737,6 +742,20 @@ } EXPORT_SYMBOL(rockchip_monitor_cpu_high_temp_adjust); +void rockchip_monitor_set_boosted(void) +{ + if (system_monitor) + system_monitor->boosted = true; +} +EXPORT_SYMBOL(rockchip_monitor_set_boosted); + +void rockchip_monitor_clear_boosted(void) +{ + if (system_monitor) + system_monitor->boosted = false; +} +EXPORT_SYMBOL(rockchip_monitor_clear_boosted); + static int rockchip_monitor_update_devfreq(struct devfreq *df) { int ret = 0; @@ -764,6 +783,8 @@ if (info->devp && info->devp->data) { df = (struct devfreq *)info->devp->data; rockchip_monitor_update_devfreq(df); + } else if (info->devp && info->devp->low_temp_adjust_volt) { + info->devp->low_temp_adjust_volt(info); } return 0; @@ -1120,7 +1141,7 @@ monitor_set_freq_table(dev, info); - if (info->devp->type == MONITOR_TPYE_DEV) { + if (info->devp->type == MONITOR_TPYE_DEV && info->devp->data) { info->devfreq_nb.notifier_call = system_monitor_devfreq_notifier_call; devfreq = (struct devfreq *)info->devp->data; @@ -1154,11 +1175,12 @@ list_del(&info->node); up_write(&mdev_list_sem); - devfreq = (struct devfreq *)info->devp->data; - if (info->devp->type == MONITOR_TPYE_DEV) + if (info->devp->type == MONITOR_TPYE_DEV && info->devp->data) { + devfreq = (struct devfreq *)info->devp->data; devm_devfreq_unregister_notifier(info->dev, devfreq, &info->devfreq_nb, DEVFREQ_TRANSITION_NOTIFIER); + } kfree(info->low_temp_adjust_table); kfree(info->opp_table); @@ -1413,7 +1435,8 @@ if (limit_freq > info->wide_temp_limit / 1000) limit_freq = info->wide_temp_limit / 1000; } - if (info->status_max_limit && + if (!system_monitor->boosted && + info->status_max_limit && limit_freq > info->status_max_limit) limit_freq = info->status_max_limit; diff --git a/kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c b/kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c index ba16186..1061881 100644 --- a/kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c +++ b/kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c @@ -2,6 +2,7 @@ /* * Copyright (C) 2020 Rockchip Electronics Co., Ltd. */ +#include <linux/clk.h> #include <linux/iopoll.h> #include <linux/kernel.h> #include <linux/kthread.h> @@ -27,6 +28,8 @@ struct resource *res; struct device_node *rds, *rdd, *dma; struct device *dev = &pdev->dev; + struct clk_bulk_data *clk_bulks; + int clk_num; u32 status; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -39,6 +42,18 @@ rds = of_parse_phandle(dev->of_node, "memory-region-src", 0); rdd = of_parse_phandle(dev->of_node, "memory-region-dst", 0); dma = of_parse_phandle(dev->of_node, "memory-region-idmac", 0); + + clk_num = clk_bulk_get_all(&pdev->dev, &clk_bulks); + if (clk_num >= 0) { + ret = clk_bulk_prepare_enable(clk_num, clk_bulks); + if (ret) { + dev_err(&pdev->dev, "failed to enable clocks\n"); + return ret; + } + } else { + dev_err(&pdev->dev, "failed to get clks property\\n"); + return clk_num; + } if (readl_poll_timeout(regs + SDMMC_STATUS, status, !(status & (BIT(10) | GENMASK(7, 4))), 100, @@ -95,6 +110,8 @@ } out: + clk_bulk_disable_unprepare(clk_num, clk_bulks); + clk_bulk_put_all(clk_num, clk_bulks); of_node_put(rds); of_node_put(rdd); of_node_put(dma); diff --git a/kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c b/kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c index f2d6067..412bc59 100644 --- a/kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c +++ b/kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c @@ -23,41 +23,15 @@ #include <linux/soc/rockchip/rk_vendor_storage.h> #include <linux/kthread.h> #include <linux/delay.h> +#include <misc/rkflash_vendor_storage.h> #define EMMC_IDB_PART_OFFSET 64 #define EMMC_SYS_PART_OFFSET 8064 #define EMMC_BOOT_PART_SIZE 1024 #define EMMC_VENDOR_PART_START (1024 * 7) -#define EMMC_VENDOR_PART_SIZE 128 +#define EMMC_VENDOR_PART_SIZE VENDOR_PART_SIZE #define EMMC_VENDOR_PART_NUM 4 -#define EMMC_VENDOR_TAG 0x524B5644 - -struct rk_vendor_req { - u32 tag; - u16 id; - u16 len; - u8 data[1024]; -}; - -struct vendor_item { - u16 id; - u16 offset; - u16 size; - u16 flag; -}; - -struct vendor_info { - u32 tag; - u32 version; - u16 next_index; - u16 item_num; - u16 free_offset; - u16 free_size; - struct vendor_item item[126]; /* 126 * 8*/ - u8 data[EMMC_VENDOR_PART_SIZE * 512 - 1024 - 8]; - u32 hash; - u32 version2; -}; +#define EMMC_VENDOR_TAG VENDOR_HEAD_TAG #ifdef CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER #define READ_SECTOR_IO _IOW('r', 0x04, unsigned int) @@ -67,10 +41,6 @@ #define GET_BAD_BLOCK_IO _IOW('r', 0x03, unsigned int) #define GET_LOCK_FLAG_IO _IOW('r', 0x53, unsigned int) #endif - -#define VENDOR_REQ_TAG 0x56524551 -#define VENDOR_READ_IO _IOW('v', 0x01, unsigned int) -#define VENDOR_WRITE_IO _IOW('v', 0x02, unsigned int) static u8 *g_idb_buffer; static struct vendor_info *g_vendor; @@ -406,7 +376,7 @@ { long ret = -1; int size; - struct rk_vendor_req *v_req; + struct RK_VENDOR_REQ *v_req; u32 *page_buf; page_buf = kmalloc(4096, GFP_KERNEL); @@ -415,7 +385,7 @@ mutex_lock(&vendor_ops_mutex); - v_req = (struct rk_vendor_req *)page_buf; + v_req = (struct RK_VENDOR_REQ *)page_buf; switch (cmd) { case VENDOR_READ_IO: @@ -574,7 +544,7 @@ return ret; } -const struct file_operations vendor_storage_fops = { +static const struct file_operations vendor_storage_fops = { .open = vendor_storage_open, .compat_ioctl = vendor_storage_ioctl, .unlocked_ioctl = vendor_storage_ioctl, diff --git a/kernel/drivers/spi/spi-rockchip-test.c b/kernel/drivers/spi/spi-rockchip-test.c index 1d4e9af..d97a5c4 100644 --- a/kernel/drivers/spi/spi-rockchip-test.c +++ b/kernel/drivers/spi/spi-rockchip-test.c @@ -102,7 +102,11 @@ spi_message_init(&m); spi_message_add_tail(&t, &m); - return spi_sync(spi, &m); + ret = spi_sync(spi, &m); + if (m.actual_length && m.actual_length != n) + pr_err("%s len=%d actual_length=%d\n", __func__, n, m.actual_length); + + return ret; } int spi_read_slt(int id, void *rxbuf, size_t n) @@ -127,7 +131,11 @@ spi_message_init(&m); spi_message_add_tail(&t, &m); - return spi_sync(spi, &m); + ret = spi_sync(spi, &m); + if (m.actual_length && m.actual_length != n) + pr_err("%s len=%d actual_length=%d\n", __func__, n, m.actual_length); + + return ret; } int spi_write_then_read_slt(int id, const void *txbuf, unsigned n_tx, diff --git a/kernel/drivers/spi/spi-rockchip.c b/kernel/drivers/spi/spi-rockchip.c index 8604291..e55c5c6 100644 --- a/kernel/drivers/spi/spi-rockchip.c +++ b/kernel/drivers/spi/spi-rockchip.c @@ -14,6 +14,7 @@ */ #include <linux/clk.h> +#include <linux/delay.h> #include <linux/dmaengine.h> #include <linux/gpio.h> #include <linux/interrupt.h> @@ -181,6 +182,12 @@ #define ROCKCHIP_SPI_REGISTER_SIZE 0x1000 +enum rockchip_spi_xfer_mode { + ROCKCHIP_SPI_DMA, + ROCKCHIP_SPI_IRQ, + ROCKCHIP_SPI_POLL, +}; + struct rockchip_spi_quirks { u32 max_baud_div_in_cpha; }; @@ -201,7 +208,9 @@ unsigned int rx_left; atomic_t state; + struct completion xfer_done; + u32 version; /*depth of the FIFO buffer */ u32 fifo_len; /* frequency of spiclk */ @@ -211,11 +220,13 @@ u8 n_bytes; u8 rsd; + u8 csm; + bool poll; /* only support transfer data by cpu polling */ bool cs_asserted[ROCKCHIP_SPI_MAX_CS_NUM]; struct pinctrl_state *high_speed_state; - bool slave_abort; + bool slave_aborted; bool gpio_requested; bool cs_inactive; /* spi slave tansmition stop when cs inactive */ struct spi_transfer *xfer; /* Store xfer temporarily */ @@ -231,17 +242,29 @@ writel_relaxed((enable ? 1U : 0U), rs->regs + ROCKCHIP_SPI_SSIENR); } -static inline void wait_for_idle(struct rockchip_spi *rs, bool slave_mode) +static inline void wait_for_tx_idle(struct rockchip_spi *rs, bool slave_mode) { unsigned long timeout = jiffies + msecs_to_jiffies(5); + u32 bit_filed = SR_BUSY; + u32 idle_val = 0; + uint32_t speed, us; + + if (slave_mode && rs->version == ROCKCHIP_SPI_VER2_TYPE2) { + bit_filed = SR_SLAVE_TX_BUSY; + idle_val = 0; + } else if (slave_mode) { + bit_filed = SR_TF_EMPTY; + idle_val = 1; + } do { - if (slave_mode) { - if (!(readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & SR_SLAVE_TX_BUSY)) - return; - } else { - if (!(readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & SR_BUSY)) - return; + if ((readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & bit_filed) == idle_val) { + if (bit_filed == SR_TF_EMPTY) { + speed = rs->speed_hz; + us = (8 * 1000000 / speed) * 2; + udelay(us); + } + return; } } while (!time_after(jiffies, timeout)); @@ -250,11 +273,7 @@ static u32 get_fifo_len(struct rockchip_spi *rs) { - u32 ver; - - ver = readl_relaxed(rs->regs + ROCKCHIP_SPI_VERSION); - - switch (ver) { + switch (rs->version) { case ROCKCHIP_SPI_VER2_TYPE1: case ROCKCHIP_SPI_VER2_TYPE2: return 64; @@ -299,6 +318,11 @@ { struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); + dev_err(rs->dev, "state=%x\n", atomic_read(&rs->state)); + dev_err(rs->dev, "tx_left=%x\n", rs->tx_left); + dev_err(rs->dev, "rx_left=%x\n", rs->rx_left); + print_hex_dump(KERN_ERR, "regs ", DUMP_PREFIX_OFFSET, 4, 4, rs->regs, 0x4c, 0); + /* stop running spi transfer * this also flushes both rx and tx fifos */ @@ -313,6 +337,7 @@ if (atomic_read(&rs->state) & RXDMA) dmaengine_terminate_async(ctlr->dma_rx); + atomic_set(&rs->state, 0); } static void rockchip_spi_pio_writer(struct rockchip_spi *rs) @@ -374,7 +399,7 @@ struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); /* When int_cs_inactive comes, spi slave abort */ - if (readl_relaxed(rs->regs + ROCKCHIP_SPI_IMR) & INT_CS_INACTIVE) { + if (rs->cs_inactive && readl_relaxed(rs->regs + ROCKCHIP_SPI_ISR) & INT_CS_INACTIVE) { ctlr->slave_abort(ctlr); writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR); writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR); @@ -390,7 +415,7 @@ spi_enable_chip(rs, false); writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR); writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR); - spi_finalize_current_transfer(ctlr); + complete(&rs->xfer_done); } return IRQ_HANDLED; @@ -400,8 +425,6 @@ struct spi_controller *ctlr, struct spi_transfer *xfer) { - rs->tx = xfer->tx_buf; - rs->rx = xfer->rx_buf; rs->tx_left = rs->tx ? xfer->len / rs->n_bytes : 0; rs->rx_left = xfer->len / rs->n_bytes; @@ -427,14 +450,16 @@ struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); int state = atomic_fetch_andnot(RXDMA, &rs->state); - if (state & TXDMA && !rs->slave_abort) + if (state & TXDMA && !rs->slave_aborted) return; if (rs->cs_inactive) writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR); spi_enable_chip(rs, false); - spi_finalize_current_transfer(ctlr); + writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR); + writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR); + complete(&rs->xfer_done); } static void rockchip_spi_dma_txcb(void *data) @@ -443,14 +468,16 @@ struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); int state = atomic_fetch_andnot(TXDMA, &rs->state); - if (state & RXDMA && !rs->slave_abort) + if (state & RXDMA && !rs->slave_aborted) return; /* Wait until the FIFO data completely. */ - wait_for_idle(rs, ctlr->slave); + wait_for_tx_idle(rs, ctlr->slave); spi_enable_chip(rs, false); - spi_finalize_current_transfer(ctlr); + writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR); + writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR); + complete(&rs->xfer_done); } static u32 rockchip_spi_calc_burst_size(u32 data_len) @@ -472,9 +499,6 @@ struct dma_async_tx_descriptor *rxdesc, *txdesc; atomic_set(&rs->state, 0); - - rs->tx = xfer->tx_buf; - rs->rx = xfer->rx_buf; rxdesc = NULL; if (xfer->rx_buf) { @@ -545,9 +569,59 @@ return 1; } -static void rockchip_spi_config(struct rockchip_spi *rs, +static int rockchip_spi_pio_transfer(struct rockchip_spi *rs, + struct spi_controller *ctlr, struct spi_transfer *xfer) +{ + unsigned long time, timeout; + u32 speed_hz = xfer->speed_hz; + unsigned long long ms; + int ret = 0; + + if (!speed_hz) + speed_hz = 100000; + + ms = 8LL * 1000LL * xfer->len; + do_div(ms, speed_hz); + ms += ms + 200; /* some tolerance */ + + if (ms > UINT_MAX || ctlr->slave) + ms = UINT_MAX; + + timeout = jiffies + msecs_to_jiffies(ms); + time = jiffies; + rs->tx_left = rs->tx ? xfer->len / rs->n_bytes : 0; + rs->rx_left = rs->rx ? xfer->len / rs->n_bytes : 0; + + spi_enable_chip(rs, true); + + while (rs->tx_left || rs->rx_left) { + if (rs->tx) + rockchip_spi_pio_writer(rs); + + if (rs->rx) + rockchip_spi_pio_reader(rs); + + cpu_relax(); + + if (time_after(time, timeout)) { + ret = -EIO; + goto out; + } + }; + + /* If tx, wait until the FIFO data completely. */ + if (rs->tx) + wait_for_tx_idle(rs, ctlr->slave); + +out: + spi_enable_chip(rs, false); + + return ret; +} + +static int rockchip_spi_config(struct rockchip_spi *rs, struct spi_device *spi, struct spi_transfer *xfer, - bool use_dma, bool slave_mode) + enum rockchip_spi_xfer_mode xfer_mode, bool slave_mode) { u32 cr0 = CR0_FRF_SPI << CR0_FRF_OFFSET | CR0_BHT_8BIT << CR0_BHT_OFFSET @@ -558,21 +632,33 @@ if (slave_mode) cr0 |= CR0_OPM_SLAVE << CR0_OPM_OFFSET; - rs->slave_abort = false; + rs->slave_aborted = false; cr0 |= rs->rsd << CR0_RSD_OFFSET; + cr0 |= rs->csm << CR0_CSM_OFFSET; cr0 |= (spi->mode & 0x3U) << CR0_SCPH_OFFSET; if (spi->mode & SPI_LSB_FIRST) cr0 |= CR0_FBM_LSB << CR0_FBM_OFFSET; if (spi->mode & SPI_CS_HIGH) cr0 |= BIT(spi->chip_select) << CR0_SOI_OFFSET; - if (xfer->rx_buf && xfer->tx_buf) + if (xfer->rx_buf && xfer->tx_buf) { cr0 |= CR0_XFM_TR << CR0_XFM_OFFSET; - else if (xfer->rx_buf) + } else if (xfer->rx_buf) { cr0 |= CR0_XFM_RO << CR0_XFM_OFFSET; - else if (use_dma) - cr0 |= CR0_XFM_TO << CR0_XFM_OFFSET; + } else if (xfer->tx_buf) { + /* + * Use the water line of rx fifo in full duplex mode to trigger + * the interruption of tx irq transmission completion. + */ + if (xfer_mode == ROCKCHIP_SPI_IRQ) + cr0 |= CR0_XFM_TR << CR0_XFM_OFFSET; + else + cr0 |= CR0_XFM_TO << CR0_XFM_OFFSET; + } else { + dev_err(rs->dev, "no transmission buffer\n"); + return -EINVAL; + } switch (xfer->bits_per_word) { case 4: @@ -595,7 +681,7 @@ unreachable(); } - if (use_dma) { + if (xfer_mode == ROCKCHIP_SPI_DMA) { if (xfer->tx_buf) dmacr |= TF_DMA_EN; if (xfer->rx_buf) @@ -652,6 +738,8 @@ writel_relaxed(2 * DIV_ROUND_UP(rs->freq, 2 * xfer->speed_hz), rs->regs + ROCKCHIP_SPI_BAUDR); rs->speed_hz = xfer->speed_hz; + + return 0; } static size_t rockchip_spi_max_transfer_size(struct spi_device *spi) @@ -663,50 +751,54 @@ { struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); u32 rx_fifo_left; - struct dma_tx_state state; - enum dma_status status; - /* Get current dma rx point */ - if (atomic_read(&rs->state) & RXDMA) { - dmaengine_pause(ctlr->dma_rx); - status = dmaengine_tx_status(ctlr->dma_rx, ctlr->dma_rx->cookie, &state); - if (status == DMA_ERROR) { - rs->rx = rs->xfer->rx_buf; - rs->xfer->len = 0; - rx_fifo_left = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR); - for (; rx_fifo_left; rx_fifo_left--) - readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR); - goto out; - } else { - rs->rx += rs->xfer->len - rs->n_bytes * state.residue; - } - } + /* Flush rx fifo */ + rx_fifo_left = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR); + for (; rx_fifo_left; rx_fifo_left--) + readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR); - /* Get the valid data left in rx fifo and set rs->xfer->len real rx size */ - if (rs->rx) { - rx_fifo_left = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR); - for (; rx_fifo_left; rx_fifo_left--) { - u32 rxw = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR); + rs->slave_aborted = true; + complete(&rs->xfer_done); - if (rs->n_bytes == 1) - *(u8 *)rs->rx = (u8)rxw; - else - *(u16 *)rs->rx = (u16)rxw; - rs->rx += rs->n_bytes; + return 0; +} + +static int rockchip_spi_transfer_wait(struct spi_controller *ctlr, + struct spi_transfer *xfer) +{ + struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); + u32 speed_hz = xfer->speed_hz; + unsigned long long ms; + + if (spi_controller_is_slave(ctlr)) { + if (wait_for_completion_interruptible(&rs->xfer_done)) { + dev_dbg(rs->dev, "RK SPI transfer interrupted\n"); + return -EINTR; } - rs->xfer->len = (unsigned int)(rs->rx - rs->xfer->rx_buf); - } + if (rs->slave_aborted) { + dev_err(rs->dev, "RK SPI transfer slave abort\n"); + return -EIO; + } + } else { + if (!speed_hz) + speed_hz = 100000; -out: - if (atomic_read(&rs->state) & RXDMA) - dmaengine_terminate_sync(ctlr->dma_rx); - if (atomic_read(&rs->state) & TXDMA) - dmaengine_terminate_sync(ctlr->dma_tx); - atomic_set(&rs->state, 0); - spi_enable_chip(rs, false); - rs->slave_abort = true; - complete(&ctlr->xfer_completion); + ms = 8LL * 1000LL * xfer->len; + do_div(ms, speed_hz); + ms += ms + 200; /* some tolerance */ + + if (ms > UINT_MAX) + ms = UINT_MAX; + + ms = wait_for_completion_timeout(&rs->xfer_done, + msecs_to_jiffies(ms)); + + if (ms == 0) { + dev_err(rs->dev, "RK SPI transfer timed out\n"); + return -ETIMEDOUT; + } + } return 0; } @@ -717,11 +809,13 @@ struct spi_transfer *xfer) { struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); + int ret; bool use_dma; + enum rockchip_spi_xfer_mode xfer_mode; /* Zero length transfers won't trigger an interrupt on completion */ if (!xfer->len) { - spi_finalize_current_transfer(ctlr); + complete(&rs->xfer_done); return 1; } @@ -740,14 +834,40 @@ rs->n_bytes = xfer->bits_per_word <= 8 ? 1 : 2; rs->xfer = xfer; - use_dma = ctlr->can_dma ? ctlr->can_dma(ctlr, spi, xfer) : false; + if (rs->poll) { + xfer_mode = ROCKCHIP_SPI_POLL; + } else { + use_dma = ctlr->can_dma ? ctlr->can_dma(ctlr, spi, xfer) : false; + if (use_dma) + xfer_mode = ROCKCHIP_SPI_DMA; + else + xfer_mode = ROCKCHIP_SPI_IRQ; + } - rockchip_spi_config(rs, spi, xfer, use_dma, ctlr->slave); + ret = rockchip_spi_config(rs, spi, xfer, xfer_mode, ctlr->slave); + if (ret) + return ret; - if (use_dma) - return rockchip_spi_prepare_dma(rs, ctlr, xfer); + rs->tx = xfer->tx_buf; + rs->rx = xfer->rx_buf; - return rockchip_spi_prepare_irq(rs, ctlr, xfer); + reinit_completion(&rs->xfer_done); + + switch (xfer_mode) { + case ROCKCHIP_SPI_POLL: + ret = rockchip_spi_pio_transfer(rs, ctlr, xfer); + break; + case ROCKCHIP_SPI_DMA: + ret = rockchip_spi_prepare_dma(rs, ctlr, xfer); + break; + default: + ret = rockchip_spi_prepare_irq(rs, ctlr, xfer); + } + + if (ret > 0) + ret = rockchip_spi_transfer_wait(ctlr, xfer); + + return ret; } static bool rockchip_spi_can_dma(struct spi_controller *ctlr, @@ -879,7 +999,7 @@ struct spi_controller *ctlr; struct resource *mem; struct device_node *np = pdev->dev.of_node; - u32 rsd_nsecs; + u32 rsd_nsecs, csm; bool slave_mode; struct pinctrl *pinctrl = NULL; const struct rockchip_spi_quirks *quirks_cfg; @@ -968,6 +1088,16 @@ rs->rsd = rsd; } + if (!device_property_read_u32(&pdev->dev, "csm", &csm)) { + if (csm > CR0_CSM_ONE) { + dev_warn(rs->dev, "The csm value %u exceeds the limit, clamping at %u\n", + csm, CR0_CSM_ONE); + csm = CR0_CSM_ONE; + } + rs->csm = csm; + } + + rs->version = readl_relaxed(rs->regs + ROCKCHIP_SPI_VERSION); rs->fifo_len = get_fifo_len(rs); if (!rs->fifo_len) { dev_err(&pdev->dev, "Failed to get fifo length\n"); @@ -1030,10 +1160,18 @@ ctlr->can_dma = rockchip_spi_can_dma; } - switch (readl_relaxed(rs->regs + ROCKCHIP_SPI_VERSION)) { + rs->poll = device_property_read_bool(&pdev->dev, "rockchip,poll-only"); + init_completion(&rs->xfer_done); + if (rs->poll && slave_mode) { + dev_err(rs->dev, "only support rockchip,poll-only property in master mode\n"); + ret = -EINVAL; + goto err_free_dma_rx; + } + + switch (rs->version) { case ROCKCHIP_SPI_VER2_TYPE1: case ROCKCHIP_SPI_VER2_TYPE2: - if (ctlr->can_dma && slave_mode) + if (slave_mode) rs->cs_inactive = true; else rs->cs_inactive = false; @@ -1041,7 +1179,6 @@ default: rs->cs_inactive = false; } - pinctrl = devm_pinctrl_get(&pdev->dev); if (!IS_ERR(pinctrl)) { rs->high_speed_state = pinctrl_lookup_state(pinctrl, "high_speed"); @@ -1072,6 +1209,8 @@ else dev_info(&pdev->dev, "register misc device %s\n", misc_name); } + + dev_info(rs->dev, "probed, poll=%d, rsd=%d\n", rs->poll, rs->rsd); return 0; @@ -1120,51 +1259,6 @@ return 0; } -#ifdef CONFIG_PM_SLEEP -static int rockchip_spi_suspend(struct device *dev) -{ - int ret; - struct spi_controller *ctlr = dev_get_drvdata(dev); - struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); - - ret = spi_controller_suspend(ctlr); - if (ret < 0) - return ret; - - clk_disable_unprepare(rs->spiclk); - clk_disable_unprepare(rs->apb_pclk); - - pinctrl_pm_select_sleep_state(dev); - - return 0; -} - -static int rockchip_spi_resume(struct device *dev) -{ - int ret; - struct spi_controller *ctlr = dev_get_drvdata(dev); - struct rockchip_spi *rs = spi_controller_get_devdata(ctlr); - - pinctrl_pm_select_default_state(dev); - - ret = clk_prepare_enable(rs->apb_pclk); - if (ret < 0) - return ret; - - ret = clk_prepare_enable(rs->spiclk); - if (ret < 0) - clk_disable_unprepare(rs->apb_pclk); - - ret = spi_controller_resume(ctlr); - if (ret < 0) { - clk_disable_unprepare(rs->spiclk); - clk_disable_unprepare(rs->apb_pclk); - } - - return 0; -} -#endif /* CONFIG_PM_SLEEP */ - #ifdef CONFIG_PM static int rockchip_spi_runtime_suspend(struct device *dev) { @@ -1195,6 +1289,46 @@ } #endif /* CONFIG_PM */ +#ifdef CONFIG_PM_SLEEP +static int rockchip_spi_suspend(struct device *dev) +{ + int ret; + struct spi_controller *ctlr = dev_get_drvdata(dev); + + ret = spi_controller_suspend(ctlr); + if (ret < 0) + return ret; + + /* Avoid redundant clock disable */ + if (!pm_runtime_status_suspended(dev)) + rockchip_spi_runtime_suspend(dev); + + pinctrl_pm_select_sleep_state(dev); + + return 0; +} + +static int rockchip_spi_resume(struct device *dev) +{ + int ret; + struct spi_controller *ctlr = dev_get_drvdata(dev); + + pinctrl_pm_select_default_state(dev); + + if (!pm_runtime_status_suspended(dev)) { + ret = rockchip_spi_runtime_resume(dev); + if (ret < 0) + return ret; + } + + ret = spi_controller_resume(ctlr); + if (ret < 0) + rockchip_spi_runtime_suspend(dev); + + return 0; +} +#endif /* CONFIG_PM_SLEEP */ + static const struct dev_pm_ops rockchip_spi_pm = { SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume) SET_RUNTIME_PM_OPS(rockchip_spi_runtime_suspend, diff --git a/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c b/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c index 05823a1..73d29bb 100644 --- a/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c +++ b/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c @@ -1164,6 +1164,15 @@ tty_port_close(tty->port, tty, filp); } +void fiq_tty_wake_up(struct platform_device *pdev) +{ + struct fiq_debugger_state *state = platform_get_drvdata(pdev); + + if (tty_port_initialized(&state->tty_port)) + tty_port_tty_wakeup(&state->tty_port); +} +EXPORT_SYMBOL_GPL(fiq_tty_wake_up); + int fiq_tty_write(struct tty_struct *tty, const unsigned char *buf, int count) { int i; @@ -1173,6 +1182,11 @@ if (!state->console_enable) return count; + +#ifdef CONFIG_RK_CONSOLE_THREAD + if (state->pdata->tty_write) + return state->pdata->tty_write(state->pdev, buf, count); +#endif fiq_debugger_uart_enable(state); spin_lock_irq(&state->console_lock); @@ -1186,7 +1200,15 @@ int fiq_tty_write_room(struct tty_struct *tty) { - return 16; +#ifdef CONFIG_RK_CONSOLE_THREAD + int line = tty->index; + struct fiq_debugger_state **states = tty->driver->driver_state; + struct fiq_debugger_state *state = states[line]; + + if (state->pdata->write_room) + return state->pdata->write_room(state->pdev); +#endif + return 2048; } #ifdef CONFIG_CONSOLE_POLL diff --git a/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h b/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h index 2e7e33e..1b9f28b 100644 --- a/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h +++ b/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h @@ -63,6 +63,8 @@ #ifdef CONFIG_RK_CONSOLE_THREAD void (*console_write)(struct platform_device *pdev, const char *s, unsigned int count); + int (*tty_write)(struct platform_device *pdev, const char *s, int count); + int (*write_room)(struct platform_device *pdev); #endif #ifdef CONFIG_FIQ_DEBUGGER_TRUST_ZONE void (*switch_cpu)(struct platform_device *pdev, u32 cpu); @@ -70,4 +72,5 @@ #endif }; +void fiq_tty_wake_up(struct platform_device *pdev); #endif diff --git a/kernel/drivers/staging/android/ion/ion_trace.h b/kernel/drivers/staging/android/ion/ion_trace.h index 8233691..3b1a8b3 100644 --- a/kernel/drivers/staging/android/ion/ion_trace.h +++ b/kernel/drivers/staging/android/ion/ion_trace.h @@ -14,7 +14,7 @@ #include <linux/tracepoint.h> #ifndef __ION_PTR_TO_HASHVAL -static unsigned int __ion_ptr_to_hash(const void *ptr) +static inline unsigned int __ion_ptr_to_hash(const void *ptr) { unsigned long hashval; diff --git a/kernel/drivers/staging/android/vsoc.c b/kernel/drivers/staging/android/vsoc.c index 034d868..d089b2c 100644 --- a/kernel/drivers/staging/android/vsoc.c +++ b/kernel/drivers/staging/android/vsoc.c @@ -438,12 +438,10 @@ return -EINVAL; wake_time = ktime_set(arg->wake_time_sec, arg->wake_time_nsec); - hrtimer_init_on_stack(&to->timer, CLOCK_MONOTONIC, - HRTIMER_MODE_ABS); + hrtimer_init_sleeper_on_stack(to, CLOCK_MONOTONIC, + HRTIMER_MODE_ABS, current); hrtimer_set_expires_range_ns(&to->timer, wake_time, current->timer_slack_ns); - - hrtimer_init_sleeper(to, current); } while (1) { diff --git a/kernel/drivers/tee/optee/supp.c b/kernel/drivers/tee/optee/supp.c index 43626e1..3e644a1 100644 --- a/kernel/drivers/tee/optee/supp.c +++ b/kernel/drivers/tee/optee/supp.c @@ -91,6 +91,9 @@ struct optee_supp_req *req = kzalloc(sizeof(*req), GFP_KERNEL); bool interruptable; u32 ret; + unsigned long timeleft; + int id; + struct optee_supp_req *get_req; if (!req) return TEEC_ERROR_OUT_OF_MEMORY; @@ -115,8 +118,17 @@ * exclusive access again. */ while (wait_for_completion_interruptible(&req->c)) { + pr_err("Warning, Interrupting an RPC to supplicant!\n"); + timeleft = wait_for_completion_timeout(&req->c, msecs_to_jiffies(2000)); + if (timeleft) { + /* get completion, it means tee-supplicant is alive. */ + break; + } else { + /* timeout, it means tee-supplicant is dead, interrupting an RPC. */ + interruptable = true; + } + mutex_lock(&supp->mutex); - interruptable = !supp->ctx; if (interruptable) { /* * There's no supplicant available and since the @@ -135,6 +147,14 @@ list_del(&req->link); req->in_queue = false; } + + idr_for_each_entry(&supp->idr, get_req, id) { + if (get_req == req) { + idr_remove(&supp->idr, id); + supp->req_id = -1; + break; + } + } } mutex_unlock(&supp->mutex); diff --git a/kernel/drivers/thermal/cpu_cooling.c b/kernel/drivers/thermal/cpu_cooling.c index c1888d0..4032f9d 100644 --- a/kernel/drivers/thermal/cpu_cooling.c +++ b/kernel/drivers/thermal/cpu_cooling.c @@ -195,7 +195,7 @@ { int i; - for (i = cpufreq_cdev->max_level; i >= 0; i--) { + for (i = cpufreq_cdev->max_level; i > 0; i--) { if (power >= cpufreq_cdev->em->table[i].power) break; } diff --git a/kernel/drivers/thermal/rockchip_thermal.c b/kernel/drivers/thermal/rockchip_thermal.c index 7d2ad2e..01ad033 100644 --- a/kernel/drivers/thermal/rockchip_thermal.c +++ b/kernel/drivers/thermal/rockchip_thermal.c @@ -230,6 +230,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) @@ -240,6 +241,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)) @@ -253,6 +255,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 @@ -264,6 +267,9 @@ #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 TSADCV2_USER_INTER_PD_SOC 0x340 /* 13 clocks */ #define TSADCV5_USER_INTER_PD_SOC 0xfc0 /* 97us, at least 90us */ @@ -278,6 +284,7 @@ #define RK1808_BUS_GRF_SOC_CON0 0x0400 #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) @@ -299,9 +306,11 @@ #define PX30S_TSADC_TDC_MODE (0x10001 << 4) #define PX30S_TSADC_TRIM (0xf0007 << 0) -#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) @@ -325,9 +334,9 @@ int temp; }; - static const struct tsadc_table rv1108_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {342, MIN_TEMP}, {374, -40000}, {382, -35000}, {389, -30000}, @@ -362,11 +371,13 @@ {618, 115000}, {626, 120000}, {634, 125000}, - {TSADCV2_DATA_MASK, 125000}, + {722, MAX_TEMP}, + {TSADCV2_DATA_MASK, MAX_TEMP}, }; static const struct tsadc_table rk1808_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {3423, MIN_TEMP}, {3455, -40000}, {3463, -35000}, {3471, -30000}, @@ -401,11 +412,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}, @@ -440,11 +453,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}, @@ -479,11 +494,15 @@ {3452, 115000}, {3437, 120000}, {3421, 125000}, - {0, 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}, @@ -517,11 +536,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}, @@ -556,11 +579,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}, @@ -595,11 +620,54 @@ {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 rk3568_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {1448, MIN_TEMP}, {1584, -40000}, {1620, -35000}, {1652, -30000}, @@ -634,16 +702,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}, }; static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table, @@ -968,6 +1039,37 @@ if (!IS_ERR(grf)) { regmap_write(grf, PX30_GRF_SOC_CON0, PX30S_TSADC_TDC_MODE); regmap_write(grf, PX30_GRF_SOC_CON0, PX30S_TSADC_TRIM); + } +} + +static void rk_tsadcv11_initialize(struct regmap *grf, void __iomem *regs, + enum tshut_polarity tshut_polarity) +{ + writel_relaxed(TSADCV7_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD); + writel_relaxed(TSADCV7_AUTO_PERIOD_HT_TIME, + regs + TSADCV3_AUTO_PERIOD_HT); + writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT, + regs + TSADCV3_HIGHT_INT_DEBOUNCE); + writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT, + regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE); + writel_relaxed(TSADCV3_Q_MAX_VAL, regs + TSADCV3_Q_MAX); + writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK, + regs + TSADCV2_AUTO_CON); + if (tshut_polarity == TSHUT_HIGH_ACTIVE) + writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH | + TSADCV2_AUTO_TSHUT_POLARITY_MASK, + regs + TSADCV2_AUTO_CON); + else + writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK, + regs + TSADCV2_AUTO_CON); + + if (!IS_ERR(grf)) { + regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_TSEN); + udelay(15); + regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0); + regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1); + regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2); + usleep_range(100, 200); } } @@ -1639,6 +1741,30 @@ }, }; +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_OTP, /* default TSHUT via GPIO give PMIC */ + .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */ + .tshut_temp = 95000, + + .initialize = rk_tsadcv11_initialize, + .irq_ack = rk_tsadcv4_irq_ack, + .control = rk_tsadcv4_control, + .get_temp = rk_tsadcv4_get_temp, + .set_alarm_temp = rk_tsadcv3_alarm_temp, + .set_tshut_temp = rk_tsadcv3_tshut_temp, + .set_tshut_mode = rk_tsadcv4_tshut_mode, + + .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 rk3568_tsadc_data = { .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ @@ -1757,6 +1883,12 @@ .data = (void *)&rk3399_tsadc_data, }, #endif +#ifdef CONFIG_CPU_RK3528 + { + .compatible = "rockchip,rk3528-tsadc", + .data = (void *)&rk3528_tsadc_data, + }, +#endif #ifdef CONFIG_CPU_RK3568 { .compatible = "rockchip,rk3568-tsadc", diff --git a/kernel/drivers/thermal/x86_pkg_temp_thermal.c b/kernel/drivers/thermal/x86_pkg_temp_thermal.c index 1ef937d..540becb 100644 --- a/kernel/drivers/thermal/x86_pkg_temp_thermal.c +++ b/kernel/drivers/thermal/x86_pkg_temp_thermal.c @@ -75,7 +75,7 @@ /* Array of package pointers */ static struct pkg_device **packages; /* Serializes interrupt notification, work and hotplug */ -static DEFINE_SPINLOCK(pkg_temp_lock); +static DEFINE_RAW_SPINLOCK(pkg_temp_lock); /* Protects zone operation in the work function against hotplug removal */ static DEFINE_MUTEX(thermal_zone_mutex); @@ -291,12 +291,12 @@ u64 msr_val, wr_val; mutex_lock(&thermal_zone_mutex); - spin_lock_irq(&pkg_temp_lock); + raw_spin_lock_irq(&pkg_temp_lock); ++pkg_work_cnt; pkgdev = pkg_temp_thermal_get_dev(cpu); if (!pkgdev) { - spin_unlock_irq(&pkg_temp_lock); + raw_spin_unlock_irq(&pkg_temp_lock); mutex_unlock(&thermal_zone_mutex); return; } @@ -310,7 +310,7 @@ } enable_pkg_thres_interrupt(); - spin_unlock_irq(&pkg_temp_lock); + raw_spin_unlock_irq(&pkg_temp_lock); /* * If tzone is not NULL, then thermal_zone_mutex will prevent the @@ -335,7 +335,7 @@ struct pkg_device *pkgdev; unsigned long flags; - spin_lock_irqsave(&pkg_temp_lock, flags); + raw_spin_lock_irqsave(&pkg_temp_lock, flags); ++pkg_interrupt_cnt; disable_pkg_thres_interrupt(); @@ -347,7 +347,7 @@ pkg_thermal_schedule_work(pkgdev->cpu, &pkgdev->work); } - spin_unlock_irqrestore(&pkg_temp_lock, flags); + raw_spin_unlock_irqrestore(&pkg_temp_lock, flags); return 0; } @@ -393,9 +393,9 @@ pkgdev->msr_pkg_therm_high); cpumask_set_cpu(cpu, &pkgdev->cpumask); - spin_lock_irq(&pkg_temp_lock); + raw_spin_lock_irq(&pkg_temp_lock); packages[pkgid] = pkgdev; - spin_unlock_irq(&pkg_temp_lock); + raw_spin_unlock_irq(&pkg_temp_lock); return 0; } @@ -432,7 +432,7 @@ } /* Protect against work and interrupts */ - spin_lock_irq(&pkg_temp_lock); + raw_spin_lock_irq(&pkg_temp_lock); /* * Check whether this cpu was the current target and store the new @@ -464,9 +464,9 @@ * To cancel the work we need to drop the lock, otherwise * we might deadlock if the work needs to be flushed. */ - spin_unlock_irq(&pkg_temp_lock); + raw_spin_unlock_irq(&pkg_temp_lock); cancel_delayed_work_sync(&pkgdev->work); - spin_lock_irq(&pkg_temp_lock); + raw_spin_lock_irq(&pkg_temp_lock); /* * If this is not the last cpu in the package and the work * did not run after we dropped the lock above, then we @@ -477,7 +477,7 @@ pkg_thermal_schedule_work(target, &pkgdev->work); } - spin_unlock_irq(&pkg_temp_lock); + raw_spin_unlock_irq(&pkg_temp_lock); /* Final cleanup if this is the last cpu */ if (lastcpu) diff --git a/kernel/drivers/tty/serial/8250/8250_core.c b/kernel/drivers/tty/serial/8250/8250_core.c index 4e1d450..eb408cb 100644 --- a/kernel/drivers/tty/serial/8250/8250_core.c +++ b/kernel/drivers/tty/serial/8250/8250_core.c @@ -54,7 +54,16 @@ static unsigned int skip_txen_test; /* force skip of txen test at init time */ -#define PASS_LIMIT 512 +/* + * On -rt we can have a more delays, and legitimately + * so - so don't drop work spuriously and spam the + * syslog: + */ +#ifdef CONFIG_PREEMPT_RT_FULL +# define PASS_LIMIT 1000000 +#else +# define PASS_LIMIT 512 +#endif #include <asm/serial.h> /* diff --git a/kernel/drivers/tty/serial/8250/8250_port.c b/kernel/drivers/tty/serial/8250/8250_port.c index 39156ec..ad452d6 100644 --- a/kernel/drivers/tty/serial/8250/8250_port.c +++ b/kernel/drivers/tty/serial/8250/8250_port.c @@ -31,6 +31,7 @@ #include <linux/nmi.h> #include <linux/mutex.h> #include <linux/slab.h> +#include <linux/kdb.h> #include <linux/uaccess.h> #include <linux/pm_runtime.h> #include <linux/ktime.h> @@ -3380,9 +3381,9 @@ serial8250_rpm_get(up); - if (port->sysrq) + if (port->sysrq || oops_in_progress) locked = 0; - else if (oops_in_progress) + else if (in_kdb_printk()) locked = spin_trylock_irqsave(&port->lock, flags); else spin_lock_irqsave(&port->lock, flags); diff --git a/kernel/drivers/tty/serial/amba-pl011.c b/kernel/drivers/tty/serial/amba-pl011.c index 5edc381..9666a20 100644 --- a/kernel/drivers/tty/serial/amba-pl011.c +++ b/kernel/drivers/tty/serial/amba-pl011.c @@ -2191,18 +2191,24 @@ { struct uart_amba_port *uap = amba_ports[co->index]; unsigned int old_cr = 0, new_cr; - unsigned long flags; + unsigned long flags = 0; int locked = 1; clk_enable(uap->clk); - local_irq_save(flags); + /* + * local_irq_save(flags); + * + * This local_irq_save() is nonsense. If we come in via sysrq + * handling then interrupts are already disabled. Aside of + * that the port.sysrq check is racy on SMP regardless. + */ if (uap->port.sysrq) locked = 0; else if (oops_in_progress) - locked = spin_trylock(&uap->port.lock); + locked = spin_trylock_irqsave(&uap->port.lock, flags); else - spin_lock(&uap->port.lock); + spin_lock_irqsave(&uap->port.lock, flags); /* * First save the CR then disable the interrupts @@ -2228,8 +2234,7 @@ pl011_write(old_cr, uap, REG_CR); if (locked) - spin_unlock(&uap->port.lock); - local_irq_restore(flags); + spin_unlock_irqrestore(&uap->port.lock, flags); clk_disable(uap->clk); } diff --git a/kernel/drivers/tty/serial/omap-serial.c b/kernel/drivers/tty/serial/omap-serial.c index 6420ae5..0f4f41e 100644 --- a/kernel/drivers/tty/serial/omap-serial.c +++ b/kernel/drivers/tty/serial/omap-serial.c @@ -1307,13 +1307,10 @@ pm_runtime_get_sync(up->dev); - local_irq_save(flags); - if (up->port.sysrq) - locked = 0; - else if (oops_in_progress) - locked = spin_trylock(&up->port.lock); + if (up->port.sysrq || oops_in_progress) + locked = spin_trylock_irqsave(&up->port.lock, flags); else - spin_lock(&up->port.lock); + spin_lock_irqsave(&up->port.lock, flags); /* * First save the IER then disable the interrupts @@ -1342,8 +1339,7 @@ pm_runtime_mark_last_busy(up->dev); pm_runtime_put_autosuspend(up->dev); if (locked) - spin_unlock(&up->port.lock); - local_irq_restore(flags); + spin_unlock_irqrestore(&up->port.lock, flags); } static int __init diff --git a/kernel/drivers/tty/sysrq.c b/kernel/drivers/tty/sysrq.c index 8b4a46a..baaa438 100644 --- a/kernel/drivers/tty/sysrq.c +++ b/kernel/drivers/tty/sysrq.c @@ -208,7 +208,7 @@ #endif #ifdef CONFIG_SMP -static DEFINE_SPINLOCK(show_lock); +static DEFINE_RAW_SPINLOCK(show_lock); static void showacpu(void *dummy) { @@ -218,10 +218,10 @@ if (idle_cpu(smp_processor_id())) return; - spin_lock_irqsave(&show_lock, flags); + raw_spin_lock_irqsave(&show_lock, flags); pr_info("CPU%d:\n", smp_processor_id()); show_stack(NULL, NULL); - spin_unlock_irqrestore(&show_lock, flags); + raw_spin_unlock_irqrestore(&show_lock, flags); } static void sysrq_showregs_othercpus(struct work_struct *dummy) diff --git a/kernel/drivers/usb/core/hcd.c b/kernel/drivers/usb/core/hcd.c index 7de2794..767ef76 100644 --- a/kernel/drivers/usb/core/hcd.c +++ b/kernel/drivers/usb/core/hcd.c @@ -1752,7 +1752,6 @@ struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus); struct usb_anchor *anchor = urb->anchor; int status = urb->unlinked; - unsigned long flags; urb->hcpriv = NULL; if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) && @@ -1780,9 +1779,7 @@ * and no one may trigger the above deadlock situation when * running complete() in tasklet. */ - local_irq_save(flags); urb->complete(urb); - local_irq_restore(flags); usb_anchor_resume_wakeups(anchor); atomic_dec(&urb->use_count); diff --git a/kernel/drivers/usb/core/hub.c b/kernel/drivers/usb/core/hub.c index 581bd13..4227272 100644 --- a/kernel/drivers/usb/core/hub.c +++ b/kernel/drivers/usb/core/hub.c @@ -5188,6 +5188,7 @@ dev_info(&port_dev->dev, "attempt power cycle\n"); usb_hub_set_port_power(hdev, hub, port1, false); msleep(2 * hub_power_on_good_delay(hub)); + set_bit(HCD_FLAG_POWER_ON, &hcd->flags); usb_hub_set_port_power(hdev, hub, port1, true); msleep(hub_power_on_good_delay(hub)); } diff --git a/kernel/drivers/usb/gadget/configfs.c b/kernel/drivers/usb/gadget/configfs.c index cc168fb..f0d8dc1 100644 --- a/kernel/drivers/usb/gadget/configfs.c +++ b/kernel/drivers/usb/gadget/configfs.c @@ -1599,19 +1599,29 @@ static int android_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *c) { - struct usb_composite_dev *cdev = get_gadget_data(gadget); + struct usb_composite_dev *cdev; unsigned long flags; - struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev); + struct gadget_info *gi; int value = -EOPNOTSUPP; struct usb_function_instance *fi; - spin_lock_irqsave(&cdev->lock, flags); + if (!android_device) + return 0; + + gi = dev_get_drvdata(android_device); + spin_lock_irqsave(&gi->spinlock, flags); + cdev = get_gadget_data(gadget); + if (!cdev || gi->unbind) { + spin_unlock_irqrestore(&gi->spinlock, flags); + return 0; + }; + if (c->bRequest == USB_REQ_GET_DESCRIPTOR && (c->wValue >> 8) == USB_DT_CONFIG && !gi->connected) { gi->connected = 1; schedule_work(&gi->work); } - spin_unlock_irqrestore(&cdev->lock, flags); + list_for_each_entry(fi, &gi->available_func, cfs_list) { if (fi != NULL && fi->f != NULL && fi->f->setup != NULL) { value = fi->f->setup(fi->f, c); @@ -1628,12 +1638,11 @@ if (value < 0) value = composite_setup(gadget, c); - spin_lock_irqsave(&cdev->lock, flags); if (c->bRequest == USB_REQ_SET_CONFIGURATION && cdev->config) { schedule_work(&gi->work); } - spin_unlock_irqrestore(&cdev->lock, flags); + spin_unlock_irqrestore(&gi->spinlock, flags); return value; } diff --git a/kernel/drivers/usb/gadget/function/f_fs.c b/kernel/drivers/usb/gadget/function/f_fs.c index 996be7e..6634dd6 100644 --- a/kernel/drivers/usb/gadget/function/f_fs.c +++ b/kernel/drivers/usb/gadget/function/f_fs.c @@ -1626,7 +1626,7 @@ ffs_data_clear(ffs); ffs_release_dev(ffs->private_data); BUG_ON(waitqueue_active(&ffs->ev.waitq) || - waitqueue_active(&ffs->ep0req_completion.wait) || + swait_active(&ffs->ep0req_completion.wait) || waitqueue_active(&ffs->wait)); destroy_workqueue(ffs->io_completion_wq); kfree(ffs->dev_name); diff --git a/kernel/drivers/usb/gadget/function/f_uac1.c b/kernel/drivers/usb/gadget/function/f_uac1.c index acd976b..14451f9 100644 --- a/kernel/drivers/usb/gadget/function/f_uac1.c +++ b/kernel/drivers/usb/gadget/function/f_uac1.c @@ -481,10 +481,10 @@ val = buf[0] | (buf[1] << 8) | (buf[2] << 16); - if (uac1->ctl_id == agdev->in_ep->address) { + if (EPIN_EN(opts) && uac1->ctl_id == agdev->in_ep->address) { opts->p_srate_active = val; u_audio_set_playback_srate(agdev, opts->p_srate_active); - } else if (uac1->ctl_id == agdev->out_ep->address) { + } else if (EPOUT_EN(opts) && uac1->ctl_id == agdev->out_ep->address) { opts->c_srate_active = val; u_audio_set_capture_srate(agdev, opts->c_srate_active); } @@ -629,9 +629,9 @@ switch (ctrl->bRequest) { case UAC_GET_CUR: { if (cs == UAC_EP_CS_ATTR_SAMPLE_RATE) { - if (ep == agdev->in_ep->address) + if (EPIN_EN(opts) && ep == agdev->in_ep->address) val = opts->p_srate_active; - else if (ep == agdev->out_ep->address) + else if (EPOUT_EN(opts) && ep == agdev->out_ep->address) val = opts->c_srate_active; buf[2] = (val >> 16) & 0xff; buf[1] = (val >> 8) & 0xff; diff --git a/kernel/drivers/usb/gadget/function/u_serial.c b/kernel/drivers/usb/gadget/function/u_serial.c index 38afe96..9c6731b 100644 --- a/kernel/drivers/usb/gadget/function/u_serial.c +++ b/kernel/drivers/usb/gadget/function/u_serial.c @@ -102,7 +102,6 @@ struct gserial *port_usb; - bool openclose; /* open/close in progress */ u8 port_num; struct list_head read_pool; @@ -595,81 +594,44 @@ { int port_num = tty->index; struct gs_port *port; - int status; + int status = 0; - do { - mutex_lock(&ports[port_num].lock); - port = ports[port_num].port; - if (!port) - status = -ENODEV; - else { - spin_lock_irq(&port->port_lock); + mutex_lock(&ports[port_num].lock); + port = ports[port_num].port; + if (!port) { + status = -ENODEV; + goto out; + } - /* already open? Great. */ - if (port->port.count) { - status = 0; - port->port.count++; - - /* currently opening/closing? wait ... */ - } else if (port->openclose) { - status = -EBUSY; - - /* ... else we do the work */ - } else { - status = -EAGAIN; - port->openclose = true; - } - spin_unlock_irq(&port->port_lock); - } - mutex_unlock(&ports[port_num].lock); - - switch (status) { - default: - /* fully handled */ - return status; - case -EAGAIN: - /* must do the work */ - break; - case -EBUSY: - /* wait for EAGAIN task to finish */ - msleep(1); - /* REVISIT could have a waitchannel here, if - * concurrent open performance is important - */ - break; - } - } while (status != -EAGAIN); - - /* Do the "real open" */ spin_lock_irq(&port->port_lock); /* allocate circular buffer on first open */ if (!kfifo_initialized(&port->port_write_buf)) { spin_unlock_irq(&port->port_lock); + + /* + * portmaster's mutex still protects from simultaneous open(), + * and close() can't happen, yet. + */ + status = kfifo_alloc(&port->port_write_buf, WRITE_BUF_SIZE, GFP_KERNEL); - spin_lock_irq(&port->port_lock); - if (status) { pr_debug("gs_open: ttyGS%d (%p,%p) no buffer\n", - port->port_num, tty, file); - port->openclose = false; - goto exit_unlock_port; + port_num, tty, file); + goto out; } + + spin_lock_irq(&port->port_lock); } - /* REVISIT if REMOVED (ports[].port NULL), abort the open - * to let rmmod work faster (but this way isn't wrong). - */ - - /* REVISIT maybe wait for "carrier detect" */ + /* already open? Great. */ + if (port->port.count++) + goto exit_unlock_port; tty->driver_data = port; port->port.tty = tty; - - port->port.count = 1; - port->openclose = false; /* if connected, start the I/O stream */ if (port->port_usb) { @@ -684,20 +646,21 @@ pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); - status = 0; - exit_unlock_port: spin_unlock_irq(&port->port_lock); +out: + mutex_unlock(&ports[port_num].lock); return status; } -static int gs_writes_finished(struct gs_port *p) +static int gs_close_flush_done(struct gs_port *p) { int cond; - /* return true on disconnect or empty buffer */ + /* return true on disconnect or empty buffer or if raced with open() */ spin_lock_irq(&p->port_lock); - cond = (p->port_usb == NULL) || !kfifo_len(&p->port_write_buf); + cond = p->port_usb == NULL || !kfifo_len(&p->port_write_buf) || + p->port.count > 1; spin_unlock_irq(&p->port_lock); return cond; @@ -711,6 +674,7 @@ spin_lock_irq(&port->port_lock); if (port->port.count != 1) { +raced_with_open: if (port->port.count == 0) WARN_ON(1); else @@ -719,12 +683,6 @@ } pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file); - - /* mark port as closing but in use; we can drop port lock - * and sleep if necessary - */ - port->openclose = true; - port->port.count = 0; gser = port->port_usb; if (gser && gser->disconnect) @@ -736,9 +694,13 @@ if (kfifo_len(&port->port_write_buf) > 0 && gser) { spin_unlock_irq(&port->port_lock); wait_event_interruptible_timeout(port->drain_wait, - gs_writes_finished(port), + gs_close_flush_done(port), GS_CLOSE_TIMEOUT * HZ); spin_lock_irq(&port->port_lock); + + if (port->port.count != 1) + goto raced_with_open; + gser = port->port_usb; } @@ -751,9 +713,8 @@ else kfifo_reset(&port->port_write_buf); + port->port.count = 0; port->port.tty = NULL; - - port->openclose = false; pr_debug("gs_close: ttyGS%d (%p,%p) done!\n", port->port_num, tty, file); @@ -1181,8 +1142,9 @@ int cond; spin_lock_irq(&port->port_lock); - cond = (port->port.count == 0) && !port->openclose; + cond = port->port.count == 0; spin_unlock_irq(&port->port_lock); + return cond; } @@ -1375,7 +1337,7 @@ port->port_usb = NULL; gser->ioport = NULL; - if (port->port.count > 0 || port->openclose) { + if (port->port.count > 0) { wake_up_interruptible(&port->drain_wait); if (port->port.tty) tty_hangup(port->port.tty); @@ -1388,7 +1350,7 @@ /* finally, free any unused/unusable I/O buffers */ spin_lock_irqsave(&port->port_lock, flags); - if (port->port.count == 0 && !port->openclose) + if (port->port.count == 0) kfifo_free(&port->port_write_buf); gs_free_requests(gser->out, &port->read_pool, NULL); gs_free_requests(gser->out, &port->read_queue, NULL); diff --git a/kernel/drivers/usb/gadget/function/uvc_v4l2.c b/kernel/drivers/usb/gadget/function/uvc_v4l2.c index 9d2356e..d822456 100644 --- a/kernel/drivers/usb/gadget/function/uvc_v4l2.c +++ b/kernel/drivers/usb/gadget/function/uvc_v4l2.c @@ -203,7 +203,7 @@ if (type != video->queue.queue.type) return -EINVAL; - if (uvc->state != UVC_STATE_CONNECTED) + if (uvc->state == UVC_STATE_DISCONNECTED) return -ENODEV; /* Enable UVC video. */ diff --git a/kernel/drivers/usb/gadget/legacy/inode.c b/kernel/drivers/usb/gadget/legacy/inode.c index a456267..adb84b0 100644 --- a/kernel/drivers/usb/gadget/legacy/inode.c +++ b/kernel/drivers/usb/gadget/legacy/inode.c @@ -345,7 +345,7 @@ spin_unlock_irq (&epdata->dev->lock); if (likely (value == 0)) { - value = wait_event_interruptible (done.wait, done.done); + value = swait_event_interruptible_exclusive(done.wait, done.done); if (value != 0) { spin_lock_irq (&epdata->dev->lock); if (likely (epdata->ep != NULL)) { @@ -354,7 +354,7 @@ usb_ep_dequeue (epdata->ep, epdata->req); spin_unlock_irq (&epdata->dev->lock); - wait_event (done.wait, done.done); + swait_event_exclusive(done.wait, done.done); if (epdata->status == -ECONNRESET) epdata->status = -EINTR; } else { diff --git a/kernel/drivers/usb/host/ehci-hub.c b/kernel/drivers/usb/host/ehci-hub.c index 9f9ab5c..2134ff0 100644 --- a/kernel/drivers/usb/host/ehci-hub.c +++ b/kernel/drivers/usb/host/ehci-hub.c @@ -1174,7 +1174,7 @@ goto error; wIndex--; temp = ehci_readl(ehci, status_reg); - if (temp & PORT_OWNER) + if ((temp & PORT_OWNER) && (!HCD_POWER_ON(hcd))) break; temp &= ~PORT_RWC_BITS; @@ -1217,6 +1217,7 @@ if (HCS_PPC(ehci->hcs_params)) { spin_unlock_irqrestore(&ehci->lock, flags); ehci_port_power(ehci, wIndex, true); + clear_bit(HCD_FLAG_POWER_ON, &hcd->flags); spin_lock_irqsave(&ehci->lock, flags); } break; diff --git a/kernel/drivers/usb/host/xhci-ring.c b/kernel/drivers/usb/host/xhci-ring.c index 66d6709..666748a 100644 --- a/kernel/drivers/usb/host/xhci-ring.c +++ b/kernel/drivers/usb/host/xhci-ring.c @@ -689,7 +689,7 @@ static void xhci_unmap_td_bounce_buffer(struct xhci_hcd *xhci, struct xhci_ring *ring, struct xhci_td *td) { - struct device *dev = xhci_to_hcd(xhci)->self.controller; + struct device *dev = xhci_to_hcd(xhci)->self.sysdev; struct xhci_segment *seg = td->bounce_seg; struct urb *urb = td->urb; size_t len; @@ -3194,7 +3194,7 @@ static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len, u32 *trb_buff_len, struct xhci_segment *seg) { - struct device *dev = xhci_to_hcd(xhci)->self.controller; + struct device *dev = xhci_to_hcd(xhci)->self.sysdev; unsigned int unalign; unsigned int max_pkt; u32 new_buff_len; diff --git a/kernel/drivers/usb/serial/Makefile b/kernel/drivers/usb/serial/Makefile index dc48ca8..2d491e4 100644 --- a/kernel/drivers/usb/serial/Makefile +++ b/kernel/drivers/usb/serial/Makefile @@ -15,7 +15,6 @@ obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o obj-$(CONFIG_USB_SERIAL_CH341) += ch341.o -obj-y += ch343.o obj-$(CONFIG_USB_SERIAL_CP210X) += cp210x.o obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o obj-$(CONFIG_USB_SERIAL_CYPRESS_M8) += cypress_m8.o diff --git a/kernel/drivers/usb/serial/ch343.c b/kernel/drivers/usb/serial/ch343.c deleted file mode 100644 index f5535b7..0000000 --- a/kernel/drivers/usb/serial/ch343.c +++ /dev/null @@ -1,2000 +0,0 @@ -/* - * USB serial driver for USB to UART(s) chip ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104, etc. - * - * Copyright (C) 2022 Nanjing Qinheng Microelectronics Co., Ltd. - * Web: http://wch.cn - * Author: WCH <tech@wch.cn> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * System required: - * Kernel version beyond 3.4.x - * Update Log: - * V1.0 - initial version - * V1.1 - added support of chip ch344, ch9101 and ch9103 - * V1.2 - added gpio support of chip ch344 - * V1.3 - added support of chip ch347 - * V1.4 - added support of chip ch9104 - * V1.5 - added gpio character device - * - added supports for kernel version beyond 5.14.x - * - removed the gpio ioctl commands - */ - -#define DEBUG -#define VERBOSE_DEBUG - -#undef DEBUG -#undef VERBOSE_DEBUG - -#include <asm/byteorder.h> -#include <asm/unaligned.h> -#include <linux/errno.h> -#include <linux/idr.h> -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/list.h> -#include <linux/module.h> -#include <linux/mutex.h> -#include <linux/serial.h> -#include <linux/slab.h> -#include <linux/tty.h> -#include <linux/tty_driver.h> -#include <linux/tty_flip.h> -#include <linux/uaccess.h> -#include <linux/usb.h> -#include <linux/usb/cdc.h> -#include <linux/version.h> - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)) -#include <linux/sched/signal.h> -#endif - -#include "ch343.h" - -#define DRIVER_AUTHOR "WCH" -#define DRIVER_DESC "USB serial driver for ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104, etc." -#define VERSION_DESC "V1.5 On 2022.12" - -#define IOCTL_MAGIC 'W' -#define IOCTL_CMD_GETCHIPTYPE _IOR(IOCTL_MAGIC, 0x84, u16) -#define IOCTL_CMD_CTRLIN _IOWR(IOCTL_MAGIC, 0x90, u16) -#define IOCTL_CMD_CTRLOUT _IOW(IOCTL_MAGIC, 0x91, u16) -#define IOCTL_CMD_GICOUNT _IOR(IOCTL_MAGIC, 0x92, u16) - -static struct usb_driver ch343_driver; -static struct tty_driver *ch343_tty_driver; -static struct usb_interface *g_intf; - -static DEFINE_IDR(ch343_minors); -static DEFINE_MUTEX(ch343_minors_lock); - -static void ch343_tty_set_termios(struct tty_struct *tty, struct ktermios *termios_old); - -/* - * Look up an ch343 structure by minor. If found and not disconnected, increment - * its refcount and return it with its mutex held. - */ -static struct ch343 *ch343_get_by_minor(unsigned int minor) -{ - struct ch343 *ch343; - - mutex_lock(&ch343_minors_lock); - ch343 = idr_find(&ch343_minors, minor); - if (ch343) { - mutex_lock(&ch343->mutex); - if (ch343->disconnected) { - mutex_unlock(&ch343->mutex); - ch343 = NULL; - } else { - tty_port_get(&ch343->port); - mutex_unlock(&ch343->mutex); - } - } - mutex_unlock(&ch343_minors_lock); - return ch343; -} - -/* - * Try to find an available minor number and if found, associate it with 'ch343'. - */ -static int ch343_alloc_minor(struct ch343 *ch343) -{ - int minor; - - mutex_lock(&ch343_minors_lock); - minor = idr_alloc(&ch343_minors, ch343, 0, CH343_TTY_MINORS, GFP_KERNEL); - mutex_unlock(&ch343_minors_lock); - - return minor; -} - -/* Release the minor number associated with 'ch343'. */ -static void ch343_release_minor(struct ch343 *ch343) -{ - mutex_lock(&ch343_minors_lock); - idr_remove(&ch343_minors, ch343->minor); - mutex_unlock(&ch343_minors_lock); -} - -/* - * Functions for CH343 control messages. - */ -static int ch343_control_out(struct ch343 *ch343, u8 request, u16 value, u16 index) -{ - int retval; - - retval = usb_autopm_get_interface(ch343->control); - if (retval) - return retval; - - retval = usb_control_msg(ch343->dev, usb_sndctrlpipe(ch343->dev, 0), request, - USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, value, index, NULL, 0, DEFAULT_TIMEOUT); - - usb_autopm_put_interface(ch343->control); - - return retval; -} - -static int ch343_control_in(struct ch343 *ch343, u8 request, u16 value, u16 index, char *buf, unsigned bufsize) -{ - int retval; - - retval = usb_autopm_get_interface(ch343->control); - if (retval) - return retval; - - retval = - usb_control_msg(ch343->dev, usb_rcvctrlpipe(ch343->dev, 0), request, - USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, value, index, buf, bufsize, DEFAULT_TIMEOUT); - - usb_autopm_put_interface(ch343->control); - - return retval; -} - -static int ch343_control_msg_out(struct ch343 *ch343, u8 request, u8 requesttype, u16 value, u16 index, void *buf, - unsigned bufsize) -{ - int retval; - char *buffer; - - buffer = kmalloc(bufsize, GFP_KERNEL); - if (!buffer) - return -ENOMEM; - - retval = copy_from_user(buffer, (char __user *)buf, bufsize); - if (retval) - goto out; - - retval = usb_autopm_get_interface(ch343->control); - if (retval) - goto out; - - retval = usb_control_msg(ch343->dev, usb_sndctrlpipe(ch343->dev, 0), request, requesttype, value, index, buf, - bufsize, DEFAULT_TIMEOUT); - - usb_autopm_put_interface(ch343->control); - -out: - kfree(buffer); - return retval; -} - -static int ch343_control_msg_in(struct ch343 *ch343, u8 request, u8 requesttype, u16 value, u16 index, void *buf, - unsigned bufsize) -{ - int retval; - char *buffer; - - buffer = kmalloc(bufsize, GFP_KERNEL); - if (!buffer) - return -ENOMEM; - - retval = usb_autopm_get_interface(ch343->control); - if (retval) - goto out; - - retval = usb_control_msg(ch343->dev, usb_rcvctrlpipe(ch343->dev, 0), request, requesttype, value, index, buffer, - bufsize, DEFAULT_TIMEOUT); - if (retval > 0) { - if (copy_to_user((char __user *)buf, buffer, retval)) { - retval = -EFAULT; - } - } - - usb_autopm_put_interface(ch343->control); - -out: - kfree(buffer); - return retval; -} - -static inline int ch343_set_control(struct ch343 *ch343, int control) -{ - if (ch343->iface <= 1) - return ch343_control_out(ch343, CMD_C2 + ch343->iface, ~control, 0x0000); - else if (ch343->iface <= 3) - return ch343_control_out(ch343, CMD_C2 + 0x10 + (ch343->iface - 2), ~control, 0x0000); - else - return -1; -} - -static inline int ch343_set_line(struct ch343 *ch343, struct usb_cdc_line_coding *line) -{ - return 0; -} - -static int ch343_get_status(struct ch343 *ch343) -{ - char *buffer; - int retval; - const unsigned size = 2; - unsigned long flags; - - buffer = kmalloc(size, GFP_KERNEL); - if (!buffer) - return -ENOMEM; - - retval = ch343_control_in(ch343, CMD_R, CMD_C3 + ch343->iface, 0, buffer, size); - if (retval != size) - goto out; - - /* setup the private status if available */ - spin_lock_irqsave(&ch343->read_lock, flags); - ch343->ctrlin = (~(*buffer)) & CH343_CTI_ST; - spin_unlock_irqrestore(&ch343->read_lock, flags); - -out: - kfree(buffer); - return retval; -} - -/* -------------------------------------------------------------------------- */ - -static int ch343_configure(struct ch343 *ch343) -{ - char *buffer; - int r; - const unsigned size = 2; - u8 chiptype; - - buffer = kmalloc(size, GFP_KERNEL); - if (!buffer) - return -ENOMEM; - - r = ch343_control_in(ch343, CMD_C6, 0, 0, buffer, size); - if (r != size) - goto out; - - chiptype = buffer[1]; - - switch (ch343->idProduct) { - case 0x55D2: - if (chiptype == 0x48) - ch343->chiptype = CHIP_CH342F; - else if (chiptype == 0x41) - ch343->chiptype = CHIP_CH342K; - break; - case 0x55D3: - if (chiptype == 0x08) - ch343->chiptype = CHIP_CH343GP; - else if (chiptype == 0x02) - ch343->chiptype = CHIP_CH343J; - else if (chiptype == 0x01) - ch343->chiptype = CHIP_CH343K; - else if (chiptype == 0x18) - ch343->chiptype = CHIP_CH343G_AUTOBAUD; - break; - case 0x55D4: - if (chiptype == 0x08) - ch343->chiptype = CHIP_CH9102F; - else if (chiptype == 0x09) - ch343->chiptype = CHIP_CH9102X; - break; - case 0x55D5: - if (chiptype == 0xC0) { - if ((buffer[0] & 0xF0) == 0x40) - ch343->chiptype = CHIP_CH344L; - else - ch343->chiptype = CHIP_CH344L_V2; - } else - ch343->chiptype = CHIP_CH344Q; - break; - case 0x55D7: - if (chiptype == 0x4B) - ch343->chiptype = CHIP_CH9103M; - break; - case 0x55D8: - if (chiptype == 0x08) - ch343->chiptype = CHIP_CH9101UH; - else if (chiptype == 0x0A) - ch343->chiptype = CHIP_CH9101RY; - break; - case 0x55DA: - case 0x55DB: - case 0x55DD: - ch343->chiptype = CHIP_CH347T; - break; - case 0x55DF: - ch343->chiptype = CHIP_CH9104L; - break; - default: - break; - } - - if (ch343->chiptype != CHIP_CH344L && ch343->chiptype != CHIP_CH344L_V2 && ch343->chiptype != CHIP_CH9104L) { - r = ch343_get_status(ch343); - if (r < 0) - goto out; - } - - dev_dbg(&ch343->data->dev, "%s - chip hver : 0x%2x, sver : 0x%2x, chip : %d\n", __func__, buffer[0], buffer[1], - ch343->chiptype); -out: - kfree(buffer); - return r < 0 ? r : 0; -} - -/* - * Write buffer management. - * All of these assume proper locks taken by the caller. - */ -static int ch343_wb_alloc(struct ch343 *ch343) -{ - int i, wbn; - struct ch343_wb *wb; - - wbn = 0; - i = 0; - for (;;) { - wb = &ch343->wb[wbn]; - if (!wb->use) { - wb->use = 1; - return wbn; - } - wbn = (wbn + 1) % CH343_NW; - if (++i >= CH343_NW) - return -1; - } -} - -static int ch343_wb_is_avail(struct ch343 *ch343) -{ - int i, n; - unsigned long flags; - - n = CH343_NW; - spin_lock_irqsave(&ch343->write_lock, flags); - for (i = 0; i < CH343_NW; i++) - n -= ch343->wb[i].use; - spin_unlock_irqrestore(&ch343->write_lock, flags); - return n; -} - -/* - * Finish write. Caller must hold ch343->write_lock - */ -static void ch343_write_done(struct ch343 *ch343, struct ch343_wb *wb) -{ - wb->use = 0; - ch343->transmitting--; - usb_autopm_put_interface_async(ch343->control); -} - -/* - * Poke write. - * - * the caller is responsible for locking - */ -static int ch343_start_wb(struct ch343 *ch343, struct ch343_wb *wb) -{ - int rc; - - ch343->transmitting++; - - wb->urb->transfer_buffer = wb->buf; - wb->urb->transfer_dma = wb->dmah; - wb->urb->transfer_buffer_length = wb->len; - wb->urb->dev = ch343->dev; - - rc = usb_submit_urb(wb->urb, GFP_ATOMIC); - if (rc < 0) { - dev_err(&ch343->data->dev, "%s - usb_submit_urb(write bulk) failed: %d\n", __func__, rc); - ch343_write_done(ch343, wb); - } - return rc; -} - -static void ch343_update_status(struct ch343 *ch343, unsigned char *data, size_t len) -{ - unsigned long flags; - u8 status; - u8 difference; - u8 type = data[0]; - u8 handled = 0; - - if (len < 4) - return; - - if (ch343->chiptype == CHIP_CH344L) { - if (data[0] != 0x00) - return; - type = data[1]; - } else if (ch343->chiptype == CHIP_CH344Q || ch343->chiptype == CHIP_CH344L_V2 || ch343->chiptype == CHIP_CH9104L) { - type = data[1]; - } - - if (type & CH343_CTT_M) { - status = ~data[len - 1] & CH343_CTI_ST; - if (ch343->chiptype == CHIP_CH344L || ch343->chiptype == CHIP_CH344L_V2) - status &= CH343_CTI_C; - - if (!ch343->clocal && (ch343->ctrlin & status & CH343_CTI_DC)) { - tty_port_tty_hangup(&ch343->port, false); - } - - spin_lock_irqsave(&ch343->read_lock, flags); - difference = status ^ ch343->ctrlin; - ch343->ctrlin = status; - ch343->oldcount = ch343->iocount; - - if (difference) { - if (difference & CH343_CTI_C) { - ch343->iocount.cts++; - } - if (difference & CH343_CTI_DS) { - ch343->iocount.dsr++; - } - if (difference & CH343_CTI_R) { - ch343->iocount.rng++; - } - if (difference & CH343_CTI_DC) { - ch343->iocount.dcd++; - } - spin_unlock_irqrestore(&ch343->read_lock, flags); - wake_up_interruptible(&ch343->wioctl); - } else - spin_unlock_irqrestore(&ch343->read_lock, flags); - handled = 1; - } - if (type & CH343_CTT_O) { - spin_lock_irqsave(&ch343->read_lock, flags); - ch343->oldcount = ch343->iocount; - ch343->iocount.overrun++; - spin_unlock_irqrestore(&ch343->read_lock, flags); - handled = 1; - } - if ((type & CH343_CTT_F) == CH343_CTT_F) { - spin_lock_irqsave(&ch343->read_lock, flags); - ch343->oldcount = ch343->iocount; - ch343->iocount.frame++; - spin_unlock_irqrestore(&ch343->read_lock, flags); - handled = 1; - } else if (type & CH343_CTT_P) { - spin_lock_irqsave(&ch343->read_lock, flags); - ch343->oldcount = ch343->iocount; - ch343->iocount.parity++; - spin_unlock_irqrestore(&ch343->read_lock, flags); - handled = 1; - } - if (!handled) - dev_err(&ch343->control->dev, - "%s - unknown status received:" - "len:%d, data0:0x%x, data1:0x%x\n", - __func__, (int)len, data[0], data[1]); -} - -/* Reports status changes with "interrupt" transfers */ -static void ch343_ctrl_irq(struct urb *urb) -{ - struct ch343 *ch343 = urb->context; - unsigned char *data = urb->transfer_buffer; - unsigned int len = urb->actual_length; - int status = urb->status; - int retval; - - switch (status) { - case 0: - /* success */ - break; - case -ECONNRESET: - case -ENOENT: - case -ESHUTDOWN: - /* this urb is terminated, clean up */ - dev_dbg(&ch343->control->dev, "%s - urb shutting down with status: %d\n", __func__, status); - return; - default: - dev_dbg(&ch343->control->dev, "%s - nonzero urb status received: %d\n", __func__, status); - goto exit; - } - - usb_mark_last_busy(ch343->dev); - ch343_update_status(ch343, data, len); -exit: - retval = usb_submit_urb(urb, GFP_ATOMIC); - if (retval && retval != -EPERM) - dev_err(&ch343->control->dev, "%s - usb_submit_urb failed: %d\n", __func__, retval); -} - -static int ch343_submit_read_urb(struct ch343 *ch343, int index, gfp_t mem_flags) -{ - int res; - - if (!test_and_clear_bit(index, &ch343->read_urbs_free)) - return 0; - - dev_vdbg(&ch343->data->dev, "%s - urb %d\n", __func__, index); - - res = usb_submit_urb(ch343->read_urbs[index], mem_flags); - if (res) { - if (res != -EPERM) { - dev_err(&ch343->data->dev, "%s - usb_submit_urb failed: %d\n", __func__, res); - } - set_bit(index, &ch343->read_urbs_free); - return res; - } - - return 0; -} - -static int ch343_submit_read_urbs(struct ch343 *ch343, gfp_t mem_flags) -{ - int res; - int i; - - for (i = 0; i < ch343->rx_buflimit; ++i) { - res = ch343_submit_read_urb(ch343, i, mem_flags); - if (res) - return res; - } - - return 0; -} - -static void ch343_process_read_urb(struct ch343 *ch343, struct urb *urb) -{ - if (!urb->actual_length) - return; - - tty_insert_flip_string(&ch343->port, urb->transfer_buffer, urb->actual_length); - tty_flip_buffer_push(&ch343->port); -} - -static void ch343_read_bulk_callback(struct urb *urb) -{ - struct ch343_rb *rb = urb->context; - struct ch343 *ch343 = rb->instance; - int status = urb->status; - - dev_vdbg(&ch343->data->dev, "%s - urb %d, len %d\n", __func__, rb->index, urb->actual_length); - - if (!ch343->dev) { - set_bit(rb->index, &ch343->read_urbs_free); - dev_dbg(&ch343->data->dev, "%s - disconnected\n", __func__); - return; - } - - if (status) { - set_bit(rb->index, &ch343->read_urbs_free); - dev_dbg(&ch343->data->dev, "%s - non-zero urb status: %d\n", __func__, status); - return; - } - - usb_mark_last_busy(ch343->dev); - ch343_process_read_urb(ch343, urb); - set_bit(rb->index, &ch343->read_urbs_free); - ch343_submit_read_urb(ch343, rb->index, GFP_ATOMIC); -} - -/* data interface wrote those outgoing bytes */ -static void ch343_write_bulk(struct urb *urb) -{ - struct ch343_wb *wb = urb->context; - struct ch343 *ch343 = wb->instance; - unsigned long flags; - int status = urb->status; - - dev_vdbg(&ch343->data->dev, "%s, len %d\n", __func__, urb->actual_length); - if (status || (urb->actual_length != urb->transfer_buffer_length)) - dev_vdbg(&ch343->data->dev, "%s - len %d/%d, status %d\n", __func__, urb->actual_length, - urb->transfer_buffer_length, status); - - spin_lock_irqsave(&ch343->write_lock, flags); - ch343_write_done(ch343, wb); - spin_unlock_irqrestore(&ch343->write_lock, flags); - schedule_work(&ch343->work); -} - -static void ch343_softint(struct work_struct *work) -{ - struct ch343 *ch343 = container_of(work, struct ch343, work); - - dev_dbg(&ch343->data->dev, "%s\n", __func__); - - tty_port_tty_wakeup(&ch343->port); -} - -/* - * TTY handlers - */ -static int ch343_tty_install(struct tty_driver *driver, struct tty_struct *tty) -{ - struct ch343 *ch343; - int retval; - - dev_dbg(tty->dev, "%s\n", __func__); - - ch343 = ch343_get_by_minor(tty->index); - if (!ch343) - return -ENODEV; - - retval = tty_standard_install(driver, tty); - if (retval) - goto error_init_termios; - - tty->driver_data = ch343; - - return 0; - -error_init_termios: - tty_port_put(&ch343->port); - return retval; -} - -static int ch343_tty_open(struct tty_struct *tty, struct file *filp) -{ - struct ch343 *ch343 = tty->driver_data; - - dev_dbg(tty->dev, "%s\n", __func__); - - return tty_port_open(&ch343->port, tty, filp); -} - -static void ch343_port_dtr_rts(struct tty_port *port, int raise) -{ - struct ch343 *ch343 = container_of(port, struct ch343, port); - int res; - - dev_dbg(&ch343->data->dev, "%s, raise:%d\n", __func__, raise); - - if (raise) - ch343->ctrlout |= CH343_CTO_D | CH343_CTO_R; - else - ch343->ctrlout &= ~(CH343_CTO_D | CH343_CTO_R); - - res = ch343_set_control(ch343, ch343->ctrlout); - if (res) - dev_err(&ch343->control->dev, "failed to set dtr/rts\n"); -} - -static int ch343_port_activate(struct tty_port *port, struct tty_struct *tty) -{ - struct ch343 *ch343 = container_of(port, struct ch343, port); - int retval = -ENODEV; - int i; - - dev_dbg(&ch343->control->dev, "%s\n", __func__); - - mutex_lock(&ch343->mutex); - if (ch343->disconnected) - goto disconnected; - - retval = usb_autopm_get_interface(ch343->control); - if (retval) - goto error_get_interface; - - /* - * FIXME: Why do we need this? Allocating 64K of physically contiguous - * memory is really nasty... - */ - set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); - ch343->control->needs_remote_wakeup = 1; - - // retval = ch343_configure(ch343); - // if (retval) - // goto error_configure; - - ch343_tty_set_termios(tty, NULL); - - retval = usb_submit_urb(ch343->ctrlurb, GFP_KERNEL); - if (retval) { - dev_err(&ch343->control->dev, "%s - usb_submit_urb(ctrl cmd) failed\n", __func__); - goto error_submit_urb; - } - - retval = ch343_submit_read_urbs(ch343, GFP_KERNEL); - if (retval) - goto error_submit_read_urbs; - usb_autopm_put_interface(ch343->control); - - mutex_unlock(&ch343->mutex); - - return 0; - -error_submit_read_urbs: - for (i = 0; i < ch343->rx_buflimit; i++) - usb_kill_urb(ch343->read_urbs[i]); -error_submit_urb: - usb_kill_urb(ch343->ctrlurb); - // error_configure: - usb_autopm_put_interface(ch343->control); -error_get_interface: -disconnected: - mutex_unlock(&ch343->mutex); - - return usb_translate_errors(retval); -} - -static void ch343_port_destruct(struct tty_port *port) -{ - struct ch343 *ch343 = container_of(port, struct ch343, port); - - dev_dbg(&ch343->control->dev, "%s\n", __func__); - - ch343_release_minor(ch343); - usb_put_intf(ch343->control); - kfree(ch343); -} - -static void ch343_port_shutdown(struct tty_port *port) -{ - struct ch343 *ch343 = container_of(port, struct ch343, port); - struct urb *urb; - struct ch343_wb *wb; - int i; - - dev_dbg(&ch343->control->dev, "%s\n", __func__); - - usb_autopm_get_interface_no_resume(ch343->control); - ch343->control->needs_remote_wakeup = 0; - usb_autopm_put_interface(ch343->control); - - for (;;) { - urb = usb_get_from_anchor(&ch343->delayed); - if (!urb) - break; - wb = urb->context; - wb->use = 0; - usb_autopm_put_interface_async(ch343->control); - } - - usb_kill_urb(ch343->ctrlurb); - for (i = 0; i < CH343_NW; i++) - usb_kill_urb(ch343->wb[i].urb); - for (i = 0; i < ch343->rx_buflimit; i++) - usb_kill_urb(ch343->read_urbs[i]); -} - -static void ch343_tty_cleanup(struct tty_struct *tty) -{ - struct ch343 *ch343 = tty->driver_data; - dev_dbg(&ch343->control->dev, "%s\n", __func__); - tty_port_put(&ch343->port); -} - -static void ch343_tty_hangup(struct tty_struct *tty) -{ - struct ch343 *ch343 = tty->driver_data; - dev_dbg(&ch343->control->dev, "%s\n", __func__); - tty_port_hangup(&ch343->port); -} - -static void ch343_tty_close(struct tty_struct *tty, struct file *filp) -{ - struct ch343 *ch343 = tty->driver_data; - dev_dbg(&ch343->control->dev, "%s\n", __func__); - tty_port_close(&ch343->port, tty, filp); -} - -static int ch343_tty_write(struct tty_struct *tty, const unsigned char *buf, int count) -{ - struct ch343 *ch343 = tty->driver_data; - int stat; - unsigned long flags; - int wbn; - struct ch343_wb *wb; - - if (!count) - return 0; - - dev_vdbg(&ch343->data->dev, "%s - count %d\n", __func__, count); - - spin_lock_irqsave(&ch343->write_lock, flags); - wbn = ch343_wb_alloc(ch343); - if (wbn < 0) { - spin_unlock_irqrestore(&ch343->write_lock, flags); - return 0; - } - wb = &ch343->wb[wbn]; - - if (!ch343->dev) { - wb->use = 0; - spin_unlock_irqrestore(&ch343->write_lock, flags); - return -ENODEV; - } - - count = (count > ch343->writesize) ? ch343->writesize : count; - - memcpy(wb->buf, buf, count); - wb->len = count; - - stat = usb_autopm_get_interface_async(ch343->control); - if (stat) { - wb->use = 0; - spin_unlock_irqrestore(&ch343->write_lock, flags); - return stat; - } - - if (ch343->susp_count) { - usb_anchor_urb(wb->urb, &ch343->delayed); - spin_unlock_irqrestore(&ch343->write_lock, flags); - return count; - } - - stat = ch343_start_wb(ch343, wb); - spin_unlock_irqrestore(&ch343->write_lock, flags); - - if (stat < 0) - return stat; - return count; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) -static unsigned int ch343_tty_write_room(struct tty_struct *tty) -#else -static int ch343_tty_write_room(struct tty_struct *tty) -#endif -{ - struct ch343 *ch343 = tty->driver_data; - /* - * Do not let the line discipline to know that we have a reserve, - * or it might get too enthusiastic. - */ - return ch343_wb_is_avail(ch343) ? ch343->writesize : 0; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) -static unsigned int ch343_tty_chars_in_buffer(struct tty_struct *tty) -#else -static int ch343_tty_chars_in_buffer(struct tty_struct *tty) -#endif -{ - struct ch343 *ch343 = tty->driver_data; - /* - * if the device was unplugged then any remaining characters fell out - * of the connector ;) - */ - if (ch343->disconnected) - return 0; - /* - * This is inaccurate (overcounts), but it works. - */ - return (CH343_NW - ch343_wb_is_avail(ch343)) * ch343->writesize; -} - -static int ch343_tty_break_ctl(struct tty_struct *tty, int state) -{ - struct ch343 *ch343 = tty->driver_data; - int retval; - uint16_t reg_contents; - uint8_t *regbuf; - - dev_dbg(&ch343->control->dev, "%s\n", __func__); - - regbuf = kmalloc(2, GFP_KERNEL); - if (!regbuf) - return -1; - - if (state != 0) { - if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) || - (ch343->chiptype == CHIP_CH344L_V2) || (ch343->chiptype == CHIP_CH9104L)) { - regbuf[0] = ch343->iface; - regbuf[1] = 0x01; - } else { - regbuf[0] = CH343_N_B; - regbuf[1] = 0x00; - } - } else { - if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) || - (ch343->chiptype == CHIP_CH344L_V2) || (ch343->chiptype == CHIP_CH9104L)) { - regbuf[0] = ch343->iface; - regbuf[1] = 0x00; - } else { - regbuf[0] = CH343_N_B | CH343_N_AB; - regbuf[1] = 0x00; - } - } - reg_contents = get_unaligned_le16(regbuf); - - if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) || (ch343->chiptype == CHIP_CH344L_V2) || - (ch343->chiptype == CHIP_CH9104L)) { - retval = ch343_control_out(ch343, CMD_C4, reg_contents, 0x00); - } else { - if (ch343->iface) - retval = ch343_control_out(ch343, CMD_C4, 0x00, reg_contents); - else - retval = ch343_control_out(ch343, CMD_C4, reg_contents, 0x00); - } - - if (retval < 0) - dev_err(&ch343->control->dev, "%s - USB control write error (%d)\n", __func__, retval); - - kfree(regbuf); - - return retval; -} - -static int ch343_tty_tiocmget(struct tty_struct *tty) -{ - struct ch343 *ch343 = tty->driver_data; - unsigned long flags; - unsigned int result; - - dev_dbg(&ch343->control->dev, "%s\n", __func__); - - spin_lock_irqsave(&ch343->read_lock, flags); - result = (ch343->ctrlout & CH343_CTO_D ? TIOCM_DTR : 0) | (ch343->ctrlout & CH343_CTO_R ? TIOCM_RTS : 0) | - (ch343->ctrlin & CH343_CTI_C ? TIOCM_CTS : 0) | (ch343->ctrlin & CH343_CTI_DS ? TIOCM_DSR : 0) | - (ch343->ctrlin & CH343_CTI_R ? TIOCM_RI : 0) | (ch343->ctrlin & CH343_CTI_DC ? TIOCM_CD : 0); - spin_unlock_irqrestore(&ch343->read_lock, flags); - - return result; -} - -static int ch343_tty_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear) -{ - struct ch343 *ch343 = tty->driver_data; - unsigned int newctrl; - - dev_dbg(&ch343->control->dev, "%s\n", __func__); - - newctrl = ch343->ctrlout; - set = (set & TIOCM_DTR ? CH343_CTO_D : 0) | (set & TIOCM_RTS ? CH343_CTO_R : 0); - clear = (clear & TIOCM_DTR ? CH343_CTO_D : 0) | (clear & TIOCM_RTS ? CH343_CTO_R : 0); - - newctrl = (newctrl & ~clear) | set; - - if (ch343->ctrlout == newctrl) { - return 0; - } - - return ch343_set_control(ch343, ch343->ctrlout = newctrl); -} - -static int ch343_get_serial_info(struct ch343 *ch343, struct serial_struct __user *info) -{ - struct serial_struct tmp; - - if (!info) - return -EINVAL; - - memset(&tmp, 0, sizeof(tmp)); - tmp.flags = ASYNC_LOW_LATENCY; - tmp.xmit_fifo_size = ch343->writesize; - tmp.baud_base = le32_to_cpu(ch343->line.dwDTERate); - tmp.close_delay = ch343->port.close_delay / 10; - tmp.closing_wait = - ch343->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? ASYNC_CLOSING_WAIT_NONE : ch343->port.closing_wait / 10; - - if (copy_to_user(info, &tmp, sizeof(tmp))) - return -EFAULT; - else - return 0; -} - -static int ch343_set_serial_info(struct ch343 *ch343, struct serial_struct __user *newinfo) -{ - struct serial_struct new_serial; - unsigned int closing_wait, close_delay; - int retval = 0; - - if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) - return -EFAULT; - - close_delay = new_serial.close_delay * 10; - closing_wait = - new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10; - - mutex_lock(&ch343->port.mutex); - - if (!capable(CAP_SYS_ADMIN)) { - if ((close_delay != ch343->port.close_delay) || (closing_wait != ch343->port.closing_wait)) - retval = -EPERM; - else - retval = -EOPNOTSUPP; - } else { - ch343->port.close_delay = close_delay; - ch343->port.closing_wait = closing_wait; - } - - mutex_unlock(&ch343->port.mutex); - return retval; -} - -static int ch343_wait_serial_change(struct ch343 *ch343, unsigned long arg) -{ - int rv = 0; - DECLARE_WAITQUEUE(wait, current); - struct async_icount old, new; - - do { - spin_lock_irq(&ch343->read_lock); - old = ch343->oldcount; - new = ch343->iocount; - ch343->oldcount = new; - spin_unlock_irq(&ch343->read_lock); - - if ((arg & TIOCM_CTS) && old.cts != new.cts) - break; - if ((arg & TIOCM_DSR) && old.dsr != new.dsr) - break; - if ((arg & TIOCM_RI) && old.rng != new.rng) - break; - if ((arg & TIOCM_CD) && old.dcd != new.dcd) - break; - - add_wait_queue(&ch343->wioctl, &wait); - set_current_state(TASK_INTERRUPTIBLE); - schedule(); - remove_wait_queue(&ch343->wioctl, &wait); - if (ch343->disconnected) { - if (arg & TIOCM_CD) - break; - else - rv = -ENODEV; - } else { - if (signal_pending(current)) - rv = -ERESTARTSYS; - } - } while (!rv); - - return rv; -} - -static int ch343_get_serial_usage(struct ch343 *ch343, struct serial_icounter_struct __user *count) -{ - struct serial_icounter_struct icount; - int rv = 0; - - memset(&icount, 0, sizeof(icount)); - icount.cts = ch343->iocount.cts; - icount.dsr = ch343->iocount.dsr; - icount.rng = ch343->iocount.rng; - icount.dcd = ch343->iocount.dcd; - icount.frame = ch343->iocount.frame; - icount.overrun = ch343->iocount.overrun; - icount.parity = ch343->iocount.parity; - icount.brk = ch343->iocount.brk; - - if (copy_to_user(count, &icount, sizeof(icount)) > 0) - rv = -EFAULT; - - return rv; -} - -static int ch343_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) -{ - struct ch343 *ch343 = tty->driver_data; - int rv = 0; - unsigned long arg1, arg2, arg3, arg4, arg5, arg6; - u32 __user *argval = (u32 __user *)arg; - u8 *buffer; - - dev_dbg(&ch343->control->dev, "%s\n", __func__); - - buffer = kmalloc(512, GFP_KERNEL); - if (!buffer) - return -ENOMEM; - - switch (cmd) { - case TIOCGSERIAL: /* gets serial port data */ - rv = ch343_get_serial_info(ch343, (struct serial_struct __user *)arg); - break; - case TIOCSSERIAL: - rv = ch343_set_serial_info(ch343, (struct serial_struct __user *)arg); - break; - case TIOCMIWAIT: - rv = usb_autopm_get_interface(ch343->control); - if (rv < 0) { - rv = -EIO; - break; - } - rv = ch343_wait_serial_change(ch343, arg); - usb_autopm_put_interface(ch343->control); - break; - case IOCTL_CMD_GICOUNT: - case TIOCGICOUNT: - rv = ch343_get_serial_usage(ch343, (struct serial_icounter_struct __user *)arg); - break; - case IOCTL_CMD_GETCHIPTYPE: - if (put_user(ch343->chiptype, argval)) { - rv = -EFAULT; - goto out; - } - break; - case IOCTL_CMD_CTRLIN: - get_user(arg1, (u8 __user *)arg); - get_user(arg2, ((u8 __user *)arg + 1)); - get_user(arg3, (u16 __user *)((u8 *)arg + 2)); - get_user(arg4, (u16 __user *)((u8 *)arg + 4)); - get_user(arg5, (u16 __user *)((u8 *)arg + 6)); - arg6 = (unsigned long)((u8 __user *)arg + 8); - rv = ch343_control_msg_in(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5); - break; - case IOCTL_CMD_CTRLOUT: - get_user(arg1, (u8 __user *)arg); - get_user(arg2, ((u8 __user *)arg + 1)); - get_user(arg3, (u16 __user *)((u8 *)arg + 2)); - get_user(arg4, (u16 __user *)((u8 *)arg + 4)); - get_user(arg5, (u16 __user *)((u8 *)arg + 6)); - arg6 = (unsigned long)((u8 __user *)arg + 8); - rv = ch343_control_msg_out(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5); - if (rv != (u16)arg5) { - rv = -EINVAL; - goto out; - } - break; - default: - rv = -ENOIOCTLCMD; - break; - } - -out: - kfree(buffer); - return rv < 0 ? rv : 0; -} - -static int ch343_get(CHIPTYPE chiptype, unsigned int bval, unsigned char *fct, unsigned char *dvs) -{ - unsigned char a; - unsigned char b; - unsigned long c; - - if (((chiptype == CHIP_CH347T) || (chiptype == CHIP_CH344Q) || (chiptype == CHIP_CH9104L)) && bval >= 2000000) { - *fct = (unsigned char)(bval / 200); - *dvs = (unsigned char)((bval / 200) >> 8); - } - - switch (bval) { - case 6000000: - case 4000000: - case 2400000: - case 921600: - case 307200: - case 256000: - b = 7; - c = 12000000; - break; - default: - if (bval > 6000000 / 255) { - b = 3; - c = 6000000; - } else if (bval > 750000 / 255) { - b = 2; - c = 750000; - } else if (bval > 93750 / 255) { - b = 1; - c = 93750; - } else { - b = 0; - c = 11719; - } - break; - } - a = (unsigned char)(c / bval); - if (a == 0 || a == 0xFF) - return -EINVAL; - if ((c / a - bval) > (bval - c / (a + 1))) - a++; - a = 256 - a; - - *fct = a; - *dvs = b; - - return 0; -} - -static void ch343_tty_set_termios(struct tty_struct *tty, struct ktermios *termios_old) -{ - struct ch343 *ch343 = tty->driver_data; - struct ktermios *termios = &tty->termios; - struct usb_ch343_line_coding newline; - int newctrl = ch343->ctrlout; - - unsigned char dvs = 0; - unsigned char reg_count = 0; - unsigned char fct = 0; - unsigned char reg_value = 0; - unsigned short value = 0; - unsigned short index = 0; - - dev_dbg(tty->dev, "%s\n", __func__); - - if (termios_old && !tty_termios_hw_change(&tty->termios, termios_old)) { - return; - } - - newline.dwDTERate = tty_get_baud_rate(tty); - - if (newline.dwDTERate == 0) - newline.dwDTERate = 9600; - ch343_get(ch343->chiptype, newline.dwDTERate, &fct, &dvs); - - newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 1; - if (newline.bCharFormat == 2) - reg_value |= CH343_L_SB; - - newline.bParityType = - termios->c_cflag & PARENB ? (termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0; - - switch (newline.bParityType) { - case 0x01: - reg_value |= CH343_L_P_O; - break; - case 0x02: - reg_value |= CH343_L_P_E; - break; - case 0x03: - reg_value |= CH343_L_P_M; - break; - case 0x04: - reg_value |= CH343_L_P_S; - break; - default: - break; - } - - switch (termios->c_cflag & CSIZE) { - case CS5: - newline.bDataBits = 5; - reg_value |= CH343_L_C5; - break; - case CS6: - newline.bDataBits = 6; - reg_value |= CH343_L_C6; - break; - case CS7: - newline.bDataBits = 7; - reg_value |= CH343_L_C7; - break; - case CS8: - default: - newline.bDataBits = 8; - reg_value |= CH343_L_C8; - break; - } - - /* FIXME: Needs to clear unsupported bits in the termios */ - ch343->clocal = ((termios->c_cflag & CLOCAL) != 0); - - if (C_BAUD(tty) == B0) { - newline.dwDTERate = ch343->line.dwDTERate; - newctrl &= ~CH343_CTO_D; - } else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) { - newctrl |= CH343_CTO_D; - } - - reg_value |= CH343_L_E_R | CH343_L_E_T; - reg_count |= CH343_L_R_CT | CH343_L_R_CL | CH343_L_R_T; - - value |= reg_count; - value |= (unsigned short)reg_value << 8; - - index |= 0x00 | dvs; - index |= (unsigned short)fct << 8; - if (ch343->iface <= 1) - ch343_control_out(ch343, CMD_C1 + ch343->iface, value, index); - else if (ch343->iface <= 3) - ch343_control_out(ch343, CMD_C1 + 0x10 + (ch343->iface - 2), value, index); - - if (memcmp(&ch343->line, &newline, sizeof newline)) { - memcpy(&ch343->line, &newline, sizeof newline); - dev_dbg(&ch343->control->dev, "%s - set line: %d %d %d %d\n", __func__, newline.dwDTERate, newline.bCharFormat, - newline.bParityType, newline.bDataBits); - } - - if (C_CRTSCTS(tty)) { - newctrl |= CH343_CTO_A | CH343_CTO_R; - } else - newctrl &= ~CH343_CTO_A; - - if (newctrl != ch343->ctrlout) - ch343_set_control(ch343, ch343->ctrlout = newctrl); -} - -static const struct tty_port_operations ch343_port_ops = { - .dtr_rts = ch343_port_dtr_rts, - .shutdown = ch343_port_shutdown, - .activate = ch343_port_activate, - .destruct = ch343_port_destruct, -}; - -/* Little helpers: write/read buffers free */ -static void ch343_write_buffers_free(struct ch343 *ch343) -{ - int i; - struct ch343_wb *wb; - struct usb_device *usb_dev = interface_to_usbdev(ch343->control); - - for (wb = &ch343->wb[0], i = 0; i < CH343_NW; i++, wb++) - usb_free_coherent(usb_dev, ch343->writesize, wb->buf, wb->dmah); -} - -static void ch343_read_buffers_free(struct ch343 *ch343) -{ - struct usb_device *usb_dev = interface_to_usbdev(ch343->control); - int i; - - for (i = 0; i < ch343->rx_buflimit; i++) - usb_free_coherent(usb_dev, ch343->readsize, ch343->read_buffers[i].base, ch343->read_buffers[i].dma); -} - -/* Little helper: write buffers allocate */ -static int ch343_write_buffers_alloc(struct ch343 *ch343) -{ - int i; - struct ch343_wb *wb; - - for (wb = &ch343->wb[0], i = 0; i < CH343_NW; i++, wb++) { - wb->buf = usb_alloc_coherent(ch343->dev, ch343->writesize, GFP_KERNEL, &wb->dmah); - if (!wb->buf) { - while (i != 0) { - --i; - --wb; - usb_free_coherent(ch343->dev, ch343->writesize, wb->buf, wb->dmah); - } - return -ENOMEM; - } - } - return 0; -} - -static int ch343_open(struct inode *inode, struct file *file) -{ - struct ch343 *ch343; - struct usb_interface *interface; - int subminor; - int retval = 0; - - subminor = iminor(inode); - - interface = usb_find_interface(&ch343_driver, subminor); - if (!interface) { - pr_err("%s - error, can't find device for minor %d\n", __func__, subminor); - retval = -ENODEV; - goto exit; - } - - ch343 = usb_get_intfdata(interface); - if (!ch343) { - retval = -ENODEV; - goto exit; - } - - /* save our object in the file's private structure */ - file->private_data = ch343; - -exit: - return retval; -} - -static int ch343_release(struct inode *inode, struct file *file) -{ - struct ch343 *ch343; - - ch343 = file->private_data; - if (ch343 == NULL) - return -ENODEV; - - return 0; -} - -static long ch343_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct ch343 *ch343; - int rv = 0; - u8 *buffer; - unsigned long arg1, arg2, arg3, arg4, arg5, arg6; - u32 __user *argval = (u32 __user *)arg; - - ch343 = file->private_data; - if (ch343 == NULL) - return -ENODEV; - - buffer = kmalloc(512, GFP_KERNEL); - if (!buffer) - return -ENOMEM; - - switch (cmd) { - case IOCTL_CMD_GETCHIPTYPE: - if (put_user(ch343->chiptype, argval)) { - rv = -EFAULT; - goto out; - } - break; - case IOCTL_CMD_CTRLIN: - get_user(arg1, (u8 __user *)arg); - get_user(arg2, ((u8 __user *)arg + 1)); - get_user(arg3, (u16 __user *)((u8 *)arg + 2)); - get_user(arg4, (u16 __user *)((u8 *)arg + 4)); - get_user(arg5, (u16 __user *)((u8 *)arg + 6)); - arg6 = (unsigned long)((u8 __user *)arg + 8); - rv = ch343_control_msg_in(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5); - break; - case IOCTL_CMD_CTRLOUT: - get_user(arg1, (u8 __user *)arg); - get_user(arg2, ((u8 __user *)arg + 1)); - get_user(arg3, (u16 __user *)((u8 *)arg + 2)); - get_user(arg4, (u16 __user *)((u8 *)arg + 4)); - get_user(arg5, (u16 __user *)((u8 *)arg + 6)); - arg6 = (unsigned long)((u8 __user *)arg + 8); - rv = ch343_control_msg_out(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5); - if (rv != (u16)arg5) { - rv = -EINVAL; - goto out; - } - break; - default: - rv = -ENOIOCTLCMD; - break; - } - -out: - kfree(buffer); - return rv; -} - -static const struct file_operations ch343_fops = { - .owner = THIS_MODULE, - .open = ch343_open, - .unlocked_ioctl = ch343_ioctl, - .release = ch343_release, -}; - -/* - * usb class driver info in order to get a minor number from the usb core, - * and to have the device registered with the driver core - */ -static struct usb_class_driver ch343_class = { - .name = "ch343_iodev%d", - .fops = &ch343_fops, - .minor_base = USB_MINOR_BASE, -}; - -/* - * USB probe and disconnect routines. - */ -static int ch343_probe(struct usb_interface *intf, const struct usb_device_id *id) -{ - struct usb_cdc_union_desc *union_header = NULL; - unsigned char *buffer = intf->altsetting->extra; - int buflen = intf->altsetting->extralen; - struct usb_interface *control_interface; - struct usb_interface *data_interface; - struct usb_endpoint_descriptor *epctrl = NULL; - struct usb_endpoint_descriptor *epread = NULL; - struct usb_endpoint_descriptor *epwrite = NULL; - struct usb_device *usb_dev = interface_to_usbdev(intf); - struct ch343 *ch343; - int minor; - int ctrlsize, readsize; - u8 *buf; - unsigned long quirks; - int num_rx_buf = CH343_NR; - int i; - unsigned int elength = 0; - struct device *tty_dev; - int rv = -ENOMEM; - - /* normal quirks */ - quirks = (unsigned long)id->driver_info; - if (!buffer) { - dev_err(&intf->dev, "Weird descriptor references\n"); - return -EINVAL; - } - - while (buflen > 0) { - elength = buffer[0]; - if (!elength) { - dev_err(&intf->dev, "skipping garbage byte\n"); - elength = 1; - goto next_desc; - } - if (buffer[1] != USB_DT_CS_INTERFACE) { - dev_err(&intf->dev, "skipping garbage\n"); - goto next_desc; - } - - switch (buffer[2]) { - case USB_CDC_UNION_TYPE: /* we've found it */ - if (elength < sizeof(struct usb_cdc_union_desc)) - goto next_desc; - if (union_header) { - dev_err(&intf->dev, - "More than one " - "union descriptor, skipping ...\n"); - goto next_desc; - } - union_header = (struct usb_cdc_union_desc *)buffer; - break; - default: - /* - * there are LOTS more CDC descriptors that - * could legitimately be found here. - */ - break; - } - next_desc: - buflen -= elength; - buffer += elength; - } - - control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); - data_interface = usb_ifnum_to_if(usb_dev, union_header->bSlaveInterface0); - - if (intf != control_interface) - return -ENODEV; - - if (usb_interface_claimed(data_interface)) { - dev_dbg(&intf->dev, "The data interface isn't available\n"); - return -EBUSY; - } - - if (data_interface->cur_altsetting->desc.bNumEndpoints < 2 || - control_interface->cur_altsetting->desc.bNumEndpoints == 0) - return -EINVAL; - - epctrl = &control_interface->cur_altsetting->endpoint[0].desc; - epwrite = &data_interface->cur_altsetting->endpoint[0].desc; - epread = &data_interface->cur_altsetting->endpoint[1].desc; - - /* workaround for switched endpoints */ - if (!usb_endpoint_dir_in(epread)) { - /* descriptors are swapped */ - dev_dbg(&intf->dev, "The data interface has switched endpoints\n"); - swap(epread, epwrite); - } - - ch343 = kzalloc(sizeof(struct ch343), GFP_KERNEL); - if (ch343 == NULL) - goto alloc_fail; - - ch343->idVendor = id->idVendor; - ch343->idProduct = id->idProduct; - ch343->iface = control_interface->cur_altsetting->desc.bInterfaceNumber / 2; - - minor = ch343_alloc_minor(ch343); - if (minor < 0) { - dev_err(&intf->dev, "no more free ch343 devices\n"); - kfree(ch343); - return -ENODEV; - } - - ctrlsize = usb_endpoint_maxp(epctrl); - readsize = usb_endpoint_maxp(epread); - ch343->writesize = usb_endpoint_maxp(epwrite) * 20; - ch343->control = control_interface; - ch343->data = data_interface; - ch343->minor = minor; - ch343->dev = usb_dev; - ch343->ctrlsize = ctrlsize; - ch343->readsize = readsize; - ch343->rx_buflimit = num_rx_buf; - - dev_dbg(&intf->dev, "ep%d ctrl: %d, ep%d read: %d, ep%d write: %d\n", usb_endpoint_num(epctrl), - usb_endpoint_maxp(epctrl), usb_endpoint_num(epread), usb_endpoint_maxp(epread), usb_endpoint_num(epwrite), - usb_endpoint_maxp(epwrite)); - - INIT_WORK(&ch343->work, ch343_softint); - init_waitqueue_head(&ch343->wioctl); - spin_lock_init(&ch343->write_lock); - spin_lock_init(&ch343->read_lock); - mutex_init(&ch343->mutex); - ch343->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); - tty_port_init(&ch343->port); - ch343->port.ops = &ch343_port_ops; - init_usb_anchor(&ch343->delayed); - ch343->quirks = quirks; - - buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &ch343->ctrl_dma); - if (!buf) - goto alloc_fail2; - ch343->ctrl_buffer = buf; - - if (ch343_write_buffers_alloc(ch343) < 0) - goto alloc_fail4; - - ch343->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); - if (!ch343->ctrlurb) - goto alloc_fail5; - - for (i = 0; i < num_rx_buf; i++) { - struct ch343_rb *rb = &(ch343->read_buffers[i]); - struct urb *urb; - - rb->base = usb_alloc_coherent(ch343->dev, readsize, GFP_KERNEL, &rb->dma); - if (!rb->base) - goto alloc_fail6; - rb->index = i; - rb->instance = ch343; - - urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) - goto alloc_fail6; - - urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - urb->transfer_dma = rb->dma; - usb_fill_bulk_urb(urb, ch343->dev, ch343->rx_endpoint, rb->base, ch343->readsize, ch343_read_bulk_callback, rb); - - ch343->read_urbs[i] = urb; - __set_bit(i, &ch343->read_urbs_free); - } - for (i = 0; i < CH343_NW; i++) { - struct ch343_wb *snd = &(ch343->wb[i]); - - snd->urb = usb_alloc_urb(0, GFP_KERNEL); - if (snd->urb == NULL) - goto alloc_fail7; - - usb_fill_bulk_urb(snd->urb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), NULL, - ch343->writesize, ch343_write_bulk, snd); - snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - snd->instance = ch343; - } - - usb_set_intfdata(intf, ch343); - - usb_fill_int_urb(ch343->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress), ch343->ctrl_buffer, - ctrlsize, ch343_ctrl_irq, ch343, epctrl->bInterval ? epctrl->bInterval : 16); - ch343->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - ch343->ctrlurb->transfer_dma = ch343->ctrl_dma; - - dev_info(&intf->dev, "ttyXRUSB%d: usb to uart device\n", minor); - - usb_driver_claim_interface(&ch343_driver, data_interface, ch343); - usb_set_intfdata(data_interface, ch343); - usb_get_intf(control_interface); - - rv = ch343_configure(ch343); - if (rv) - goto alloc_fail7; - - if (ch343->iface == 0) { - /* register the device now, as it is ready */ - rv = usb_register_dev(intf, &ch343_class); - if (rv) { - /* error when registering this driver */ - dev_err(&intf->dev, "Not able to get a minor for this device.\n"); - } else { - g_intf = intf; - } - } - - tty_dev = tty_port_register_device(&ch343->port, ch343_tty_driver, minor, &control_interface->dev); - if (IS_ERR(tty_dev)) { - rv = PTR_ERR(tty_dev); - goto alloc_fail7; - } - - return 0; - -alloc_fail7: - usb_set_intfdata(intf, NULL); - for (i = 0; i < CH343_NW; i++) - usb_free_urb(ch343->wb[i].urb); -alloc_fail6: - for (i = 0; i < num_rx_buf; i++) - usb_free_urb(ch343->read_urbs[i]); - ch343_read_buffers_free(ch343); - usb_free_urb(ch343->ctrlurb); -alloc_fail5: - ch343_write_buffers_free(ch343); -alloc_fail4: - usb_free_coherent(usb_dev, ctrlsize, ch343->ctrl_buffer, ch343->ctrl_dma); -alloc_fail2: - ch343_release_minor(ch343); - kfree(ch343); -alloc_fail: - return rv; -} - -static void stop_data_traffic(struct ch343 *ch343) -{ - int i; - - usb_kill_urb(ch343->ctrlurb); - for (i = 0; i < CH343_NW; i++) - usb_kill_urb(ch343->wb[i].urb); - for (i = 0; i < ch343->rx_buflimit; i++) - usb_kill_urb(ch343->read_urbs[i]); - cancel_work_sync(&ch343->work); -} - -static void ch343_disconnect(struct usb_interface *intf) -{ - struct ch343 *ch343 = usb_get_intfdata(intf); - struct usb_device *usb_dev = interface_to_usbdev(intf); - struct tty_struct *tty; - int i; - - dev_dbg(&intf->dev, "%s\n", __func__); - - /* sibling interface is already cleaning up */ - if (!ch343) - return; - - /* give back minor */ - if ((ch343->iface == 0) && (g_intf != NULL)) { - usb_deregister_dev(g_intf, &ch343_class); - } - - mutex_lock(&ch343->mutex); - ch343->disconnected = true; - wake_up_all(&ch343->wioctl); - usb_set_intfdata(ch343->control, NULL); - usb_set_intfdata(ch343->data, NULL); - mutex_unlock(&ch343->mutex); - - tty = tty_port_tty_get(&ch343->port); - if (tty) { - tty_vhangup(tty); - tty_kref_put(tty); - } - - stop_data_traffic(ch343); - - tty_unregister_device(ch343_tty_driver, ch343->minor); - - usb_free_urb(ch343->ctrlurb); - for (i = 0; i < CH343_NW; i++) - usb_free_urb(ch343->wb[i].urb); - for (i = 0; i < ch343->rx_buflimit; i++) - usb_free_urb(ch343->read_urbs[i]); - ch343_write_buffers_free(ch343); - usb_free_coherent(usb_dev, ch343->ctrlsize, ch343->ctrl_buffer, ch343->ctrl_dma); - ch343_read_buffers_free(ch343); - - usb_driver_release_interface(&ch343_driver, intf == ch343->control ? ch343->data : ch343->control); - - tty_port_put(&ch343->port); - dev_info(&intf->dev, "%s\n", "ch343 usb device disconnect."); -} - -#ifdef CONFIG_PM -static int ch343_suspend(struct usb_interface *intf, pm_message_t message) -{ - struct ch343 *ch343 = usb_get_intfdata(intf); - int cnt; - - dev_dbg(&intf->dev, "%s\n", __func__); - - spin_lock_irq(&ch343->write_lock); - if (PMSG_IS_AUTO(message)) { - if (ch343->transmitting) { - spin_unlock_irq(&ch343->write_lock); - return -EBUSY; - } - } - cnt = ch343->susp_count++; - spin_unlock_irq(&ch343->write_lock); - - if (cnt) - return 0; - - stop_data_traffic(ch343); - - return 0; -} - -static int ch343_resume(struct usb_interface *intf) -{ - struct ch343 *ch343 = usb_get_intfdata(intf); - struct urb *urb; - int rv = 0; - - dev_dbg(&intf->dev, "%s\n", __func__); - - spin_lock_irq(&ch343->write_lock); - - if (--ch343->susp_count) - goto out; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)) - if (tty_port_initialized(&ch343->port)) { -#else - if (test_bit(ASYNCB_INITIALIZED, &ch343->port.flags)) { -#endif - rv = usb_submit_urb(ch343->ctrlurb, GFP_ATOMIC); - - for (;;) { - urb = usb_get_from_anchor(&ch343->delayed); - if (!urb) - break; - - ch343_start_wb(ch343, urb->context); - } - - /* - * delayed error checking because we must - * do the write path at all cost - */ - if (rv < 0) - goto out; - - rv = ch343_submit_read_urbs(ch343, GFP_ATOMIC); - } -out: - spin_unlock_irq(&ch343->write_lock); - - return rv; -} - -static int ch343_reset_resume(struct usb_interface *intf) -{ - struct ch343 *ch343 = usb_get_intfdata(intf); - - dev_dbg(&intf->dev, "%s\n", __func__); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)) - if (tty_port_initialized(&ch343->port)) -#else - if (test_bit(ASYNCB_INITIALIZED, &ch343->port.flags)) -#endif - tty_port_tty_hangup(&ch343->port, false); - - return ch343_resume(intf); -} - -#endif /* CONFIG_PM */ - -/* - * USB driver structure. - */ - -static const struct usb_device_id ch343_ids[] = {{USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D2, /* ch342 chip */ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D3, /* ch343 chip */ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D5, /* ch344 chip */ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DA, /* ch347 chip mode0*/ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DB, /* ch347 chip mode1*/ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DD, /* ch347 chip mode3*/ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D8, /* ch9101 chip */ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D4, /* ch9102 chip */ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D7, /* ch9103 chip */ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DF, /* ch9104 chip */ - USB_CDC_ACM_PROTO_AT_V25TER)}, - - {}}; - -MODULE_DEVICE_TABLE(usb, ch343_ids); - -static struct usb_driver ch343_driver = { - .name = "usb_ch343", - .probe = ch343_probe, - .disconnect = ch343_disconnect, -#ifdef CONFIG_PM - .suspend = ch343_suspend, - .resume = ch343_resume, - .reset_resume = ch343_reset_resume, -#endif - .id_table = ch343_ids, -#ifdef CONFIG_PM - .supports_autosuspend = 1, -#endif - .disable_hub_initiated_lpm = 1, -}; - -/* - * TTY driver structures. - */ -static const struct tty_operations ch343_ops = { - .install = ch343_tty_install, - .open = ch343_tty_open, - .close = ch343_tty_close, - .cleanup = ch343_tty_cleanup, - .hangup = ch343_tty_hangup, - .write = ch343_tty_write, - .write_room = ch343_tty_write_room, - .ioctl = ch343_tty_ioctl, - .chars_in_buffer = ch343_tty_chars_in_buffer, - .break_ctl = ch343_tty_break_ctl, - .set_termios = ch343_tty_set_termios, - .tiocmget = ch343_tty_tiocmget, - .tiocmset = ch343_tty_tiocmset, -}; - -/* - * Init / exit. - */ -static int __init ch343_init(void) -{ - int retval; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) - ch343_tty_driver = tty_alloc_driver(CH343_TTY_MINORS, TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV); - if (IS_ERR(ch343_tty_driver)) - return PTR_ERR(ch343_tty_driver); -#else - ch343_tty_driver = alloc_tty_driver(CH343_TTY_MINORS); - if (!ch343_tty_driver) - return -ENOMEM; -#endif - ch343_tty_driver->driver_name = "usbch343", ch343_tty_driver->name = "ttyXRUSB", - ch343_tty_driver->major = CH343_TTY_MAJOR, ch343_tty_driver->minor_start = 0, - ch343_tty_driver->type = TTY_DRIVER_TYPE_SERIAL, ch343_tty_driver->subtype = SERIAL_TYPE_NORMAL, -#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) - ch343_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; -#endif - ch343_tty_driver->init_termios = tty_std_termios; - ch343_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - tty_set_operations(ch343_tty_driver, &ch343_ops); - - retval = tty_register_driver(ch343_tty_driver); - if (retval) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) - tty_driver_kref_put(ch343_tty_driver); -#else - put_tty_driver(ch343_tty_driver); -#endif - return retval; - } - - retval = usb_register(&ch343_driver); - if (retval) { - tty_unregister_driver(ch343_tty_driver); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) - tty_driver_kref_put(ch343_tty_driver); -#else - put_tty_driver(ch343_tty_driver); -#endif - return retval; - } - - printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); - printk(KERN_INFO KBUILD_MODNAME ": " VERSION_DESC "\n"); - - return 0; -} - -static void __exit ch343_exit(void) -{ - usb_deregister(&ch343_driver); - tty_unregister_driver(ch343_tty_driver); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) - tty_driver_kref_put(ch343_tty_driver); -#else - put_tty_driver(ch343_tty_driver); -#endif - idr_destroy(&ch343_minors); - printk(KERN_INFO KBUILD_MODNAME - ": " - "ch343 driver exit.\n"); -} - -module_init(ch343_init); -module_exit(ch343_exit); - -MODULE_AUTHOR(DRIVER_AUTHOR); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_VERSION(VERSION_DESC); -MODULE_LICENSE("GPL"); -MODULE_ALIAS_CHARDEV_MAJOR(CH343_TTY_MAJOR); diff --git a/kernel/drivers/usb/serial/ch343.h b/kernel/drivers/usb/serial/ch343.h deleted file mode 100644 index c53a875..0000000 --- a/kernel/drivers/usb/serial/ch343.h +++ /dev/null @@ -1,243 +0,0 @@ -#ifndef _CH343_H -#define _CH343_H - -/* - * Baud rate and default timeout - */ -#define DEFAULT_BAUD_RATE 9600 -#define DEFAULT_TIMEOUT 2000 - -/* - * CMSPAR, some architectures can't have space and mark parity. - */ - -#ifndef CMSPAR -#define CMSPAR 0 -#endif - -/* - * Major and minor numbers. - */ - -#define CH343_TTY_MAJOR 170 -#define CH343_TTY_MINORS 256 - -#define USB_MINOR_BASE 70 - -/* - * Requests. - */ - -#define USB_RT_CH343 (USB_TYPE_CLASS | USB_RECIP_INTERFACE) - -#define CMD_R 0x95 -#define CMD_W 0x9A -#define CMD_C1 0xA1 -#define CMD_C2 0xA4 -#define CMD_C3 0x05 -#define CMD_C4 0xA8 -#define CMD_C5 0x5E -#define CMD_C6 0x5F - -#define CH343_CTO_O 0x10 -#define CH343_CTO_D 0x20 -#define CH343_CTO_R 0x40 -#define CH343_CTO_A 0x80 -#define CH343_CTI_C 0x01 -#define CH343_CTI_DS 0x02 -#define CH343_CTI_R 0x04 -#define CH343_CTI_DC 0x08 -#define CH343_CTI_ST 0x0f - -#define CH343_CTT_M 0x08 -#define CH343_CTT_F 0x44 -#define CH343_CTT_P 0x04 -#define CH343_CTT_O 0x02 - -#define CH343_LO 0x02 -#define CH343_LE 0x04 -#define CH343_LB -#define CH343_LP 0x00 -#define CH343_LF 0x40 -#define CH343_LM 0x08 - -#define CH343_L_R_CT 0x80 -#define CH343_L_R_CL 0x04 -#define CH343_L_R_T 0x08 - -#define CH343_L_E_R 0x80 -#define CH343_L_E_T 0x40 -#define CH343_L_P_S 0x38 -#define CH343_L_P_M 0x28 -#define CH343_L_P_E 0x18 -#define CH343_L_P_O 0x08 -#define CH343_L_SB 0x04 -#define CH343_L_C8 0x03 -#define CH343_L_C7 0x02 -#define CH343_L_C6 0x01 -#define CH343_L_C5 0x00 - -#define CH343_N_B 0x80 -#define CH343_N_AB 0x10 - -/* - * Internal driver structures. - */ - -/* - * The only reason to have several buffers is to accommodate assumptions - * in line disciplines. They ask for empty space amount, receive our URB size, - * and proceed to issue several 1-character writes, assuming they will fit. - * The very first write takes a complete URB. Fortunately, this only happens - * when processing onlcr, so we only need 2 buffers. These values must be - * powers of 2. - */ -#define CH343_NW 16 -#define CH343_NR 16 - -struct ch343_wb { - unsigned char *buf; - dma_addr_t dmah; - int len; - int use; - struct urb *urb; - struct ch343 *instance; -}; - -struct ch343_rb { - int size; - unsigned char *base; - dma_addr_t dma; - int index; - struct ch343 *instance; -}; - -struct usb_ch343_line_coding { - __u32 dwDTERate; - __u8 bCharFormat; -#define USB_CH343_1_STOP_BITS 0 -#define USB_CH343_1_5_STOP_BITS 1 -#define USB_CH343_2_STOP_BITS 2 - - __u8 bParityType; -#define USB_CH343_NO_PARITY 0 -#define USB_CH343_ODD_PARITY 1 -#define USB_CH343_EVEN_PARITY 2 -#define USB_CH343_MARK_PARITY 3 -#define USB_CH343_SPACE_PARITY 4 - - __u8 bDataBits; -} __attribute__((packed)); - -typedef enum { - CHIP_CH342F = 0x00, - CHIP_CH342K, - CHIP_CH343GP, - CHIP_CH343G_AUTOBAUD, - CHIP_CH343K, - CHIP_CH343J, - CHIP_CH344L, - CHIP_CH344L_V2, - CHIP_CH344Q, - CHIP_CH347T, - CHIP_CH9101UH, - CHIP_CH9101RY, - CHIP_CH9102F, - CHIP_CH9102X, - CHIP_CH9103M, - CHIP_CH9104L, -} CHIPTYPE; - -struct gpioinfo { - int group; - int pin; -}; - -struct ch343_gpio { - int gpiocount; - struct gpioinfo io[64]; -}; - -struct ch343_gpio ch343_gpios[] = { - { 0, {}}, - { 0, {}}, - { 0, {}}, - { 0, {}}, - { 0, {}}, - { 0, {}}, - /* CH344L */ - { 8, {}}, - /* CH344L-V2 */ - { 8, {}}, - /* CH344Q */ - { 8, {}}, - /* CH347T */ - { 4, {}}, - /* CH9101UH */ - { 5, {{3, 2}, {3, 3}, {1, 3}, {1, 2}, {1, 5}, {2, 4}}}, - /* CH9101RY */ - { 4, {{1, 3}, {3, 3}, {3, 2}, {2, 4}}}, - /* CH9102F */ - { 5, {{2, 1}, {2, 7}, {2, 4}, {2, 6}, {2, 3}}}, - /* CH9102X */ - { 6, {{2, 3}, {2, 5}, {2, 1}, {2, 7}, {3, 0}, {2, 2}}}, - /* CH9103M */ - {12, {{1, 3}, {1, 2}, {3, 2}, {2, 6}, {1, 0}, {1, 6}, {2, 3}, {2, 5}, {3, 0}, {2, 2}, {1, 5}, {2, 4}}}, - /* CH9104L */ - {24, {}}, -}; - -struct ch343 { - struct usb_device *dev; /* the corresponding usb device */ - struct usb_interface *control; /* control interface */ - struct usb_interface *data; /* data interface */ - struct tty_port port; /* our tty port data */ - struct urb *ctrlurb; /* urbs */ - u8 *ctrl_buffer; /* buffers of urbs */ - dma_addr_t ctrl_dma; /* dma handles of buffers */ - struct ch343_wb wb[CH343_NW]; - unsigned long read_urbs_free; - struct urb *read_urbs[CH343_NR]; - struct ch343_rb read_buffers[CH343_NR]; - int rx_buflimit; - int rx_endpoint; - spinlock_t read_lock; - int write_used; /* number of non-empty write buffers */ - int transmitting; - spinlock_t write_lock; - struct mutex mutex; - bool disconnected; - struct usb_ch343_line_coding line; /* bits, stop, parity */ - struct work_struct work; /* work queue entry for line discipline waking up */ - unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ - unsigned int ctrlout; /* output control lines (DTR, RTS) */ - struct async_icount iocount; /* counters for control line changes */ - struct async_icount oldcount; /* for comparison of counter */ - wait_queue_head_t wioctl; /* for ioctl */ - unsigned int writesize; /* max packet size for the output bulk endpoint */ - unsigned int readsize, ctrlsize; /* buffer sizes for freeing */ - unsigned int minor; /* ch343 minor number */ - unsigned char clocal; /* termios CLOCAL */ - unsigned int susp_count; /* number of suspended interfaces */ - u8 bInterval; - struct usb_anchor delayed; /* writes queued for a device about to be woken */ - unsigned long quirks; - u8 iface; - CHIPTYPE chiptype; - u16 idVendor; - u16 idProduct; - u8 gpio5dir; -}; - -#define CDC_DATA_INTERFACE_TYPE 0x0a - -/* constants describing various quirks and errors */ -#define NO_UNION_NORMAL BIT(0) -#define SINGLE_RX_URB BIT(1) -#define NO_CAP_LINE BIT(2) -#define NO_DATA_INTERFACE BIT(4) -#define IGNORE_DEVICE BIT(5) -#define QUIRK_CONTROL_LINE_STATE BIT(6) -#define CLEAR_HALT_CONDITIONS BIT(7) - -#endif diff --git a/kernel/drivers/usb/serial/option.c b/kernel/drivers/usb/serial/option.c index 50441e5..ff67562 100644 --- a/kernel/drivers/usb/serial/option.c +++ b/kernel/drivers/usb/serial/option.c @@ -198,6 +198,8 @@ #define DELL_PRODUCT_5821E 0x81d7 #define DELL_PRODUCT_5821E_ESIM 0x81e0 +#define DELL_PRODUCT_5829E_ESIM 0x81e4 +#define DELL_PRODUCT_5829E 0x81e6 #define KYOCERA_VENDOR_ID 0x0c88 #define KYOCERA_PRODUCT_KPC650 0x17da @@ -238,6 +240,7 @@ #define QUECTEL_PRODUCT_UC15 0x9090 /* These u-blox products use Qualcomm's vendor ID */ #define UBLOX_PRODUCT_R410M 0x90b2 +#define UBLOX_PRODUCT_R6XX 0x90fa /* These Yuga products use Qualcomm's vendor ID */ #define YUGA_PRODUCT_CLM920_NC5 0x9625 @@ -245,11 +248,13 @@ /* These Quectel products use Quectel's vendor ID */ #define QUECTEL_PRODUCT_EC21 0x0121 #define QUECTEL_PRODUCT_EC25 0x0125 +#define QUECTEL_PRODUCT_EG91 0x0191 #define QUECTEL_PRODUCT_EG95 0x0195 #define QUECTEL_PRODUCT_BG96 0x0296 #define QUECTEL_PRODUCT_EP06 0x0306 #define QUECTEL_PRODUCT_EM12 0x0512 #define QUECTEL_PRODUCT_RM500Q 0x0800 +#define QUECTEL_PRODUCT_EC200S_CN 0x6002 #define QUECTEL_PRODUCT_EC200T 0x6026 #define CMOTECH_VENDOR_ID 0x16d8 @@ -425,6 +430,8 @@ #define CINTERION_PRODUCT_AHXX_2RMNET 0x0084 #define CINTERION_PRODUCT_AHXX_AUDIO 0x0085 #define CINTERION_PRODUCT_CLS8 0x00b0 +#define CINTERION_PRODUCT_MV31_MBIM 0x00b3 +#define CINTERION_PRODUCT_MV31_RMNET 0x00b7 /* Olivetti products */ #define OLIVETTI_VENDOR_ID 0x0b3c @@ -580,39 +587,6 @@ static const struct usb_device_id option_ids[] = { -#if 1 - { USB_DEVICE( 0x2cb7, 0x0a04 ) }, /* Fibocom FG650 ECM */ - { USB_DEVICE( 0x2cb7, 0x0a05 ) }, /* Fibocom FG650 NCM */ - { USB_DEVICE( 0x2cb7, 0x0a06 ) }, /* Fibocom FG650 RNDIS*/ -#endif - -#if 1 //Added by Quectel - { USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */ - { USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */ - { USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20(MDM9215) */ - { USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC20(MDM9x07)/EC25/EG25 */ - { USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */ - { USB_DEVICE(0x2C7C, 0x0191) }, /* Quectel EG91 */ - { USB_DEVICE(0x2C7C, 0x0195) }, /* Quectel EG95 */ - { USB_DEVICE(0x2C7C, 0x0306) }, /* Quectel EG06/EP06/EM06 */ - { USB_DEVICE(0x2C7C, 0x0512) }, /* Quectel EG12/EP12/EM12/EG16/EG18 */ - { USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */ - { USB_DEVICE(0x2C7C, 0x0700) }, /* Quectel BG95/BG77/BG600L-M3/BC69 */ - { USB_DEVICE(0x2C7C, 0x0435) }, /* Quectel AG35 */ - { USB_DEVICE(0x2C7C, 0x0415) }, /* Quectel AG15 */ - { USB_DEVICE(0x2C7C, 0x0520) }, /* Quectel AG520 */ - { USB_DEVICE(0x2C7C, 0x0550) }, /* Quectel AG550 */ - { USB_DEVICE(0x2C7C, 0x0620) }, /* Quectel EG20 */ - { USB_DEVICE(0x2C7C, 0x0800) }, /* Quectel RG500/RM500/RG510/RM510 */ - { USB_DEVICE(0x2C7C, 0x6026) }, /* Quectel EC200 */ - { USB_DEVICE(0x2C7C, 0x6120) }, /* Quectel UC200 */ - { USB_DEVICE(0x2C7C, 0x6000) }, /* Quectel EC200/UC200 */ - { USB_DEVICE(0x2C7C, 0x6002) }, /* Quectel EC200/UC200 */ -#endif - { USB_DEVICE(0x19d2, 0x0199) }, /* ZTE ME3860 ME3760_V2*/ - { USB_DEVICE(0x19d2, 0x1476) }, /* ZTE ME3620*/ - { USB_DEVICE(0x19d2, 0x0117) }, - { USB_DEVICE(0x1286, 0x4e3c) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, @@ -1092,6 +1066,10 @@ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5821E_ESIM), .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E), + .driver_info = RSVD(0) | RSVD(6) }, + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E_ESIM), + .driver_info = RSVD(0) | RSVD(6) }, { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, @@ -1133,6 +1111,8 @@ /* u-blox products using Qualcomm vendor ID */ { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M), .driver_info = RSVD(1) | RSVD(3) }, + { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R6XX), + .driver_info = RSVD(3) }, /* Quectel products using Quectel vendor ID */ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff), .driver_info = NUMEP2 }, @@ -1140,6 +1120,9 @@ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25, 0xff, 0xff, 0xff), .driver_info = NUMEP2 }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25, 0xff, 0, 0) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG91, 0xff, 0xff, 0xff), + .driver_info = NUMEP2 }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG91, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0xff, 0xff), .driver_info = NUMEP2 }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0, 0) }, @@ -1157,6 +1140,7 @@ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10), .driver_info = ZLP }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, @@ -1232,6 +1216,24 @@ .driver_info = NCTRL(2) | RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1055, 0xff), /* Telit FN980 (PCIe) */ .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */ + .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff), /* Telit LN920 (rmnet) */ + .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff), /* Telit LN920 (MBIM) */ + .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1062, 0xff), /* Telit LN920 (RNDIS) */ + .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff), /* Telit LN920 (ECM) */ + .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1070, 0xff), /* Telit FN990 (rmnet) */ + .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1071, 0xff), /* Telit FN990 (MBIM) */ + .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1072, 0xff), /* Telit FN990 (RNDIS) */ + .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff), /* Telit FN990 (ECM) */ + .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), @@ -1246,6 +1248,8 @@ .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1203, 0xff), /* Telit LE910Cx (RNDIS) */ .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1204, 0xff), /* Telit LE910Cx (MBIM) */ + .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), @@ -1272,7 +1276,19 @@ .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1901, 0xff), /* Telit LN940 (MBIM) */ .driver_info = NCTRL(0) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7010, 0xff), /* Telit LE910-S1 (RNDIS) */ + .driver_info = NCTRL(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7011, 0xff), /* Telit LE910-S1 (ECM) */ + .driver_info = NCTRL(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701a, 0xff), /* Telit LE910R1 (RNDIS) */ + .driver_info = NCTRL(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701b, 0xff), /* Telit LE910R1 (ECM) */ + .driver_info = NCTRL(2) }, { USB_DEVICE(TELIT_VENDOR_ID, 0x9010), /* Telit SBL FN980 flashing device */ + .driver_info = NCTRL(0) | ZLP }, + { USB_DEVICE(TELIT_VENDOR_ID, 0x9200), /* Telit LE910S1 flashing device */ + .driver_info = NCTRL(0) | ZLP }, + { USB_DEVICE(TELIT_VENDOR_ID, 0x9201), /* Telit LE910R1 flashing device */ .driver_info = NCTRL(0) | ZLP }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), @@ -1601,7 +1617,8 @@ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1272, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1273, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1274, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1275, 0xff, 0xff, 0xff) }, + { USB_DEVICE(ZTE_VENDOR_ID, 0x1275), /* ZTE P685M */ + .driver_info = RSVD(3) | RSVD(4) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1276, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1277, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1278, 0xff, 0xff, 0xff) }, @@ -1645,6 +1662,8 @@ .driver_info = RSVD(2) }, { USB_DEVICE_INTERFACE_CLASS(ZTE_VENDOR_ID, 0x1476, 0xff) }, /* GosunCn ZTE WeLink ME3630 (ECM/NCM mode) */ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1481, 0xff, 0x00, 0x00) }, /* ZTE MF871A */ + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1485, 0xff, 0xff, 0xff), /* ZTE MF286D */ + .driver_info = RSVD(5) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) }, @@ -1672,7 +1691,6 @@ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff), .driver_info = RSVD(1) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff), @@ -1948,6 +1966,10 @@ { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDMNET) }, { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, /* HC28 enumerates with Siemens or Cinterion VID depending on FW revision */ { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, + { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV31_MBIM, 0xff), + .driver_info = RSVD(3)}, + { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV31_RMNET, 0xff), + .driver_info = RSVD(0)}, { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100), .driver_info = RSVD(4) }, { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD120), @@ -2086,13 +2108,20 @@ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, { USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, + { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */ + .driver_info = RSVD(3) }, { USB_DEVICE(0x1508, 0x1001), /* Fibocom NL668 (IOT version) */ .driver_info = RSVD(4) | RSVD(5) | RSVD(6) }, { USB_DEVICE(0x2cb7, 0x0104), /* Fibocom NL678 series */ .driver_info = RSVD(4) | RSVD(5) }, { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff), /* Fibocom NL678 series */ .driver_info = RSVD(6) }, + { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff), /* Fibocom FM101-GL (laptop MBIM) */ + .driver_info = RSVD(4) }, { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */ @@ -2131,9 +2160,6 @@ #ifdef CONFIG_PM .suspend = usb_wwan_suspend, .resume = usb_wwan_resume, -#if 1 //Added by Quectel - .reset_resume = usb_wwan_resume, -#endif #endif }; @@ -2157,101 +2183,6 @@ struct usb_interface_descriptor *iface_desc = &serial->interface->cur_altsetting->desc; unsigned long device_flags = id->driver_info; - -#if 1 - /*ZTE ME3860 ME3760_V2 ME3620*/ - printk("idVendor=%x, idProduct=%x, bInterfaceNumber =%d\r\n", - serial->dev->descriptor.idVendor, - serial->dev->descriptor.idProduct, - serial->interface->cur_altsetting->desc. bInterfaceNumber); - - if (serial->dev->descriptor.idVendor == 0x19d2 && - serial->dev->descriptor.idProduct == 0x1476 && - serial->interface->cur_altsetting->desc. bInterfaceNumber == 3) - return -ENODEV; - if (serial->dev->descriptor.idVendor == 0x19d2 && - serial->dev->descriptor.idProduct == 0x1476 && - serial->interface->cur_altsetting->desc. bInterfaceNumber == 4) - return -ENODEV; - if (serial->dev->descriptor.idVendor == 0x19d2 && - serial->dev->descriptor.idProduct == 0x0199 && - serial->interface->cur_altsetting->desc. bInterfaceNumber == 0) - return -ENODEV; - if (serial->dev->descriptor.idVendor == 0x19d2 && - serial->dev->descriptor.idProduct == 0x0199 && - serial->interface->cur_altsetting->desc. bInterfaceNumber == 1) - return -ENODEV; -#endif - -#if 1 //Added by FG650 - if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2cb7) && - serial->dev->descriptor.idProduct == cpu_to_le16(0x0a04) && - serial->interface->cur_altsetting->desc.bInterfaceNumber <= 1) { - printk("Discover the 4th interface for fibocom\n"); - return -ENODEV; - } - - if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2cb7) && - serial->dev->descriptor.idProduct == cpu_to_le16(0x0a05) && - serial->interface->cur_altsetting->desc.bInterfaceNumber <= 1) { - printk("Discover the 4th interface for fibocom\n"); - return -ENODEV; - } - - if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2cb7) && - serial->dev->descriptor.idProduct == cpu_to_le16(0x0a06) && - serial->interface->cur_altsetting->desc.bInterfaceNumber <= 1) { - printk("Discover the 4th interface for fibocom\n"); - return -ENODEV; - } -#endif - - - -if (serial->dev->descriptor.idVendor == 0x19d2 && - serial->dev->descriptor.idProduct == 0x1476 && - serial->interface->cur_altsetting->desc. bInterfaceNumber == 3) - return -ENODEV; - -if (serial->dev->descriptor.idVendor == 0x19d2 && - serial->dev->descriptor.idProduct == 0x1476 && - serial->interface->cur_altsetting->desc. bInterfaceNumber == 4) - return -ENODEV; - -if (serial->dev->descriptor.idVendor == 0x19d2 && - serial->dev->descriptor.idProduct == 0x1509 && - serial->interface->cur_altsetting->desc. bInterfaceNumber == 4) - return -ENODEV; - -if (serial->dev->descriptor.idVendor == 0x19d2 && - serial->dev->descriptor.idProduct == 0x1509 && - serial->interface->cur_altsetting->desc. bInterfaceNumber == 5) - return -ENODEV; - - -#if 1 //Added by Quectel - //Quectel UC20's interface 4 can be used as USB Network device - if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9003) - && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) - return -ENODEV; - - //Quectel EC20(MDM9215)'s interface 4 can be used as USB Network device - if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9215) - && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) - return -ENODEV; - - if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) { - __u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct); - - //Quectel module's some interfaces can be used as USB Network device (ecm, rndis, mbim) - if (serial->interface->cur_altsetting->desc.bInterfaceClass != 0xFF) - return -ENODEV; - - //Quectel EC25&EC20's interface 4 can be used as USB network device (qmi) - if ((idProduct != 0x6026 && idProduct != 0x6120) && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) - return -ENODEV; - } -#endif /* Never bind to the CD-Rom emulation interface */ if (iface_desc->bInterfaceClass == USB_CLASS_MASS_STORAGE) diff --git a/kernel/drivers/usb/typec/tcpm/tcpm.c b/kernel/drivers/usb/typec/tcpm/tcpm.c index af0660d..deac55e 100644 --- a/kernel/drivers/usb/typec/tcpm/tcpm.c +++ b/kernel/drivers/usb/typec/tcpm/tcpm.c @@ -4383,7 +4383,7 @@ break; case PORT_RESET: tcpm_reset_port(port); - tcpm_set_cc(port, TYPEC_CC_OPEN); + tcpm_set_cc(port, TYPEC_CC_RD); tcpm_set_state(port, PORT_RESET_WAIT_OFF, PD_T_ERROR_RECOVERY); break; diff --git a/kernel/drivers/video/rockchip/mpp/mpp_common.c b/kernel/drivers/video/rockchip/mpp/mpp_common.c index 728704a..3b3d02a 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_common.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_common.c @@ -36,7 +36,6 @@ #include "mpp_common.h" #include "mpp_iommu.h" -#define MPP_WORK_TIMEOUT_DELAY (200) #define MPP_WAIT_TIMEOUT_DELAY (2000) /* Use 'v' as magic number */ @@ -231,20 +230,9 @@ return 0; } -static int mpp_session_clear(struct mpp_dev *mpp, - struct mpp_session *session) +static int mpp_session_clear_pending(struct mpp_session *session) { struct mpp_task *task = NULL, *n; - - /* clear session done list */ - mutex_lock(&session->done_lock); - list_for_each_entry_safe(task, n, - &session->done_list, - done_link) { - list_del_init(&task->done_link); - kref_put(&task->ref, mpp_free_task); - } - mutex_unlock(&session->done_lock); /* clear session pending list */ mutex_lock(&session->pending_lock); @@ -261,6 +249,49 @@ return 0; } +void mpp_session_cleanup_detach(struct mpp_taskqueue *queue, struct kthread_work *work) +{ + struct mpp_session *session, *n; + + if (!atomic_read(&queue->detach_count)) + return; + + mutex_lock(&queue->session_lock); + list_for_each_entry_safe(session, n, &queue->session_detach, session_link) { + s32 task_count = atomic_read(&session->task_count); + + if (!task_count) { + list_del_init(&session->session_link); + atomic_dec(&queue->detach_count); + } + + mutex_unlock(&queue->session_lock); + + if (task_count) { + mpp_dbg_session("session %d:%d task not finished %d\n", + session->pid, session->index, + atomic_read(&queue->detach_count)); + + mpp_session_clear_pending(session); + } else { + mpp_dbg_session("queue detach %d\n", + atomic_read(&queue->detach_count)); + + mpp_session_deinit(session); + } + + mutex_lock(&queue->session_lock); + } + mutex_unlock(&queue->session_lock); + + if (atomic_read(&queue->detach_count)) { + mpp_dbg_session("queue detach %d again\n", + atomic_read(&queue->detach_count)); + + kthread_queue_work(&queue->worker, work); + } +} + static struct mpp_session *mpp_session_init(void) { struct mpp_session *session = kzalloc(sizeof(*session), GFP_KERNEL); @@ -271,13 +302,10 @@ session->pid = current->pid; mutex_init(&session->pending_lock); - mutex_init(&session->done_lock); INIT_LIST_HEAD(&session->pending_list); - INIT_LIST_HEAD(&session->done_list); INIT_LIST_HEAD(&session->service_link); INIT_LIST_HEAD(&session->session_link); - init_waitqueue_head(&session->wait); atomic_set(&session->task_count, 0); atomic_set(&session->release_request, 0); @@ -293,7 +321,7 @@ if (mpp->dev_ops->free_session) mpp->dev_ops->free_session(session); - mpp_session_clear(mpp, session); + mpp_session_clear_pending(session); if (session->dma) { mpp_iommu_down_read(mpp->iommu_info); @@ -314,14 +342,10 @@ list_del_init(&session->session_link); } -int mpp_session_deinit(struct mpp_session *session) +void mpp_session_deinit(struct mpp_session *session) { - u32 task_count = atomic_read(&session->task_count); - - mpp_dbg_session("session %p:%d task %d release\n", - session, session->index, task_count); - if (task_count) - return -1; + mpp_dbg_session("session %d:%d task %d deinit\n", session->pid, + session->index, atomic_read(&session->task_count)); if (likely(session->deinit)) session->deinit(session); @@ -331,13 +355,12 @@ mpp_dbg_session("session %p:%d deinit\n", session, session->index); kfree(session); - return 0; } static void mpp_session_attach_workqueue(struct mpp_session *session, struct mpp_taskqueue *queue) { - mpp_dbg_session("session %p:%d attach\n", session, session->index); + mpp_dbg_session("session %d:%d attach\n", session->pid, session->index); mutex_lock(&queue->session_lock); list_add_tail(&session->session_link, &queue->session_attach); mutex_unlock(&queue->session_lock); @@ -351,14 +374,14 @@ if (!session->mpp || !session->mpp->queue) return; - mpp_dbg_session("session %p:%d detach\n", session, session->index); + mpp_dbg_session("session %d:%d detach\n", session->pid, session->index); mpp = session->mpp; queue = mpp->queue; mutex_lock(&queue->session_lock); list_del_init(&session->session_link); list_add_tail(&session->session_link, &queue->session_detach); - queue->detach_count++; + atomic_inc(&queue->detach_count); mutex_unlock(&queue->session_lock); mpp_taskqueue_trigger_work(mpp); @@ -370,6 +393,10 @@ { kref_get(&task->ref); mutex_lock(&session->pending_lock); + if (session->srv->timing_en) { + task->on_pending = ktime_get(); + set_bit(TASK_TIMING_PENDING, &task->state); + } list_add_tail(&task->pending_link, &session->pending_list); mutex_unlock(&session->pending_lock); @@ -402,29 +429,6 @@ return task; } -static int mpp_session_push_done(struct mpp_session *session, - struct mpp_task *task) -{ - kref_get(&task->ref); - mutex_lock(&session->done_lock); - list_add_tail(&task->done_link, &session->done_list); - mutex_unlock(&session->done_lock); - - return 0; -} - -static int mpp_session_pop_done(struct mpp_session *session, - struct mpp_task *task) -{ - mutex_lock(&session->done_lock); - list_del_init(&task->done_link); - mutex_unlock(&session->done_lock); - set_bit(TASK_STATE_DONE, &task->state); - kref_put(&task->ref, mpp_free_task); - - return 0; -} - static void mpp_free_task(struct kref *ref) { struct mpp_dev *mpp; @@ -438,9 +442,9 @@ session = task->session; mpp_debug_func(DEBUG_TASK_INFO, - "session=%p, task=%p, state=0x%lx, abort_request=%d\n", - session, task, task->state, - atomic_read(&task->abort_request)); + "session %d:%d task %d state 0x%lx abort_request %d\n", + session->device_type, session->index, task->task_index, + task->state, atomic_read(&task->abort_request)); if (!session->mpp) { mpp_err("session %p, session->mpp is null.\n", session); return; @@ -469,19 +473,21 @@ return; } - mpp_err("task %p processing time out!\n", task); if (!task->session) { mpp_err("task %p, task->session is null.\n", task); return; } + session = task->session; if (!session->mpp) { - mpp_err("session %p, session->mpp is null.\n", session); + mpp_err("session %d:%d, session mpp is null.\n", session->pid, + session->index); return; } mpp = session->mpp; - + dev_err(mpp->dev, "session %d:%d task %d state %lx processing time out!\n", + session->device_type, session->index, task->task_index, task->state); synchronize_hardirq(mpp->irq); if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) { @@ -489,18 +495,32 @@ return; } + mpp_task_dump_timing(task, ktime_us_delta(ktime_get(), task->on_create)); + + /* disable core irq */ + disable_irq(mpp->irq); + /* disable mmu irq */ + mpp_iommu_disable_irq(mpp->iommu_info); + /* hardware maybe dead, reset it */ mpp_reset_up_read(mpp->reset_group); mpp_dev_reset(mpp); mpp_power_off(mpp); - mpp_session_push_done(session, task); + set_bit(TASK_STATE_TIMEOUT, &task->state); + set_bit(TASK_STATE_DONE, &task->state); /* Wake up the GET thread */ - wake_up(&session->wait); + wake_up(&task->wait); /* remove task from taskqueue running list */ - set_bit(TASK_STATE_TIMEOUT, &task->state); mpp_taskqueue_pop_running(mpp->queue, task); + + /* enable core irq */ + enable_irq(mpp->irq); + /* enable mmu irq */ + mpp_iommu_enable_irq(mpp->iommu_info); + + mpp_taskqueue_trigger_work(mpp); } static int mpp_process_task_default(struct mpp_session *session, @@ -508,6 +528,8 @@ { struct mpp_task *task = NULL; struct mpp_dev *mpp = session->mpp; + u32 timing_en; + ktime_t on_create; if (unlikely(!mpp)) { mpp_err("pid %d clinet %d found invalid process function\n", @@ -515,13 +537,26 @@ return -EINVAL; } + timing_en = session->srv->timing_en; + if (timing_en) + on_create = ktime_get(); + if (mpp->dev_ops->alloc_task) task = mpp->dev_ops->alloc_task(session, msgs); if (!task) { mpp_err("alloc_task failed.\n"); return -ENOMEM; } + + if (timing_en) { + task->on_create_end = ktime_get(); + task->on_create = on_create; + set_bit(TASK_TIMING_CREATE_END, &task->state); + set_bit(TASK_TIMING_CREATE, &task->state); + } + kref_init(&task->ref); + init_waitqueue_head(&task->wait); atomic_set(&task->abort_request, 0); task->task_index = atomic_fetch_inc(&mpp->task_index); INIT_DELAYED_WORK(&task->timeout_work, mpp_task_timeout_work); @@ -544,7 +579,10 @@ /* trigger current queue to run task */ mpp_taskqueue_trigger_work(mpp); kref_put(&task->ref, mpp_free_task); - + mpp_debug_func(DEBUG_TASK_INFO, + "session %d:%d task %d state 0x%lx\n", + session->device_type, session->index, + task->task_index, task->state); return 0; } @@ -599,10 +637,6 @@ group->resets[type] = rst; group->queue = mpp->queue; } - /* if reset not in the same queue, it means different device - * may reset in the same time, then rw_sem_on should set true. - */ - group->rw_sem_on |= (group->queue != mpp->queue) ? true : false; dev_info(mpp->dev, "reset_group->rw_sem_on=%d\n", group->rw_sem_on); up_write(&group->rw_sem); @@ -647,12 +681,49 @@ return 0; } +void mpp_task_run_begin(struct mpp_task *task, u32 timing_en, u32 timeout) +{ + preempt_disable(); + + set_bit(TASK_STATE_START, &task->state); + + mpp_time_record(task); + schedule_delayed_work(&task->timeout_work, msecs_to_jiffies(timeout)); + + if (timing_en) { + task->on_sched_timeout = ktime_get(); + set_bit(TASK_TIMING_TO_SCHED, &task->state); + } +} + +void mpp_task_run_end(struct mpp_task *task, u32 timing_en) +{ + if (timing_en) { + task->on_run_end = ktime_get(); + set_bit(TASK_TIMING_RUN_END, &task->state); + } + +#ifdef MODULE + preempt_enable(); +#else + preempt_enable_no_resched(); +#endif +} + static int mpp_task_run(struct mpp_dev *mpp, struct mpp_task *task) { int ret; + struct mpp_session *session = task->session; + u32 timing_en; mpp_debug_enter(); + + timing_en = mpp->srv->timing_en; + if (timing_en) { + task->on_run = ktime_get(); + set_bit(TASK_TIMING_RUN, &task->state); + } /* * before running, we have to switch grf ctrl bit to ensure @@ -679,8 +750,10 @@ mpp_power_on(mpp); mpp_time_record(task); - mpp_debug(DEBUG_TASK_INFO, "pid %d, start hw %s\n", - task->session->pid, dev_name(mpp->dev)); + mpp_debug_func(DEBUG_TASK_INFO, + "%s session %d:%d task=%d state=0x%lx\n", + dev_name(mpp->dev), session->device_type, + session->index, task->task_index, task->state); if (mpp->auto_freq_en && mpp->hw_ops->set_freq) mpp->hw_ops->set_freq(mpp, task); @@ -690,8 +763,6 @@ */ mpp_reset_down_read(mpp->reset_group); - schedule_delayed_work(&task->timeout_work, - msecs_to_jiffies(MPP_WORK_TIMEOUT_DELAY)); if (mpp->dev_ops->run) mpp->dev_ops->run(mpp, task); set_bit(TASK_STATE_START, &task->state); @@ -709,6 +780,7 @@ mpp_debug_enter(); +get_task: task = mpp_taskqueue_get_pending_task(queue); if (!task) goto done; @@ -716,7 +788,7 @@ /* if task timeout and aborted, remove it */ if (atomic_read(&task->abort_request) > 0) { mpp_taskqueue_pop_pending(queue, task); - goto done; + goto get_task; } /* get device for current task */ @@ -748,28 +820,7 @@ } done: - mutex_lock(&queue->session_lock); - while (queue->detach_count) { - struct mpp_session *session = NULL; - - session = list_first_entry_or_null(&queue->session_detach, struct mpp_session, - session_link); - if (session) { - list_del_init(&session->session_link); - queue->detach_count--; - } - - mutex_unlock(&queue->session_lock); - - if (session) { - mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev), - queue->detach_count); - mpp_session_deinit(session); - } - - mutex_lock(&queue->session_lock); - } - mutex_unlock(&queue->session_lock); + mpp_session_cleanup_detach(queue, work_s); } static int mpp_wait_result_default(struct mpp_session *session, @@ -785,62 +836,32 @@ return -EINVAL; } - ret = wait_event_timeout(session->wait, - !list_empty(&session->done_list), - msecs_to_jiffies(MPP_WAIT_TIMEOUT_DELAY)); - task = mpp_session_get_pending_task(session); if (!task) { - mpp_err("session %p pending list is empty!\n", session); + mpp_err("session %d:%d pending list is empty!\n", + session->pid, session->index); return -EIO; } + ret = wait_event_timeout(task->wait, + test_bit(TASK_STATE_DONE, &task->state), + msecs_to_jiffies(MPP_WAIT_TIMEOUT_DELAY)); if (ret > 0) { - u32 task_found = 0; - struct mpp_task *loop = NULL, *n; - - /* find task in session done list */ - mutex_lock(&session->done_lock); - list_for_each_entry_safe(loop, n, - &session->done_list, - done_link) { - if (loop == task) { - task_found = 1; - break; - } - } - mutex_unlock(&session->done_lock); - if (task_found) { - if (mpp->dev_ops->result) - ret = mpp->dev_ops->result(mpp, task, msgs); - mpp_session_pop_done(session, task); - - if (test_bit(TASK_STATE_TIMEOUT, &task->state)) - ret = -ETIMEDOUT; - } else { - mpp_err("session %p task %p, not found in done list!\n", - session, task); - ret = -EIO; - } + if (mpp->dev_ops->result) + ret = mpp->dev_ops->result(mpp, task, msgs); } else { atomic_inc(&task->abort_request); - mpp_err("timeout, pid %d session %p:%d count %d cur_task %p index %d.\n", - session->pid, session, session->index, - atomic_read(&session->task_count), task, - task->task_index); - /* if twice and return timeout, otherwise, re-wait */ - if (atomic_read(&task->abort_request) > 1) { - mpp_err("session %p:%d, task %p index %d abort wait twice!\n", - session, session->index, - task, task->task_index); - ret = -ETIMEDOUT; - } else { - return mpp_wait_result_default(session, msgs); - } + set_bit(TASK_STATE_ABORT, &task->state); + mpp_err("timeout, pid %d session %d:%d count %d cur_task %d state %lx\n", + session->pid, session->device_type, session->index, + atomic_read(&session->task_count), task->task_index, task->state); } mpp_debug_func(DEBUG_TASK_INFO, - "kref_read=%d, ret=%d\n", kref_read(&task->ref), ret); + "session %d:%d task %d state 0x%lx kref_read %d ret %d\n", + session->device_type, + session->index, task->task_index, task->state, + kref_read(&task->ref), ret); mpp_session_pop_pending(session, task); return ret; @@ -919,6 +940,10 @@ goto err_put_pdev; } else { mpp->reset_group = mpp->srv->reset_groups[reset_group_node]; + if (!mpp->reset_group->queue) + mpp->reset_group->queue = queue; + if (mpp->reset_group->queue != mpp->queue) + mpp->reset_group->rw_sem_on = true; } } @@ -951,6 +976,10 @@ /* default taskqueue has max 16 task capacity */ queue->task_capacity = MPP_MAX_TASK_CAPACITY; + + mutex_init(&queue->ref_lock); + atomic_set(&queue->runtime_cnt, 0); + atomic_set(&queue->detach_count, 0); return queue; } @@ -1197,7 +1226,7 @@ if (!mpp) return -EINVAL; - mpp_session_clear(mpp, session); + mpp_session_clear_pending(session); mpp_iommu_down_write(mpp->iommu_info); ret = mpp_dma_session_destroy(session->dma); mpp_iommu_up_write(mpp->iommu_info); @@ -1410,7 +1439,7 @@ /* wait for task all done */ atomic_inc(&session->release_request); - if (session->mpp) + if (session->mpp || atomic_read(&session->task_count)) mpp_session_detach_workqueue(session); else mpp_session_deinit(session); @@ -1421,24 +1450,9 @@ return 0; } -static unsigned int -mpp_dev_poll(struct file *filp, poll_table *wait) -{ - unsigned int mask = 0; - struct mpp_session *session = - (struct mpp_session *)filp->private_data; - - poll_wait(filp, &session->wait, wait); - if (!list_empty(&session->done_list)) - mask |= POLLIN | POLLRDNORM; - - return mask; -} - const struct file_operations rockchip_mpp_fops = { .open = mpp_dev_open, .release = mpp_dev_release, - .poll = mpp_dev_poll, .unlocked_ioctl = mpp_dev_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = mpp_dev_ioctl, @@ -1673,12 +1687,23 @@ mpp_dev_reset(mpp); mpp_power_off(mpp); - if (!atomic_read(&task->abort_request)) { - mpp_session_push_done(session, task); - /* Wake up the GET thread */ - wake_up(&session->wait); - } set_bit(TASK_STATE_FINISH, &task->state); + set_bit(TASK_STATE_DONE, &task->state); + + if (session->srv->timing_en) { + s64 time_diff; + + task->on_finish = ktime_get(); + set_bit(TASK_TIMING_FINISH, &task->state); + + time_diff = ktime_us_delta(task->on_finish, task->on_create); + + if (mpp->timing_check && time_diff > (s64)mpp->timing_check) + mpp_task_dump_timing(task, time_diff); + } + + /* Wake up the GET thread */ + wake_up(&task->wait); mpp_taskqueue_pop_running(mpp->queue, task); return 0; @@ -1780,9 +1805,9 @@ unsigned long iova, int status, void *arg) { - struct mpp_taskqueue *queue = (struct mpp_taskqueue *)arg; + struct mpp_dev *mpp = (struct mpp_dev *)arg; + struct mpp_taskqueue *queue = mpp->queue; struct mpp_task *task = mpp_taskqueue_get_running_task(queue); - struct mpp_dev *mpp; /* * NOTE: In link mode, this task may not be the task of the current @@ -1798,7 +1823,7 @@ mpp_task_dump_hw_reg(mpp, task); if (mpp->iommu_info->hdl) - mpp->iommu_info->hdl(iommu, iommu_dev, iova, status, arg); + mpp->iommu_info->hdl(iommu, iommu_dev, iova, status, mpp); return 0; } @@ -1815,6 +1840,8 @@ /* Get disable auto frequent flag from dtsi */ mpp->auto_freq_en = !device_property_read_bool(dev, "rockchip,disable-auto-freq"); + /* read flag for pum idle request */ + mpp->skip_idle = device_property_read_bool(dev, "rockchip,skip-pmu-idle-request"); /* Get and attach to service */ ret = mpp_attach_service(mpp, dev); @@ -1897,7 +1924,7 @@ /* set iommu fault handler */ if (!IS_ERR(mpp->iommu_info)) iommu_set_fault_handler(mpp->iommu_info->domain, - mpp_iommu_handle, mpp->queue); + mpp_iommu_handle, mpp); /* read hardware id */ if (hw_info->reg_id >= 0) { @@ -1951,6 +1978,12 @@ struct mpp_dev *mpp = param; struct mpp_task *task = mpp->cur_task; irqreturn_t irq_ret = IRQ_NONE; + u32 timing_en = mpp->srv->timing_en; + + if (task && timing_en) { + task->on_irq = ktime_get(); + set_bit(TASK_TIMING_IRQ, &task->state); + } if (mpp->dev_ops->irq) irq_ret = mpp->dev_ops->irq(mpp); @@ -1965,6 +1998,10 @@ mpp->irq_status); irq_ret = IRQ_HANDLED; goto done; + } + if (timing_en) { + task->on_cancel_timeout = ktime_get(); + set_bit(TASK_TIMING_TO_CANCEL, &task->state); } cancel_delayed_work(&task->timeout_work); /* normal condition, set state and wake up isr thread */ @@ -1981,6 +2018,12 @@ { irqreturn_t ret = IRQ_NONE; struct mpp_dev *mpp = param; + struct mpp_task *task = mpp->cur_task; + + if (task && mpp->srv->timing_en) { + task->on_isr = ktime_get(); + set_bit(TASK_TIMING_ISR, &task->state); + } if (mpp->auto_freq_en && mpp->hw_ops->reduce_freq && @@ -2030,24 +2073,88 @@ int mpp_time_record(struct mpp_task *task) { - if (mpp_debug_unlikely(DEBUG_TIMING) && task) - do_gettimeofday(&task->start); + if (mpp_debug_unlikely(DEBUG_TIMING) && task) { + task->start = ktime_get(); + task->part = task->start; + } + + return 0; +} + +int mpp_time_part_diff(struct mpp_task *task) +{ + ktime_t end; + struct mpp_dev *mpp = task->session->mpp; + + end = ktime_get(); + mpp_debug(DEBUG_PART_TIMING, "%s: session %d:%d part time: %lld us\n", + dev_name(mpp->dev), task->session->pid, task->session->index, + ktime_us_delta(end, task->part)); + task->part = end; return 0; } int mpp_time_diff(struct mpp_task *task) { - struct timeval end; + ktime_t end; struct mpp_dev *mpp = task->session->mpp; - do_gettimeofday(&end); - mpp_debug(DEBUG_TIMING, "%s: pid: %d, session: %p, time: %ld us\n", - dev_name(mpp->dev), task->session->pid, task->session, - (end.tv_sec - task->start.tv_sec) * 1000000 + - (end.tv_usec - task->start.tv_usec)); + end = ktime_get(); + mpp_debug(DEBUG_TIMING, "%s: session %d:%d task time: %lld us\n", + dev_name(mpp->dev), task->session->pid, task->session->index, + ktime_us_delta(end, task->start)); return 0; +} + +int mpp_time_diff_with_hw_time(struct mpp_task *task, u32 clk_hz) +{ + if (mpp_debug_unlikely(DEBUG_TIMING)) { + ktime_t end; + struct mpp_dev *mpp = task->session->mpp; + + end = ktime_get(); + + if (clk_hz) + mpp_debug(DEBUG_TIMING, "%s: session %d time: %lld us hw %d us\n", + dev_name(mpp->dev), task->session->index, + ktime_us_delta(end, task->start), + task->hw_cycles / (clk_hz / 1000000)); + else + mpp_debug(DEBUG_TIMING, "%s: session %d time: %lld us\n", + dev_name(mpp->dev), task->session->index, + ktime_us_delta(end, task->start)); + } + + return 0; +} + +#define LOG_TIMING(state, id, stage, time, base) \ + do { \ + if (test_bit(id, &state)) \ + pr_info("timing: %-14s : %lld us\n", stage, ktime_us_delta(time, base)); \ + else \ + pr_info("timing: %-14s : invalid\n", stage); \ + } while (0) + +void mpp_task_dump_timing(struct mpp_task *task, s64 time_diff) +{ + ktime_t s = task->on_create; + unsigned long state = task->state; + + pr_info("task %d dump timing at %lld us:", task->task_index, time_diff); + + pr_info("timing: %-14s : %lld us\n", "create", ktime_to_us(s)); + LOG_TIMING(state, TASK_TIMING_CREATE_END, "create end", task->on_create_end, s); + LOG_TIMING(state, TASK_TIMING_PENDING, "pending", task->on_pending, s); + LOG_TIMING(state, TASK_TIMING_RUN, "run", task->on_run, s); + LOG_TIMING(state, TASK_TIMING_TO_SCHED, "timeout start", task->on_sched_timeout, s); + LOG_TIMING(state, TASK_TIMING_RUN_END, "run end", task->on_run_end, s); + LOG_TIMING(state, TASK_TIMING_IRQ, "irq", task->on_irq, s); + LOG_TIMING(state, TASK_TIMING_TO_CANCEL, "timeout cancel", task->on_cancel_timeout, s); + LOG_TIMING(state, TASK_TIMING_ISR, "isr", task->on_isr, s); + LOG_TIMING(state, TASK_TIMING_FINISH, "finish", task->on_finish, s); } int mpp_write_req(struct mpp_dev *mpp, u32 *regs, @@ -2184,6 +2291,7 @@ if (clk_rate_hz) { clk_info->used_rate_hz = clk_rate_hz; clk_set_rate(clk_info->clk, clk_rate_hz); + clk_info->real_rate_hz = clk_get_rate(clk_info->clk); } return 0; @@ -2230,4 +2338,9 @@ { return proc_create_data(name, mode, parent, &procfs_fops_u32, data); } + +void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp) +{ + mpp_procfs_create_u32("timing_check", 0644, parent, &mpp->timing_check); +} #endif diff --git a/kernel/drivers/video/rockchip/mpp/mpp_common.h b/kernel/drivers/video/rockchip/mpp/mpp_common.h index bf39983..04bb908 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_common.h +++ b/kernel/drivers/video/rockchip/mpp/mpp_common.h @@ -22,8 +22,10 @@ #include <linux/reset.h> #include <linux/irqreturn.h> #include <linux/poll.h> +#include <soc/rockchip/pm_domains.h> -#define MHZ (1000 * 1000) +#define MHZ (1000 * 1000) +#define MPP_WORK_TIMEOUT_DELAY (500) #define MPP_MAX_MSG_NUM (16) #define MPP_MAX_REG_TRANS_NUM (60) @@ -116,6 +118,7 @@ MPP_CMD_TRANS_FD_TO_IOVA = MPP_CMD_CONTROL_BASE + 1, MPP_CMD_RELEASE_FD = MPP_CMD_CONTROL_BASE + 2, MPP_CMD_SEND_CODEC_INFO = MPP_CMD_CONTROL_BASE + 3, + MPP_CMD_SET_ERR_REF_HACK = MPP_CMD_CONTROL_BASE + 4, MPP_CMD_CONTROL_BUTT, MPP_CMD_BUTT, @@ -199,6 +202,12 @@ struct mpp_grf_info { u32 offset; u32 val; + + /* close mem when module is not working*/ + u32 mem_offset; + u32 val_mem_on; + u32 val_mem_off; + struct regmap *grf; }; @@ -255,6 +264,7 @@ u32 reduce_rate_hz; /* record last used rate */ u32 used_rate_hz; + u32 real_rate_hz; }; struct mpp_dev_var { @@ -293,6 +303,8 @@ struct kthread_work work; /* the flag for get/get/reduce freq */ bool auto_freq_en; + /* the flag for pmu idle request before device reset */ + bool skip_idle; /* * The task capacity is the task queue length that hardware can accept. @@ -322,6 +334,9 @@ struct mpp_service *srv; struct list_head queue_link; + + /* common per-device procfs */ + u32 timing_check; }; struct mpp_task; @@ -338,13 +353,7 @@ struct mutex pending_lock; /* task pending list in session */ struct list_head pending_list; - /* lock for session task done list */ - struct mutex done_lock; - /* task done list in session */ - struct list_head done_list; - /* event for session wait thread */ - wait_queue_head_t wait; pid_t pid; atomic_t task_count; atomic_t release_request; @@ -387,6 +396,18 @@ TASK_STATE_ABORT = 9, TASK_STATE_ABORT_READY = 10, TASK_STATE_PROC_DONE = 11, + + /* timing debug state */ + TASK_TIMING_CREATE = 16, + TASK_TIMING_CREATE_END = 17, + TASK_TIMING_PENDING = 18, + TASK_TIMING_RUN = 19, + TASK_TIMING_TO_SCHED = 20, + TASK_TIMING_RUN_END = 21, + TASK_TIMING_IRQ = 22, + TASK_TIMING_TO_CANCEL = 23, + TASK_TIMING_ISR = 24, + TASK_TIMING_FINISH = 25, }; /* The context for the a task */ @@ -413,11 +434,29 @@ struct kref ref; /* record context running start time */ - struct timeval start; + ktime_t start; + ktime_t part; + + /* debug timing */ + ktime_t on_create; + ktime_t on_create_end; + ktime_t on_pending; + ktime_t on_run; + ktime_t on_sched_timeout; + ktime_t on_run_end; + ktime_t on_irq; + ktime_t on_cancel_timeout; + ktime_t on_isr; + ktime_t on_finish; + /* hardware info for current task */ struct mpp_hw_info *hw_info; u32 task_index; u32 *reg; + /* hw cycles */ + u32 hw_cycles; + /* event for session wait thread */ + wait_queue_head_t wait; }; struct mpp_taskqueue { @@ -432,7 +471,7 @@ struct list_head session_attach; /* link to session session_link for detached sessions */ struct list_head session_detach; - u32 detach_count; + atomic_t detach_count; /* lock for pending list */ struct mutex pending_lock; @@ -454,6 +493,15 @@ * device task capacity which is attached to the taskqueue */ u32 task_capacity; + + /* + * when we need to set grf_mem config to close mem shared by combo modules, + * use runtime_cnt to make sure every combo module are not working + */ + /* lock for runtime counting */ + struct mutex ref_lock; + atomic_t runtime_cnt; + }; struct mpp_reset_group { @@ -490,6 +538,9 @@ struct mutex session_lock; struct list_head session_list; u32 session_count; + + /* global timing record flag */ + u32 timing_en; }; /* @@ -580,6 +631,8 @@ struct mpp_task *task); int mpp_task_finish(struct mpp_session *session, struct mpp_task *task); +void mpp_task_run_begin(struct mpp_task *task, u32 timing_en, u32 timeout); +void mpp_task_run_end(struct mpp_task *task, u32 timing_en); int mpp_task_finalize(struct mpp_session *session, struct mpp_task *task); int mpp_task_dump_mem_region(struct mpp_dev *mpp, @@ -588,8 +641,12 @@ struct mpp_task *task); int mpp_task_dump_hw_reg(struct mpp_dev *mpp, struct mpp_task *task); +void mpp_task_dump_timing(struct mpp_task *task, s64 time_diff); +void mpp_reg_show(struct mpp_dev *mpp, u32 offset); -int mpp_session_deinit(struct mpp_session *session); +void mpp_session_deinit(struct mpp_session *session); +void mpp_session_cleanup_detach(struct mpp_taskqueue *queue, + struct kthread_work *work); int mpp_dev_probe(struct mpp_dev *mpp, struct platform_device *pdev); @@ -613,6 +670,8 @@ int mpp_time_record(struct mpp_task *task); int mpp_time_diff(struct mpp_task *task); +int mpp_time_diff_with_hw_time(struct mpp_task *task, u32 clk_hz); +int mpp_time_part_diff(struct mpp_task *task); int mpp_write_req(struct mpp_dev *mpp, u32 *regs, u32 start_idx, u32 end_idx, u32 en_idx); @@ -740,10 +799,19 @@ return 0; } +static inline int mpp_pmu_idle_request(struct mpp_dev *mpp, bool idle) +{ + if (mpp->skip_idle) + return 0; + + return rockchip_pmu_idle_request(mpp->dev, idle); +} + #ifdef CONFIG_ROCKCHIP_MPP_PROC_FS struct proc_dir_entry * mpp_procfs_create_u32(const char *name, umode_t mode, struct proc_dir_entry *parent, void *data); +void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp); #else static inline struct proc_dir_entry * mpp_procfs_create_u32(const char *name, umode_t mode, @@ -751,6 +819,9 @@ { return 0; } +void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp) +{ +} #endif #ifdef CONFIG_ROCKCHIP_MPP_PROC_FS diff --git a/kernel/drivers/video/rockchip/mpp/mpp_debug.h b/kernel/drivers/video/rockchip/mpp/mpp_debug.h index 6d49fb7..acd75dd 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_debug.h +++ b/kernel/drivers/video/rockchip/mpp/mpp_debug.h @@ -53,6 +53,9 @@ #define PRINT_FUNCTION 0x80000000 #define PRINT_LINE 0x40000000 +/* reuse old debug bit flag */ +#define DEBUG_PART_TIMING 0x00000080 + extern unsigned int mpp_dev_debug; #define mpp_debug_unlikely(type) \ diff --git a/kernel/drivers/video/rockchip/mpp/mpp_iep2.c b/kernel/drivers/video/rockchip/mpp/mpp_iep2.c index 92ec40e..e8e2183 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_iep2.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_iep2.c @@ -20,6 +20,8 @@ #include <linux/regmap.h> #include <linux/pm_runtime.h> #include <linux/proc_fs.h> +#include <linux/mfd/syscon.h> +#include <linux/rockchip/cpu.h> #include <soc/rockchip/pm_domains.h> #include "rockchip_iep2_regs.h" @@ -389,12 +391,13 @@ | IEP2_REG_DIL_OSD_EN | IEP2_REG_DIL_PD_EN | IEP2_REG_DIL_FF_EN - | IEP2_REG_DIL_MD_PRE_EN | IEP2_REG_DIL_FIELD_ORDER(cfg->dil_field_order) | IEP2_REG_DIL_OUT_MODE(cfg->dil_out_mode) | IEP2_REG_DIL_MODE(cfg->dil_mode); if (cfg->roi_en) reg |= IEP2_REG_DIL_ROI_EN; + if (cfg->md_lambda < 8) + reg |= IEP2_REG_DIL_MD_PRE_EN; mpp_write_relaxed(mpp, IEP2_REG_DIL_CONFIG0, reg); if (cfg->dil_mode != ROCKCHIP_IEP2_DIL_MODE_PD) { @@ -437,6 +440,9 @@ mpp_write_relaxed(mpp, IEP2_REG_SRC_ADDR_NXTUV, bot->cbcr); mpp_write_relaxed(mpp, IEP2_REG_SRC_ADDR_NXTV, bot->cr); } + + reg = IEP2_REG_TIMEOUT_CFG_EN | 0x3ffffff; + mpp_write_relaxed(mpp, IEP2_REG_TIMEOUT_CFG, reg); mpp_write_relaxed(mpp, IEP2_REG_SRC_ADDR_PREY, cfg->src[2].y); mpp_write_relaxed(mpp, IEP2_REG_SRC_ADDR_PREUV, cfg->src[2].cbcr); @@ -580,6 +586,7 @@ struct mpp_task *mpp_task) { struct iep_task *task = NULL; + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -598,12 +605,20 @@ mpp_write_relaxed(mpp, IEP2_REG_INT_EN, IEP2_REG_FRM_DONE_EN | IEP2_REG_OSD_MAX_EN - | IEP2_REG_BUS_ERROR_EN); + | IEP2_REG_BUS_ERROR_EN + | IEP2_REG_TIMEOUT_EN); + + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); /* Last, flush the registers */ wmb(); /* start iep2 */ mpp_write(mpp, IEP2_REG_FRM_START, 1); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -612,6 +627,10 @@ static int iep2_irq(struct mpp_dev *mpp) { + u32 work_mode = mpp_read(mpp, IEP2_REG_WORK_MODE); + + if (work_mode && !(work_mode & IEP2_REG_IEP2_MODE)) + return IRQ_NONE; mpp->irq_status = mpp_read(mpp, IEP2_REG_INT_STS); mpp_write(mpp, IEP2_REG_INT_CLR, 0xffffffff); @@ -640,7 +659,8 @@ mpp_debug(DEBUG_IRQ_STATUS, "irq_status: %08x\n", task->irq_status); - if (IEP2_REG_RO_BUS_ERROR_STS(task->irq_status)) + if (IEP2_REG_RO_BUS_ERROR_STS(task->irq_status) || + IEP2_REG_RO_TIMEOUT_STS(task->irq_status)) atomic_inc(&mpp->reset_request); mpp_task_finish(mpp_task->session, mpp_task); @@ -769,6 +789,10 @@ iep->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(iep->procfs, mpp); + mpp_procfs_create_u32("aclk", 0644, iep->procfs, &iep->aclk_info.debug_rate_hz); mpp_procfs_create_u32("session_buffers", 0644, @@ -870,17 +894,29 @@ { struct iep2_dev *iep = to_iep2_dev(mpp); - if (iep->rst_a && iep->rst_h && iep->rst_s) { - /* Don't skip this or iommu won't work after reset */ - rockchip_pmu_idle_request(mpp->dev, true); - mpp_safe_reset(iep->rst_a); - mpp_safe_reset(iep->rst_h); - mpp_safe_reset(iep->rst_s); - udelay(5); - mpp_safe_unreset(iep->rst_a); - mpp_safe_unreset(iep->rst_h); - mpp_safe_unreset(iep->rst_s); - rockchip_pmu_idle_request(mpp->dev, false); + int ret = 0; + u32 rst_status = 0; + + /* soft rest first */ + mpp_write(mpp, IEP2_REG_IEP_CONFIG0, IEP2_REG_ACLK_SRESET_P); + ret = readl_relaxed_poll_timeout(mpp->reg_base + IEP2_REG_STATUS, + rst_status, + rst_status & IEP2_REG_ARST_FINISH_DONE, + 0, 5); + if (ret) { + mpp_err("soft reset timeout, use cru reset\n"); + if (iep->rst_a && iep->rst_h && iep->rst_s) { + /* Don't skip this or iommu won't work after reset */ + mpp_pmu_idle_request(mpp, true); + mpp_safe_reset(iep->rst_a); + mpp_safe_reset(iep->rst_h); + mpp_safe_reset(iep->rst_s); + udelay(5); + mpp_safe_unreset(iep->rst_a); + mpp_safe_unreset(iep->rst_h); + mpp_safe_unreset(iep->rst_s); + mpp_pmu_idle_request(mpp, false); + } } return 0; @@ -1008,12 +1044,53 @@ dev_err(dev, "wait total running time out\n"); } +static int iep2_runtime_suspend(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + struct mpp_taskqueue *queue = mpp->queue; + + if (cpu_is_rk3528() && info && info->mem_offset) { + mutex_lock(&queue->ref_lock); + if (!atomic_dec_if_positive(&queue->runtime_cnt)) { + regmap_write(info->grf, info->mem_offset, + info->val_mem_off); + } + mutex_unlock(&queue->ref_lock); + } + + return 0; +} + +static int iep2_runtime_resume(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + struct mpp_taskqueue *queue = mpp->queue; + + if (cpu_is_rk3528() && info && info->mem_offset) { + mutex_lock(&queue->ref_lock); + regmap_write(info->grf, info->mem_offset, + info->val_mem_on); + atomic_inc(&queue->runtime_cnt); + mutex_unlock(&queue->ref_lock); + } + + return 0; +} + +static const struct dev_pm_ops iep2_pm_ops = { + .runtime_suspend = iep2_runtime_suspend, + .runtime_resume = iep2_runtime_resume, +}; + struct platform_driver rockchip_iep2_driver = { .probe = iep2_probe, .remove = iep2_remove, .shutdown = iep2_shutdown, .driver = { .name = IEP2_DRIVER_NAME, + .pm = &iep2_pm_ops, .of_match_table = of_match_ptr(mpp_iep2_match), }, }; diff --git a/kernel/drivers/video/rockchip/mpp/mpp_iommu.c b/kernel/drivers/video/rockchip/mpp/mpp_iommu.c index d99ff20..504c7934 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_iommu.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_iommu.c @@ -87,7 +87,7 @@ oldest = buffer; } } - if (oldest && kref_read(&oldest->ref) <= 1) + if (oldest && kref_read(&oldest->ref) == 1) kref_put(&oldest->ref, mpp_dma_release_buffer); mutex_unlock(&dma->list_mutex); } @@ -179,7 +179,8 @@ } /* remove the oldest before add buffer */ - mpp_dma_remove_extra_buffer(dma); + if (!IS_ENABLED(CONFIG_DMABUF_CACHE)) + mpp_dma_remove_extra_buffer(dma); /* Check whether in dma session */ buffer = mpp_dma_find_buffer_fd(dma, fd); @@ -233,6 +234,8 @@ buffer->dma = dma; kref_init(&buffer->ref); + if (!IS_ENABLED(CONFIG_DMABUF_CACHE)) + kref_get(&buffer->ref); mutex_lock(&dma->list_mutex); dma->buffer_count++; @@ -437,6 +440,8 @@ info->dev = dev; info->pdev = pdev; init_rwsem(&info->rw_sem); + info->irq = platform_get_irq(pdev, 0); + info->got_irq = (info->irq < 0) ? false : true; return info; diff --git a/kernel/drivers/video/rockchip/mpp/mpp_iommu.h b/kernel/drivers/video/rockchip/mpp/mpp_iommu.h index 9ae1b6b..6410445 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_iommu.h +++ b/kernel/drivers/video/rockchip/mpp/mpp_iommu.h @@ -13,6 +13,7 @@ #include <linux/iommu.h> #include <linux/dma-mapping.h> +#include <linux/interrupt.h> struct mpp_dma_buffer { /* link to dma session buffer list */ @@ -73,6 +74,8 @@ struct iommu_group *group; struct mpp_rk_iommu *iommu; iommu_fault_handler_t hdl; + int irq; + int got_irq; }; struct mpp_dma_session * @@ -137,4 +140,16 @@ return 0; } +static inline void mpp_iommu_enable_irq(struct mpp_iommu_info *info) +{ + if (info && info->got_irq) + enable_irq(info->irq); +} + +static inline void mpp_iommu_disable_irq(struct mpp_iommu_info *info) +{ + if (info && info->got_irq) + disable_irq(info->irq); +} + #endif diff --git a/kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c b/kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c index 3e94cee..c361c66 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c @@ -251,6 +251,7 @@ u32 i; u32 reg_en; struct jpgdec_task *task = to_jpgdec_task(mpp_task); + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -263,12 +264,21 @@ mpp_write_req(mpp, task->reg, s, e, reg_en); } + + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); + /* Flush the register before the start the device */ wmb(); mpp_write(mpp, JPGDEC_REG_INT_EN_BASE, task->reg[reg_en] | JPGDEC_START_EN); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -374,6 +384,10 @@ dec->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(dec->procfs, mpp); + mpp_procfs_create_u32("aclk", 0644, dec->procfs, &dec->aclk_info.debug_rate_hz); mpp_procfs_create_u32("session_buffers", 0644, @@ -510,13 +524,13 @@ mpp_debug(DEBUG_RESET, "reset in\n"); /* Don't skip this or iommu won't work after reset */ - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(dec->rst_a); mpp_safe_reset(dec->rst_h); udelay(5); mpp_safe_unreset(dec->rst_a); mpp_safe_unreset(dec->rst_h); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); mpp_debug(DEBUG_RESET, "reset out\n"); } diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c index 09bea1e..89ec8a9 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c @@ -944,11 +944,11 @@ task = to_rkvdec_task(mpp_task); /* - * HW defeat workaround: VP9 power save optimization cause decoding + * HW defeat workaround: VP9 and H.265 power save optimization cause decoding * corruption, disable optimization here. */ fmt = RKVDEC_GET_FORMAT(task->reg[RKVDEC_REG_SYS_CTRL_INDEX]); - if (fmt == RKVDEC_FMT_VP9D) { + if (fmt == RKVDEC_FMT_VP9D || fmt == RKVDEC_FMT_H265D) { cfg = task->reg[RKVDEC_POWER_CTL_INDEX] | 0xFFFF; task->reg[RKVDEC_POWER_CTL_INDEX] = cfg & (~(1 << 12)); mpp_write_relaxed(mpp, RKVDEC_POWER_CTL_BASE, @@ -1171,6 +1171,10 @@ dec->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(dec->procfs, mpp); + mpp_procfs_create_u32("aclk", 0644, dec->procfs, &dec->aclk_info.debug_rate_hz); mpp_procfs_create_u32("clk_core", 0644, @@ -1629,7 +1633,7 @@ mpp_debug_enter(); if (dec->rst_a && dec->rst_h) { - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(dec->rst_niu_a); mpp_safe_reset(dec->rst_niu_h); mpp_safe_reset(dec->rst_a); @@ -1645,7 +1649,7 @@ mpp_safe_unreset(dec->rst_core); mpp_safe_unreset(dec->rst_cabac); mpp_safe_unreset(dec->rst_hevc_cabac); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); } mpp_debug_leave(); diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c index f6d605d..61364f2 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c @@ -17,8 +17,10 @@ #include <linux/devfreq_cooling.h> #include <soc/rockchip/rockchip_ipa.h> +#include <soc/rockchip/rockchip_dmc.h> #include <soc/rockchip/rockchip_opp_select.h> #include <soc/rockchip/rockchip_system_monitor.h> +#include <soc/rockchip/rockchip_iommu.h> #ifdef CONFIG_PM_DEVFREQ #include "../../../devfreq/governor.h" @@ -304,6 +306,7 @@ static int rkvdec2_run(struct mpp_dev *mpp, struct mpp_task *mpp_task) { struct rkvdec2_task *task = to_rkvdec2_task(mpp_task); + u32 timing_en = mpp->srv->timing_en; u32 reg_en = mpp_task->hw_info->reg_en; /* set cache size */ u32 reg = RKVDEC_CACHE_PERMIT_CACHEABLE_ACCESS | @@ -332,12 +335,20 @@ e = s + req->size / sizeof(u32); mpp_write_req(mpp, task->reg, s, e, reg_en); } + + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; - mpp_time_record(mpp_task); + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); + /* Flush the register before the start the device */ wmb(); mpp_write(mpp, RKVDEC_REG_START_EN_BASE, task->reg[reg_en] | RKVDEC_START_EN); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -381,13 +392,15 @@ u32 err_mask; struct rkvdec2_task *task = NULL; struct mpp_task *mpp_task = mpp->cur_task; + struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); /* FIXME use a spin lock here */ if (!mpp_task) { dev_err(mpp->dev, "no current task\n"); return IRQ_HANDLED; } - mpp_time_diff(mpp_task); + mpp_task->hw_cycles = mpp_read(mpp, RKVDEC_PERF_WORKING_CNT); + mpp_time_diff_with_hw_time(mpp_task, dec->core_clk_info.real_rate_hz); mpp->cur_task = NULL; task = to_rkvdec2_task(mpp_task); task->irq_status = mpp->irq_status; @@ -552,6 +565,16 @@ } } } break; + case MPP_CMD_SET_ERR_REF_HACK: { + struct rkvdec2_dev *dec = to_rkvdec2_dev(session->mpp); + u32 err_ref_hack_en = 0; + + if (copy_from_user(&err_ref_hack_en, req->data, sizeof(u32))) { + mpp_err("copy_from_user failed\n"); + return -EINVAL; + } + dec->err_ref_hack = err_ref_hack_en; + } break; default: { mpp_err("unknown mpp ioctl cmd %x\n", req->cmd); } break; @@ -617,6 +640,10 @@ dec->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(dec->procfs, mpp); + mpp_procfs_create_u32("aclk", 0644, dec->procfs, &dec->aclk_info.debug_rate_hz); mpp_procfs_create_u32("clk_core", 0644, @@ -1067,17 +1094,41 @@ return 0; } +static int rkvdec2_soft_reset(struct mpp_dev *mpp) +{ + int ret = 0; + + /* + * for rk3528 and rk3562 + * use mmu reset instead of rkvdec soft reset + * rkvdec will reset together when rkvdec_mmu force reset + */ + ret = rockchip_iommu_force_reset(mpp->dev); + if (ret) + mpp_err("soft mmu reset fail, ret %d\n", ret); + mpp_write(mpp, RKVDEC_REG_INT_EN, 0); + + return ret; + +} + static int rkvdec2_reset(struct mpp_dev *mpp) { struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); + int ret = 0; mpp_debug_enter(); #ifdef CONFIG_PM_DEVFREQ if (dec->devfreq) mutex_lock(&dec->devfreq->lock); #endif - if (dec->rst_a && dec->rst_h) { - rockchip_pmu_idle_request(mpp->dev, true); + /* safe reset first*/ + ret = rkvdec2_soft_reset(mpp); + + /* cru reset */ + if (ret && dec->rst_a && dec->rst_h) { + mpp_err("soft reset timeout, use cru reset\n"); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(dec->rst_niu_a); mpp_safe_reset(dec->rst_niu_h); mpp_safe_reset(dec->rst_a); @@ -1093,12 +1144,30 @@ mpp_safe_unreset(dec->rst_core); mpp_safe_unreset(dec->rst_cabac); mpp_safe_unreset(dec->rst_hevc_cabac); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); } #ifdef CONFIG_PM_DEVFREQ if (dec->devfreq) mutex_unlock(&dec->devfreq->lock); #endif + mpp_debug_leave(); + + return 0; +} + +static int rkvdec2_sip_reset(struct mpp_dev *mpp) +{ + mpp_debug_enter(); + + if (IS_REACHABLE(CONFIG_ROCKCHIP_SIP)) { + /* sip reset */ + rockchip_dmcfreq_lock(); + sip_smc_vpu_reset(0, 0, 0); + rockchip_dmcfreq_unlock(); + } else { + rkvdec2_reset(mpp); + } + mpp_debug_leave(); return 0; @@ -1120,7 +1189,7 @@ .clk_off = rkvdec2_clk_off, .get_freq = rkvdec2_get_freq, .set_freq = rkvdec2_set_freq, - .reset = rkvdec2_reset, + .reset = rkvdec2_sip_reset, }; static struct mpp_dev_ops rkvdec_v2_dev_ops = { diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h index 0056bb6..e97b6ac 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h @@ -33,6 +33,10 @@ #define RKVDEC_DRIVER_NAME "mpp_rkvdec2" +#define RKVDEC_REG_IMPORTANT_BASE 0x2c +#define RKVDEC_REG_IMPORTANT_INDEX 11 +#define RKVDEC_SOFTREST_EN BIT(20) + #define RKVDEC_SESSION_MAX_BUFFERS 40 /* The maximum registers number of all the version */ #define RKVDEC_REG_NUM 279 @@ -71,6 +75,7 @@ RKVDEC_BUF_EMPTY_STA |\ RKVDEC_TIMEOUT_STA |\ RKVDEC_ERROR_STA) +#define RKVDEC_PERF_WORKING_CNT 0x41c /* perf sel reference register */ #define RKVDEC_PERF_SEL_OFFSET 0x20000 @@ -202,6 +207,8 @@ /* for link mode */ struct rkvdec_link_dev *link_dec; struct mpp_dma_buffer *fix; + + u32 err_ref_hack; }; void *rkvdec2_alloc_task(struct mpp_session *session, diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c index dfe74e0..d4a4fdb 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c @@ -60,6 +60,10 @@ /* interrupt read back in table buffer */ u32 tb_reg_int; bool hack_setup; + u32 tb_reg_cycle; + u32 tb_reg_out; + u32 tb_reg_ref_s; + u32 tb_reg_ref_e; struct rkvdec_link_status reg_status; }; @@ -113,6 +117,7 @@ }, .tb_reg_int = 164, .hack_setup = 1, + .tb_reg_cycle = 179, .reg_status = { .dec_num_mask = 0x3fffffff, .err_flag_base = 0x010, @@ -122,7 +127,7 @@ /* vdpu382 link hw info */ struct rkvdec_link_info rkvdec_link_v2_hw_info = { - .tb_reg_num = 218, + .tb_reg_num = 222, .tb_reg_next = 0, .tb_reg_r = 1, .tb_reg_second_en = 8, @@ -162,21 +167,27 @@ .part_r[0] = { .tb_reg_off = 180, .reg_start = 224, - .reg_num = 10, + .reg_num = 12, }, .part_r[1] = { - .tb_reg_off = 190, + .tb_reg_off = 192, .reg_start = 258, - .reg_num = 28, + .reg_num = 30, }, - .tb_reg_int = 180, - .hack_setup = 0, + .tb_reg_int = 180, + .hack_setup = 0, + .tb_reg_cycle = 197, + .tb_reg_out = 86, + .tb_reg_ref_s = 104, + .tb_reg_ref_e = 119, .reg_status = { .dec_num_mask = 0x000fffff, .err_flag_base = 0x024, .err_flag_bit = BIT(8), }, }; + +static void rkvdec2_link_free_task(struct kref *ref); static void rkvdec_link_status_update(struct rkvdec_link_dev *dev) { @@ -426,8 +437,6 @@ memcpy(&tb_reg[off], &task->reg[s], n * sizeof(u32)); } - /* setup error mode flag */ - tb_reg[9] |= BIT(18) | BIT(9); tb_reg[info->tb_reg_second_en] |= RKVDEC_WAIT_RESET_EN; /* memset read registers */ @@ -514,6 +523,7 @@ } if (!resend) { + u32 timing_en = dev->mpp->srv->timing_en; u32 i; for (i = 0; i < task_to_run; i++) { @@ -523,10 +533,8 @@ if (!task_ddr) continue; - set_bit(TASK_STATE_START, &task_ddr->state); - schedule_delayed_work(&task_ddr->timeout_work, - msecs_to_jiffies(200)); - mpp_time_record(task_ddr); + mpp_task_run_begin(task_ddr, timing_en, MPP_WORK_TIMEOUT_DELAY); + mpp_task_run_end(task_ddr, timing_en); } } else { if (task_total) @@ -538,6 +546,8 @@ /* start config before all registers are set */ wmb(); + + mpp_iommu_flush_tlb(dev->mpp->iommu_info); /* configure done */ writel(RKVDEC_LINK_BIT_CFG_DONE, reg_base + RKVDEC_LINK_CFG_CTRL_BASE); @@ -591,6 +601,7 @@ struct rkvdec_link_info *info = link_dec->info; u32 *table_base = (u32 *)link_dec->table->vaddr; int i; + struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); for (i = 0; i < count; i++) { int idx = rkvdec_link_get_task_read(link_dec); @@ -599,15 +610,15 @@ u32 *regs = NULL; u32 irq_status = 0; - if (!mpp_task) { + if (!mpp_task && info->hack_setup) { regs = table_base + idx * link_dec->link_reg_count; mpp_dbg_link_flow("slot %d read task stuff\n", idx); link_dec->stuff_total++; if (link_dec->statistic_count && - regs[RKVDEC_LINK_REG_CYCLE_CNT]) { + regs[info->tb_reg_cycle]) { link_dec->stuff_cycle_sum += - regs[RKVDEC_LINK_REG_CYCLE_CNT]; + regs[info->tb_reg_cycle]; link_dec->stuff_cnt++; if (link_dec->stuff_cnt >= link_dec->statistic_count) { @@ -648,22 +659,27 @@ continue; } - mpp_time_diff(mpp_task); + if (!mpp_task) + return 0; + task = to_rkvdec2_task(mpp_task); regs = table_base + idx * link_dec->link_reg_count; + link_dec->error_iova = regs[info->tb_reg_out]; irq_status = regs[info->tb_reg_int]; + mpp_task->hw_cycles = regs[info->tb_reg_cycle]; + mpp_time_diff_with_hw_time(mpp_task, dec->aclk_info.real_rate_hz); mpp_dbg_link_flow("slot %d rd task %d\n", idx, mpp_task->task_index); task->irq_status = irq_status ? irq_status : mpp->irq_status; - + mpp_debug(DEBUG_IRQ_STATUS, "irq_status: %08x\n", task->irq_status); cancel_delayed_work_sync(&mpp_task->timeout_work); set_bit(TASK_STATE_HANDLE, &mpp_task->state); if (link_dec->statistic_count && - regs[RKVDEC_LINK_REG_CYCLE_CNT]) { + regs[info->tb_reg_cycle]) { link_dec->task_cycle_sum += - regs[RKVDEC_LINK_REG_CYCLE_CNT]; + regs[info->tb_reg_cycle]; link_dec->task_cnt++; if (link_dec->task_cnt >= link_dec->statistic_count) { dev_info(link_dec->dev, "hw cycle %u\n", @@ -691,6 +707,8 @@ set_bit(TASK_STATE_PROC_DONE, &mpp_task->state); /* Wake up the GET thread */ wake_up(&task->wait); + kref_put(&mpp_task->ref, rkvdec2_link_free_task); + link_dec->tasks_hw[idx] = NULL; } return 0; @@ -729,7 +747,6 @@ static int rkvdec2_link_reset(struct mpp_dev *mpp) { - struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); dev_info(mpp->dev, "resetting...\n"); @@ -740,11 +757,8 @@ rockchip_save_qos(mpp->dev); - mutex_lock(&dec->sip_reset_lock); - rockchip_dmcfreq_lock(); - sip_smc_vpu_reset(0, 0, 0); - rockchip_dmcfreq_unlock(); - mutex_unlock(&dec->sip_reset_lock); + if (mpp->hw_ops->reset) + mpp->hw_ops->reset(mpp); rockchip_restore_qos(mpp->dev); @@ -762,6 +776,49 @@ return 0; } +static void rkvdec2_check_err_ref(struct mpp_dev *mpp) +{ + struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); + struct rkvdec_link_dev *link_dec = dec->link_dec; + struct rkvdec_link_info *link_info = link_dec->info; + struct mpp_taskqueue *queue = mpp->queue; + struct mpp_task *mpp_task = NULL, *n; + struct rkvdec2_task *task; + int i; + + if (!link_dec->error_iova || !dec->err_ref_hack) + return; + + dev_err(mpp->dev, "err task iova %#08x\n", link_dec->error_iova); + list_for_each_entry_safe(mpp_task, n, &queue->running_list, queue_link) { + if (mpp_task) { + u32 *regs = NULL; + u32 *table_base = (u32 *)link_dec->table->vaddr; + + task = to_rkvdec2_task(mpp_task); + regs = table_base + task->slot_idx * link_dec->link_reg_count; + + for (i = link_info->tb_reg_ref_s; i <= link_info->tb_reg_ref_e; i++) { + if (regs[i] == link_dec->error_iova) + regs[i] = 0; + } + } + } + + mutex_lock(&queue->pending_lock); + list_for_each_entry_safe(mpp_task, n, &queue->pending_list, queue_link) { + task = to_rkvdec2_task(mpp_task); + + /* ref frame reg index start - end */ + for (i = 164; i <= 179; i++) { + if (task->reg[i] == link_dec->error_iova) + task->reg[i] = 0; + } + } + mutex_unlock(&queue->pending_lock); + link_dec->error_iova = 0; +} + static int rkvdec2_link_irq(struct mpp_dev *mpp) { struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); @@ -774,9 +831,6 @@ } irq_status = readl(link_dec->reg_base + RKVDEC_LINK_IRQ_BASE); - - mpp_debug(DEBUG_IRQ_STATUS, "irq_status: %08x\n", irq_status); - mpp_dbg_link_flow("link irq %08x\n", irq_status); if (irq_status & RKVDEC_LINK_BIT_IRQ_RAW) { u32 enabled = readl(link_dec->reg_base + RKVDEC_LINK_EN_BASE); @@ -795,7 +849,8 @@ writel_relaxed(0, link_dec->reg_base + RKVDEC_LINK_IRQ_BASE); } - + mpp_debug((DEBUG_IRQ_STATUS | DEBUG_LINK_TABLE), "irq_status: %08x : %08x\n", + irq_status, mpp->irq_status); return 0; } @@ -815,6 +870,7 @@ mpp_debug_enter(); disable_irq(mpp->irq); + mpp_iommu_disable_irq(mpp->iommu_info); rkvdec_link_status_update(link_dec); link_dec->irq_status = irq_status; prev_dec_num = link_dec->task_decoded; @@ -822,8 +878,10 @@ if (!link_dec->enabled || task_timeout) { u32 val; - if (task_timeout) + if (task_timeout) { rkvdec_link_reg_dump("timeout", link_dec); + link_dec->decoded += task_timeout; + } val = mpp_read(mpp, 224 * 4); if (link_info->hack_setup && !(val & BIT(2))) { @@ -838,6 +896,7 @@ if (link_dec->enabled && !count && !need_reset) { /* process extra isr when task is processed */ enable_irq(mpp->irq); + mpp_iommu_enable_irq(mpp->iommu_info); goto done; } @@ -851,15 +910,18 @@ goto do_reset; enable_irq(mpp->irq); + mpp_iommu_enable_irq(mpp->iommu_info); goto done; do_reset: + rkvdec2_check_err_ref(mpp); /* NOTE: irq may run with reset */ atomic_inc(&mpp->reset_request); rkvdec2_link_reset(mpp); link_dec->task_decoded = 0; link_dec->task_total = 0; enable_irq(mpp->irq); + mpp_iommu_enable_irq(mpp->iommu_info); if (link_dec->total == link_dec->decoded) goto done; @@ -881,6 +943,26 @@ mpp_debug_leave(); return IRQ_HANDLED; +} + +static int rkvdec2_link_iommu_handle(struct iommu_domain *iommu, + struct device *iommu_dev, + unsigned long iova, + int status, void *arg) +{ + struct mpp_dev *mpp = (struct mpp_dev *)arg; + + dev_err(iommu_dev, "fault addr 0x%08lx status %x arg %p\n", + iova, status, arg); + + if (!mpp) { + dev_err(iommu_dev, "pagefault without device to handle\n"); + return 0; + } + + rk_iommu_mask_irq(mpp->dev); + + return 0; } int rkvdec2_link_remove(struct mpp_dev *mpp, struct rkvdec_link_dev *link_dec) @@ -1016,7 +1098,8 @@ if (link_dec->info->hack_setup) rkvdec2_link_hack_data_setup(dec->fix); - + iommu_set_fault_handler(mpp->iommu_info->domain, + rkvdec2_link_iommu_handle, mpp); link_dec->mpp = mpp; link_dec->dev = dev; atomic_set(&link_dec->task_timeout, 0); @@ -1060,8 +1143,10 @@ } session = task->session; - mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d state 0x%lx\n", - session->index, task->task_index, task->state); + mpp_debug_func(DEBUG_TASK_INFO, + "session %d:%d task %d state 0x%lx abort_request %d\n", + session->device_type, session->index, task->task_index, + task->state, atomic_read(&task->abort_request)); if (!session->mpp) { mpp_err("session %d session->mpp is null.\n", session->index); return; @@ -1112,6 +1197,7 @@ if (!link_dec->irq_enabled) { enable_irq(mpp->irq); + mpp_iommu_enable_irq(mpp->iommu_info); link_dec->irq_enabled = 1; } @@ -1146,6 +1232,7 @@ if (atomic_xchg(&link_dec->power_enabled, 0)) { disable_irq(mpp->irq); + mpp_iommu_disable_irq(mpp->iommu_info); link_dec->irq_enabled = 0; if (mpp->hw_ops->clk_off) @@ -1287,6 +1374,7 @@ u32 task_to_run = 0; int slot_idx = 0; int ret; + struct mpp_session *session = task->session; mpp_debug_enter(); @@ -1301,8 +1389,10 @@ } rkvdec2_link_power_on(mpp); - mpp_debug(DEBUG_TASK_INFO, "pid %d, start hw %s\n", - task->session->pid, dev_name(mpp->dev)); + mpp_debug_func(DEBUG_TASK_INFO, + "%s session %d:%d task=%d state=0x%lx\n", + dev_name(mpp->dev), session->device_type, + session->index, task->task_index, task->state); /* prepare the task for running */ if (test_and_set_bit(TASK_STATE_PREPARE, &task->state)) @@ -1372,7 +1462,6 @@ struct mpp_task *task) { set_bit(TASK_STATE_DONE, &task->state); - kref_put(&task->ref, rkvdec2_link_free_task); return 0; } @@ -1479,10 +1568,12 @@ goto done; disable_irq(mpp->irq); + mpp_iommu_disable_irq(mpp->iommu_info); rkvdec2_link_reset(mpp); link_dec->task_decoded = 0; link_dec->task_total = 0; enable_irq(mpp->irq); + mpp_iommu_enable_irq(mpp->iommu_info); } /* * process pending queue to find the task to accept. @@ -1500,7 +1591,6 @@ mutex_lock(&queue->pending_lock); list_del_init(&task->queue_link); - kref_get(&task->ref); set_bit(TASK_STATE_ABORT_READY, &task->state); set_bit(TASK_STATE_PROC_DONE, &task->state); @@ -1546,28 +1636,7 @@ rkvdec2_link_power_off(mpp); } - mutex_lock(&queue->session_lock); - while (queue->detach_count) { - struct mpp_session *session = NULL; - - session = list_first_entry_or_null(&queue->session_detach, struct mpp_session, - session_link); - if (session) { - list_del_init(&session->session_link); - queue->detach_count--; - } - - mutex_unlock(&queue->session_lock); - - if (session) { - mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev), - queue->detach_count); - mpp_session_deinit(session); - } - - mutex_lock(&queue->session_lock); - } - mutex_unlock(&queue->session_lock); + mpp_session_cleanup_detach(queue, work_s); } void rkvdec2_link_session_deinit(struct mpp_session *session) @@ -1580,9 +1649,9 @@ if (session->dma) { mpp_dbg_session("session %d destroy dma\n", session->index); - mpp_iommu_down_read(mpp->iommu_info); + mpp_iommu_down_write(mpp->iommu_info); mpp_dma_session_destroy(session->dma); - mpp_iommu_up_read(mpp->iommu_info); + mpp_iommu_up_write(mpp->iommu_info); session->dma = NULL; } if (session->srv) { diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h index c7b2ab6..2035610 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h @@ -41,8 +41,6 @@ #define RKVDEC_LINK_STA_BASE 0x024 -#define RKVDEC_LINK_REG_CYCLE_CNT 179 - struct rkvdec_link_dev { struct device *dev; struct mpp_dev *mpp; @@ -99,6 +97,8 @@ u32 task_cnt; u64 stuff_cycle_sum; u32 stuff_cnt; + + u32 error_iova; }; extern struct rkvdec_link_info rkvdec_link_rk3568_hw_info; diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c index 5bc2449..4a3c7d7 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -439,6 +439,7 @@ int i; struct mpp_request *req; u32 reg_en = mpp_task->hw_info->reg_en; + u32 timing_en = mpp->srv->timing_en; /* * Tips: ensure osd plt clock is 0 before setting register, @@ -466,11 +467,20 @@ rkvenc_write_req_backward(mpp, task->reg, s, e, reg_en); } } + + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); + /* Flush the register before the start the device */ wmb(); mpp_write(mpp, RKVENC_ENC_START_BASE, task->reg[reg_en]); + + mpp_task_run_end(mpp_task, timing_en); } break; case RKVENC_MODE_LINKTABLE_FIX: case RKVENC_MODE_LINKTABLE_UPDATE: @@ -802,6 +812,10 @@ enc->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(enc->procfs, mpp); + /* for debug */ mpp_procfs_create_u32("aclk", 0644, enc->procfs, &enc->aclk_info.debug_rate_hz); @@ -1264,7 +1278,7 @@ mpp_write(mpp, RKVENC_INT_STATUS_BASE, 0); /* cru reset */ if (enc->rst_a && enc->rst_h && enc->rst_core) { - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(enc->rst_a); mpp_safe_reset(enc->rst_h); mpp_safe_reset(enc->rst_core); @@ -1272,7 +1286,7 @@ mpp_safe_unreset(enc->rst_a); mpp_safe_unreset(enc->rst_h); mpp_safe_unreset(enc->rst_core); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); } #ifdef CONFIG_PM_DEVFREQ if (enc->devfreq) diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c index 90cdc13..7d2d7ae 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c @@ -28,6 +28,8 @@ #include <linux/nospec.h> #include <linux/workqueue.h> #include <linux/dma-iommu.h> +#include <linux/mfd/syscon.h> +#include <linux/rockchip/cpu.h> #include <soc/rockchip/pm_domains.h> #include <soc/rockchip/rockchip_ipa.h> #include <soc/rockchip/rockchip_opp_select.h> @@ -41,6 +43,7 @@ #define RKVENC_SESSION_MAX_BUFFERS 40 #define RKVENC_MAX_CORE_NUM 4 +#define RKVENC_SCLR_DONE_STA BIT(2) #define to_rkvenc_info(info) \ container_of(info, struct rkvenc_hw_info, hw) @@ -187,6 +190,7 @@ dma_addr_t sram_iova; u32 sram_enabled; struct page *rcb_page; + struct regmap *grf; }; @@ -699,6 +703,7 @@ struct rkvenc_dev *enc = to_rkvenc_dev(mpp); struct rkvenc_task *task = to_rkvenc_task(mpp_task); struct rkvenc_hw_info *hw = enc->hw_info; + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -735,11 +740,20 @@ } } + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); + /* Flush the register before the start the device */ wmb(); + mpp_write(mpp, enc->hw_info->enc_start_base, start_val); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -793,6 +807,7 @@ if (mpp_debug_unlikely(DEBUG_DUMP_ERR_REG)) mpp_task_dump_hw_reg(mpp, mpp_task); } + mpp_task_finish(mpp_task->session, mpp_task); mpp_debug_leave(); @@ -1031,6 +1046,10 @@ enc->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(enc->procfs, mpp); + /* for debug */ mpp_procfs_create_u32("aclk", 0644, enc->procfs, &enc->aclk_info.debug_rate_hz); @@ -1063,7 +1082,7 @@ struct rkvenc_dev *enc = to_rkvenc_dev(mpp); int ret = 0; - mpp->grf_info = &mpp->srv->grf_infos[MPP_DRIVER_RKVENC]; + mpp->grf_info = &mpp->srv->grf_infos[MPP_DRIVER_RKVENC2]; /* Get clock info from dtsi */ ret = mpp_get_clk_info(mpp, &enc->aclk_info, "aclk_vcodec"); @@ -1097,23 +1116,41 @@ return 0; } -static int rkvenc_reset(struct mpp_dev *mpp) +static int rkvenc_soft_reset(struct mpp_dev *mpp) { struct rkvenc_dev *enc = to_rkvenc_dev(mpp); struct rkvenc_hw_info *hw = enc->hw_info; - - mpp_debug_enter(); + u32 rst_status = 0; + int ret = 0; /* safe reset */ mpp_write(mpp, hw->int_mask_base, 0x3FF); mpp_write(mpp, hw->enc_clr_base, 0x1); - udelay(5); + ret = readl_relaxed_poll_timeout(mpp->reg_base + hw->int_sta_base, + rst_status, + rst_status & RKVENC_SCLR_DONE_STA, + 0, 5); mpp_write(mpp, hw->int_clr_base, 0xffffffff); mpp_write(mpp, hw->int_sta_base, 0); + return ret; + +} + +static int rkvenc_reset(struct mpp_dev *mpp) +{ + struct rkvenc_dev *enc = to_rkvenc_dev(mpp); + int ret = 0; + + mpp_debug_enter(); + + /* safe reset first*/ + ret = rkvenc_soft_reset(mpp); + /* cru reset */ - if (enc->rst_a && enc->rst_h && enc->rst_core) { - rockchip_pmu_idle_request(mpp->dev, true); + if (ret && enc->rst_a && enc->rst_h && enc->rst_core) { + mpp_err("soft reset timeout, use cru reset\n"); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(enc->rst_a); mpp_safe_reset(enc->rst_h); mpp_safe_reset(enc->rst_core); @@ -1121,7 +1158,7 @@ mpp_safe_unreset(enc->rst_a); mpp_safe_unreset(enc->rst_h); mpp_safe_unreset(enc->rst_core); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); } mpp_debug_leave(); @@ -1338,6 +1375,7 @@ } mpp->session_max_buffers = RKVENC_SESSION_MAX_BUFFERS; enc->hw_info = to_rkvenc_info(mpp->var->hw_info); + rkvenc_procfs_init(mpp); mpp_dev_register_srv(mpp, mpp->srv); @@ -1416,12 +1454,44 @@ dev_info(dev, "shutdown success\n"); } +static int rkvenc_runtime_suspend(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + + if (cpu_is_rk3528() && info && info->mem_offset) + regmap_write(info->grf, + info->mem_offset, + info->val_mem_off); + + return 0; +} + +static int rkvenc_runtime_resume(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + + if (cpu_is_rk3528() && info && info->mem_offset) + regmap_write(info->grf, + info->mem_offset, + info->val_mem_on); + + return 0; +} + +static const struct dev_pm_ops rkvenc_pm_ops = { + .runtime_suspend = rkvenc_runtime_suspend, + .runtime_resume = rkvenc_runtime_resume, +}; + struct platform_driver rockchip_rkvenc2_driver = { .probe = rkvenc_probe, .remove = rkvenc_remove, .shutdown = rkvenc_shutdown, .driver = { .name = RKVENC_DRIVER_NAME, + .pm = &rkvenc_pm_ops, .of_match_table = of_match_ptr(mpp_rkvenc_dt_match), }, }; diff --git a/kernel/drivers/video/rockchip/mpp/mpp_service.c b/kernel/drivers/video/rockchip/mpp/mpp_service.c index 375f550..67ef213 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_service.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_service.c @@ -19,6 +19,7 @@ #include <linux/slab.h> #include <linux/nospec.h> #include <linux/mfd/syscon.h> +#include <linux/regmap.h> #include "mpp_debug.h" #include "mpp_common.h" @@ -42,34 +43,47 @@ struct mpp_grf_info *grf_info, const char *grf_name) { - int ret; int index; u32 grf_offset = 0; u32 grf_value = 0; + u32 mem_offset = 0; + u32 val_mem_on = 0; + u32 val_mem_off = 0; struct regmap *grf; grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); if (IS_ERR_OR_NULL(grf)) return -EINVAL; - ret = of_property_read_u32(np, "rockchip,grf-offset", &grf_offset); - if (ret) - return -ENODATA; - index = of_property_match_string(np, "rockchip,grf-names", grf_name); if (index < 0) return -ENODATA; - ret = of_property_read_u32_index(np, "rockchip,grf-values", - index, &grf_value); - if (ret) - return -ENODATA; + of_property_read_u32(np, "rockchip,grf-offset", &grf_offset); + of_property_read_u32_index(np, "rockchip,grf-values", + index, &grf_value); + of_property_read_u32_index(np, "rockchip,grf-mem-offset", + index, &mem_offset); + of_property_read_u32_index(np, "rockchip,grf-mem-on-values", + index, &val_mem_on); + of_property_read_u32_index(np, "rockchip,grf-mem-off-values", + index, &val_mem_off); + grf_info->grf = grf; grf_info->offset = grf_offset; grf_info->val = grf_value; - mpp_set_grf(grf_info); + grf_info->mem_offset = mem_offset; + grf_info->val_mem_on = val_mem_on; + grf_info->val_mem_off = val_mem_off; + + if (grf_info->offset && grf_info->val) + mpp_set_grf(grf_info); + + if (grf_info->mem_offset && grf_info->val_mem_off) + regmap_write(grf_info->grf, grf_info->mem_offset, + grf_info->val_mem_off); return 0; } @@ -261,6 +275,7 @@ /* show support devices */ proc_create_single_data("supports-device", 0444, srv->procfs, mpp_show_support_device, srv); + mpp_procfs_create_u32("timing_en", 0644, srv->procfs, &srv->timing_en); return 0; } diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c b/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c index 9369615..43a7cb0 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c @@ -18,6 +18,8 @@ #include <linux/uaccess.h> #include <linux/regmap.h> #include <linux/proc_fs.h> +#include <linux/mfd/syscon.h> +#include <linux/rockchip/cpu.h> #include <soc/rockchip/pm_domains.h> #include "mpp_debug.h" @@ -27,6 +29,8 @@ #define VDPP_DRIVER_NAME "mpp_vdpp" #define VDPP_SESSION_MAX_BUFFERS 15 +#define VDPP_REG_WORK_MODE 0x0008 +#define VDPP_REG_VDPP_MODE BIT(1) #define to_vdpp_info(info) \ container_of(info, struct vdpp_hw_info, hw) @@ -87,6 +91,7 @@ struct reset_control *rst_s; /* for zme */ void __iomem *zme_base; + struct regmap *grf; }; static struct vdpp_hw_info vdpp_v1_hw_info = { @@ -332,6 +337,9 @@ } } + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; /* Flush the register before the start the device */ @@ -474,6 +482,8 @@ int ret; struct vdpp_dev *vdpp = to_vdpp_dev(mpp); + mpp->grf_info = &mpp->srv->grf_infos[MPP_DRIVER_VDPP]; + /* Get clock info from dtsi */ ret = mpp_get_clk_info(mpp, &vdpp->aclk_info, "aclk"); if (ret) @@ -546,12 +556,18 @@ { struct vdpp_dev *vdpp = to_vdpp_dev(mpp); struct vdpp_hw_info *hw_info = vdpp->hw_info; + u32 work_mode = mpp_read(mpp, VDPP_REG_WORK_MODE); + if (!(work_mode & VDPP_REG_VDPP_MODE)) + return IRQ_NONE; mpp->irq_status = mpp_read(mpp, hw_info->int_sta_base); if (!(mpp->irq_status & hw_info->int_mask)) return IRQ_NONE; mpp_write(mpp, hw_info->int_en_base, 0); mpp_write(mpp, hw_info->int_clr_base, mpp->irq_status); + + /* ensure hardware is being off status */ + mpp_write(mpp, hw_info->start_base, 0); return IRQ_WAKE_THREAD; } @@ -590,7 +606,7 @@ mpp_debug(DEBUG_RESET, "reset in\n"); /* Don't skip this or iommu won't work after reset */ - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(vdpp->rst_a); mpp_safe_reset(vdpp->rst_h); mpp_safe_reset(vdpp->rst_s); @@ -598,7 +614,7 @@ mpp_safe_unreset(vdpp->rst_a); mpp_safe_unreset(vdpp->rst_h); mpp_safe_unreset(vdpp->rst_s); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); mpp_debug(DEBUG_RESET, "reset out\n"); } @@ -617,14 +633,18 @@ mpp_write(mpp, hw_info->cfg_base, hw_info->bit_rst_en); ret = readl_relaxed_poll_timeout(mpp->reg_base + hw_info->rst_sta_base, rst_status, - !(rst_status & hw_info->bit_rst_done), - 0, 2); + rst_status & hw_info->bit_rst_done, + 0, 5); if (ret) { mpp_err("soft reset timeout, use cru reset\n"); return _vdpp_reset(mpp, vdpp); } mpp_write(mpp, hw_info->rst_sta_base, 0); + + /* ensure hardware is being off status */ + mpp_write(mpp, hw_info->start_base, 0); + return 0; } @@ -710,6 +730,7 @@ dev_err(dev, "register interrupter runtime failed\n"); return -EINVAL; } + mpp->session_max_buffers = VDPP_SESSION_MAX_BUFFERS; vdpp->hw_info = to_vdpp_info(mpp->var->hw_info); vdpp_procfs_init(mpp); @@ -751,12 +772,53 @@ dev_err(dev, "wait total running time out\n"); } +static int vdpp_runtime_suspend(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + struct mpp_taskqueue *queue = mpp->queue; + + if (cpu_is_rk3528() && info && info->mem_offset) { + mutex_lock(&queue->ref_lock); + if (!atomic_dec_if_positive(&queue->runtime_cnt)) { + regmap_write(info->grf, info->mem_offset, + info->val_mem_off); + } + mutex_unlock(&queue->ref_lock); + } + + return 0; +} + +static int vdpp_runtime_resume(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + struct mpp_taskqueue *queue = mpp->queue; + + if (cpu_is_rk3528() && info && info->mem_offset) { + mutex_lock(&queue->ref_lock); + regmap_write(info->grf, info->mem_offset, + info->val_mem_on); + atomic_inc(&queue->runtime_cnt); + mutex_unlock(&queue->ref_lock); + } + + return 0; +} + +static const struct dev_pm_ops vdpp_pm_ops = { + .runtime_suspend = vdpp_runtime_suspend, + .runtime_resume = vdpp_runtime_resume, +}; + struct platform_driver rockchip_vdpp_driver = { .probe = vdpp_probe, .remove = vdpp_remove, .shutdown = vdpp_shutdown, .driver = { .name = VDPP_DRIVER_NAME, + .pm = &vdpp_pm_ops, .of_match_table = of_match_ptr(mpp_vdpp_dt_match), }, }; diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c b/kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c index a14f102..537c6a2 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c @@ -20,6 +20,8 @@ #include <linux/uaccess.h> #include <linux/regmap.h> #include <linux/proc_fs.h> +#include <linux/mfd/syscon.h> +#include <linux/rockchip/cpu.h> #include <soc/rockchip/pm_domains.h> #include "mpp_debug.h" @@ -57,6 +59,9 @@ /* NOTE: Don't enable it or decoding AVC would meet problem at rk3288 */ #define VDPU1_REG_DEC_EN 0x008 #define VDPU1_CLOCK_GATE_EN BIT(10) + +#define VDPU1_REG_SOFT_RESET 0x194 +#define VDPU1_REG_SOFT_RESET_INDEX (101) #define VDPU1_REG_SYS_CTRL 0x00c #define VDPU1_REG_SYS_CTRL_INDEX (3) @@ -387,6 +392,7 @@ u32 i; u32 reg_en; struct vdpu_task *task = to_vdpu_task(mpp_task); + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -401,12 +407,21 @@ mpp_write_req(mpp, task->reg, s, e, reg_en); } + + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); + /* Flush the register before the start the device */ wmb(); mpp_write(mpp, VDPU1_REG_DEC_INT_EN, task->reg[reg_en] | VDPU1_DEC_START); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -503,6 +518,10 @@ dec->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(dec->procfs, mpp); + mpp_procfs_create_u32("aclk", 0644, dec->procfs, &dec->aclk_info.debug_rate_hz); mpp_procfs_create_u32("session_buffers", 0644, @@ -663,21 +682,35 @@ return IRQ_HANDLED; } +static int vdpu_soft_reset(struct mpp_dev *mpp) +{ + u32 val; + + mpp_write(mpp, VDPU1_REG_SOFT_RESET, 1); + udelay(2); + val = mpp_read(mpp, VDPU1_REG_SOFT_RESET); + + return val; +} + static int vdpu_reset(struct mpp_dev *mpp) { struct vdpu_dev *dec = to_vdpu_dev(mpp); + u32 ret = 0; - if (dec->rst_a && dec->rst_h) { + /* soft reset first */ + ret = vdpu_soft_reset(mpp); + if (ret && dec->rst_a && dec->rst_h) { mpp_debug(DEBUG_RESET, "reset in\n"); /* Don't skip this or iommu won't work after reset */ - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(dec->rst_a); mpp_safe_reset(dec->rst_h); udelay(5); mpp_safe_unreset(dec->rst_a); mpp_safe_unreset(dec->rst_h); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); mpp_debug(DEBUG_RESET, "reset out\n"); } @@ -774,12 +807,10 @@ .data = &vdpu_3368_data, }, #endif -#ifdef CONFIG_CPU_RK3328 { .compatible = "rockchip,avs-plus-decoder", .data = &avsd_plus_data, }, -#endif {}, }; @@ -864,12 +895,53 @@ dev_err(dev, "wait total running time out\n"); } +static int vdpu_runtime_suspend(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + struct mpp_taskqueue *queue = mpp->queue; + + if (cpu_is_rk3528() && info && info->mem_offset) { + mutex_lock(&queue->ref_lock); + if (!atomic_dec_if_positive(&queue->runtime_cnt)) { + regmap_write(info->grf, info->mem_offset, + info->val_mem_off); + } + mutex_unlock(&queue->ref_lock); + } + + return 0; +} + +static int vdpu_runtime_resume(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + struct mpp_taskqueue *queue = mpp->queue; + + if (cpu_is_rk3528() && info && info->mem_offset) { + mutex_lock(&queue->ref_lock); + regmap_write(info->grf, info->mem_offset, + info->val_mem_on); + atomic_inc(&queue->runtime_cnt); + mutex_unlock(&queue->ref_lock); + } + + return 0; +} + +static const struct dev_pm_ops vdpu_pm_ops = { + .runtime_suspend = vdpu_runtime_suspend, + .runtime_resume = vdpu_runtime_resume, +}; + struct platform_driver rockchip_vdpu1_driver = { .probe = vdpu_probe, .remove = vdpu_remove, .shutdown = vdpu_shutdown, .driver = { .name = VDPU1_DRIVER_NAME, + .pm = &vdpu_pm_ops, .of_match_table = of_match_ptr(mpp_vdpu1_dt_match), }, }; diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c b/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c index f697033..1e58094 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c @@ -20,6 +20,8 @@ #include <linux/uaccess.h> #include <linux/regmap.h> #include <linux/proc_fs.h> +#include <linux/mfd/syscon.h> +#include <linux/rockchip/cpu.h> #include <soc/rockchip/pm_domains.h> #include "mpp_debug.h" @@ -69,6 +71,9 @@ #define VDPU2_DEC_CLOCK_GATE_EN BIT(4) #define VDPU2_DEC_START BIT(0) +#define VDPU2_REG_SOFT_RESET 0x0e8 +#define VDPU2_REG_SOFT_RESET_INDEX (58) + #define VDPU2_REG_DIR_MV_BASE 0x0f8 #define VDPU2_REG_DIR_MV_BASE_INDEX (62) @@ -108,6 +113,7 @@ #endif struct reset_control *rst_a; struct reset_control *rst_h; + struct regmap *grf; }; static struct mpp_hw_info vdpu_v2_hw_info = { @@ -340,6 +346,7 @@ u32 i; u32 reg_en; struct vdpu_task *task = to_vdpu_task(mpp_task); + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -354,12 +361,21 @@ mpp_write_req(mpp, task->reg, s, e, reg_en); } + + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); + /* Flush the registers */ wmb(); mpp_write(mpp, VDPU2_REG_DEC_EN, task->reg[reg_en] | VDPU2_DEC_START); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -456,6 +472,10 @@ dec->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(dec->procfs, mpp); + mpp_procfs_create_u32("aclk", 0644, dec->procfs, &dec->aclk_info.debug_rate_hz); mpp_procfs_create_u32("session_buffers", 0644, @@ -596,21 +616,38 @@ return IRQ_HANDLED; } +static int vdpu_soft_reset(struct mpp_dev *mpp) +{ + u32 val; + + mpp_write(mpp, VDPU2_REG_SOFT_RESET, 1); + udelay(2); + val = mpp_read(mpp, VDPU2_REG_SOFT_RESET); + + return val; +} + static int vdpu_reset(struct mpp_dev *mpp) { struct vdpu_dev *dec = to_vdpu_dev(mpp); + u32 ret = 0; mpp_write(mpp, VDPU2_REG_DEC_EN, 0); mpp_write(mpp, VDPU2_REG_DEC_INT, 0); - if (dec->rst_a && dec->rst_h) { + + /* soft reset first */ + ret = vdpu_soft_reset(mpp); + if (ret && dec->rst_a && dec->rst_h) { /* Don't skip this or iommu won't work after reset */ - rockchip_pmu_idle_request(mpp->dev, true); + mpp_debug(DEBUG_RESET, "reset in\n"); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(dec->rst_a); mpp_safe_reset(dec->rst_h); udelay(5); mpp_safe_unreset(dec->rst_a); mpp_safe_unreset(dec->rst_h); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); + mpp_debug(DEBUG_RESET, "reset out\n"); } return 0; @@ -758,12 +795,53 @@ dev_err(dev, "wait total running time out\n"); } +static int vdpu_runtime_suspend(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + struct mpp_taskqueue *queue = mpp->queue; + + if (cpu_is_rk3528() && info && info->mem_offset) { + mutex_lock(&queue->ref_lock); + if (!atomic_dec_if_positive(&queue->runtime_cnt)) { + regmap_write(info->grf, info->mem_offset, + info->val_mem_off); + } + mutex_unlock(&queue->ref_lock); + } + + return 0; +} + +static int vdpu_runtime_resume(struct device *dev) +{ + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct mpp_grf_info *info = mpp->grf_info; + struct mpp_taskqueue *queue = mpp->queue; + + if (cpu_is_rk3528() && info && info->mem_offset) { + mutex_lock(&queue->ref_lock); + regmap_write(info->grf, info->mem_offset, + info->val_mem_on); + atomic_inc(&queue->runtime_cnt); + mutex_unlock(&queue->ref_lock); + } + + return 0; +} + +static const struct dev_pm_ops vdpu_pm_ops = { + .runtime_suspend = vdpu_runtime_suspend, + .runtime_resume = vdpu_runtime_resume, +}; + struct platform_driver rockchip_vdpu2_driver = { .probe = vdpu_probe, .remove = vdpu_remove, .shutdown = vdpu_shutdown, .driver = { .name = VDPU2_DRIVER_NAME, + .pm = &vdpu_pm_ops, .of_match_table = of_match_ptr(mpp_vdpu2_dt_match), }, }; diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vepu1.c b/kernel/drivers/video/rockchip/mpp/mpp_vepu1.c index aef0ad7..13eb0cb 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_vepu1.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_vepu1.c @@ -264,6 +264,7 @@ u32 i; u32 reg_en; struct vepu_task *task = to_vepu_task(mpp_task); + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -282,12 +283,21 @@ mpp_write_req(mpp, task->reg, s, e, reg_en); } + + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); + /* Last, flush start registers */ wmb(); mpp_write(mpp, VEPU1_REG_ENC_EN, task->reg[reg_en] | VEPU1_ENC_START); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -555,6 +565,10 @@ enc->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(enc->procfs, mpp); + mpp_procfs_create_u32("aclk", 0644, enc->procfs, &enc->aclk_info.debug_rate_hz); mpp_procfs_create_u32("session_buffers", 0644, @@ -656,13 +670,13 @@ if (enc->rst_a && enc->rst_h) { /* Don't skip this or iommu won't work after reset */ - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(enc->rst_a); mpp_safe_reset(enc->rst_h); udelay(5); mpp_safe_unreset(enc->rst_a); mpp_safe_unreset(enc->rst_h); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); } mpp_write(mpp, VEPU1_REG_ENC_EN, 0); diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vepu2.c b/kernel/drivers/video/rockchip/mpp/mpp_vepu2.c index 75188f2..d7dd2c1 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_vepu2.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_vepu2.c @@ -287,6 +287,7 @@ u32 i; u32 reg_en; struct vepu_task *task = to_vepu_task(mpp_task); + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -305,12 +306,21 @@ mpp_write_req(mpp, task->reg, s, e, reg_en); } + + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); + /* Last, flush the registers */ wmb(); mpp_write(mpp, VEPU2_REG_ENC_EN, task->reg[reg_en] | VEPU2_ENC_START); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -578,6 +588,10 @@ enc->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(enc->procfs, mpp); + mpp_procfs_create_u32("aclk", 0644, enc->procfs, &enc->aclk_info.debug_rate_hz); mpp_procfs_create_u32("session_buffers", 0644, @@ -722,15 +736,17 @@ { struct vepu_dev *enc = to_vepu_dev(mpp); + mpp_write(mpp, VEPU2_REG_ENC_EN, 0); + udelay(5); if (enc->rst_a && enc->rst_h) { /* Don't skip this or iommu won't work after reset */ - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(enc->rst_a); mpp_safe_reset(enc->rst_h); udelay(5); mpp_safe_unreset(enc->rst_a); mpp_safe_unreset(enc->rst_h); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); } mpp_write(mpp, VEPU2_REG_INT, VEPU2_INT_CLEAR); diff --git a/kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h b/kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h index 4c7b878..d85a30d 100644 --- a/kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h +++ b/kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h @@ -11,6 +11,7 @@ #define __ROCKCHIP_IEP2_REGS_H__ #define IEP2_REG_FRM_START 0x0000 +#define IEP2_REG_FRM_EN BIT(0) #define IEP2_REG_IEP_CONFIG0 0x0004 #define IEP2_REG_CCLK_SRESET_P BIT(22) #define IEP2_REG_ACLK_SRESET_P BIT(21) @@ -37,15 +38,19 @@ #define IEP2_REG_MD_CLK_ON BIT(1) #define IEP2_REG_CLK_ON BIT(0) #define IEP2_REG_STATUS 0x0014 +#define IEP2_REG_ARST_FINISH_DONE BIT(0) #define IEP2_REG_INT_EN 0x0020 +#define IEP2_REG_TIMEOUT_EN BIT(5) #define IEP2_REG_BUS_ERROR_EN BIT(4) #define IEP2_REG_OSD_MAX_EN BIT(1) #define IEP2_REG_FRM_DONE_EN BIT(0) #define IEP2_REG_INT_CLR 0x0024 +#define IEP2_REG_TIMEOUT_CLR BIT(5) #define IEP2_REG_BUS_ERROR_CLR BIT(4) #define IEP2_REG_OSD_MAX_CLR BIT(1) #define IEP2_REG_FRM_DONE_CLR BIT(0) #define IEP2_REG_INT_STS 0x0028 +#define IEP2_REG_RO_TIMEOUT_STS(x) ((x) & BIT(5)) #define IEP2_REG_RO_BUS_ERROR_STS(x) ((x) & BIT(4)) #define IEP2_REG_RO_OSD_MAX_STS(x) ((x) & BIT(1)) #define IEP2_REG_RO_FRM_DONE_STS(x) ((x) & BIT(0)) @@ -73,6 +78,8 @@ #define IEP2_REG_DIL_FIELD_ORDER(x) (((x) & 1) << 5) #define IEP2_REG_DIL_OUT_MODE(x) (((x) & 1) << 4) #define IEP2_REG_DIL_MODE(x) ((x) & 0xf) +#define IEP2_REG_TIMEOUT_CFG 0x0050 +#define IEP2_REG_TIMEOUT_CFG_EN BIT(31) #define IEP2_REG_DBG_FRM_CNT 0x0058 #define IEP2_REG_DBG_TIMEOUT_CNT 0x005c #define IEP2_REG_SRC_ADDR_CURY 0x0060 diff --git a/kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h b/kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h index cd84951..6a5601b 100644 --- a/kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h +++ b/kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h @@ -4,38 +4,122 @@ #include "rga_drv.h" -#define RGA2_USE_MASTER_MODE 1 +#define RGA2_SYS_REG_BASE 0x000 +#define RGA2_CSC_REG_BASE 0x060 +#define RGA2_CMD_REG_BASE 0x100 -/* General Registers */ -#define RGA2_SYS_CTRL 0x000 -#define RGA2_CMD_CTRL 0x004 -#define RGA2_CMD_BASE 0x008 -#define RGA2_STATUS 0x00c -#define RGA2_INT 0x010 -#define RGA2_MMU_CTRL0 0x018 -#define RGA2_MMU_CMD_BASE 0x01c -#define RGA2_VERSION_NUM 0x028 +/* sys reg */ +#define RGA2_SYS_CTRL 0x000 +#define RGA2_CMD_CTRL 0x004 +#define RGA2_CMD_BASE 0x008 +#define RGA2_STATUS1 0x00c +#define RGA2_INT 0x010 +#define RGA2_MMU_CTRL0 0x014 +#define RGA2_MMU_CMD_BASE 0x018 +#define RGA2_STATUS2 0x01c +#define RGA2_VERSION_NUM 0x028 +#define RGA2_READ_LINE_CNT 0x030 +#define RGA2_WRITE_LINE_CNT 0x034 +#define RGA2_LINE_CNT 0x038 +#define RGA2_PERF_CTRL0 0x040 -#define rRGA_SYS_CTRL (*(volatile u32 *)(RGA2_BASE + RGA2_SYS_CTRL_OFFSET)) -#define rRGA_CMD_CTRL (*(volatile u32 *)(RGA2_BASE + RGA2_CMD_CTRL_OFFSET)) -#define rRGA_CMD_BASE (*(volatile u32 *)(RGA2_BASE + RGA2_CMD_BASE_OFFSET)) -#define rRGA_STATUS (*(volatile u32 *)(RGA2_BASE + RGA2_STATUS_OFFSET)) -#define rRGA_INT (*(volatile u32 *)(RGA2_BASE + RGA2_INT_OFFSET)) -#define rRGA_MMU_CTRL0 (*(volatile u32 *)(RGA2_BASE + RGA2_MMU_CTRL0_OFFSET)) -#define rRGA_MMU_CMD_BASE (*(volatile u32 *)(RGA2_BASE + RGA2_MMU_CMD_BASE_OFFSET)) -#define rRGA_CMD_ADDR (*(volatile u32 *)(RGA2_BASE + RGA2_CMD_ADDR)) -#define rRGA_READ_LINE_CNT_TH (*(volatile u32 *)(RGA2_BASE + RGA2_READ_LINE_CNT_OFFSET)) -#define rRGA_WRITE_LINE_CNT_TH (*(volatile u32 *)(RGA2_BASE + RGA2_WRITE_LINE_CNT_OFFSET)) -#define rRGA_INT_LINE_CNT (*(volatile u32 *)(RGA2_BASE + RGA2_LINE_CNT_OFFSET)) -#define rRGA_PERF_CTRL0 (*(volatile u32 *)(RGA2_BASE + RGA2_PERF_CTRL0_OFFSET)) -#define rRGA_OSD_CUR_FLAGS0 (*(volatile u32 *)(RGA2_BASE + RGA2_OSD_CUR_FLAGS0)) -#define rRGA_OSD_CUR_FLAGS1 (*(volatile u32 *)(RGA2_BASE + RGA2_OSD_CUR_FLAGS1)) +/* full csc reg */ +#define RGA2_DST_CSC_00 0x060 +#define RGA2_DST_CSC_01 0x064 +#define RGA2_DST_CSC_02 0x068 +#define RGA2_DST_CSC_OFF0 0x06c +#define RGA2_DST_CSC_10 0x070 +#define RGA2_DST_CSC_11 0x074 +#define RGA2_DST_CSC_12 0x078 +#define RGA2_DST_CSC_OFF1 0x07c +#define RGA2_DST_CSC_20 0x080 +#define RGA2_DST_CSC_21 0x084 +#define RGA2_DST_CSC_22 0x088 +#define RGA2_DST_CSC_OFF2 0x08c + +/* osd read-back reg */ +#define RGA2_OSD_CUR_FLAGS0 0x090 +#define RGA2_OSD_CUR_FLAGS1 0x09c + +/* mode ctrl */ +#define RGA2_MODE_CTRL_OFFSET 0x000 +#define RGA2_SRC_INFO_OFFSET 0x004 +#define RGA2_SRC_BASE0_OFFSET 0x008 +#define RGA2_SRC_BASE1_OFFSET 0x00c +#define RGA2_SRC_BASE2_OFFSET 0x010 +#define RGA2_SRC_BASE3_OFFSET 0x014 +#define RGA2_SRC_VIR_INFO_OFFSET 0x018 +#define RGA2_SRC_ACT_INFO_OFFSET 0x01c +#define RGA2_SRC_X_FACTOR_OFFSET 0x020 +#define RGA2_OSD_CTRL0_OFFSET 0x020 // repeat +#define RGA2_SRC_Y_FACTOR_OFFSET 0x024 +#define RGA2_OSD_CTRL1_OFFSET 0x024 // repeat +#define RGA2_SRC_BG_COLOR_OFFSET 0x028 +#define RGA2_OSD_COLOR0_OFFSET 0x028 // repeat +#define RGA2_SRC_FG_COLOR_OFFSET 0x02c +#define RGA2_OSD_COLOR1_OFFSET 0x02c // repeat +#define RGA2_SRC_TR_COLOR0_OFFSET 0x030 +#define RGA2_CF_GR_A_OFFSET 0x030 // repeat +#define RGA2_OSD_LAST_FLAGS0_OFFSET 0x030 // repeat +#define RGA2_MOSAIC_MODE_OFFSET 0x030 // repeat +#define RGA2_SRC_TR_COLOR1_OFFSET 0x034 +#define RGA2_CF_GR_B_OFFSET 0x034 // repeat +#define RGA2_OSD_LAST_FLAGS1_OFFSET 0x034 // repeat +#define RGA2_DST_INFO_OFFSET 0x038 +#define RGA2_DST_BASE0_OFFSET 0x03c +#define RGA2_DST_BASE1_OFFSET 0x040 +#define RGA2_DST_BASE2_OFFSET 0x044 +#define RGA2_DST_VIR_INFO_OFFSET 0x048 +#define RGA2_DST_ACT_INFO_OFFSET 0x04c +#define RGA2_ALPHA_CTRL0_OFFSET 0x050 +#define RGA2_ALPHA_CTRL1_OFFSET 0x054 +#define RGA2_FADING_CTRL_OFFSET 0x058 +#define RGA2_PAT_CON_OFFSET 0x05c +#define RGA2_ROP_CTRL0_OFFSET 0x060 +#define RGA2_CF_GR_G_OFFSET 0x060 // repeat +#define RGA2_DST_Y4MAP_LUT0_OFFSET 0x060 // repeat +#define RGA2_DST_QUANTIZE_SCALE_OFFSET 0x060 // repeat +#define RGA2_OSD_INVERTSION_CAL0_OFFSET 0x060 // repeat +#define RGA2_ROP_CTRL1_OFFSET 0x064 +#define RGA2_CF_GR_R_OFFSET 0x064 // repeat +#define RGA2_DST_Y4MAP_LUT1_OFFSET 0x064 // repeat +#define RGA2_DST_QUANTIZE_OFFSET_OFFSET 0x064 // repeat +#define RGA2_OSD_INVERTSION_CAL1_OFFSET 0x064 // repeat +#define RGA2_MASK_BASE_OFFSET 0x068 +#define RGA2_MMU_CTRL1_OFFSET 0x06c +#define RGA2_MMU_SRC_BASE_OFFSET 0x070 +#define RGA2_MMU_SRC1_BASE_OFFSET 0x074 +#define RGA2_MMU_DST_BASE_OFFSET 0x078 +#define RGA2_MMU_ELS_BASE_OFFSET 0x07c /*RGA_SYS*/ -#define m_RGA2_SYS_HOLD_MODE_EN (1 << 9) +#define m_RGA2_SYS_CTRL_SRC0YUV420SP_RD_OPT_DIS (0x1 << 12) +#define m_RGA2_SYS_CTRL_DST_WR_OPT_DIS (0x1 << 11) +#define m_RGA2_SYS_CTRL_CMD_CONTINUE_P (0x1 << 10) +#define m_RGA2_SYS_CTRL_HOLD_MODE_EN (0x1 << 9) +#define m_RGA2_SYS_CTRL_RST_HANDSAVE_P (0x1 << 7) +#define m_RGA2_SYS_CTRL_RST_PROTECT_P (0x1 << 6) +#define m_RGA2_SYS_CTRL_AUTO_RST (0x1 << 5) +#define m_RGA2_SYS_CTRL_CCLK_SRESET_P (0x1 << 4) +#define m_RGA2_SYS_CTRL_ACLK_SRESET_P (0x1 << 3) +#define m_RGA2_SYS_CTRL_AUTO_CKG (0x1 << 2) +#define m_RGA2_SYS_CTRL_CMD_MODE (0x1 << 1) +#define m_RGA2_SYS_CTRL_CMD_OP_ST_P (0x1 << 0) -#define s_RGA2_SYS_HOLD_MODE_EN(x) ((x & 0x1) << 9) -#define s_RGA2_SYS_CMD_CONTINUE(x) ((x & 0x1) << 10) +#define s_RGA2_SYS_CTRL_CMD_CONTINUE(x) ((x & 0x1) << 10) +#define s_RGA2_SYS_CTRL_HOLD_MODE_EN(x) ((x & 0x1) << 9) +#define s_RGA2_SYS_CTRL_CMD_MODE(x) ((x & 0x1) << 1) + +/* RGA_CMD_CTRL */ +#define m_RGA2_CMD_CTRL_INCR_NUM (0x3ff << 3) +#define m_RGA2_CMD_CTRL_STOP (0x1 << 2) +#define m_RGA2_CMD_CTRL_INCR_VALID_P (0x1 << 1) +#define m_RGA2_CMD_CTRL_CMD_LINE_ST_P (0x1 << 0) + +/* RGA_STATUS1 */ +#define m_RGA2_STATUS1_SW_CMD_TOTAL_NUM (0xfff << 8) +#define m_RGA2_STATUS1_SW_CMD_CUR_NUM (0xfff << 8) +#define m_RGA2_STATUS1_SW_RGA_STA (0x1 << 0) /*RGA_INT*/ #define m_RGA2_INT_LINE_WR_CLEAR (1 << 16) @@ -56,6 +140,22 @@ #define m_RGA2_INT_MMU_INT_FLAG (1 << 1) #define m_RGA2_INT_ERROR_INT_FLAG (1 << 0) +#define m_RGA2_INT_ERROR_FLAG_MASK \ + ( \ + m_RGA2_INT_MMU_INT_FLAG | \ + m_RGA2_INT_ERROR_INT_FLAG \ + ) +#define m_RGA2_INT_ERROR_CLEAR_MASK \ + ( \ + m_RGA2_INT_MMU_INT_CLEAR | \ + m_RGA2_INT_ERROR_INT_CLEAR \ +) +#define m_RGA2_INT_ERROR_ENABLE_MASK \ + ( \ + m_RGA2_INT_MMU_INT_EN | \ + m_RGA2_INT_ERROR_INT_EN \ + ) + #define s_RGA2_INT_LINE_WR_CLEAR(x) ((x & 0x1) << 16) #define s_RGA2_INT_LINE_RD_CLEAR(x) ((x & 0x1) << 15) #define s_RGA2_INT_LINE_WR_EN(x) ((x & 0x1) << 14) @@ -67,6 +167,13 @@ #define s_RGA2_INT_ALL_CMD_DONE_INT_CLEAR(x) ((x & 0x1) << 6) #define s_RGA2_INT_MMU_INT_CLEAR(x) ((x & 0x1) << 5) #define s_RGA2_INT_ERROR_INT_CLEAR(x) ((x & 0x1) << 4) + +/* RGA_STATUS2 hardware status */ +#define m_RGA2_STATUS2_RPP_MKRAM_RREADY (0x2 << 11) +#define m_RGA2_STATUS2_DSTRPP_OUTBUF_RREADY (0x1f << 6) +#define m_RGA2_STATUS2_SRCRPP_OUTBUF_RREADY (0xf << 2) +#define m_RGA2_STATUS2_BUS_ERROR (0x1 << 1) +#define m_RGA2_STATUS2_RPP_ERROR (0x1 << 0) /* RGA_READ_LINE_CNT_TH */ #define m_RGA2_READ_LINE_SW_INTR_LINE_RD_TH (0x1fff << 0) @@ -325,95 +432,9 @@ #define s_RGA2_MMU_CTRL1_SW_ELS_MMU_EN(x) ((x & 0x1) << 12) #define s_RGA2_MMU_CTRL1_SW_ELS_MMU_FLUSH(x) ((x & 0x1) << 13) -/* sys ctrl */ -#define RGA2_SYS_CTRL_OFFSET 0x0 -#define RGA2_CMD_CTRL_OFFSET 0x4 -#define RGA2_CMD_BASE_OFFSET 0x8 -#define RGA2_STATUS_OFFSET 0xc -#define RGA2_INT_OFFSET 0x10 -#define RGA2_MMU_CTRL0_OFFSET 0x14 -#define RGA2_MMU_CMD_BASE_OFFSET 0x18 -#define RGA2_READ_LINE_CNT_OFFSET 0x30 -#define RGA2_WRITE_LINE_CNT_OFFSET 0x34 -#define RGA2_LINE_CNT_OFFSET 0x38 -#define RGA2_PERF_CTRL0_OFFSET 0x40 -#define RGA2_DST_CSC_00_OFFSET 0x60 -#define RGA2_DST_CSC_01_OFFSET 0x64 -#define RGA2_DST_CSC_02_OFFSET 0x68 -#define RGA2_DST_CSC_OFF0_OFFSET 0x6c -#define RGA2_DST_CSC_10_OFFSET 0x70 -#define RGA2_DST_CSC_11_OFFSET 0x74 -#define RGA2_DST_CSC_12_OFFSET 0x78 -#define RGA2_DST_CSC_OFF1_OFFSET 0x7c -#define RGA2_DST_CSC_20_OFFSET 0x80 -#define RGA2_DST_CSC_21_OFFSET 0x84 -#define RGA2_DST_CSC_22_OFFSET 0x88 -#define RGA2_DST_CSC_OFF2_OFFSET 0x8c -#define RGA2_OSD_CUR_FLAGS0_OFFSET 0x90 -#define RGA2_OSD_CUR_FLAGS1_OFFSET 0x9c +#define RGA2_VSP_BICUBIC_LIMIT 1996 -/* mode ctrl */ -#define RGA2_MODE_CTRL_OFFSET 0x00 -#define RGA2_SRC_INFO_OFFSET 0x04 -#define RGA2_SRC_BASE0_OFFSET 0x08 -#define RGA2_SRC_BASE1_OFFSET 0x0c -#define RGA2_SRC_BASE2_OFFSET 0x10 -#define RGA2_SRC_BASE3_OFFSET 0x14 -#define RGA2_SRC_VIR_INFO_OFFSET 0x18 -#define RGA2_SRC_ACT_INFO_OFFSET 0x1c -#define RGA2_SRC_X_FACTOR_OFFSET 0x20 -#define RGA2_OSD_CTRL0_OFFSET 0x20 // repeat -#define RGA2_SRC_Y_FACTOR_OFFSET 0x24 -#define RGA2_OSD_CTRL1_OFFSET 0x24 // repeat -#define RGA2_SRC_BG_COLOR_OFFSET 0x28 -#define RGA2_OSD_COLOR0_OFFSET 0x28 // repeat -#define RGA2_SRC_FG_COLOR_OFFSET 0x2c -#define RGA2_OSD_COLOR1_OFFSET 0x2c // repeat -#define RGA2_SRC_TR_COLOR0_OFFSET 0x30 -#define RGA2_CF_GR_A_OFFSET 0x30 // repeat -#define RGA2_OSD_LAST_FLAGS0_OFFSET 0x30 // repeat -#define RGA2_MOSAIC_MODE_OFFSET 0x30 // repeat -#define RGA2_SRC_TR_COLOR1_OFFSET 0x34 -#define RGA2_CF_GR_B_OFFSET 0x34 // repeat -#define RGA2_OSD_LAST_FLAGS1_OFFSET 0x34 // repeat -#define RGA2_DST_INFO_OFFSET 0x38 -#define RGA2_DST_BASE0_OFFSET 0x3c -#define RGA2_DST_BASE1_OFFSET 0x40 -#define RGA2_DST_BASE2_OFFSET 0x44 -#define RGA2_DST_VIR_INFO_OFFSET 0x48 -#define RGA2_DST_ACT_INFO_OFFSET 0x4c -#define RGA2_ALPHA_CTRL0_OFFSET 0x50 -#define RGA2_ALPHA_CTRL1_OFFSET 0x54 -#define RGA2_FADING_CTRL_OFFSET 0x58 -#define RGA2_PAT_CON_OFFSET 0x5c -#define RGA2_ROP_CTRL0_OFFSET 0x60 -#define RGA2_CF_GR_G_OFFSET 0x60 // repeat -#define RGA2_DST_Y4MAP_LUT0_OFFSET 0x60 // repeat -#define RGA2_DST_QUANTIZE_SCALE_OFFSET 0x60 // repeat -#define RGA2_OSD_INVERTSION_CAL0_OFFSET 0x60 // repeat -#define RGA2_ROP_CTRL1_OFFSET 0x64 -#define RGA2_CF_GR_R_OFFSET 0x64 // repeat -#define RGA2_DST_Y4MAP_LUT1_OFFSET 0x64 // repeat -#define RGA2_DST_QUANTIZE_OFFSET_OFFSET 0x64 // repeat -#define RGA2_OSD_INVERTSION_CAL1_OFFSET 0x64 // repeat -#define RGA2_MASK_BASE_OFFSET 0x68 -#define RGA2_MMU_CTRL1_OFFSET 0x6c -#define RGA2_MMU_SRC_BASE_OFFSET 0x70 -#define RGA2_MMU_SRC1_BASE_OFFSET 0x74 -#define RGA2_MMU_DST_BASE_OFFSET 0x78 -#define RGA2_MMU_ELS_BASE_OFFSET 0x7c - -#define RGA2_SYS_REG_BASE 0x0 -#define RGA2_CSC_REG_BASE 0x60 -#define RGA2_CMD_REG_BASE 0x100 - -int rga2_gen_reg_info(unsigned char *base, struct rga2_req *msg); - -void rga2_soft_reset(struct rga_scheduler_t *scheduler); -int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler); -int rga2_init_reg(struct rga_job *job); -int rga2_get_version(struct rga_scheduler_t *scheduler); -void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler); +extern const struct rga_backend_ops rga2_ops; #endif diff --git a/kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h b/kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h index d8eba9f..88d05a5 100644 --- a/kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h +++ b/kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h @@ -4,451 +4,492 @@ #include "rga_drv.h" -//General Registers -/* yqw: status和int寄存器尚不明了,无法进行修改。 */ -//#define RGA2_STATUS 0x00c -//#define RGA2_INT 0x010 +/* sys reg */ +#define RGA3_SYS_CTRL 0x000 +#define RGA3_CMD_CTRL 0x004 +#define RGA3_CMD_ADDR 0x008 +#define RGA3_MI_GROUP_CTRL 0x00c +#define RGA3_ARQOS_CTRL 0x010 +#define RGA3_VERSION_NUM 0x018 +#define RGA3_VERSION_TIM 0x01c +#define RGA3_INT_EN 0x020 +#define RGA3_INT_RAW 0x024 +#define RGA3_INT_MSK 0x028 +#define RGA3_INT_CLR 0x02c +#define RGA3_RO_SRST 0x030 +#define RGA3_STATUS0 0x034 +#define RGA3_SCAN_CNT 0x038 +#define RGA3_CMD_STATE 0x040 -#define RGA3_SYS_CTRL 0x000 -#define RGA3_CMD_CTRL 0x004 -#define RGA3_CMD_ADDR 0x008 -#define RGA3_MI_GROUP_CTRL 0x00c -#define RGA3_ARQOS_CTRL 0x010 -#define RGA3_VERSION_NUM 0x018 -#define RGA3_VERSION_TIM 0x01c -#define RGA3_INT_EN 0x020 -#define RGA3_INT_RAW 0x024 -#define RGA3_INT_MSK 0x028 -#define RGA3_INT_CLR 0x02c -#define RGA3_RO_SRST 0x030 -#define RGA3_STATUS0 0x034 -#define RGA3_SCAN_CNT 0x038 -#define RGA3_STATUS1 0x03c -#define RGA3_CMD_STATE 0x040 +/* cmd reg */ +#define RGA3_WIN0_RD_CTRL_OFFSET 0x000 +#define RGA3_WIN0_Y_BASE_OFFSET 0x010 +#define RGA3_WIN0_U_BASE_OFFSET 0x014 +#define RGA3_WIN0_V_BASE_OFFSET 0x018 +#define RGA3_WIN0_VIR_STRIDE_OFFSET 0x01c +#define RGA3_WIN0_FBC_OFF_OFFSET 0x020 +#define RGA3_WIN0_SRC_SIZE_OFFSET 0x024 +#define RGA3_WIN0_ACT_OFF_OFFSET 0x028 +#define RGA3_WIN0_ACT_SIZE_OFFSET 0x02c +#define RGA3_WIN0_DST_SIZE_OFFSET 0x030 +#define RGA3_WIN0_SCL_FAC_OFFSET 0x034 +#define RGA3_WIN0_UV_VIR_STRIDE_OFFSET 0x038 +#define RGA3_WIN1_RD_CTRL_OFFSET 0x040 +#define RGA3_WIN1_Y_BASE_OFFSET 0x050 +#define RGA3_WIN1_U_BASE_OFFSET 0x054 +#define RGA3_WIN1_V_BASE_OFFSET 0x058 +#define RGA3_WIN1_VIR_STRIDE_OFFSET 0x05c +#define RGA3_WIN1_FBC_OFF_OFFSET 0x060 +#define RGA3_WIN1_SRC_SIZE_OFFSET 0x064 +#define RGA3_WIN1_ACT_OFF_OFFSET 0x068 +#define RGA3_WIN1_ACT_SIZE_OFFSET 0x06c +#define RGA3_WIN1_DST_SIZE_OFFSET 0x070 +#define RGA3_WIN1_SCL_FAC_OFFSET 0x074 +#define RGA3_WIN1_UV_VIR_STRIDE_OFFSET 0x078 +#define RGA3_OVLP_CTRL_OFFSET 0x080 +#define RGA3_OVLP_OFF_OFFSET 0x084 +#define RGA3_OVLP_TOP_KEY_MIN_OFFSET 0x088 +#define RGA3_OVLP_TOP_KEY_MAX_OFFSET 0x08c +#define RGA3_OVLP_TOP_CTRL_OFFSET 0x090 +#define RGA3_OVLP_BOT_CTRL_OFFSET 0x094 +#define RGA3_OVLP_TOP_ALPHA_OFFSET 0x098 +#define RGA3_OVLP_BOT_ALPHA_OFFSET 0x09c +#define RGA3_WR_CTRL_OFFSET 0x0a0 +#define RGA3_WR_FBCE_CTRL_OFFSET 0x0a4 +#define RGA3_WR_VIR_STRIDE_OFFSET 0x0a8 +#define RGA3_WR_PL_VIR_STRIDE_OFFSET 0x0ac +#define RGA3_WR_Y_BASE_OFFSET 0x0b0 +#define RGA3_WR_U_BASE_OFFSET 0x0b4 +#define RGA3_WR_V_BASE_OFFSET 0x0b8 -/* TODO: RGA_INT */ +/* RGA3_SYS_CTRL */ +#define m_RGA3_SYS_CTRL_FRMEND_AUTO_RSTN_EN (0x1 << 11) +#define m_RGA3_SYS_CTRL_RGA_BIC_MODE (0x3 << 9) +#define m_RGA3_SYS_CTRL_RGA_RAM_CLK_ON (0x1 << 8) +#define m_RGA3_SYS_CTRL_CCLK_SRESET (0x1 << 4) +#define m_RGA3_SYS_CTRL_ACLK_SRESET (0x1 << 3) +#define m_RGA3_SYS_CTRL_RGA_LGC_CLK_ON (0x1 << 2) +#define m_RGA3_SYS_CTRL_CMD_MODE (0x1 << 1) +#define m_RGA3_SYS_CTRL_RGA_SART (0x1 << 0) + +#define s_RGA3_SYS_CTRL_RGA_BIC_MODE(x) ((x & 0x3) << 9) +#define s_RGA3_SYS_CTRL_CCLK_SRESET(x) ((x & 0x1) << 4) +#define s_RGA3_SYS_CTRL_ACLK_SRESET(x) ((x & 0x1) << 3) +#define s_RGA3_SYS_CTRL_CMD_MODE(x) ((x & 0x1) << 1) + +/* TODO: RGA3_INT_EN/RGA3_INT_RAW/RGA3_INT_MSK/RGA3_INT_CLR */ +#define m_RGA3_INT_WIN1_VOR_FIFO_REN_ERR (0x1 << 29) +#define m_RGA3_INT_WIN1_VOR_FIFO_WEN_ERR (0x1 << 28) +#define m_RGA3_INT_WIN1_HOR_FIFO_REN_ERR (0x1 << 27) +#define m_RGA3_INT_WIN1_HOR_FIFO_WEN_ERR (0x1 << 26) +#define m_RGA3_INT_WIN1_IN_FIFO_REB_ERR (0x1 << 25) +#define m_RGA3_INT_WIN1_IN_FIFO_WEN_ERR (0x1 << 24) +#define m_RGA3_INT_WIN0_VOR_FIFO_REN_ERR (0x1 << 21) +#define m_RGA3_INT_WIN0_VOR_FIFO_WEN_ERR (0x1 << 20) +#define m_RGA3_INT_WIN0_HOR_FIFO_REN_ERR (0x1 << 19) +#define m_RGA3_INT_WIN0_HOR_FIFO_WEN_ERR (0x1 << 18) +#define m_RGA3_INT_WIN0_IN_FIFO_REB_ERR (0x1 << 17) +#define m_RGA3_INT_WIN0_IN_FIFO_WEN_ERR (0x1 << 16) +#define m_RGA3_INT_RGA_MI_WR_BUS_ERR (0x1 << 15) +#define m_RGA3_INT_RGA_MI_WR_IN_HERR (0x1 << 14) +//The signal is invalid, it will be pulled up every time, no need to care. +// #define m_RGA3_INT_RGA_MI_WR_IN_VERR (0x1 << 13) +#define m_RGA3_INT_WIN1_V_ERR (0x1 << 11) +#define m_RGA3_INT_WIN1_H_ERR (0x1 << 10) +#define m_RGA3_INT_WIN1_FBCD_DEC_ERR (0x1 << 9) +#define m_RGA3_INT_WIN1_RD_FRM_END (0x1 << 8) //not error +#define m_RGA3_INT_WIN0_V_ERR (0x1 << 7) +#define m_RGA3_INT_WIN0_H_ERR (0x1 << 6) +#define m_RGA3_INT_WIN0_FBCD_DEC_ERR (0x1 << 5) +#define m_RGA3_INT_WIN0_RD_FRM_END (0x1 << 4) //not error +#define m_RGA3_INT_CMD_LINE_FINISH (0x1 << 3) //not error +#define m_RGA3_INT_RAG_MI_RD_BUS_ERR (0x1 << 2) +#define m_RGA3_INT_RGA_MMU_INTR (0x1 << 1) +#define m_RGA3_INT_FRM_DONE (0x1 << 0) //not error + +#define m_RGA3_INT_ERROR_MASK \ + ( \ + m_RGA3_INT_RGA_MMU_INTR | \ + m_RGA3_INT_RAG_MI_RD_BUS_ERR | \ + m_RGA3_INT_WIN0_FBCD_DEC_ERR | \ + m_RGA3_INT_WIN0_H_ERR | \ + m_RGA3_INT_WIN0_V_ERR | \ + m_RGA3_INT_WIN1_FBCD_DEC_ERR | \ + m_RGA3_INT_WIN1_H_ERR | \ + m_RGA3_INT_WIN1_V_ERR | \ + m_RGA3_INT_RGA_MI_WR_IN_HERR | \ + m_RGA3_INT_RGA_MI_WR_BUS_ERR | \ + m_RGA3_INT_WIN0_IN_FIFO_WEN_ERR | \ + m_RGA3_INT_WIN0_IN_FIFO_REB_ERR | \ + m_RGA3_INT_WIN0_HOR_FIFO_WEN_ERR | \ + m_RGA3_INT_WIN0_HOR_FIFO_REN_ERR| \ + m_RGA3_INT_WIN0_VOR_FIFO_WEN_ERR | \ + m_RGA3_INT_WIN0_VOR_FIFO_REN_ERR | \ + m_RGA3_INT_WIN1_IN_FIFO_WEN_ERR | \ + m_RGA3_INT_WIN1_IN_FIFO_REB_ERR | \ + m_RGA3_INT_WIN1_HOR_FIFO_WEN_ERR | \ + m_RGA3_INT_WIN1_HOR_FIFO_REN_ERR| \ + m_RGA3_INT_WIN1_VOR_FIFO_WEN_ERR | \ + m_RGA3_INT_WIN1_VOR_FIFO_REN_ERR \ + ) + +/* RGA3_CMD_CTRL */ +#define m_RGA3_CMD_CTRL_CMD_INCR_NUM (0x3ff << 3) +#define m_RGA3_CMD_CTRL_CMD_STOP_MODE (0x1 << 2) +#define m_RGA3_CMD_CTRL_CMD_INCR_VALID_P (0x1 << 1) +#define m_RGA3_CMD_CTRL_CMD_LINE_ST_P (0x1 << 0) + +/* RGA3_RO_SRST */ +#define m_RGA3_RO_SRST_RO_RST_DONE (0x3f << 0) + +/* RGA3_CMD_STATE */ +#define m_RGA3_CMD_STATE_CMD_CNT_CUR (0xfff << 16) +#define m_RGA3_CMD_STATE_CMD_WORKING (0x1 << 0) /* RGA3_WIN0_RD_CTRL */ -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ENABLE (0x1 << 0) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_MODE (0x3 << 1) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_PIC_FORMAT (0xf << 4) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_FORMAT (0x3 << 8) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YUV10B_COMPACT (0x1 << 10) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ENDIAN_MODE (0x1 << 11) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ENABLE (0x1 << 0) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_MODE (0x3 << 1) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_PIC_FORMAT (0xf << 4) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_FORMAT (0x3 << 8) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YUV10B_COMPACT (0x1 << 10) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ENDIAN_MODE (0x1 << 11) #define m_RGA3_WIN0_RD_CTRL_SW_WIN0_PIX_SWAP (0x1 << 12) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YC_SWAP (0x1 << 13) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT (0x1 << 16) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_XMIRROR (0x1 << 17) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR (0x1 << 18) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY (0x1 << 20) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP (0x1 << 21) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY (0x1 << 22) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP (0x1 << 23) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_Y2R_EN (0x1 << 24) -#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_R2Y_EN (0x1 << 25) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YC_SWAP (0x1 << 13) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT (0x1 << 16) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_XMIRROR (0x1 << 17) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR (0x1 << 18) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY (0x1 << 20) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP (0x1 << 21) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY (0x1 << 22) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP (0x1 << 23) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_Y2R_EN (0x1 << 24) +#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_R2Y_EN (0x1 << 25) #define m_RGA3_WIN0_RD_CTRL_SW_WIN0_CSC_MODE (0x3 << 26) #define m_RGA3_WIN0_RD_CTRL_SW_WIN0_PERF_OPT_DIS (0x1 << 29) #define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_ALIGN_DIS (0x1 << 30) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ENABLE(x) ((x & 0x1) << 0) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_MODE(x) ((x & 0x3) << 1) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PIC_FORMAT(x) ((x & 0xf) << 4) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ENABLE(x) ((x & 0x1) << 0) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_MODE(x) ((x & 0x3) << 1) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PIC_FORMAT(x) ((x & 0xf) << 4) #define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_FORMAT(x) ((x & 0x3) << 8) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YUV10B_COMPACT(x) ((x & 0x1) << 10) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ENDIAN_MODE(x) ((x & 0x1) << 11) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PIX_SWAP(x) ((x & 0x1) << 12) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YC_SWAP(x) ((x & 0x1) << 13) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT(x) ((x & 0x1) << 16) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_XMIRROR(x) ((x & 0x1) << 17) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR(x) ((x & 0x1) << 18) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x) ((x & 0x1) << 20) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x) ((x & 0x1) << 21) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(x) ((x & 0x1) << 22) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(x) ((x & 0x1) << 23) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_Y2R_EN(x) ((x & 0x1) << 24) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_R2Y_EN(x) ((x & 0x1) << 25) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_CSC_MODE(x) ((x & 0x3) << 26) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PERF_OPT_DIS(x) ((x & 0x1) << 29) -#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_ALIGN_DIS(x) ((x & 0x1) << 30) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YUV10B_COMPACT(x) ((x & 0x1) << 10) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ENDIAN_MODE(x) ((x & 0x1) << 11) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PIX_SWAP(x) ((x & 0x1) << 12) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YC_SWAP(x) ((x & 0x1) << 13) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT(x) ((x & 0x1) << 16) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_XMIRROR(x) ((x & 0x1) << 17) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR(x) ((x & 0x1) << 18) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x) ((x & 0x1) << 20) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x) ((x & 0x1) << 21) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(x) ((x & 0x1) << 22) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(x) ((x & 0x1) << 23) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_Y2R_EN(x) ((x & 0x1) << 24) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_R2Y_EN(x) ((x & 0x1) << 25) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_CSC_MODE(x) ((x & 0x3) << 26) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PERF_OPT_DIS(x) ((x & 0x1) << 29) +#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_ALIGN_DIS(x) ((x & 0x1) << 30) /* RGA3_WIN0_FBC_OFF */ #define m_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_XOFF (0x1fff << 0) #define m_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_YOFF (0x1fff << 16) -#define s_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_XOFF(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_YOFF(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_XOFF(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_YOFF(x) ((x & 0x1fff) << 16) /* RGA3_WIN0_SRC_SIZE */ -#define m_RGA3_WIN0_SRC_SIZE_SW_WIN0_SRC_WIDTH (0x1fff << 0) -#define m_RGA3_WIN0_SRC_SIZE_SW_WIN0_SRC_HEIGHT (0x1fff << 16) +#define m_RGA3_WIN0_SRC_SIZE_SW_WIN0_SRC_WIDTH (0x1fff << 0) +#define m_RGA3_WIN0_SRC_SIZE_SW_WIN0_SRC_HEIGHT (0x1fff << 16) -#define s_RGA3_WIN0_SRC_OFF_SW_WIN0_SRC_WIDTH(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN0_SRC_OFF_SW_WIN0_SRC_HEIGHT(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN0_SRC_OFF_SW_WIN0_SRC_WIDTH(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN0_SRC_OFF_SW_WIN0_SRC_HEIGHT(x) ((x & 0x1fff) << 16) /* RGA3_WIN0_ACT_OFF */ #define m_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_XOFF (0x1fff << 0) #define m_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_YOFF (0x1fff << 16) -#define s_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_XOFF(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_YOFF(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_XOFF(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_YOFF(x) ((x & 0x1fff) << 16) /* RGA3_WIN0_ACT_SIZE */ -#define m_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_WIDTH (0x1fff << 0) -#define m_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_HEIGHT (0x1fff << 16) +#define m_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_WIDTH (0x1fff << 0) +#define m_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_HEIGHT (0x1fff << 16) -#define s_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_WIDTH(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_HEIGHT(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_WIDTH(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_HEIGHT(x) ((x & 0x1fff) << 16) /* RGA3_WIN0_DST_SIZE */ -#define m_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_WIDTH (0x1fff << 0) -#define m_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_HEIGHT (0x1fff << 16) +#define m_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_WIDTH (0x1fff << 0) +#define m_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_HEIGHT (0x1fff << 16) -#define s_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_WIDTH(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_HEIGHT(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_WIDTH(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_HEIGHT(x) ((x & 0x1fff) << 16) /* RGA3_WIN0_SCL_FAC */ -#define m_RGA3_WIN0_SCL_FAC_SW_WIN0_VER_FAC (0xffff << 0) -#define m_RGA3_WIN0_SCL_FAC_SW_WIN0_HOR_FAC (0xffff << 16) +#define m_RGA3_WIN0_SCL_FAC_SW_WIN0_VER_FAC (0xffff << 0) +#define m_RGA3_WIN0_SCL_FAC_SW_WIN0_HOR_FAC (0xffff << 16) -#define s_RGA3_WIN0_SCL_FAC_SW_WIN0_VER_FAC(x) ((x & 0xffff) << 0) -#define s_RGA3_WIN0_SCL_FAC_SW_WIN0_HOR_FAC(x) ((x & 0xffff) << 16) +#define s_RGA3_WIN0_SCL_FAC_SW_WIN0_VER_FAC(x) ((x & 0xffff) << 0) +#define s_RGA3_WIN0_SCL_FAC_SW_WIN0_HOR_FAC(x) ((x & 0xffff) << 16) /* RGA3_WIN1_RD_CTRL */ -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ENABLE (0x1 << 0) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_MODE (0x3 << 1) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_PIC_FORMAT (0xf << 4) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_FORMAT (0x3 << 8) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YUV10B_COMPACT (0x1 << 10) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ENDIAN_MODE (0x1 << 11) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ENABLE (0x1 << 0) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_MODE (0x3 << 1) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_PIC_FORMAT (0xf << 4) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_FORMAT (0x3 << 8) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YUV10B_COMPACT (0x1 << 10) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ENDIAN_MODE (0x1 << 11) #define m_RGA3_WIN1_RD_CTRL_SW_WIN1_PIX_SWAP (0x1 << 12) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YC_SWAP (0x1 << 13) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ROT (0x1 << 16) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_XMIRROR (0x1 << 17) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YMIRROR (0x1 << 18) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_BY (0x1 << 20) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_UP (0x1 << 21) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_BY (0x1 << 22) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_UP (0x1 << 23) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_Y2R_EN (0x1 << 24) -#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_R2Y_EN (0x1 << 25) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YC_SWAP (0x1 << 13) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ROT (0x1 << 16) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_XMIRROR (0x1 << 17) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YMIRROR (0x1 << 18) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_BY (0x1 << 20) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_UP (0x1 << 21) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_BY (0x1 << 22) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_UP (0x1 << 23) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_Y2R_EN (0x1 << 24) +#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_R2Y_EN (0x1 << 25) #define m_RGA3_WIN1_RD_CTRL_SW_WIN1_CSC_MODE (0x3 << 26) #define m_RGA3_WIN1_RD_CTRL_SW_WIN1_PERF_OPT_DIS (0x1 << 29) #define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_ALIGN_DIS (0x1 << 30) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ENABLE(x) ((x & 0x1) << 0) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_MODE(x) ((x & 0x3) << 1) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PIC_FORMAT(x) ((x & 0xf) << 4) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ENABLE(x) ((x & 0x1) << 0) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_MODE(x) ((x & 0x3) << 1) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PIC_FORMAT(x) ((x & 0xf) << 4) #define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_FORMAT(x) ((x & 0x3) << 8) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YUV10B_COMPACT(x) ((x & 0x1) << 10) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ENDIAN_MODE(x) ((x & 0x1) << 11) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PIX_SWAP(x) ((x & 0x1) << 12) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YC_SWAP(x) ((x & 0x1) << 13) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ROT(x) ((x & 0x1) << 16) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_XMIRROR(x) ((x & 0x1) << 17) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YMIRROR(x) ((x & 0x1) << 18) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_BY(x) ((x & 0x1) << 20) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_UP(x) ((x & 0x1) << 21) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_BY(x) ((x & 0x1) << 22) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_UP(x) ((x & 0x1) << 23) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_Y2R_EN(x) ((x & 0x1) << 24) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_R2Y_EN(x) ((x & 0x1) << 25) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_CSC_MODE(x) ((x & 0x3) << 26) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PERF_OPT_DIS(x) ((x & 0x1) << 29) -#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_ALIGN_DIS(x) ((x & 0x1) << 30) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YUV10B_COMPACT(x) ((x & 0x1) << 10) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ENDIAN_MODE(x) ((x & 0x1) << 11) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PIX_SWAP(x) ((x & 0x1) << 12) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YC_SWAP(x) ((x & 0x1) << 13) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ROT(x) ((x & 0x1) << 16) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_XMIRROR(x) ((x & 0x1) << 17) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YMIRROR(x) ((x & 0x1) << 18) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_BY(x) ((x & 0x1) << 20) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_UP(x) ((x & 0x1) << 21) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_BY(x) ((x & 0x1) << 22) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_UP(x) ((x & 0x1) << 23) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_Y2R_EN(x) ((x & 0x1) << 24) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_R2Y_EN(x) ((x & 0x1) << 25) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_CSC_MODE(x) ((x & 0x3) << 26) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PERF_OPT_DIS(x) ((x & 0x1) << 29) +#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_ALIGN_DIS(x) ((x & 0x1) << 30) /* RGA3_WIN1_FBC_OFF */ #define m_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_XOFF (0x1fff << 0) #define m_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_YOFF (0x1fff << 16) -#define s_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_XOFF(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_YOFF(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_XOFF(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_YOFF(x) ((x & 0x1fff) << 16) /* RGA3_WIN1_SRC_SIZE */ -#define m_RGA3_WIN1_SRC_SIZE_SW_WIN1_SRC_WIDTH (0x1fff << 0) -#define m_RGA3_WIN1_SRC_SIZE_SW_WIN1_SRC_HEIGHT (0x1fff << 16) +#define m_RGA3_WIN1_SRC_SIZE_SW_WIN1_SRC_WIDTH (0x1fff << 0) +#define m_RGA3_WIN1_SRC_SIZE_SW_WIN1_SRC_HEIGHT (0x1fff << 16) -#define s_RGA3_WIN1_SRC_OFF_SW_WIN1_SRC_WIDTH(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN1_SRC_OFF_SW_WIN1_SRC_HEIGHT(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN1_SRC_OFF_SW_WIN1_SRC_WIDTH(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN1_SRC_OFF_SW_WIN1_SRC_HEIGHT(x) ((x & 0x1fff) << 16) /* RGA3_WIN1_ACT_OFF */ #define m_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_XOFF (0x1fff << 0) #define m_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_YOFF (0x1fff << 16) -#define s_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_XOFF(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_YOFF(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_XOFF(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_YOFF(x) ((x & 0x1fff) << 16) /* RGA3_WIN1_ACT_SIZE */ -#define m_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_WIDTH (0x1fff << 0) -#define m_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_HEIGHT (0x1fff << 16) +#define m_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_WIDTH (0x1fff << 0) +#define m_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_HEIGHT (0x1fff << 16) -#define s_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_WIDTH(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_HEIGHT(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_WIDTH(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_HEIGHT(x) ((x & 0x1fff) << 16) /* RGA3_WIN1_DST_SIZE */ -#define m_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_WIDTH (0x1fff << 0) -#define m_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_HEIGHT (0x1fff << 16) +#define m_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_WIDTH (0x1fff << 0) +#define m_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_HEIGHT (0x1fff << 16) -#define s_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_WIDTH(x) ((x & 0x1fff) << 0) -#define s_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_HEIGHT(x) ((x & 0x1fff) << 16) +#define s_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_WIDTH(x) ((x & 0x1fff) << 0) +#define s_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_HEIGHT(x) ((x & 0x1fff) << 16) /* RGA3_WIN1_SCL_FAC */ -#define m_RGA3_WIN1_SCL_FAC_SW_WIN1_VER_FAC (0xffff << 0) -#define m_RGA3_WIN1_SCL_FAC_SW_WIN1_HOR_FAC (0xffff << 16) +#define m_RGA3_WIN1_SCL_FAC_SW_WIN1_VER_FAC (0xffff << 0) +#define m_RGA3_WIN1_SCL_FAC_SW_WIN1_HOR_FAC (0xffff << 16) -#define s_RGA3_WIN1_SCL_FAC_SW_WIN1_VER_FAC(x) ((x & 0xffff) << 0) -#define s_RGA3_WIN1_SCL_FAC_SW_WIN1_HOR_FAC(x) ((x & 0xffff) << 16) +#define s_RGA3_WIN1_SCL_FAC_SW_WIN1_VER_FAC(x) ((x & 0xffff) << 0) +#define s_RGA3_WIN1_SCL_FAC_SW_WIN1_HOR_FAC(x) ((x & 0xffff) << 16) /* RGA3_OVLP_CTRL */ -#define m_RGA3_OVLP_CTRL_SW_OVLP_MODE (0x3 << 0) -#define m_RGA3_OVLP_CTRL_SW_OVLP_FIELD (0x1 << 2) -#define m_RGA3_OVLP_CTRL_SW_TOP_SWAP (0x1 << 3) -#define m_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN (0x1 << 4) -#define m_RGA3_OVLP_CTRL_SW_TOP_KEY_EN (0x7FFF << 5) -#define m_RGA3_OVLP_CTRL_SW_OVLP_Y2R_EN (0x1 << 20) -#define m_RGA3_OVLP_CTRL_SW_OVLP_R2Y_EN (0x1 << 21) -#define m_RGA3_OVLP_CTRL_SW_OVLP_CSC_MODE (0x3 << 22) +#define m_RGA3_OVLP_CTRL_SW_OVLP_MODE (0x3 << 0) +#define m_RGA3_OVLP_CTRL_SW_OVLP_FIELD (0x1 << 2) +#define m_RGA3_OVLP_CTRL_SW_TOP_SWAP (0x1 << 3) +#define m_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN (0x1 << 4) +#define m_RGA3_OVLP_CTRL_SW_TOP_KEY_EN (0x7FFF << 5) +#define m_RGA3_OVLP_CTRL_SW_OVLP_Y2R_EN (0x1 << 20) +#define m_RGA3_OVLP_CTRL_SW_OVLP_R2Y_EN (0x1 << 21) +#define m_RGA3_OVLP_CTRL_SW_OVLP_CSC_MODE (0x3 << 22) -#define s_RGA3_OVLP_CTRL_SW_OVLP_MODE(x) ((x & 0x3) << 0) -#define s_RGA3_OVLP_CTRL_SW_OVLP_FIELD(x) ((x & 0x1) << 2) -#define s_RGA3_OVLP_CTRL_SW_TOP_SWAP(x) ((x & 0x1) << 3) -#define s_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN(x) ((x & 0x1) << 4) -#define s_RGA3_OVLP_CTRL_SW_TOP_KEY_EN(x) ((x & 0x7FFF) << 5) -#define s_RGA3_OVLP_CTRL_SW_OVLP_Y2R_EN(x) ((x & 0x1) << 20) -#define s_RGA3_OVLP_CTRL_SW_OVLP_R2Y_EN(x) ((x & 0x1) << 21) -#define s_RGA3_OVLP_CTRL_SW_OVLP_CSC_MODE(x) ((x & 0x3) << 22) +#define s_RGA3_OVLP_CTRL_SW_OVLP_MODE(x) ((x & 0x3) << 0) +#define s_RGA3_OVLP_CTRL_SW_OVLP_FIELD(x) ((x & 0x1) << 2) +#define s_RGA3_OVLP_CTRL_SW_TOP_SWAP(x) ((x & 0x1) << 3) +#define s_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN(x) ((x & 0x1) << 4) +#define s_RGA3_OVLP_CTRL_SW_TOP_KEY_EN(x) ((x & 0x7FFF) << 5) +#define s_RGA3_OVLP_CTRL_SW_OVLP_Y2R_EN(x) ((x & 0x1) << 20) +#define s_RGA3_OVLP_CTRL_SW_OVLP_R2Y_EN(x) ((x & 0x1) << 21) +#define s_RGA3_OVLP_CTRL_SW_OVLP_CSC_MODE(x) ((x & 0x3) << 22) /* RGA3_OVLP_OFF */ -#define m_RGA3_OVLP_OFF_SW_OVLP_XOFF (0x1fff << 0) -#define m_RGA3_OVLP_OFF_SW_OVLP_YOFF (0x1fff << 16) +#define m_RGA3_OVLP_OFF_SW_OVLP_XOFF (0x1fff << 0) +#define m_RGA3_OVLP_OFF_SW_OVLP_YOFF (0x1fff << 16) -#define s_RGA3_OVLP_OFF_SW_OVLP_XOFF(x) ((x & 0x1fff) << 0) -#define s_RGA3_OVLP_OFF_SW_OVLP_YOFF(x) ((x & 0x1fff) << 16) +#define s_RGA3_OVLP_OFF_SW_OVLP_XOFF(x) ((x & 0x1fff) << 0) +#define s_RGA3_OVLP_OFF_SW_OVLP_YOFF(x) ((x & 0x1fff) << 16) /* RGA3_OVLP_TOP_KEY_MIN */ -#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_YG_MIN (0x3ff << 0) -#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_UB_MIN (0x3ff << 10) -#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_VR_MIN (0x3ff << 20) +#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_YG_MIN (0x3ff << 0) +#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_UB_MIN (0x3ff << 10) +#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_VR_MIN (0x3ff << 20) -#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_YG_MIN(x) ((x & 0x3f)f << 0) -#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_UB_MIN(x) ((x & 0x3ff) << 10) -#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_VR_MIN(x) ((x & 0x3ff) << 20) +#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_YG_MIN(x) ((x & 0x3f)f << 0) +#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_UB_MIN(x) ((x & 0x3ff) << 10) +#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_VR_MIN(x) ((x & 0x3ff) << 20) /* RGA3_OVLP_TOP_KEY_MAX */ -#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_YG_MAX (0x3ff << 0) -#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_UB_MAX (0x3ff << 10) -#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_VR_MAX (0x3ff << 20) +#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_YG_MAX (0x3ff << 0) +#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_UB_MAX (0x3ff << 10) +#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_VR_MAX (0x3ff << 20) -#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_YG_MAX(x) ((x & 0x3ff) << 0) -#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_UB_MAX(x) ((x & 0x3ff) << 10) -#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_VR_MAX(x) ((x & 0x3ff) << 20) +#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_YG_MAX(x) ((x & 0x3ff) << 0) +#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_UB_MAX(x) ((x & 0x3ff) << 10) +#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_VR_MAX(x) ((x & 0x3ff) << 20) /* RGA3_OVLP_TOP_CTRL */ #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_COLOR_M0 (0x1 << 0) #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_M0 (0x1 << 1) #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_BLEND_M0 (0x3 << 2) #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_CAL_M0 (0x1 << 4) -#define m_RGA3_OVLP_TOP_CTRL_SW_TOP_FACTOR_M0 (0x7 << 5) +#define m_RGA3_OVLP_TOP_CTRL_SW_TOP_FACTOR_M0 (0x7 << 5) #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_GLOBAL_ALPHA (0xff << 16) -#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_COLOR_M0(x) ((x & 0x1) << 0) -#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_M0(x) ((x & 0x1) << 1) -#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_BLEND_M0(x) ((x & 0x3) << 2) -#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_CAL_M0(x) ((x & 0x1) << 4) +#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_COLOR_M0(x) ((x & 0x1) << 0) +#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_M0(x) ((x & 0x1) << 1) +#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_BLEND_M0(x) ((x & 0x3) << 2) +#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_CAL_M0(x) ((x & 0x1) << 4) #define s_RGA3_OVLP_TOP_CTRL_SW_TOP_FACTOR_M0(x) ((x & 0x7) << 5) -#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_GLOBAL_ALPHA(x) ((x & 0xff) << 16) +#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_GLOBAL_ALPHA(x) ((x & 0xff) << 16) /* RGA3_OVLP_BOT_CTRL */ #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_COLOR_M0 (0x1 << 0) #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_M0 (0x1 << 1) #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_BLEND_M0 (0x3 << 2) #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_CAL_M0 (0x1 << 4) -#define m_RGA3_OVLP_BOT_CTRL_SW_BOT_FACTOR_M0 (0x7 << 5) +#define m_RGA3_OVLP_BOT_CTRL_SW_BOT_FACTOR_M0 (0x7 << 5) #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_GLOBAL_ALPHA (0xff << 16) -#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_COLOR_M0(x) ((x & 0x1) << 0) -#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_M0(x) ((x & 0x1) << 1) -#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_BLEND_M0(x) ((x & 0x3) << 2) -#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_CAL_M0(x) ((x & 0x1) << 4) +#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_COLOR_M0(x) ((x & 0x1) << 0) +#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_M0(x) ((x & 0x1) << 1) +#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_BLEND_M0(x) ((x & 0x3) << 2) +#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_CAL_M0(x) ((x & 0x1) << 4) #define s_RGA3_OVLP_BOT_CTRL_SW_BOT_FACTOR_M0(x) ((x & 0x7) << 5) -#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_GLOBAL_ALPHA(x) ((x & 0xff) << 16) +#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_GLOBAL_ALPHA(x) ((x & 0xff) << 16) /* RGA3_OVLP_TOP_ALPHA */ -#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_M1 (0x1 << 1) -#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_BLEND_M1 (0x3 << 2) -#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1 (0x1 << 4) -#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1 (0x7 << 5) +#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_M1 (0x1 << 1) +#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_BLEND_M1 (0x3 << 2) +#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1 (0x1 << 4) +#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1 (0x7 << 5) #define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_M1(x) ((x & 0x1) << 1) #define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_BLEND_M1(x) ((x & 0x3) << 2) -#define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1(x) ((x & 0x1) << 4) -#define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1(x) ((x & 0x7) << 5) +#define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1(x) ((x & 0x1) << 4) +#define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1(x) ((x & 0x7) << 5) /* RGA3_OVLP_BOT_ALPHA */ -#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_M1 (0x1 << 1) -#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_BLEND_M1 (0x3 << 2) -#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1 (0x1 << 4) -#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1 (0x7 << 5) +#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_M1 (0x1 << 1) +#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_BLEND_M1 (0x3 << 2) +#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1 (0x1 << 4) +#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1 (0x7 << 5) #define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_M1(x) ((x & 0x1) << 1) #define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_BLEND_M1(x) ((x & 0x3) << 2) -#define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1(x) ((x & 0x1) << 4) -#define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1(x) ((x & 0x7) << 5) +#define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1(x) ((x & 0x1) << 4) +#define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1(x) ((x & 0x7) << 5) /* RGA3_WR_CTRL */ -#define m_RGA3_WR_CTRL_SW_WR_MODE (0x3 << 0) -#define m_RGA3_WR_CTRL_SW_WR_FBCE_SPARSE_EN (0x1 << 2) -#define m_RGA3_WR_CTRL_SW_WR_PIC_FORMAT (0xf << 4) +#define m_RGA3_WR_CTRL_SW_WR_MODE (0x3 << 0) +#define m_RGA3_WR_CTRL_SW_WR_FBCE_SPARSE_EN (0x1 << 2) +#define m_RGA3_WR_CTRL_SW_WR_PIC_FORMAT (0xf << 4) #define m_RGA3_WR_CTRL_SW_WR_FORMAT (0x3 << 8) -#define m_RGA3_WR_CTRL_SW_WR_YUV10B_COMPACT (0x1 << 10) -#define m_RGA3_WR_CTRL_SW_WR_ENDIAN_MODE (0x1 << 11) -#define m_RGA3_WR_CTRL_SW_WR_PIX_SWAP (0x1 << 12) -#define m_RGA3_WR_CTRL_SW_OUTSTANDING_MAX (0x3f << 13) -#define m_RGA3_WR_CTRL_SW_WR_YC_SWAP (0x1 << 20) +#define m_RGA3_WR_CTRL_SW_WR_YUV10B_COMPACT (0x1 << 10) +#define m_RGA3_WR_CTRL_SW_WR_ENDIAN_MODE (0x1 << 11) +#define m_RGA3_WR_CTRL_SW_WR_PIX_SWAP (0x1 << 12) +#define m_RGA3_WR_CTRL_SW_OUTSTANDING_MAX (0x3f << 13) +#define m_RGA3_WR_CTRL_SW_WR_YC_SWAP (0x1 << 20) -#define s_RGA3_WR_CTRL_SW_WR_MODE(x) ((x & 0x3) << 0) -#define s_RGA3_WR_CTRL_SW_WR_FBCE_SPARSE_EN(x) ((x & 0x1) << 2) -#define s_RGA3_WR_CTRL_SW_WR_PIC_FORMAT(x) ((x & 0xf) << 4) -#define s_RGA3_WR_CTRL_SW_WR_FORMAT(x) ((x & 0x3) << 8) -#define s_RGA3_WR_CTRL_SW_WR_YUV10B_COMPACT(x) ((x & 0x1) << 10) -#define s_RGA3_WR_CTRL_SW_WR_ENDIAN_MODE(x) ((x & 0x1) << 11) -#define s_RGA3_WR_CTRL_SW_WR_PIX_SWAP(x) ((x & 0x1) << 12) -#define s_RGA3_WR_CTRL_SW_OUTSTANDING_MAX(x) ((x & 0x3f) << 13) -#define s_RGA3_WR_CTRL_SW_WR_YC_SWAP(x) ((x & 0x1) << 20) +#define s_RGA3_WR_CTRL_SW_WR_MODE(x) ((x & 0x3) << 0) +#define s_RGA3_WR_CTRL_SW_WR_FBCE_SPARSE_EN(x) ((x & 0x1) << 2) +#define s_RGA3_WR_CTRL_SW_WR_PIC_FORMAT(x) ((x & 0xf) << 4) +#define s_RGA3_WR_CTRL_SW_WR_FORMAT(x) ((x & 0x3) << 8) +#define s_RGA3_WR_CTRL_SW_WR_YUV10B_COMPACT(x) ((x & 0x1) << 10) +#define s_RGA3_WR_CTRL_SW_WR_ENDIAN_MODE(x) ((x & 0x1) << 11) +#define s_RGA3_WR_CTRL_SW_WR_PIX_SWAP(x) ((x & 0x1) << 12) +#define s_RGA3_WR_CTRL_SW_OUTSTANDING_MAX(x) ((x & 0x3f) << 13) +#define s_RGA3_WR_CTRL_SW_WR_YC_SWAP(x) ((x & 0x1) << 20) /* RGA3_WR_FBCE_CTRL */ -#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_BLKBD_OPT_DIS (0x1 << 0) +#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_BLKBD_OPT_DIS (0x1 << 0) #define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_HOFF_DISS (0x1 << 1) -#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO0_WATERMARK (0x3f << 2) -#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO1_WATERMARK (0x3f << 8) -#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_SIZE_ALIGN_DIS (0x1 << 31) +#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO0_WATERMARK (0x3f << 2) +#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO1_WATERMARK (0x3f << 8) +#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_SIZE_ALIGN_DIS (0x1 << 31) -#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_BLKBD_OPT_DIS(x) ((x & 0x1) << 0) +#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_BLKBD_OPT_DIS(x) ((x & 0x1) << 0) #define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_HOFF_DISS(x) ((x & 0x1) << 1) -#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO0_WATERMARK(x) ((x & 0x3f) << 2) -#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO1_WATERMARK(x) ((x & 0x3f) << 8) -#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_SIZE_ALIGN_DIS(x) ((x & 0x1) << 31) +#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO0_WATERMARK(x) ((x & 0x3f) << 2) +#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO1_WATERMARK(x) ((x & 0x3f) << 8) +#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_SIZE_ALIGN_DIS(x) ((x & 0x1) << 31) /* RGA3_MMU_STATUS read_only */ -#define m_RGA3_MMU_STATUS_PAGING_ENABLED (0x1 << 0) -#define m_RGA3_MMU_STATUS_PAGE_FAULT_ACTIVE (0x1 << 1) -#define m_RGA3_MMU_STATUS_STAIL_ACTIVE (0x1 << 2) -#define m_RGA3_MMU_STATUS_MMU_IDLE (0x1 << 3) -#define m_RGA3_MMU_STATUS_REPLAY_BUFFER_EMPTY (0x1 << 4) -#define m_RGA3_MMU_STATUS_PAGE_FAULT_IS_WRITE (0x1 << 5) -#define m_RGA3_MMU_STATUS_PAGE_FAULT_BUS_ID (0x1f << 6) +#define m_RGA3_MMU_STATUS_PAGING_ENABLED (0x1 << 0) +#define m_RGA3_MMU_STATUS_PAGE_FAULT_ACTIVE (0x1 << 1) +#define m_RGA3_MMU_STATUS_STAIL_ACTIVE (0x1 << 2) +#define m_RGA3_MMU_STATUS_MMU_IDLE (0x1 << 3) +#define m_RGA3_MMU_STATUS_REPLAY_BUFFER_EMPTY (0x1 << 4) +#define m_RGA3_MMU_STATUS_PAGE_FAULT_IS_WRITE (0x1 << 5) +#define m_RGA3_MMU_STATUS_PAGE_FAULT_BUS_ID (0x1f << 6) /* RGA3_MMU_INT_RAWSTAT read_only */ -#define m_RGA3_MMU_INT_RAWSTAT_READ_BUS_ERROR (0x1 << 0) -#define m_RGA3_MMU_INT_RAWSTAT_PAGE_FAULT (0x1 << 1) +#define m_RGA3_MMU_INT_RAWSTAT_READ_BUS_ERROR (0x1 << 0) +#define m_RGA3_MMU_INT_RAWSTAT_PAGE_FAULT (0x1 << 1) /* RGA3_MMU_INT_CLEAR write_only */ -#define m_RGA3_MMU_INT_CLEAR_READ_BUS_ERROR (0x1 << 0) -#define m_RGA3_MMU_INT_CLEAR_PAGE_FAULT (0x1 << 1) +#define m_RGA3_MMU_INT_CLEAR_READ_BUS_ERROR (0x1 << 0) +#define m_RGA3_MMU_INT_CLEAR_PAGE_FAULT (0x1 << 1) -#define s_RGA3_MMU_INT_CLEAR_READ_BUS_ERROR(x) ((x & 0x1) << 0) -#define s_RGA3_MMU_INT_CLEAR_PAGE_FAULT(x) ((x & 0x1) << 1) +#define s_RGA3_MMU_INT_CLEAR_READ_BUS_ERROR(x) ((x & 0x1) << 0) +#define s_RGA3_MMU_INT_CLEAR_PAGE_FAULT(x) ((x & 0x1) << 1) /* RGA3_MMU_INT_MASK */ -#define m_RGA3_MMU_INT_MASK_READ_BUS_ERROR (0x1 << 0) -#define m_RGA3_MMU_INT_MASK_PAGE_FAULT (0x1 << 1) +#define m_RGA3_MMU_INT_MASK_READ_BUS_ERROR (0x1 << 0) +#define m_RGA3_MMU_INT_MASK_PAGE_FAULT (0x1 << 1) -#define s_RGA3_MMU_INT_MASK_READ_BUS_ERROR(x) ((x & 0x1) << 0) -#define s_RGA3_MMU_INT_MASK_PAGE_FAULT(x) ((x & 0x1) << 1) +#define s_RGA3_MMU_INT_MASK_READ_BUS_ERROR(x) ((x & 0x1) << 0) +#define s_RGA3_MMU_INT_MASK_PAGE_FAULT(x) ((x & 0x1) << 1) /* RGA3_MMU_INT_STATUS read_only */ -#define m_RGA3_MMU_INT_STATUS_READ_BUS_ERROR (0x1 << 0) +#define m_RGA3_MMU_INT_STATUS_READ_BUS_ERROR (0x1 << 0) #define m_RGA3_MMU_INT_STATUS_PAGE_FAULT (0x1 << 1) /* RGA3_MMU_AUTO_GATING */ -#define m_RGA3_MMU_AUTO_GATING_MMU_AUTO_GATING (0x1 << 1) -#define m_RGA3_MMU_AUTO_GATING_MMU_CFG_MODE (0x1 << 1) -#define m_RGA3_MMU_AUTO_GATING_MMU_BUG_FIXED_DISABLE (0x1 << 31) +#define m_RGA3_MMU_AUTO_GATING_MMU_AUTO_GATING (0x1 << 1) +#define m_RGA3_MMU_AUTO_GATING_MMU_CFG_MODE (0x1 << 1) +#define m_RGA3_MMU_AUTO_GATING_MMU_BUG_FIXED_DISABLE (0x1 << 31) -#define s_RGA3_MMU_AUTO_GATING_MMU_AUTO_GATING(x) ((x & 0x1) << 1) -#define s_RGA3_MMU_AUTO_GATING_MMU_BUG_FIXED_DISABLE(x) ((x & 0x1) << 31) +#define s_RGA3_MMU_AUTO_GATING_MMU_AUTO_GATING(x) ((x & 0x1) << 1) +#define s_RGA3_MMU_AUTO_GATING_MMU_BUG_FIXED_DISABLE(x) ((x & 0x1) << 31) -/* sys_reg */ -#define RGA3_SYS_CTRL_OFFSET 0x000 -#define RGA3_CMD_CTRL_OFFSET 0x004 -#define RGA3_CMD_ADDR_OFFSET 0x008 -#define RGA3_MI_GROUP_CTRL_OFFSET 0x00c -#define RGA3_ARQOS_CTRL_OFFSET 0x010 -#define RGA3_VERSION_NUM_OFFSET 0x018 -#define RGA3_VERSION_TIM_OFFSET 0x01c -#define RGA3_INT_EN_OFFSET 0x020 -#define RGA3_INT_RAW_OFFSET 0x024 -#define RGA3_INT_MSK_OFFSET 0x028 -#define RGA3_INT_CLR_OFFSET 0x02c -#define RGA3_RO_SRST_OFFSET 0x030 -#define RGA3_STATUS0_OFFSET 0x034 -#define RGA3_SCAN_CNT_OFFSET 0x038 -#define RGA3_STATUS1_OFFSET 0x03c -#define RGA3_CMD_STATE_OFFSET 0x040 +#define RGA3_ROT_BIT_ROT_90 BIT(0) +#define RGA3_ROT_BIT_X_MIRROR BIT(1) +#define RGA3_ROT_BIT_Y_MIRROR BIT(2) -/* op_reg */ -#define RGA3_WIN0_RD_CTRL_OFFSET 0x000 -#define RGA3_WIN0_Y_BASE_OFFSET 0x010 -#define RGA3_WIN0_U_BASE_OFFSET 0x014 -#define RGA3_WIN0_V_BASE_OFFSET 0x018 -#define RGA3_WIN0_VIR_STRIDE_OFFSET 0x01c -#define RGA3_WIN0_FBC_OFF_OFFSET 0x020 -#define RGA3_WIN0_SRC_SIZE_OFFSET 0x024 -#define RGA3_WIN0_ACT_OFF_OFFSET 0x028 -#define RGA3_WIN0_ACT_SIZE_OFFSET 0x02c -#define RGA3_WIN0_DST_SIZE_OFFSET 0x030 -#define RGA3_WIN0_SCL_FAC_OFFSET 0x034 -#define RGA3_WIN0_UV_VIR_STRIDE_OFFSET 0x038 -#define RGA3_WIN1_RD_CTRL_OFFSET 0x040 -#define RGA3_WIN1_Y_BASE_OFFSET 0x050 -#define RGA3_WIN1_U_BASE_OFFSET 0x054 -#define RGA3_WIN1_V_BASE_OFFSET 0x058 -#define RGA3_WIN1_VIR_STRIDE_OFFSET 0x05c -#define RGA3_WIN1_FBC_OFF_OFFSET 0x060 -#define RGA3_WIN1_SRC_SIZE_OFFSET 0x064 -#define RGA3_WIN1_ACT_OFF_OFFSET 0x068 -#define RGA3_WIN1_ACT_SIZE_OFFSET 0x06c -#define RGA3_WIN1_DST_SIZE_OFFSET 0x070 -#define RGA3_WIN1_SCL_FAC_OFFSET 0x074 -#define RGA3_WIN1_UV_VIR_STRIDE_OFFSET 0x078 -#define RGA3_OVLP_CTRL_OFFSET 0x080 -#define RGA3_OVLP_OFF_OFFSET 0x084 -#define RGA3_OVLP_TOP_KEY_MIN_OFFSET 0x088 -#define RGA3_OVLP_TOP_KEY_MAX_OFFSET 0x08c -#define RGA3_OVLP_TOP_CTRL_OFFSET 0x090 -#define RGA3_OVLP_BOT_CTRL_OFFSET 0x094 -#define RGA3_OVLP_TOP_ALPHA_OFFSET 0x098 -#define RGA3_OVLP_BOT_ALPHA_OFFSET 0x09c -#define RGA3_WR_CTRL_OFFSET 0x0a0 -#define RGA3_WR_FBCE_CTRL_OFFSET 0x0a4 -#define RGA3_WR_VIR_STRIDE_OFFSET 0x0a8 -#define RGA3_WR_PL_VIR_STRIDE_OFFSET 0x0ac -#define RGA3_WR_Y_BASE_OFFSET 0x0b0 -#define RGA3_WR_U_BASE_OFFSET 0x0b4 -#define RGA3_WR_V_BASE_OFFSET 0x0b8 -#define RGA3_MMU_DTE_ADDR_OFFSET 0x0f00 -#define RGA3_MMU_STATUS_OFFSET 0x0f04 -#define RGA3_MMU_COMMAND_OFFSET 0x0f08 -#define RGA3_MMU_PAGE_FAULT_ADDR_OFFSET 0x0f0c -#define RGA3_MMU_ZAP_ONE_LINE_OFFSET 0x0f10 -#define RGA3_MMU_INT_RAWSTAT_OFFSET 0x0f14 -#define RGA3_MMU_INT_CLEAR_OFFSET 0x0f18 -#define RGA3_MMU_INT_MASK_OFFSET 0x0f1c -#define RGA3_MMU_INT_STATUS_OFFSET 0x0f20 -#define RGA3_MMU_AUTO_GATING_OFFSET 0x0f24 -#define RGA3_MMU_REG_LOAD_EN_OFFSET 0x0f28 - -#define RGA3_ROT_BIT_ROT_90 BIT(0) -#define RGA3_ROT_BIT_X_MIRROR BIT(1) -#define RGA3_ROT_BIT_Y_MIRROR BIT(2) - -int rga3_gen_reg_info(unsigned char *base, struct rga3_req *msg); -void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req); -//void RGA_MSG_2_RGA3_MSG_32(struct rga_req_32 *req_rga, struct rga3_req *req); - -void rga3_soft_reset(struct rga_scheduler_t *scheduler); -int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler); -int rga3_init_reg(struct rga_job *job); -int rga3_get_version(struct rga_scheduler_t *scheduler); +extern const struct rga_backend_ops rga3_ops; #endif diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_common.h b/kernel/drivers/video/rockchip/rga3/include/rga_common.h index addd4cb..0b2ad9e 100644 --- a/kernel/drivers/video/rockchip/rga3/include/rga_common.h +++ b/kernel/drivers/video/rockchip/rga3/include/rga_common.h @@ -18,7 +18,11 @@ bool rga_is_yuv_format(uint32_t format); bool rga_is_alpha_format(uint32_t format); bool rga_is_yuv420_packed_format(uint32_t format); +bool rga_is_yuv420_planar_format(uint32_t format); +bool rga_is_yuv420_semi_planar_format(uint32_t format); bool rga_is_yuv422_packed_format(uint32_t format); +bool rga_is_yuv422_planar_format(uint32_t format); +bool rga_is_yuv422_semi_planar_format(uint32_t format); bool rga_is_yuv8bit_format(uint32_t format); bool rga_is_yuv10bit_format(uint32_t format); bool rga_is_yuv422p_format(uint32_t format); @@ -40,5 +44,7 @@ void rga_swap_pd_mode(struct rga_req *req_rga); int rga_image_size_cal(int w, int h, int format, int *yrgb_size, int *uv_size, int *v_size); +void rga_dump_memory_parm(struct rga_memory_parm *parm); +void rga_dump_external_buffer(struct rga_external_buffer *buffer); #endif diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_debugger.h b/kernel/drivers/video/rockchip/rga3/include/rga_debugger.h index 05d5f69..c274fe8 100644 --- a/kernel/drivers/video/rockchip/rga3/include/rga_debugger.h +++ b/kernel/drivers/video/rockchip/rga3/include/rga_debugger.h @@ -133,7 +133,6 @@ void rga_cmd_print_debug_info(struct rga_req *req); void rga_request_task_debug_info(struct seq_file *m, struct rga_req *req); -void rga_dump_external_buffer(struct rga_external_buffer *buffer); #ifdef CONFIG_NO_GKI void rga_dump_job_image(struct rga_job *dump_job); #else diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_drv.h b/kernel/drivers/video/rockchip/rga3/include/rga_drv.h index 7f94456..29a64a6 100644 --- a/kernel/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/kernel/drivers/video/rockchip/rga3/include/rga_drv.h @@ -16,6 +16,7 @@ #include <linux/dma-mapping.h> #include <linux/err.h> #include <linux/fb.h> +#include <linux/fdtable.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/interrupt.h> @@ -48,7 +49,6 @@ #include <linux/iommu.h> #include <linux/iova.h> -#include <linux/dma-iommu.h> #include <linux/pagemap.h> #ifdef CONFIG_DMABUF_CACHE @@ -87,7 +87,7 @@ #define DRIVER_MAJOR_VERISON 1 #define DRIVER_MINOR_VERSION 2 -#define DRIVER_REVISION_VERSION 20 +#define DRIVER_REVISION_VERSION 26 #define DRIVER_PATCH_VERSION #define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \ @@ -135,6 +135,17 @@ RGA_SCHEDULER_IDLE = 0, RGA_SCHEDULER_WORKING, RGA_SCHEDULER_ABORT, +}; + +enum rga_job_state { + RGA_JOB_STATE_PENDING = 0, + RGA_JOB_STATE_PREPARE, + RGA_JOB_STATE_RUNNING, + RGA_JOB_STATE_FINISH, + RGA_JOB_STATE_DONE, + RGA_JOB_STATE_INTR_ERR, + RGA_JOB_STATE_HW_TIMEOUT, + RGA_JOB_STATE_ABORT, }; struct rga_iommu_dma_cookie { @@ -285,6 +296,12 @@ int ret; pid_t pid; bool use_batch_mode; + + struct kref refcount; + unsigned long state; + uint32_t intr_status; + uint32_t hw_status; + uint32_t cmd_status; }; struct rga_backend_ops { @@ -292,6 +309,9 @@ int (*set_reg)(struct rga_job *job, struct rga_scheduler_t *scheduler); int (*init_reg)(struct rga_job *job); void (*soft_reset)(struct rga_scheduler_t *scheduler); + int (*read_back_reg)(struct rga_job *job, struct rga_scheduler_t *scheduler); + int (*irq)(struct rga_scheduler_t *scheduler); + int (*isr_thread)(struct rga_job *job, struct rga_scheduler_t *scheduler); }; struct rga_timer { @@ -421,8 +441,6 @@ struct rga_match_data_t { const char * const *clks; int num_clks; - const struct rga_irqs_data_t *irqs; - int num_irqs; }; static inline int rga_read(int offset, struct rga_scheduler_t *scheduler) diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_iommu.h b/kernel/drivers/video/rockchip/rga3/include/rga_iommu.h index fd37377..b80a1f4 100644 --- a/kernel/drivers/video/rockchip/rga3/include/rga_iommu.h +++ b/kernel/drivers/video/rockchip/rga3/include/rga_iommu.h @@ -4,6 +4,42 @@ #include "rga_drv.h" +/* RGA_IOMMU register offsets */ +#define RGA_IOMMU_BASE 0xf00 +#define RGA_IOMMU_DTE_ADDR (RGA_IOMMU_BASE + 0x00) /* Directory table address */ +#define RGA_IOMMU_STATUS (RGA_IOMMU_BASE + 0x04) +#define RGA_IOMMU_COMMAND (RGA_IOMMU_BASE + 0x08) +#define RGA_IOMMU_PAGE_FAULT_ADDR (RGA_IOMMU_BASE + 0x0C) /* IOVA of last page fault */ +#define RGA_IOMMU_ZAP_ONE_LINE (RGA_IOMMU_BASE + 0x10) /* Shootdown one IOTLB entry */ +#define RGA_IOMMU_INT_RAWSTAT (RGA_IOMMU_BASE + 0x14) /* IRQ status ignoring mask */ +#define RGA_IOMMU_INT_CLEAR (RGA_IOMMU_BASE + 0x18) /* Acknowledge and re-arm irq */ +#define RGA_IOMMU_INT_MASK (RGA_IOMMU_BASE + 0x1C) /* IRQ enable */ +#define RGA_IOMMU_INT_STATUS (RGA_IOMMU_BASE + 0x20) /* IRQ status after masking */ +#define RGA_IOMMU_AUTO_GATING (RGA_IOMMU_BASE + 0x24) + +/* RGA_IOMMU_STATUS fields */ +#define RGA_IOMMU_STATUS_PAGING_ENABLED BIT(0) +#define RGA_IOMMU_STATUS_PAGE_FAULT_ACTIVE BIT(1) +#define RGA_IOMMU_STATUS_STALL_ACTIVE BIT(2) +#define RGA_IOMMU_STATUS_IDLE BIT(3) +#define RGA_IOMMU_STATUS_REPLAY_BUFFER_EMPTY BIT(4) +#define RGA_IOMMU_STATUS_PAGE_FAULT_IS_WRITE BIT(5) +#define RGA_IOMMU_STATUS_STALL_NOT_ACTIVE BIT(31) + +/* RGA_IOMMU_COMMAND command values */ +#define RGA_IOMMU_CMD_ENABLE_PAGING 0 /* Enable memory translation */ +#define RGA_IOMMU_CMD_DISABLE_PAGING 1 /* Disable memory translation */ +#define RGA_IOMMU_CMD_ENABLE_STALL 2 /* Stall paging to allow other cmds */ +#define RGA_IOMMU_CMD_DISABLE_STALL 3 /* Stop stall re-enables paging */ +#define RGA_IOMMU_CMD_ZAP_CACHE 4 /* Shoot down entire IOTLB */ +#define RGA_IOMMU_CMD_PAGE_FAULT_DONE 5 /* Clear page fault */ +#define RGA_IOMMU_CMD_FORCE_RESET 6 /* Reset all registers */ + +/* RGA_IOMMU_INT_* register fields */ +#define RGA_IOMMU_IRQ_PAGE_FAULT 0x01 /* page fault */ +#define RGA_IOMMU_IRQ_BUS_ERROR 0x02 /* bus read error */ +#define RGA_IOMMU_IRQ_MASK (RGA_IOMMU_IRQ_PAGE_FAULT | RGA_IOMMU_IRQ_BUS_ERROR) + /* * The maximum input is 8192*8192, the maximum output is 4096*4096 * The size of physical pages requested is: diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_job.h b/kernel/drivers/video/rockchip/rga3/include/rga_job.h index 214472e..0fc7761 100644 --- a/kernel/drivers/video/rockchip/rga3/include/rga_job.h +++ b/kernel/drivers/video/rockchip/rga3/include/rga_job.h @@ -21,12 +21,9 @@ RGA_JOB_UNSUPPORT_RGA_MMU = 1 << 4, }; -struct rga_scheduler_t *rga_job_get_scheduler(struct rga_job *job); - -void rga_job_session_destroy(struct rga_session *session); - void rga_job_scheduler_dump_info(struct rga_scheduler_t *scheduler); -void rga_job_done(struct rga_scheduler_t *scheduler, int ret); +void rga_job_next(struct rga_scheduler_t *scheduler); +struct rga_job *rga_job_done(struct rga_scheduler_t *scheduler); struct rga_job *rga_job_commit(struct rga_req *rga_command_base, struct rga_request *request); int rga_job_mpi_commit(struct rga_req *rga_command_base, struct rga_request *request); @@ -38,6 +35,7 @@ uint32_t id); int rga_request_commit(struct rga_request *user_request); +void rga_request_session_destroy_abort(struct rga_session *session); int rga_request_put(struct rga_request *request); void rga_request_get(struct rga_request *request); int rga_request_free(struct rga_request *request); @@ -51,11 +49,5 @@ int rga_request_manager_init(struct rga_pending_request_manager **request_manager_session); int rga_request_manager_remove(struct rga_pending_request_manager **request_manager_session); - -struct rga_job * -rga_scheduler_get_pending_job_list(struct rga_scheduler_t *scheduler); - -struct rga_job * -rga_scheduler_get_running_job(struct rga_scheduler_t *scheduler); #endif /* __LINUX_RKRGA_JOB_H_ */ diff --git a/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c b/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c index 923c1f3..a624778 100644 --- a/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -7,7 +7,6 @@ #define pr_fmt(fmt) "rga2_reg: " fmt -#include "rga_job.h" #include "rga2_reg_info.h" #include "rga_dma_buf.h" #include "rga_iommu.h" @@ -165,12 +164,8 @@ bRGA_MODE_CTL = (u32 *) (base + RGA2_MODE_CTRL_OFFSET); - if (msg->render_mode == 4) - render_mode = 3; - - /* In slave mode, the current frame completion interrupt must be enabled. */ - if (!RGA2_USE_MASTER_MODE) - msg->CMD_fin_int_enable = 1; + if (msg->render_mode == UPDATE_PALETTE_TABLE_MODE) + render_mode = 0x3; reg = ((reg & (~m_RGA2_MODE_CTRL_SW_RENDER_MODE)) | @@ -231,6 +226,7 @@ u32 sw, sh; u32 dw, dh; u8 rotate_mode; + u8 vsp_scale_mode = 0; u8 scale_w_flag, scale_h_flag; bRGA_SRC_INFO = (u32 *) (base + RGA2_SRC_INFO_OFFSET); @@ -292,6 +288,18 @@ /* uvvds need to force tile mode. */ if (msg->uvvds_mode && scale_w_flag == 0) scale_w_flag = 3; + } + + /* VSP scale mode select, HSD > VSD > VSP > HSP */ + if (scale_h_flag == 0x2) { + /* After HSD, VSP needs to check dst_width */ + if ((scale_w_flag == 0x1) && (dw < RGA2_VSP_BICUBIC_LIMIT)) + vsp_scale_mode = 0x0; + else if (sw < RGA2_VSP_BICUBIC_LIMIT) + vsp_scale_mode = 0x0; + else + /* default select bilinear */ + vsp_scale_mode = 0x1; } switch (msg->src.format) { @@ -564,8 +572,7 @@ ((msg->alpha_rop_flag >> 4) & 0x1))); reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL)) | - (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL(( - msg->scale_bicu_mode >> 4)))); + (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL((vsp_scale_mode)))); reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_E)) | (s_RGA2_SRC_INFO_SW_SW_YUV10_E((yuv10)))); @@ -1715,7 +1722,7 @@ *bRGA_MMU_ELS_BASE = (u32) (msg->mmu_info.els_base_addr) >> 4; } -int rga2_gen_reg_info(u8 *base, struct rga2_req *msg) +static int rga2_gen_reg_info(u8 *base, struct rga2_req *msg) { u8 dst_nn_quantize_en = 0; @@ -1847,9 +1854,6 @@ req->rotate_mode |= (3 << 4); break; } - - if ((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h)) - req->scale_bicu_mode |= (1 << 4); req->LUT_addr = req_rga->LUT_addr; req->rop_mask_addr = req_rga->rop_mask_addr; @@ -2060,16 +2064,18 @@ } } -void rga2_soft_reset(struct rga_scheduler_t *scheduler) +static void rga2_soft_reset(struct rga_scheduler_t *scheduler) { u32 i; u32 reg; - u32 iommu_dte_addr; + u32 iommu_dte_addr = 0; if (scheduler->data->mmu == RGA_IOMMU) - iommu_dte_addr = rga_read(0xf00, scheduler); + iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler); - rga_write((1 << 3) | (1 << 4) | (1 << 6), RGA2_SYS_CTRL, scheduler); + rga_write(m_RGA2_SYS_CTRL_ACLK_SRESET_P | m_RGA2_SYS_CTRL_CCLK_SRESET_P | + m_RGA2_SYS_CTRL_RST_PROTECT_P, + RGA2_SYS_CTRL, scheduler); for (i = 0; i < RGA_RESET_TIMEOUT; i++) { /* RGA_SYS_CTRL */ @@ -2082,13 +2088,16 @@ } if (scheduler->data->mmu == RGA_IOMMU) { - rga_write(iommu_dte_addr, 0xf00, scheduler); + rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler); /* enable iommu */ - rga_write(0, 0xf08, scheduler); + rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler); } if (i == RGA_RESET_TIMEOUT) - pr_err("soft reset timeout.\n"); + pr_err("RAG2 soft reset timeout.\n"); + else + pr_info("RGA2 soft reset complete.\n"); + } static int rga2_check_param(const struct rga_hw_data *data, const struct rga2_req *req) @@ -2215,7 +2224,7 @@ pr_info("yuv2rgb mode is %x\n", req->yuv2rgb_mode); } -int rga2_init_reg(struct rga_job *job) +static int rga2_init_reg(struct rga_job *job) { struct rga2_req req; int ret = 0; @@ -2266,6 +2275,10 @@ return -EFAULT; } } + + /* In slave mode, the current frame completion interrupt must be enabled. */ + if (scheduler->data->mmu == RGA_IOMMU) + req.CMD_fin_int_enable = 1; if (rga2_gen_reg_info((uint8_t *)job->cmd_reg, &req) == -1) { pr_err("gen reg info error\n"); @@ -2338,7 +2351,7 @@ cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); } -void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler) +static void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler) { rga2_dump_read_back_sys_reg(scheduler); rga2_dump_read_back_csc_reg(scheduler); @@ -2351,28 +2364,28 @@ if (job->pre_intr_info.read_intr_en) { reg = s_RGA2_READ_LINE_SW_INTR_LINE_RD_TH(job->pre_intr_info.read_threshold); - rga_write(reg, RGA2_READ_LINE_CNT_OFFSET, scheduler); + rga_write(reg, RGA2_READ_LINE_CNT, scheduler); } if (job->pre_intr_info.write_intr_en) { reg = s_RGA2_WRITE_LINE_SW_INTR_LINE_WR_START(job->pre_intr_info.write_start); reg = ((reg & (~m_RGA2_WRITE_LINE_SW_INTR_LINE_WR_STEP)) | (s_RGA2_WRITE_LINE_SW_INTR_LINE_WR_STEP(job->pre_intr_info.write_step))); - rga_write(reg, RGA2_WRITE_LINE_CNT_OFFSET, scheduler); + rga_write(reg, RGA2_WRITE_LINE_CNT, scheduler); } - reg = rga_read(RGA2_SYS_CTRL_OFFSET, scheduler); - reg = ((reg & (~m_RGA2_SYS_HOLD_MODE_EN)) | - (s_RGA2_SYS_HOLD_MODE_EN(job->pre_intr_info.read_hold_en))); - rga_write(reg, RGA2_SYS_CTRL_OFFSET, scheduler); + reg = rga_read(RGA2_SYS_CTRL, scheduler); + reg = ((reg & (~m_RGA2_SYS_CTRL_HOLD_MODE_EN)) | + (s_RGA2_SYS_CTRL_HOLD_MODE_EN(job->pre_intr_info.read_hold_en))); + rga_write(reg, RGA2_SYS_CTRL, scheduler); - reg = rga_read(RGA2_INT_OFFSET, scheduler); + reg = rga_read(RGA2_INT, scheduler); reg = (reg | s_RGA2_INT_LINE_RD_CLEAR(0x1) | s_RGA2_INT_LINE_WR_CLEAR(0x1)); reg = ((reg & (~m_RGA2_INT_LINE_RD_EN)) | (s_RGA2_INT_LINE_RD_EN(job->pre_intr_info.read_intr_en))); reg = ((reg & (~m_RGA2_INT_LINE_WR_EN)) | (s_RGA2_INT_LINE_WR_EN(job->pre_intr_info.write_intr_en))); - rga_write(reg, RGA2_INT_OFFSET, scheduler); + rga_write(reg, RGA2_INT, scheduler); } static void rga2_set_reg_full_csc(struct rga_job *job, struct rga_scheduler_t *scheduler) @@ -2388,29 +2401,40 @@ /* full csc coefficient */ /* Y coefficient */ rga_write(job->full_csc.coe_y.r_v | (clip_y_max << 16) | (clip_y_min << 24), - RGA2_DST_CSC_00_OFFSET, scheduler); + RGA2_DST_CSC_00, scheduler); rga_write(job->full_csc.coe_y.g_y | (clip_uv_max << 16) | (clip_uv_min << 24), - RGA2_DST_CSC_01_OFFSET, scheduler); - rga_write(job->full_csc.coe_y.b_u, RGA2_DST_CSC_02_OFFSET, scheduler); - rga_write(job->full_csc.coe_y.off, RGA2_DST_CSC_OFF0_OFFSET, scheduler); + RGA2_DST_CSC_01, scheduler); + rga_write(job->full_csc.coe_y.b_u, RGA2_DST_CSC_02, scheduler); + rga_write(job->full_csc.coe_y.off, RGA2_DST_CSC_OFF0, scheduler); /* U coefficient */ - rga_write(job->full_csc.coe_u.r_v, RGA2_DST_CSC_10_OFFSET, scheduler); - rga_write(job->full_csc.coe_u.g_y, RGA2_DST_CSC_11_OFFSET, scheduler); - rga_write(job->full_csc.coe_u.b_u, RGA2_DST_CSC_12_OFFSET, scheduler); - rga_write(job->full_csc.coe_u.off, RGA2_DST_CSC_OFF1_OFFSET, scheduler); + rga_write(job->full_csc.coe_u.r_v, RGA2_DST_CSC_10, scheduler); + rga_write(job->full_csc.coe_u.g_y, RGA2_DST_CSC_11, scheduler); + rga_write(job->full_csc.coe_u.b_u, RGA2_DST_CSC_12, scheduler); + rga_write(job->full_csc.coe_u.off, RGA2_DST_CSC_OFF1, scheduler); /* V coefficient */ - rga_write(job->full_csc.coe_v.r_v, RGA2_DST_CSC_20_OFFSET, scheduler); - rga_write(job->full_csc.coe_v.g_y, RGA2_DST_CSC_21_OFFSET, scheduler); - rga_write(job->full_csc.coe_v.b_u, RGA2_DST_CSC_22_OFFSET, scheduler); - rga_write(job->full_csc.coe_v.off, RGA2_DST_CSC_OFF2_OFFSET, scheduler); + rga_write(job->full_csc.coe_v.r_v, RGA2_DST_CSC_20, scheduler); + rga_write(job->full_csc.coe_v.g_y, RGA2_DST_CSC_21, scheduler); + rga_write(job->full_csc.coe_v.b_u, RGA2_DST_CSC_22, scheduler); + rga_write(job->full_csc.coe_v.off, RGA2_DST_CSC_OFF2, scheduler); } -int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) +static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) { - ktime_t now = ktime_get(); int i; + bool master_mode_en; + uint32_t sys_ctrl; + ktime_t now = ktime_get(); + + /* + * Currently there is no iova allocated for storing cmd for the IOMMU device, + * so the iommu device needs to use the slave mode. + */ + if (scheduler->data->mmu != RGA_IOMMU) + master_mode_en = true; + else + master_mode_en = false; if (job->pre_intr_info.enable) rga2_set_pre_intr_reg(job, scheduler); @@ -2419,7 +2443,7 @@ rga2_set_reg_full_csc(job, scheduler); if (DEBUGGER_EN(REG)) { - int32_t *p; + uint32_t *p; rga2_dump_read_back_sys_reg(scheduler); rga2_dump_read_back_csc_reg(scheduler); @@ -2434,42 +2458,44 @@ /* All CMD finish int */ rga_write(rga_read(RGA2_INT, scheduler) | - (0x1 << 10) | (0x1 << 9) | (0x1 << 8), RGA2_INT, scheduler); + m_RGA2_INT_ERROR_ENABLE_MASK | m_RGA2_INT_ALL_CMD_DONE_INT_EN, + RGA2_INT, scheduler); /* sys_reg init */ - rga_write((0x1 << 2) | (0x1 << 5) | (0x1 << 6) | (0x1 << 11) | (0x1 << 12), - RGA2_SYS_CTRL, scheduler); + sys_ctrl = m_RGA2_SYS_CTRL_AUTO_CKG | m_RGA2_SYS_CTRL_AUTO_RST | + m_RGA2_SYS_CTRL_RST_PROTECT_P | m_RGA2_SYS_CTRL_DST_WR_OPT_DIS | + m_RGA2_SYS_CTRL_SRC0YUV420SP_RD_OPT_DIS; - if (RGA2_USE_MASTER_MODE) { + if (master_mode_en) { /* master mode */ - rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | (0x1 << 1), - RGA2_SYS_CTRL, scheduler); + sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(1); /* cmd buffer flush cache to ddr */ rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[32], scheduler); /* set cmd_addr */ rga_write(virt_to_phys(job->cmd_reg), RGA2_CMD_BASE, scheduler); - - rga_write(1, RGA2_CMD_CTRL, scheduler); + rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler); + rga_write(m_RGA2_CMD_CTRL_CMD_LINE_ST_P, RGA2_CMD_CTRL, scheduler); } else { /* slave mode */ - rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | (0x0 << 1), - RGA2_SYS_CTRL, scheduler); + sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(0) | m_RGA2_SYS_CTRL_CMD_OP_ST_P; /* set cmd_reg */ for (i = 0; i <= 32; i++) rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler); - rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | 0x1, RGA2_SYS_CTRL, scheduler); + rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler); } - if (DEBUGGER_EN(TIME)) { - pr_info("sys_ctrl = %x, int = %x, set cmd use time = %lld\n", + if (DEBUGGER_EN(REG)) + pr_info("sys_ctrl = %x, int = %x\n", rga_read(RGA2_SYS_CTRL, scheduler), - rga_read(RGA2_INT, scheduler), + rga_read(RGA2_INT, scheduler)); + + if (DEBUGGER_EN(TIME)) + pr_info("set cmd use time = %lld\n", ktime_us_delta(now, job->timestamp)); - } job->hw_running_time = now; job->hw_recoder_time = now; @@ -2480,7 +2506,7 @@ return 0; } -int rga2_get_version(struct rga_scheduler_t *scheduler) +static int rga2_get_version(struct rga_scheduler_t *scheduler) { u32 major_version, minor_version, svn_version; u32 reg_version; @@ -2511,3 +2537,96 @@ return 0; } + +static int rga2_read_back_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) +{ + if (job->rga_command_base.osd_info.enable) { + job->rga_command_base.osd_info.cur_flags0 = rga_read(RGA2_OSD_CUR_FLAGS0, + scheduler); + job->rga_command_base.osd_info.cur_flags1 = rga_read(RGA2_OSD_CUR_FLAGS1, + scheduler); + } + + return 0; +} + +static int rga2_irq(struct rga_scheduler_t *scheduler) +{ + struct rga_job *job = scheduler->running_job; + + /* The hardware interrupt top-half don't need to lock the scheduler. */ + if (job == NULL) + return IRQ_HANDLED; + + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) + return IRQ_WAKE_THREAD; + + job->intr_status = rga_read(RGA2_INT, scheduler); + job->hw_status = rga_read(RGA2_STATUS2, scheduler); + job->cmd_status = rga_read(RGA2_STATUS1, scheduler); + + if (DEBUGGER_EN(INT_FLAG)) + pr_info("irq handler, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", + job->intr_status, job->hw_status, job->cmd_status); + + if (job->intr_status & + (m_RGA2_INT_CUR_CMD_DONE_INT_FLAG | m_RGA2_INT_ALL_CMD_DONE_INT_FLAG)) { + set_bit(RGA_JOB_STATE_FINISH, &job->state); + } else if (job->intr_status & m_RGA2_INT_ERROR_FLAG_MASK) { + set_bit(RGA_JOB_STATE_INTR_ERR, &job->state); + + pr_err("irq handler err! INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", + job->intr_status, job->hw_status, job->cmd_status); + scheduler->ops->soft_reset(scheduler); + } + + /*clear INTR */ + rga_write(rga_read(RGA2_INT, scheduler) | + (m_RGA2_INT_ERROR_CLEAR_MASK | + m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR | + m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR), + RGA2_INT, scheduler); + + return IRQ_WAKE_THREAD; +} + +static int rga2_isr_thread(struct rga_job *job, struct rga_scheduler_t *scheduler) +{ + if (DEBUGGER_EN(INT_FLAG)) + pr_info("isr thread, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", + rga_read(RGA2_INT, scheduler), + rga_read(RGA2_STATUS2, scheduler), + rga_read(RGA2_STATUS1, scheduler)); + + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) { + if (job->hw_status & m_RGA2_STATUS2_RPP_ERROR) + pr_err("RGA current status: rpp error!\n"); + if (job->hw_status & m_RGA2_STATUS2_BUS_ERROR) + pr_err("RGA current status: bus error!\n"); + + if (job->intr_status & m_RGA2_INT_ERROR_INT_FLAG) { + pr_err("RGA bus error intr, please check your configuration and buffer.\n"); + job->ret = -EFAULT; + } else if (job->intr_status & m_RGA2_INT_MMU_INT_FLAG) { + pr_err("mmu failed, please check size of the buffer or whether the buffer has been freed.\n"); + job->ret = -EACCES; + } + + if (job->ret == 0) { + pr_err("rga intr error[0x%x]!\n", job->intr_status); + job->ret = -EFAULT; + } + } + + return IRQ_HANDLED; +} + +const struct rga_backend_ops rga2_ops = { + .get_version = rga2_get_version, + .set_reg = rga2_set_reg, + .init_reg = rga2_init_reg, + .soft_reset = rga2_soft_reset, + .read_back_reg = rga2_read_back_reg, + .irq = rga2_irq, + .isr_thread = rga2_isr_thread, +}; diff --git a/kernel/drivers/video/rockchip/rga3/rga3_reg_info.c b/kernel/drivers/video/rockchip/rga3/rga3_reg_info.c index e065b82..d462f98 100644 --- a/kernel/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/kernel/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -8,6 +8,8 @@ #define pr_fmt(fmt) "rga3_reg: " fmt #include "rga3_reg_info.h" +#include "rga_dma_buf.h" +#include "rga_iommu.h" #include "rga_common.h" #include "rga_debugger.h" #include "rga_hw_config.h" @@ -91,14 +93,12 @@ dw = msg->win0.dst_act_w; dh = msg->win0.dst_act_h; - if (msg->win0.rotate_mode != 0) { - if (rotate_mode) { - sh = msg->win0.src_act_w; - sw = msg->win0.src_act_h; - } else { - sw = msg->win0.src_act_w; - sh = msg->win0.src_act_h; - } + if (rotate_mode) { + sh = msg->win0.src_act_w; + sw = msg->win0.src_act_h; + } else { + sw = msg->win0.src_act_w; + sh = msg->win0.src_act_h; } if (sw > dw) { @@ -289,7 +289,7 @@ } /* rotate & mirror */ - if (msg->win1.yrgb_addr == 0) { + if (msg->win0.rotate_mode == 1) { reg = ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT)) | (s_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT(rotate_mode))); @@ -299,36 +299,23 @@ reg = ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR)) | (s_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR(ymirror))); - - /* scale */ - *bRGA3_WIN0_SCL_FAC = param_x | param_y << 16; - - reg = - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x_by))); - reg = - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x_up))); - reg = - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(y_by))); - reg = - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(y_up))); - } else { - reg = - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(1))); - reg = - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(0))); - reg = - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(1))); - reg = - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(0))); } + + /* scale */ + *bRGA3_WIN0_SCL_FAC = param_x | param_y << 16; + + reg = + ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) | + (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x_by))); + reg = + ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) | + (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x_up))); + reg = + ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) | + (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(y_by))); + reg = + ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) | + (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(y_up))); /* rd_mode */ reg = @@ -357,19 +344,36 @@ *bRGA3_WIN0_RD_CTRL = reg; - /* stride need align to 16 */ - if (msg->win0.rd_mode != 1) + switch (msg->win0.rd_mode) { + case 0: /* raster */ stride = (((msg->win0.vir_w * pixel_width) + 15) & ~15) >> 2; - else - stride = ((msg->win0.vir_w + 15) & ~15) >> 2; + if (rga_is_yuv420_semi_planar_format(msg->win0.format)) + uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2; + else + uv_stride = stride; + break; - if (msg->win0.format == RGA_FORMAT_YCbCr_420_SP - || msg->win0.format == RGA_FORMAT_YCrCb_420_SP - || msg->win0.format == RGA_FORMAT_YCbCr_420_SP_10B - || msg->win0.format == RGA_FORMAT_YCrCb_420_SP_10B) - uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2; - else - uv_stride = stride; + case 1: /* fbc */ + stride = ((msg->win0.vir_w + 15) & ~15) >> 2; + if (rga_is_yuv420_semi_planar_format(msg->win0.format)) + uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2; + else + uv_stride = stride; + break; + + case 2: /* tile 8*8 */ + /* + * tile 8*8 mode 8 lines of data are read/written at one time, + * so stride needs * 8. YUV420 only has 4 lines of UV data, so + * it needs to >>1. + */ + stride = (((msg->win0.vir_w * pixel_width * 8) + 15) & ~15) >> 2; + if (rga_is_yuv420_semi_planar_format(msg->win0.format)) + uv_stride = ((((msg->win0.vir_w * 8) + 15) & ~15) >> 1) >> 2; + else + uv_stride = stride; + break; + } *bRGA3_WIN0_Y_BASE = (u32) msg->win0.yrgb_addr; *bRGA3_WIN0_U_BASE = (u32) msg->win0.uv_addr; @@ -386,9 +390,9 @@ */ /* do not use win0 src size except fbcd */ - *bRGA3_WIN0_SRC_SIZE = (msg->win0.src_act_w + - msg->win0.x_offset) | ((msg->win0.y_offset + - msg->win0.src_act_h) << 16); + /* in FBCD, src_width needs to be aligned at 16 */ + *bRGA3_WIN0_SRC_SIZE = ALIGN(msg->win0.src_act_w + msg->win0.x_offset, 16) | + (ALIGN(msg->win0.y_offset + msg->win0.src_act_h, 16) << 16); *bRGA3_WIN0_ACT_SIZE = msg->win0.src_act_w | (msg->win0.src_act_h << 16); *bRGA3_WIN0_DST_SIZE = @@ -721,19 +725,31 @@ *bRGA3_WIN1_RD_CTRL = reg; - /* stride need align to 16 */ - if (msg->win1.rd_mode != 1) + switch (msg->win1.rd_mode) { + case 0: /* raster */ stride = (((msg->win1.vir_w * pixel_width) + 15) & ~15) >> 2; - else - stride = ((msg->win1.vir_w + 15) & ~15) >> 2; + if (rga_is_yuv420_semi_planar_format(msg->win1.format)) + uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2; + else + uv_stride = stride; + break; - if (msg->win1.format == RGA_FORMAT_YCbCr_420_SP - || msg->win1.format == RGA_FORMAT_YCrCb_420_SP - || msg->win1.format == RGA_FORMAT_YCbCr_420_SP_10B - || msg->win1.format == RGA_FORMAT_YCrCb_420_SP_10B) - uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2; - else - uv_stride = stride; + case 1: /* fbc */ + stride = ((msg->win1.vir_w + 15) & ~15) >> 2; + if (rga_is_yuv420_semi_planar_format(msg->win1.format)) + uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2; + else + uv_stride = stride; + break; + + case 2: /* tile 8*8 */ + stride = (((msg->win1.vir_w * pixel_width * 8) + 15) & ~15) >> 2; + if (rga_is_yuv420_semi_planar_format(msg->win1.format)) + uv_stride = ((((msg->win1.vir_w * 8) + 15) & ~15) >> 1) >> 2; + else + uv_stride = stride; + break; + } *bRGA3_WIN1_Y_BASE = (u32) msg->win1.yrgb_addr; *bRGA3_WIN1_U_BASE = (u32) msg->win1.uv_addr; @@ -947,16 +963,20 @@ *bRGA3_WR_RD_CTRL = reg; *bRGA3_WR_FBCD_CTRL = fbcd_reg; - /* stride need align to 16 */ - if (msg->wr.rd_mode != 1) { + switch (msg->wr.rd_mode) { + case 0: /* raster */ stride = (((msg->wr.vir_w * pixel_width) + 15) & ~15) >> 2; - *bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr; uv_stride = ((msg->wr.vir_w + 15) & ~15) >> 2; - } else { + + *bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr; + + break; + + case 1: /* fbc */ stride = ((msg->wr.vir_w + 15) & ~15) >> 2; /* need to calculate fbcd header size */ vir_h = ((msg->wr.vir_h + 15) & ~15); - *bRGA3_WR_U_BASE = (u32) (msg->wr.uv_addr + ((stride * vir_h)>>2)); + /* RGBA8888 */ if (wr_format == 0x6) uv_stride = ((msg->wr.vir_w + 15) & ~15); @@ -972,6 +992,20 @@ /* yuv422 10bit */ else if (wr_format == 0x3) uv_stride = (((msg->wr.vir_w + 15) & ~15) >> 3) * 5; + + *bRGA3_WR_U_BASE = (u32) (msg->wr.uv_addr + ((stride * vir_h)>>2)); + + break; + + case 2: /* tile 8*8 */ + stride = (((msg->wr.vir_w * pixel_width * 8) + 15) & ~15) >> 2; + if (rga_is_yuv420_semi_planar_format(msg->win0.format)) + uv_stride = ((((msg->wr.vir_w * 8) + 15) & ~15) >> 1) >> 2; + else + uv_stride = stride; + + *bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr; + break; } *bRGA3_WR_Y_BASE = (u32) msg->wr.yrgb_addr; @@ -1141,7 +1175,7 @@ *bRGA3_OVLP_OFF = msg->wr.x_offset | (msg->wr.y_offset << 16); } -int rga3_gen_reg_info(u8 *base, struct rga3_req *msg) +static int rga3_gen_reg_info(u8 *base, struct rga3_req *msg) { switch (msg->render_mode) { case BITBLT_MODE: @@ -1225,7 +1259,7 @@ } /* TODO: common part */ -void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req) +static void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req) { u16 alpha_mode_0, alpha_mode_1; struct rga_img_info_t tmp; @@ -1385,18 +1419,18 @@ if (req->win0.x_offset || req->win0.y_offset) { req->win0.src_act_w = req->win0.src_act_w + req->win0.x_offset; req->win0.src_act_h = req->win0.src_act_h + req->win0.y_offset; - req->win0.dst_act_w = req_rga->pat.act_w + req->win0.x_offset; - req->win0.dst_act_h = req_rga->pat.act_h + req->win0.y_offset; + req->win0.dst_act_w = req_rga->dst.act_w + req->win0.x_offset; + req->win0.dst_act_h = req_rga->dst.act_h + req->win0.y_offset; req->win0.x_offset = 0; req->win0.y_offset = 0; } else { - req->win0.dst_act_w = req_rga->pat.act_w; - req->win0.dst_act_h = req_rga->pat.act_h; + req->win0.dst_act_w = req_rga->dst.act_w; + req->win0.dst_act_h = req_rga->dst.act_h; } /* set win1 dst size */ - req->win1.dst_act_w = req_rga->pat.act_w; - req->win1.dst_act_h = req_rga->pat.act_h; + req->win1.dst_act_w = req_rga->dst.act_w; + req->win1.dst_act_h = req_rga->dst.act_h; } else { /* A+B->B mode */ set_win_info(&req->win0, &req_rga->dst); @@ -1589,54 +1623,38 @@ } } -void rga3_soft_reset(struct rga_scheduler_t *scheduler) +static void rga3_soft_reset(struct rga_scheduler_t *scheduler) { u32 i; - u32 reg; - u32 mmu_addr; + u32 iommu_dte_addr = 0; - mmu_addr = rga_read(0xf00, scheduler); + if (scheduler->data->mmu == RGA_IOMMU) + iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler); - rga_write((1 << 3) | (1 << 4), RGA3_SYS_CTRL, scheduler); - - pr_err("soft reset sys_ctrl = %x, ro_rest = %x", - rga_read(RGA3_SYS_CTRL, scheduler), - rga_read(RGA3_RO_SRST, scheduler)); - - mdelay(20); - - pr_err("soft reset sys_ctrl = %x, ro_rest = %x", - rga_read(RGA3_SYS_CTRL, scheduler), - rga_read(RGA3_RO_SRST, scheduler)); - - rga_write((0 << 3) | (0 << 4), RGA3_SYS_CTRL, scheduler); - - pr_err("soft after reset sys_ctrl = %x, ro_rest = %x", - rga_read(RGA3_SYS_CTRL, scheduler), - rga_read(RGA3_RO_SRST, scheduler)); - - rga_write(1, RGA3_INT_CLR, scheduler); - - rga_write(mmu_addr, 0xf00, scheduler); - rga_write(0, 0xf08, scheduler); - - if (DEBUGGER_EN(INT_FLAG)) - pr_info("irq INT[%x], STATS0[%x], STATS1[%x]\n", - rga_read(RGA3_INT_RAW, scheduler), - rga_read(RGA3_STATUS0, scheduler), - rga_read(RGA3_STATUS1, scheduler)); + rga_write(s_RGA3_SYS_CTRL_CCLK_SRESET(1) | s_RGA3_SYS_CTRL_ACLK_SRESET(1), + RGA3_SYS_CTRL, scheduler); for (i = 0; i < RGA_RESET_TIMEOUT; i++) { - reg = rga_read(RGA3_SYS_CTRL, scheduler) & 1; - - if (reg == 0) + if (rga_read(RGA3_RO_SRST, scheduler) & m_RGA3_RO_SRST_RO_RST_DONE) break; udelay(1); } + rga_write(s_RGA3_SYS_CTRL_CCLK_SRESET(0) | s_RGA3_SYS_CTRL_ACLK_SRESET(0), + RGA3_SYS_CTRL, scheduler); + + if (scheduler->data->mmu == RGA_IOMMU) { + rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler); + /* enable iommu */ + rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler); + } + if (i == RGA_RESET_TIMEOUT) - pr_err("soft reset timeout.\n"); + pr_err("RGA3 soft reset timeout. SYS_CTRL[0x%x], RO_SRST[0x%x]\n", + rga_read(RGA3_SYS_CTRL, scheduler), rga_read(RGA3_RO_SRST, scheduler)); + else + pr_info("RGA3 soft reset complete.\n"); } static int rga3_scale_check(const struct rga3_req *req) @@ -1836,7 +1854,7 @@ return 0; } -int rga3_init_reg(struct rga_job *job) +static int rga3_init_reg(struct rga_job *job) { struct rga3_req req; int ret = 0; @@ -1893,29 +1911,24 @@ cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); } -int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) +static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) { + int i; + bool master_mode_en; + uint32_t sys_ctrl; ktime_t now = ktime_get(); - //rga_dma_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler); - - rga_write(0x0, RGA3_SYS_CTRL, scheduler); - -#if 0 - /* CMD buff */ - rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler); -#else - { - int32_t m, *cmd; - - cmd = job->cmd_reg; - for (m = 0; m <= 50; m++) - rga_write(cmd[m], 0x100 + m * 4, scheduler); - } -#endif + /* + * Currently there is no iova allocated for storing cmd for the IOMMU device, + * so the iommu device needs to use the slave mode. + */ + if (scheduler->data->mmu != RGA_IOMMU) + master_mode_en = true; + else + master_mode_en = false; if (DEBUGGER_EN(REG)) { - int32_t i, *p; + uint32_t *p; p = job->cmd_reg; pr_info("CMD_REG\n"); @@ -1925,27 +1938,39 @@ p[2 + i * 4], p[3 + i * 4]); } -#if 0 - /* master mode */ - rga_write((0x1 << 1) | (0x1 << 2) | (0x1 << 5) | (0x1 << 6), - RGA3_SYS_CTRL, scheduler); -#else - /* slave mode */ - //rga_write(1, 0xf08, scheduler); -#endif - /* All CMD finish int */ - rga_write(1, RGA3_INT_EN, scheduler); + rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, + RGA3_INT_EN, scheduler); - if (DEBUGGER_EN(MSG)) { - pr_info("sys_ctrl = %x, int_en = %x, int_raw = %x\n", + if (master_mode_en) { + /* master mode */ + sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(1); + + /* cmd buffer flush cache to ddr */ + rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler); + + rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler); + rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); + rga_write(m_RGA3_CMD_CTRL_CMD_LINE_ST_P, RGA3_CMD_CTRL, scheduler); + } else { + /* slave mode */ + sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(0) | m_RGA3_SYS_CTRL_RGA_SART; + + for (i = 0; i <= 50; i++) + rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler); + + rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); + } + + if (DEBUGGER_EN(REG)) { + pr_info("sys_ctrl = 0x%x, int_en = 0x%x, int_raw = 0x%x\n", rga_read(RGA3_SYS_CTRL, scheduler), rga_read(RGA3_INT_EN, scheduler), rga_read(RGA3_INT_RAW, scheduler)); - pr_info("status0 = %x, status1 = %x\n", + pr_info("hw_status = 0x%x, cmd_status = 0x%x\n", rga_read(RGA3_STATUS0, scheduler), - rga_read(RGA3_STATUS1, scheduler)); + rga_read(RGA3_CMD_STATE, scheduler)); } if (DEBUGGER_EN(TIME)) @@ -1954,15 +1979,13 @@ job->hw_running_time = now; job->hw_recoder_time = now; - rga_write(1, RGA3_SYS_CTRL, scheduler); - if (DEBUGGER_EN(REG)) rga3_dump_read_back_reg(scheduler); return 0; } -int rga3_get_version(struct rga_scheduler_t *scheduler) +static int rga3_get_version(struct rga_scheduler_t *scheduler) { u32 major_version, minor_version, svn_version; u32 reg_version; @@ -1987,3 +2010,80 @@ return 0; } + +static int rga3_irq(struct rga_scheduler_t *scheduler) +{ + struct rga_job *job = scheduler->running_job; + + if (job == NULL) + return IRQ_HANDLED; + + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) + return IRQ_WAKE_THREAD; + + job->intr_status = rga_read(RGA3_INT_RAW, scheduler); + job->hw_status = rga_read(RGA3_STATUS0, scheduler); + job->cmd_status = rga_read(RGA3_CMD_STATE, scheduler); + + if (DEBUGGER_EN(INT_FLAG)) + pr_info("irq handler, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", + job->intr_status, job->hw_status, job->cmd_status); + + if (job->intr_status & (m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH)) { + set_bit(RGA_JOB_STATE_FINISH, &job->state); + } else if (job->intr_status & m_RGA3_INT_ERROR_MASK) { + set_bit(RGA_JOB_STATE_INTR_ERR, &job->state); + + pr_err("irq handler err! INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", + job->intr_status, job->hw_status, job->cmd_status); + scheduler->ops->soft_reset(scheduler); + } + + /*clear INTR */ + rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, + RGA3_INT_CLR, scheduler); + + return IRQ_WAKE_THREAD; +} + +static int rga3_isr_thread(struct rga_job *job, struct rga_scheduler_t *scheduler) +{ + if (DEBUGGER_EN(INT_FLAG)) + pr_info("isr thread, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", + rga_read(RGA3_INT_RAW, scheduler), + rga_read(RGA3_STATUS0, scheduler), + rga_read(RGA3_CMD_STATE, scheduler)); + + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) { + if (job->intr_status & m_RGA3_INT_RAG_MI_RD_BUS_ERR) { + pr_err("DMA read bus error, please check size of the input_buffer or whether the buffer has been freed.\n"); + job->ret = -EFAULT; + } else if (job->intr_status & m_RGA3_INT_WIN0_FBCD_DEC_ERR) { + pr_err("win0 FBC decoder error, please check the fbc image of the source.\n"); + job->ret = -EFAULT; + } else if (job->intr_status & m_RGA3_INT_WIN1_FBCD_DEC_ERR) { + pr_err("win1 FBC decoder error, please check the fbc image of the source.\n"); + job->ret = -EFAULT; + } else if (job->intr_status & m_RGA3_INT_RGA_MI_WR_BUS_ERR) { + pr_err("wr buss error, please check size of the output_buffer or whether the buffer has been freed.\n"); + job->ret = -EFAULT; + } + + if (job->ret == 0) { + pr_err("rga intr error[0x%x]!\n", job->intr_status); + job->ret = -EFAULT; + } + } + + return IRQ_HANDLED; +} + +const struct rga_backend_ops rga3_ops = { + .get_version = rga3_get_version, + .set_reg = rga3_set_reg, + .init_reg = rga3_init_reg, + .soft_reset = rga3_soft_reset, + .read_back_reg = NULL, + .irq = rga3_irq, + .isr_thread = rga3_isr_thread, +}; diff --git a/kernel/drivers/video/rockchip/rga3/rga_common.c b/kernel/drivers/video/rockchip/rga3/rga_common.c index 0e21326..dfe1103 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_common.c +++ b/kernel/drivers/video/rockchip/rga3/rga_common.c @@ -107,6 +107,30 @@ } } +bool rga_is_yuv420_planar_format(uint32_t format) +{ + switch (format) { + case RGA_FORMAT_YCbCr_420_P: + case RGA_FORMAT_YCrCb_420_P: + return true; + default: + return false; + } +} + +bool rga_is_yuv420_semi_planar_format(uint32_t format) +{ + switch (format) { + case RGA_FORMAT_YCbCr_420_SP: + case RGA_FORMAT_YCrCb_420_SP: + case RGA_FORMAT_YCbCr_420_SP_10B: + case RGA_FORMAT_YCrCb_420_SP_10B: + return true; + default: + return false; + } +} + bool rga_is_yuv422_packed_format(uint32_t format) { switch (format) { @@ -114,6 +138,30 @@ case RGA_FORMAT_VYUY_422: case RGA_FORMAT_YUYV_422: case RGA_FORMAT_UYVY_422: + return true; + default: + return false; + } +} + +bool rga_is_yuv422_planar_format(uint32_t format) +{ + switch (format) { + case RGA_FORMAT_YCbCr_422_P: + case RGA_FORMAT_YCrCb_422_P: + return true; + default: + return false; + } +} + +bool rga_is_yuv422_semi_planar_format(uint32_t format) +{ + switch (format) { + case RGA_FORMAT_YCbCr_422_SP: + case RGA_FORMAT_YCrCb_422_SP: + case RGA_FORMAT_YCbCr_422_SP_10B: + case RGA_FORMAT_YCrCb_422_SP_10B: return true; default: return false; @@ -665,3 +713,17 @@ return (yrgb + uv + v); } + +void rga_dump_memory_parm(struct rga_memory_parm *parm) +{ + pr_info("memory param: w = %d, h = %d, f = %s(0x%x), size = %d\n", + parm->width, parm->height, rga_get_format_name(parm->format), + parm->format, parm->size); +} + +void rga_dump_external_buffer(struct rga_external_buffer *buffer) +{ + pr_info("external: memory = 0x%lx, type = %s\n", + (unsigned long)buffer->memory, rga_get_memory_type_str(buffer->type)); + rga_dump_memory_parm(&buffer->memory_parm); +} diff --git a/kernel/drivers/video/rockchip/rga3/rga_debugger.c b/kernel/drivers/video/rockchip/rga3/rga_debugger.c index 068e0cc..fe21031 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_debugger.c +++ b/kernel/drivers/video/rockchip/rga3/rga_debugger.c @@ -621,7 +621,11 @@ #ifdef CONFIG_ROCKCHIP_RGA_PROC_FS static int rga_procfs_open(struct inode *inode, struct file *file) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + struct rga_debugger_node *node = pde_data(inode); +#else struct rga_debugger_node *node = PDE_DATA(inode); +#endif return single_open(file, node->info_ent->show, node); } @@ -826,16 +830,6 @@ req->core, req->priority, req->in_fence_fd); } -void rga_dump_external_buffer(struct rga_external_buffer *buffer) -{ - pr_info("external: memory = 0x%lx, type = %s\n", - (unsigned long)buffer->memory, rga_get_memory_type_str(buffer->type)); - pr_info("param: w = %d, h = %d, f = %s, size = %d\n", - buffer->memory_parm.width, buffer->memory_parm.height, - rga_get_format_name(buffer->memory_parm.format), - buffer->memory_parm.size); -} - #ifdef CONFIG_NO_GKI static int rga_dump_image_to_file(struct rga_internal_buffer *dump_buffer, const char *channel_name, @@ -846,6 +840,10 @@ struct file *file; size_t size = 0; loff_t pos = 0; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + int ret; + struct iosys_map map; +#endif void *kvaddr = NULL; void *kvaddr_origin = NULL; @@ -858,7 +856,12 @@ return -EINVAL; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + ret = dma_buf_vmap(dump_buffer->dma_buffer->dma_buf, &map); + kvaddr = ret ? NULL : map.vaddr; +#else kvaddr = dma_buf_vmap(dump_buffer->dma_buffer->dma_buf); +#endif if (!kvaddr) { pr_err("can't vmap the dma buffer!\n"); return -EINVAL; @@ -928,7 +931,11 @@ switch (dump_buffer->type) { case RGA_DMA_BUFFER: case RGA_DMA_BUFFER_PTR: +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + dma_buf_vunmap(dump_buffer->dma_buffer->dma_buf, &map); +#else dma_buf_vunmap(dump_buffer->dma_buffer->dma_buf, kvaddr_origin); +#endif break; case RGA_VIRTUAL_ADDRESS: vunmap(kvaddr_origin); diff --git a/kernel/drivers/video/rockchip/rga3/rga_dma_buf.c b/kernel/drivers/video/rockchip/rga3/rga_dma_buf.c index b5b0dd0..db34db5 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_dma_buf.c +++ b/kernel/drivers/video/rockchip/rga3/rga_dma_buf.c @@ -203,15 +203,14 @@ size_t size, u64 dma_limit, struct device *dev) { - struct rga_iommu_dma_cookie *cookie = domain->iova_cookie; + struct rga_iommu_dma_cookie *cookie = (void *)domain->iova_cookie; struct iova_domain *iovad = &cookie->iovad; unsigned long shift, iova_len, iova = 0; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) - dma_addr_t limit; -#endif shift = iova_shift(iovad); iova_len = size >> shift; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0)) /* * Freeing non-power-of-two-sized allocations back into the IOVA caches * will come back to bite us badly, so we have to waste a bit of space @@ -220,6 +219,7 @@ */ if (iova_len < (1 << (IOVA_RANGE_CACHE_MAX_SIZE - 1))) iova_len = roundup_pow_of_two(iova_len); +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) dma_limit = min_not_zero(dma_limit, dev->bus_dma_limit); @@ -231,12 +231,13 @@ if (domain->geometry.force_aperture) dma_limit = min(dma_limit, (u64)domain->geometry.aperture_end); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) - iova = alloc_iova_fast(iovad, iova_len, dma_limit >> shift, true); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(4, 19, 111) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) + iova = alloc_iova_fast(iovad, iova_len, + min_t(dma_addr_t, dma_limit >> shift, iovad->end_pfn), + true); #else - limit = min_t(dma_addr_t, dma_limit >> shift, iovad->end_pfn); - - iova = alloc_iova_fast(iovad, iova_len, limit, true); + iova = alloc_iova_fast(iovad, iova_len, dma_limit >> shift, true); #endif return (dma_addr_t)iova << shift; @@ -245,7 +246,7 @@ static void rga_iommu_dma_free_iova(struct iommu_domain *domain, dma_addr_t iova, size_t size) { - struct rga_iommu_dma_cookie *cookie = domain->iova_cookie; + struct rga_iommu_dma_cookie *cookie = (void *)domain->iova_cookie; struct iova_domain *iovad = &cookie->iovad; free_iova_fast(iovad, iova_pfn(iovad, iova), size >> iova_shift(iovad)); @@ -284,7 +285,7 @@ } domain = rga_iommu_get_dma_domain(rga_dev); - cookie = domain->iova_cookie; + cookie = (void *)domain->iova_cookie; iovad = &cookie->iovad; align_size = iova_align(iovad, size); @@ -329,7 +330,7 @@ } domain = rga_iommu_get_dma_domain(rga_dev); - cookie = domain->iova_cookie; + cookie = (void *)domain->iova_cookie; iovad = &cookie->iovad; align_size = iova_align(iovad, size); @@ -393,12 +394,20 @@ { int ret = 0; void *vaddr; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + struct iosys_map map; +#endif struct dma_buf *dma_buf; dma_buf = rga_dma_buffer->dma_buf; if (!IS_ERR_OR_NULL(dma_buf)) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + ret = dma_buf_vmap(dma_buf, &map); + vaddr = ret ? NULL : map.vaddr; +#else vaddr = dma_buf_vmap(dma_buf); +#endif if (vaddr) { ret = rga_virtual_memory_check(vaddr, img->vir_w, img->vir_h, img->format, img->yrgb_addr); @@ -406,8 +415,11 @@ pr_err("can't vmap the dma buffer!\n"); return -EINVAL; } - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + dma_buf_vunmap(dma_buf, &map); +#else dma_buf_vunmap(dma_buf, vaddr); +#endif } return ret; @@ -424,21 +436,21 @@ if (dma_buf != NULL) { get_dma_buf(dma_buf); } else { - pr_err("dma_buf is Invalid[%p]\n", dma_buf); + pr_err("dma_buf is invalid[%p]\n", dma_buf); return -EINVAL; } attach = dma_buf_attach(dma_buf, rga_dev); if (IS_ERR(attach)) { - pr_err("Failed to attach dma_buf\n"); - ret = -EINVAL; + ret = PTR_ERR(attach); + pr_err("Failed to attach dma_buf, ret[%d]\n", ret); goto err_get_attach; } sgt = dma_buf_map_attachment(attach, dir); if (IS_ERR(sgt)) { - pr_err("Failed to map src attachment\n"); - ret = -EINVAL; + ret = PTR_ERR(sgt); + pr_err("Failed to map attachment, ret[%d]\n", ret); goto err_get_sgt; } @@ -474,22 +486,22 @@ dma_buf = dma_buf_get(fd); if (IS_ERR(dma_buf)) { - pr_err("dma_buf_get fail fd[%d]\n", fd); - ret = -EINVAL; + ret = PTR_ERR(dma_buf); + pr_err("Fail to get dma_buf from fd[%d], ret[%d]\n", fd, ret); return ret; } attach = dma_buf_attach(dma_buf, rga_dev); if (IS_ERR(attach)) { - pr_err("Failed to attach dma_buf\n"); - ret = -EINVAL; + ret = PTR_ERR(attach); + pr_err("Failed to attach dma_buf, ret[%d]\n", ret); goto err_get_attach; } sgt = dma_buf_map_attachment(attach, dir); if (IS_ERR(sgt)) { - pr_err("Failed to map src attachment\n"); - ret = -EINVAL; + ret = PTR_ERR(sgt); + pr_err("Failed to map attachment, ret[%d]\n", ret); goto err_get_sgt; } diff --git a/kernel/drivers/video/rockchip/rga3/rga_drv.c b/kernel/drivers/video/rockchip/rga3/rga_drv.c index 576b460..226fb77 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_drv.c +++ b/kernel/drivers/video/rockchip/rga3/rga_drv.c @@ -26,20 +26,6 @@ static struct hrtimer timer; static ktime_t kt; -static const struct rga_backend_ops rga3_ops = { - .get_version = rga3_get_version, - .set_reg = rga3_set_reg, - .init_reg = rga3_init_reg, - .soft_reset = rga3_soft_reset -}; - -static const struct rga_backend_ops rga2_ops = { - .get_version = rga2_get_version, - .set_reg = rga2_set_reg, - .init_reg = rga2_init_reg, - .soft_reset = rga2_soft_reset -}; - static struct rga_session *rga_session_init(void); static int rga_session_deinit(struct rga_session *session); @@ -49,6 +35,7 @@ { struct rga_external_buffer buffer; + memset(&buffer, 0x0, sizeof(buffer)); buffer.memory = (unsigned long)dma_buf; buffer.type = RGA_DMA_BUFFER_PTR; buffer.memory_parm.width = channel_info->vir_w; @@ -270,8 +257,8 @@ struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager; session = rga_session_init(); - if (!session) - return -ENOMEM; + if (IS_ERR(session)) + return PTR_ERR(session); request_id = rga_request_alloc(0, session); if (request_id < 0) { @@ -561,22 +548,38 @@ static struct rga_session *rga_session_init(void) { + int new_id; + struct rga_session_manager *session_manager = NULL; - struct rga_session *session = kzalloc(sizeof(*session), GFP_KERNEL); + struct rga_session *session = NULL; session_manager = rga_drvdata->session_manager; if (session_manager == NULL) { pr_err("rga_session_manager is null!\n"); - kfree(session); - return NULL; + return ERR_PTR(-EFAULT); + } + + session = kzalloc(sizeof(*session), GFP_KERNEL); + if (!session) { + pr_err("rga_session alloc failed\n"); + return ERR_PTR(-ENOMEM); } mutex_lock(&session_manager->lock); idr_preload(GFP_KERNEL); - session->id = idr_alloc(&session_manager->ctx_id_idr, session, 1, 0, GFP_ATOMIC); - session_manager->session_cnt++; + new_id = idr_alloc_cyclic(&session_manager->ctx_id_idr, session, 1, 0, GFP_NOWAIT); idr_preload_end(); + if (new_id < 0) { + mutex_unlock(&session_manager->lock); + + pr_err("rga_session alloc id failed!\n"); + kfree(session); + return ERR_PTR(new_id); + } + + session->id = new_id; + session_manager->session_cnt++; mutex_unlock(&session_manager->lock); @@ -588,29 +591,7 @@ static int rga_session_deinit(struct rga_session *session) { - pid_t pid; - int request_id; - struct rga_pending_request_manager *request_manager; - struct rga_request *request; - - pid = current->pid; - - request_manager = rga_drvdata->pend_request_manager; - - mutex_lock(&request_manager->lock); - - idr_for_each_entry(&request_manager->request_idr, request, request_id) { - - if (session == request->session) { - pr_err("[pid:%d] destroy request[%d] when the user exits", - pid, request->id); - rga_request_put(request); - } - } - - mutex_unlock(&request_manager->lock); - - rga_job_session_destroy(session); + rga_request_session_destroy_abort(session); rga_mm_session_release_buffer(session); rga_session_free_remove_idr(session); @@ -670,8 +651,9 @@ ret = rga_mm_import_buffer(&external_buffer[i], session); if (ret == 0) { - pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = 0x%x\n", + pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = %s(0x%x)\n", i, (unsigned long)external_buffer[i].memory, + rga_get_memory_type_str(external_buffer[i].type), external_buffer[i].type); goto err_free_external_buffer; @@ -741,7 +723,8 @@ ret = rga_mm_release_buffer(external_buffer[i].handle); if (ret < 0) { - pr_err("buffer[%d] mm release buffer failed!\n", i); + pr_err("buffer[%d] mm release buffer failed! handle = %d\n", + i, external_buffer[i].handle); goto err_free_external_buffer; } @@ -1140,8 +1123,8 @@ struct rga_session *session = NULL; session = rga_session_init(); - if (!session) - return -ENOMEM; + if (IS_ERR(session)) + return PTR_ERR(session); file->private_data = (void *)session; @@ -1157,97 +1140,39 @@ return 0; } -static irqreturn_t rga3_irq_handler(int irq, void *data) +static irqreturn_t rga_irq_handler(int irq, void *data) { + irqreturn_t irq_ret = IRQ_NONE; struct rga_scheduler_t *scheduler = data; - if (DEBUGGER_EN(INT_FLAG)) - pr_info("irqthread INT[%x],STATS0[%x], STATS1[%x]\n", - rga_read(RGA3_INT_RAW, scheduler), - rga_read(RGA3_STATUS0, scheduler), - rga_read(RGA3_STATUS1, scheduler)); + if (scheduler->ops->irq) + irq_ret = scheduler->ops->irq(scheduler); - /* TODO: if error interrupt then soft reset hardware */ - //scheduler->ops->soft_reset(job->core); - - /*clear INT */ - rga_write(1, RGA3_INT_CLR, scheduler); - - return IRQ_WAKE_THREAD; + return irq_ret; } -static irqreturn_t rga3_irq_thread(int irq, void *data) +static irqreturn_t rga_isr_thread(int irq, void *data) { + irqreturn_t irq_ret = IRQ_NONE; struct rga_scheduler_t *scheduler = data; struct rga_job *job; - job = scheduler->running_job; - - if (!job) { - pr_err("running job is invaild on irq thread\n"); + job = rga_job_done(scheduler); + if (job == NULL) { + pr_err("isr thread invalid job!\n"); return IRQ_HANDLED; } - if (DEBUGGER_EN(INT_FLAG)) - pr_info("irq INT[%x], STATS0[%x], STATS1[%x]\n", - rga_read(RGA3_INT_RAW, scheduler), - rga_read(RGA3_STATUS0, scheduler), - rga_read(RGA3_STATUS1, scheduler)); + if (scheduler->ops->isr_thread) + irq_ret = scheduler->ops->isr_thread(job, scheduler); - rga_job_done(scheduler, 0); + rga_request_release_signal(scheduler, job); - return IRQ_HANDLED; -} + rga_job_next(scheduler); -static irqreturn_t rga2_irq_handler(int irq, void *data) -{ - struct rga_scheduler_t *scheduler = data; + rga_power_disable(scheduler); - if (DEBUGGER_EN(INT_FLAG)) - pr_info("irqthread INT[%x],STATS0[%x]\n", - rga_read(RGA2_INT, scheduler), rga_read(RGA2_STATUS, - scheduler)); - - /*if error interrupt then soft reset hardware */ - //warning - if (rga_read(RGA2_INT, scheduler) & 0x01) { - pr_err("err irq! INT[%x],STATS0[%x]\n", - rga_read(RGA2_INT, scheduler), - rga_read(RGA2_STATUS, scheduler)); - scheduler->ops->soft_reset(scheduler); - } - - /*clear INT */ - rga_write(rga_read(RGA2_INT, scheduler) | - (0x1 << 4) | (0x1 << 5) | (0x1 << 6) | (0x1 << 7) | - (0x1 << 15) | (0x1 << 16), RGA2_INT, scheduler); - - return IRQ_WAKE_THREAD; -} - -static irqreturn_t rga2_irq_thread(int irq, void *data) -{ - struct rga_scheduler_t *scheduler = data; - struct rga_job *job; - - job = scheduler->running_job; - - if (!job) - return IRQ_HANDLED; - - if (DEBUGGER_EN(INT_FLAG)) - pr_info("irq INT[%x], STATS0[%x]\n", - rga_read(RGA2_INT, scheduler), rga_read(RGA2_STATUS, - scheduler)); - - job->rga_command_base.osd_info.cur_flags0 = rga_read(RGA2_OSD_CUR_FLAGS0_OFFSET, - scheduler); - job->rga_command_base.osd_info.cur_flags1 = rga_read(RGA2_OSD_CUR_FLAGS1_OFFSET, - scheduler); - - rga_job_done(scheduler, 0); - - return IRQ_HANDLED; + return irq_ret; } const struct file_operations rga_fops = { @@ -1290,44 +1215,24 @@ "clk_rga3_1", }; -static const struct rga_irqs_data_t single_rga2_irqs[] = { - {"rga2_irq", rga2_irq_handler, rga2_irq_thread} -}; - -static const struct rga_irqs_data_t rga3_core0_irqs[] = { - {"rga3_core0_irq", rga3_irq_handler, rga3_irq_thread} -}; - -static const struct rga_irqs_data_t rga3_core1_irqs[] = { - {"rga3_core1_irq", rga3_irq_handler, rga3_irq_thread} -}; - static const struct rga_match_data_t old_rga2_match_data = { .clks = old_rga2_clks, .num_clks = ARRAY_SIZE(old_rga2_clks), - .irqs = single_rga2_irqs, - .num_irqs = ARRAY_SIZE(single_rga2_irqs) }; static const struct rga_match_data_t rk3588_rga2_match_data = { .clks = rk3588_rga2_clks, .num_clks = ARRAY_SIZE(rk3588_rga2_clks), - .irqs = single_rga2_irqs, - .num_irqs = ARRAY_SIZE(single_rga2_irqs) }; static const struct rga_match_data_t rga3_core0_match_data = { .clks = rga3_core_0_clks, .num_clks = ARRAY_SIZE(rga3_core_0_clks), - .irqs = rga3_core0_irqs, - .num_irqs = ARRAY_SIZE(rga3_core0_irqs) }; static const struct rga_match_data_t rga3_core1_match_data = { .clks = rga3_core_1_clks, .num_clks = ARRAY_SIZE(rga3_core_1_clks), - .irqs = rga3_core1_irqs, - .num_irqs = ARRAY_SIZE(rga3_core1_irqs) }; static const struct of_device_id rga3_core0_dt_ids[] = { @@ -1439,21 +1344,21 @@ /* there are irq names in dts */ irq = platform_get_irq(pdev, 0); if (irq < 0) { - dev_err(dev, "no irq %s in dts\n", match_data->irqs[0].name); + dev_err(dev, "no irq %s in dts\n", dev_driver_string(dev)); return irq; } scheduler->irq = irq; - pr_info("%s, irq = %d, match scheduler\n", match_data->irqs[0].name, irq); + pr_info("%s, irq = %d, match scheduler\n", dev_driver_string(dev), irq); ret = devm_request_threaded_irq(dev, irq, - match_data->irqs[0].irq_hdl, - match_data->irqs[0].irq_thread, + rga_irq_handler, + rga_isr_thread, IRQF_SHARED, dev_driver_string(dev), scheduler); if (ret < 0) { - pr_err("request irq name: %s failed: %d\n", match_data->irqs[0].name, ret); + pr_err("request irq name: %s failed: %d\n", dev_driver_string(dev), ret); return ret; } @@ -1695,6 +1600,8 @@ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)) #ifdef CONFIG_ROCKCHIP_THUNDER_BOOT module_init(rga_init); +#elif defined CONFIG_VIDEO_REVERSE_IMAGE +fs_initcall(rga_init); #else late_initcall(rga_init); #endif diff --git a/kernel/drivers/video/rockchip/rga3/rga_fence.c b/kernel/drivers/video/rockchip/rga3/rga_fence.c index 0e1f58f..7d831d5 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_fence.c +++ b/kernel/drivers/video/rockchip/rga3/rga_fence.c @@ -84,8 +84,10 @@ return fence_fd; sync_file = sync_file_create(fence); - if (!sync_file) + if (!sync_file) { + put_unused_fd(fence_fd); return -ENOMEM; + } fd_install(fence_fd, sync_file->file); diff --git a/kernel/drivers/video/rockchip/rga3/rga_iommu.c b/kernel/drivers/video/rockchip/rga3/rga_iommu.c index 3b7a4ef..6ef9cbc 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_iommu.c +++ b/kernel/drivers/video/rockchip/rga3/rga_iommu.c @@ -5,7 +5,7 @@ * Author: Huang Lee <Putin.li@rock-chips.com> */ -#define pr_fmt(fmt) "rga2_mmu: " fmt +#define pr_fmt(fmt) "rga_iommu: " fmt #include "rga_iommu.h" #include "rga_dma_buf.h" @@ -170,6 +170,12 @@ * size * channel_num * address_size */ order = get_order(size * 3 * sizeof(*mmu_base->buf_virtual)); + if (order >= MAX_ORDER) { + pr_err("Can not alloc pages with order[%d] for mmu_page_table, max_order = %d\n", + order, MAX_ORDER); + goto err_free_mmu_base; + } + mmu_base->buf_virtual = (uint32_t *) __get_free_pages(GFP_KERNEL | GFP_DMA32, order); if (mmu_base->buf_virtual == NULL) { pr_err("Can not alloc pages for mmu_page_table\n"); @@ -178,6 +184,12 @@ mmu_base->buf_order = order; order = get_order(size * sizeof(*mmu_base->pages)); + if (order >= MAX_ORDER) { + pr_err("Can not alloc pages with order[%d] for mmu_base->pages, max_order = %d\n", + order, MAX_ORDER); + goto err_free_buf_virtual; + } + mmu_base->pages = (struct page **)__get_free_pages(GFP_KERNEL | GFP_DMA32, order); if (mmu_base->pages == NULL) { pr_err("Can not alloc pages for mmu_base->pages\n"); @@ -219,6 +231,38 @@ kfree(base); *mmu_base = NULL; +} + +static int rga_iommu_intr_fault_handler(struct iommu_domain *iommu, struct device *iommu_dev, + unsigned long iova, int status, void *arg) +{ + struct rga_scheduler_t *scheduler = (struct rga_scheduler_t *)arg; + struct rga_job *job = scheduler->running_job; + + if (job == NULL) + return 0; + + pr_err("IOMMU intr fault, IOVA[0x%lx], STATUS[0x%x]\n", iova, status); + if (scheduler->ops->irq) + scheduler->ops->irq(scheduler); + + /* iommu interrupts on rga2 do not affect rga2 itself. */ + if (!test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) { + set_bit(RGA_JOB_STATE_INTR_ERR, &job->state); + scheduler->ops->soft_reset(scheduler); + } + + if (status & RGA_IOMMU_IRQ_PAGE_FAULT) { + pr_err("RGA IOMMU: page fault! Please check the memory size.\n"); + job->ret = -EACCES; + } else if (status & RGA_IOMMU_IRQ_BUS_ERROR) { + pr_err("RGA IOMMU: bus error! Please check if the memory is invalid or has been freed.\n"); + job->ret = -EACCES; + } else { + pr_err("RGA IOMMU: Wrong IOMMU interrupt signal!\n"); + } + + return 0; } int rga_iommu_detach(struct rga_iommu_info *info) @@ -306,6 +350,9 @@ if (main_iommu == NULL) { main_iommu = scheduler->iommu_info; main_iommu_index = i; + iommu_set_fault_handler(main_iommu->domain, + rga_iommu_intr_fault_handler, + (void *)scheduler); } else { scheduler->iommu_info->domain = main_iommu->domain; scheduler->iommu_info->default_dev = main_iommu->default_dev; diff --git a/kernel/drivers/video/rockchip/rga3/rga_job.c b/kernel/drivers/video/rockchip/rga3/rga_job.c index 47bb908..bbe6fa8 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_job.c +++ b/kernel/drivers/video/rockchip/rga3/rga_job.c @@ -14,74 +14,28 @@ #include "rga_iommu.h" #include "rga_debugger.h" -struct rga_job * -rga_scheduler_get_pending_job_list(struct rga_scheduler_t *scheduler) -{ - unsigned long flags; - struct rga_job *job; - - spin_lock_irqsave(&scheduler->irq_lock, flags); - - job = list_first_entry_or_null(&scheduler->todo_list, - struct rga_job, head); - - spin_unlock_irqrestore(&scheduler->irq_lock, flags); - - return job; -} - -struct rga_job * -rga_scheduler_get_running_job(struct rga_scheduler_t *scheduler) -{ - unsigned long flags; - struct rga_job *job; - - spin_lock_irqsave(&scheduler->irq_lock, flags); - - job = scheduler->running_job; - - spin_unlock_irqrestore(&scheduler->irq_lock, flags); - - return job; -} - -struct rga_scheduler_t *rga_job_get_scheduler(struct rga_job *job) -{ - return job->scheduler; -} - static void rga_job_free(struct rga_job *job) { free_page((unsigned long)job); } -void rga_job_session_destroy(struct rga_session *session) +static void rga_job_kref_release(struct kref *ref) { - struct rga_scheduler_t *scheduler = NULL; - struct rga_job *job_pos, *job_q; - int i; + struct rga_job *job; - unsigned long flags; + job = container_of(ref, struct rga_job, refcount); - for (i = 0; i < rga_drvdata->num_of_scheduler; i++) { - scheduler = rga_drvdata->scheduler[i]; + rga_job_free(job); +} - spin_lock_irqsave(&scheduler->irq_lock, flags); +static int rga_job_put(struct rga_job *job) +{ + return kref_put(&job->refcount, rga_job_kref_release); +} - list_for_each_entry_safe(job_pos, job_q, &scheduler->todo_list, head) { - if (session == job_pos->session) { - list_del(&job_pos->head); - - spin_unlock_irqrestore(&scheduler->irq_lock, flags); - - rga_job_free(job_pos); - - spin_lock_irqsave(&scheduler->irq_lock, flags); - } - } - - spin_unlock_irqrestore(&scheduler->irq_lock, flags); - } +static void rga_job_get(struct rga_job *job) +{ + kref_get(&job->refcount); } static int rga_job_cleanup(struct rga_job *job) @@ -90,7 +44,7 @@ pr_err("(pid:%d) job clean use time = %lld\n", job->pid, ktime_us_delta(ktime_get(), job->timestamp)); - rga_job_free(job); + rga_job_put(job); return 0; } @@ -165,6 +119,7 @@ return NULL; INIT_LIST_HEAD(&job->head); + kref_init(&job->refcount); job->timestamp = ktime_get(); job->pid = current->pid; @@ -232,16 +187,18 @@ return ret; } + set_bit(RGA_JOB_STATE_RUNNING, &job->state); + /* for debug */ if (DEBUGGER_EN(MSG)) rga_job_dump_info(job); return ret; - } -static void rga_job_next(struct rga_scheduler_t *scheduler) +void rga_job_next(struct rga_scheduler_t *scheduler) { + int ret; struct rga_job *job = NULL; unsigned long flags; @@ -261,51 +218,33 @@ scheduler->job_count--; scheduler->running_job = job; + set_bit(RGA_JOB_STATE_PREPARE, &job->state); + rga_job_get(job); spin_unlock_irqrestore(&scheduler->irq_lock, flags); - job->ret = rga_job_run(job, scheduler); + ret = rga_job_run(job, scheduler); /* If some error before hw run */ - if (job->ret < 0) { - pr_err("some error on rga_job_run before hw start, %s(%d)\n", - __func__, __LINE__); + if (ret < 0) { + pr_err("some error on rga_job_run before hw start, %s(%d)\n", __func__, __LINE__); spin_lock_irqsave(&scheduler->irq_lock, flags); scheduler->running_job = NULL; + rga_job_put(job); spin_unlock_irqrestore(&scheduler->irq_lock, flags); + job->ret = ret; rga_request_release_signal(scheduler, job); goto next_job; } + + rga_job_put(job); } -static void rga_job_finish_and_next(struct rga_scheduler_t *scheduler, - struct rga_job *job, int ret) -{ - ktime_t now; - - job->ret = ret; - - if (DEBUGGER_EN(TIME)) { - now = ktime_get(); - pr_info("hw use time = %lld\n", ktime_us_delta(now, job->hw_running_time)); - pr_info("(pid:%d) job done use time = %lld\n", job->pid, - ktime_us_delta(now, job->timestamp)); - } - - rga_mm_unmap_job_info(job); - - rga_request_release_signal(scheduler, job); - - rga_job_next(scheduler); - - rga_power_disable(scheduler); -} - -void rga_job_done(struct rga_scheduler_t *scheduler, int ret) +struct rga_job *rga_job_done(struct rga_scheduler_t *scheduler) { struct rga_job *job; unsigned long flags; @@ -314,16 +253,34 @@ spin_lock_irqsave(&scheduler->irq_lock, flags); job = scheduler->running_job; + if (job == NULL) { + pr_err("core[0x%x] running job has been cleanup.\n", scheduler->core); + + spin_unlock_irqrestore(&scheduler->irq_lock, flags); + return NULL; + } scheduler->running_job = NULL; scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time); + set_bit(RGA_JOB_STATE_DONE, &job->state); spin_unlock_irqrestore(&scheduler->irq_lock, flags); + + if (scheduler->ops->read_back_reg) + scheduler->ops->read_back_reg(job, scheduler); if (DEBUGGER_EN(DUMP_IMAGE)) rga_dump_job_image(job); - rga_job_finish_and_next(scheduler, job, ret); + if (DEBUGGER_EN(TIME)) { + pr_info("hw use time = %lld\n", ktime_us_delta(now, job->hw_running_time)); + pr_info("(pid:%d) job done use time = %lld\n", job->pid, + ktime_us_delta(now, job->timestamp)); + } + + rga_mm_unmap_job_info(job); + + return job; } static void rga_job_scheduler_timeout_clean(struct rga_scheduler_t *scheduler) @@ -391,13 +348,20 @@ } scheduler->job_count++; + set_bit(RGA_JOB_STATE_PENDING, &job->state); spin_unlock_irqrestore(&scheduler->irq_lock, flags); } static struct rga_scheduler_t *rga_job_schedule(struct rga_job *job) { + int i; struct rga_scheduler_t *scheduler = NULL; + + for (i = 0; i < rga_drvdata->num_of_scheduler; i++) { + scheduler = rga_drvdata->scheduler[i]; + rga_job_scheduler_timeout_clean(scheduler); + } if (rga_drvdata->num_of_scheduler > 1) { job->core = rga_job_assign(job); @@ -411,14 +375,12 @@ job->scheduler = rga_drvdata->scheduler[0]; } - scheduler = rga_job_get_scheduler(job); + scheduler = job->scheduler; if (scheduler == NULL) { pr_err("failed to get scheduler, %s(%d)\n", __func__, __LINE__); job->ret = -EFAULT; return NULL; } - - rga_job_scheduler_timeout_clean(scheduler); return scheduler; } @@ -557,26 +519,13 @@ request->current_mm = NULL; } -static int rga_request_alloc_release_fence(struct dma_fence **release_fence) -{ - struct dma_fence *fence; - - fence = rga_dma_fence_alloc(); - if (IS_ERR(fence)) { - pr_err("Can not alloc release fence!\n"); - return IS_ERR(fence); - } - - *release_fence = fence; - - return rga_dma_fence_get_fd(fence); -} - -static int rga_request_add_acquire_fence_callback(int acquire_fence_fd, void *private, +static int rga_request_add_acquire_fence_callback(int acquire_fence_fd, + struct rga_request *request, dma_fence_func_t cb_func) { int ret; struct dma_fence *acquire_fence = NULL; + struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager; if (DEBUGGER_EN(MSG)) pr_info("acquire_fence_fd = %d", acquire_fence_fd); @@ -588,19 +537,38 @@ return -EINVAL; } /* close acquire fence fd */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + close_fd(acquire_fence_fd); +#else ksys_close(acquire_fence_fd); +#endif ret = rga_dma_fence_get_status(acquire_fence); - if (ret == 0) { - ret = rga_dma_fence_add_callback(acquire_fence, cb_func, private); - if (ret < 0) { - if (ret == -ENOENT) - return 1; + if (ret < 0) { + pr_err("%s: Current acquire fence unexpectedly has error status before signal\n", + __func__); + return ret; + } else if (ret > 0) { + /* has been signaled */ + return ret; + } + /* + * Ensure that the request will not be free early when + * the callback is called. + */ + mutex_lock(&request_manager->lock); + rga_request_get(request); + mutex_unlock(&request_manager->lock); + + ret = rga_dma_fence_add_callback(acquire_fence, cb_func, (void *)request); + if (ret < 0) { + if (ret != -ENOENT) pr_err("%s: failed to add fence callback\n", __func__); - return ret; - } - } else { + + mutex_lock(&request_manager->lock); + rga_request_put(request); + mutex_unlock(&request_manager->lock); return ret; } @@ -742,6 +710,70 @@ mutex_unlock(&request_manager->lock); } +void rga_request_session_destroy_abort(struct rga_session *session) +{ + int request_id; + struct rga_request *request; + struct rga_pending_request_manager *request_manager; + + request_manager = rga_drvdata->pend_request_manager; + if (request_manager == NULL) { + pr_err("rga_pending_request_manager is null!\n"); + return; + } + + mutex_lock(&request_manager->lock); + + idr_for_each_entry(&request_manager->request_idr, request, request_id) { + if (session == request->session) { + pr_err("[tgid:%d pid:%d] destroy request[%d] when the user exits", + session->tgid, current->pid, request->id); + rga_request_put(request); + } + } + + mutex_unlock(&request_manager->lock); +} + +static int rga_request_timeout_query_state(struct rga_request *request) +{ + int i; + unsigned long flags; + struct rga_scheduler_t *scheduler = NULL; + struct rga_job *job = NULL; + + for (i = 0; i < rga_drvdata->num_of_scheduler; i++) { + scheduler = rga_drvdata->scheduler[i]; + + spin_lock_irqsave(&scheduler->irq_lock, flags); + + if (scheduler->running_job) { + job = scheduler->running_job; + if (request->id == job->request_id) { + if (test_bit(RGA_JOB_STATE_DONE, &job->state) && + test_bit(RGA_JOB_STATE_FINISH, &job->state)) { + spin_unlock_irqrestore(&scheduler->irq_lock, flags); + return request->ret; + } else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) && + test_bit(RGA_JOB_STATE_FINISH, &job->state)) { + spin_unlock_irqrestore(&scheduler->irq_lock, flags); + pr_err("hardware has finished, but the software has timeout!\n"); + return -EBUSY; + } else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) && + !test_bit(RGA_JOB_STATE_FINISH, &job->state)) { + spin_unlock_irqrestore(&scheduler->irq_lock, flags); + pr_err("hardware has timeout.\n"); + return -EBUSY; + } + } + } + + spin_unlock_irqrestore(&scheduler->irq_lock, flags); + } + + return request->ret; +} + static int rga_request_wait(struct rga_request *request) { int left_time; @@ -752,8 +784,7 @@ switch (left_time) { case 0: - pr_err("%s timeout", __func__); - ret = -EBUSY; + ret = rga_request_timeout_query_state(request); goto err_request_abort; case -ERESTARTSYS: ret = -ERESTARTSYS; @@ -800,9 +831,15 @@ struct dma_fence_cb *_waiter) { struct rga_fence_waiter *waiter = (struct rga_fence_waiter *)_waiter; + struct rga_request *request = (struct rga_request *)waiter->private; + struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager; - if (rga_request_commit((struct rga_request *)waiter->private)) + if (rga_request_commit(request)) pr_err("rga request commit failed!\n"); + + mutex_lock(&request_manager->lock); + rga_request_put(request); + mutex_unlock(&request_manager->lock); kfree(waiter); } @@ -832,8 +869,6 @@ rga_request_get(request); mutex_unlock(&request_manager->lock); - rga_job_cleanup(job); - spin_lock_irqsave(&request->lock, flags); if (job->ret < 0) { @@ -847,6 +882,8 @@ finished_count = request->finished_task_count; spin_unlock_irqrestore(&request->lock, flags); + + rga_job_cleanup(job); if ((failed_count + finished_count) >= request->task_count) { spin_lock_irqsave(&request->lock, flags); @@ -1003,18 +1040,21 @@ { int ret = 0; unsigned long flags; + struct dma_fence *release_fence; spin_lock_irqsave(&request->lock, flags); if (request->is_running) { - pr_err("can not re-config when request is running"); spin_unlock_irqrestore(&request->lock, flags); + + pr_err("can not re-config when request is running\n"); return -EFAULT; } if (request->task_list == NULL) { - pr_err("can not find task list from id[%d]", request->id); spin_unlock_irqrestore(&request->lock, flags); + + pr_err("can not find task list from id[%d]\n", request->id); return -EINVAL; } @@ -1026,46 +1066,71 @@ rga_request_get_current_mm(request); + /* Unlock after ensuring that the current request will not be resubmitted. */ spin_unlock_irqrestore(&request->lock, flags); if (request->sync_mode == RGA_BLIT_ASYNC) { - ret = rga_request_alloc_release_fence(&request->release_fence); - if (ret < 0) { - pr_err("Failed to alloc release fence fd!\n"); - return ret; + release_fence = rga_dma_fence_alloc(); + if (IS_ERR(release_fence)) { + pr_err("Can not alloc release fence!\n"); + ret = IS_ERR(release_fence); + goto error_put_current_mm; } - request->release_fence_fd = ret; + request->release_fence = release_fence; if (request->acquire_fence_fd > 0) { ret = rga_request_add_acquire_fence_callback( - request->acquire_fence_fd, - (void *)request, + request->acquire_fence_fd, request, rga_request_acquire_fence_signaled_cb); if (ret == 0) { - return ret; - } else if (ret == 1) { + /* acquire fence active */ + goto export_release_fence_fd; + } else if (ret > 0) { + /* acquire fence has been signaled */ goto request_commit; } else { pr_err("Failed to add callback with acquire fence fd[%d]!\n", request->acquire_fence_fd); - goto error_release_fence_put; + goto err_put_release_fence; } } - } request_commit: ret = rga_request_commit(request); if (ret < 0) { pr_err("rga request commit failed!\n"); - goto error_release_fence_put; + goto err_put_release_fence; + } + +export_release_fence_fd: + if (request->release_fence != NULL) { + ret = rga_dma_fence_get_fd(request->release_fence); + if (ret < 0) { + pr_err("Failed to alloc release fence fd!\n"); + rga_request_release_abort(request, ret); + return ret; + } + + request->release_fence_fd = ret; } return 0; -error_release_fence_put: - rga_dma_fence_put(request->release_fence); - request->release_fence = NULL; +err_put_release_fence: + if (request->release_fence != NULL) { + rga_dma_fence_put(request->release_fence); + request->release_fence = NULL; + } + +error_put_current_mm: + spin_lock_irqsave(&request->lock, flags); + + rga_request_put_current_mm(request); + request->is_running = false; + + spin_unlock_irqrestore(&request->lock, flags); + return ret; } @@ -1159,10 +1224,11 @@ request = container_of(ref, struct rga_request, refcount); if (rga_dma_fence_get_status(request->release_fence) == 0) - rga_dma_fence_signal(request->release_fence, -EEXIST); + rga_dma_fence_signal(request->release_fence, -EFAULT); spin_lock_irqsave(&request->lock, flags); + rga_request_put_current_mm(request); rga_dma_fence_put(request->release_fence); if (!request->is_running || request->is_done) { @@ -1188,6 +1254,7 @@ int rga_request_alloc(uint32_t flags, struct rga_session *session) { + int new_id; struct rga_pending_request_manager *request_manager; struct rga_request *request; @@ -1218,17 +1285,17 @@ mutex_lock(&request_manager->lock); idr_preload(GFP_KERNEL); - request->id = idr_alloc(&request_manager->request_idr, request, 1, 0, GFP_KERNEL); + new_id = idr_alloc_cyclic(&request_manager->request_idr, request, 1, 0, GFP_NOWAIT); idr_preload_end(); - - if (request->id <= 0) { - pr_err("alloc request_id failed!\n"); + if (new_id < 0) { + pr_err("request alloc id failed!\n"); mutex_unlock(&request_manager->lock); kfree(request); - return -EFAULT; + return new_id; } + request->id = new_id; request_manager->request_count++; mutex_unlock(&request_manager->lock); diff --git a/kernel/drivers/video/rockchip/rga3/rga_mm.c b/kernel/drivers/video/rockchip/rga3/rga_mm.c index 7d59472..cd461b5 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_mm.c +++ b/kernel/drivers/video/rockchip/rga3/rga_mm.c @@ -53,14 +53,14 @@ for (i = 0; i < pageCount; i++) { vma = find_vma(current_mm, (Memory + i) << PAGE_SHIFT); if (!vma) { - pr_err("failed to get vma\n"); + pr_err("page[%d] failed to get vma\n", i); ret = RGA_OUT_OF_RESOURCES; break; } pgd = pgd_offset(current_mm, (Memory + i) << PAGE_SHIFT); if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) { - pr_err("failed to get pgd\n"); + pr_err("page[%d] failed to get pgd\n", i); ret = RGA_OUT_OF_RESOURCES; break; } @@ -71,7 +71,7 @@ */ p4d = p4d_offset(pgd, (Memory + i) << PAGE_SHIFT); if (p4d_none(*p4d) || unlikely(p4d_bad(*p4d))) { - pr_err("failed to get p4d\n"); + pr_err("page[%d] failed to get p4d\n", i); ret = RGA_OUT_OF_RESOURCES; break; } @@ -82,20 +82,20 @@ #endif if (pud_none(*pud) || unlikely(pud_bad(*pud))) { - pr_err("failed to get pud\n"); + pr_err("page[%d] failed to get pud\n", i); ret = RGA_OUT_OF_RESOURCES; break; } pmd = pmd_offset(pud, (Memory + i) << PAGE_SHIFT); if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd))) { - pr_err("failed to get pmd\n"); + pr_err("page[%d] failed to get pmd\n", i); ret = RGA_OUT_OF_RESOURCES; break; } pte = pte_offset_map_lock(current_mm, pmd, (Memory + i) << PAGE_SHIFT, &ptl); if (pte_none(*pte)) { - pr_err("failed to get pte\n"); + pr_err("page[%d] failed to get pte\n", i); pte_unmap_unlock(pte, ptl); ret = RGA_OUT_OF_RESOURCES; break; @@ -105,6 +105,10 @@ pages[i] = pfn_to_page(pfn); pte_unmap_unlock(pte, ptl); } + + if (ret == RGA_OUT_OF_RESOURCES && i > 0) + pr_err("Only get buffer %d byte from vma, but current image required %d byte", + (int)(i * PAGE_SIZE), (int)(pageCount * PAGE_SIZE)); return ret; } @@ -144,9 +148,9 @@ put_page(pages[i]); ret = rga_get_user_pages_from_vma(pages, Memory, pageCount, current_mm); - if (ret < 0) { - pr_err("Can not get user pages from vma, result = %d, pagecount = %d\n", - result, pageCount); + if (ret < 0 && result > 0) { + pr_err("Only get buffer %d byte from user pages, but current image required %d byte\n", + (int)(result * PAGE_SIZE), (int)(pageCount * PAGE_SIZE)); } } @@ -177,9 +181,12 @@ } /* get sg form pages. */ - ret = sg_alloc_table_from_pages(sgt, virt_addr->pages, + /* iova requires minimum page alignment, so sgt cannot have offset */ + ret = sg_alloc_table_from_pages(sgt, + virt_addr->pages, virt_addr->page_count, - 0, virt_addr->size, + 0, + virt_addr->size, GFP_KERNEL); if (ret) { pr_err("sg_alloc_table_from_pages failed"); @@ -245,21 +252,29 @@ if (!size) { pr_err("failed to calculating buffer size! size = %ld, count = %d, offset = %ld\n", size, count, (unsigned long)offset); + rga_dump_memory_parm(memory_parm); return -EFAULT; } /* alloc pages and page_table */ order = get_order(count * sizeof(struct page *)); + if (order >= MAX_ORDER) { + pr_err("Can not alloc pages with order[%d] for viraddr pages, max_order = %d\n", + order, MAX_ORDER); + return -ENOMEM; + } + pages = (struct page **)__get_free_pages(GFP_KERNEL, order); if (pages == NULL) { - pr_err("%s can not alloc pages for pages\n", __func__); + pr_err("%s can not alloc pages for viraddr pages\n", __func__); return -ENOMEM; } /* get pages from virtual address. */ ret = rga_get_user_pages(pages, viraddr >> PAGE_SHIFT, count, writeFlag, mm); if (ret < 0) { - pr_err("failed to get pages"); + pr_err("failed to get pages from virtual adrees: 0x%lx\n", + (unsigned long)viraddr); ret = -EINVAL; goto out_free_pages; } else if (ret > 0) { @@ -301,7 +316,7 @@ if (scheduler->data->mmu == RGA_MMU && !(mm_flag & RGA_MEM_UNDER_4G)) { - pr_err("%s unsupported Memory larger than 4G!\n", + pr_err("%s unsupported memory larger than 4G!\n", rga_get_mmu_type_str(scheduler->data->mmu)); return false; } @@ -358,6 +373,7 @@ struct rga_job *job) { int ret; + int ex_buffer_size; uint32_t mm_flag = 0; phys_addr_t phys_addr = 0; struct rga_dma_buffer *buffer; @@ -369,6 +385,19 @@ if (scheduler == NULL) { pr_err("Invalid scheduler device!\n"); return -EINVAL; + } + + if (external_buffer->memory_parm.size) + ex_buffer_size = external_buffer->memory_parm.size; + else + ex_buffer_size = rga_image_size_cal(external_buffer->memory_parm.width, + external_buffer->memory_parm.height, + external_buffer->memory_parm.format, + NULL, NULL, NULL); + if (ex_buffer_size <= 0) { + pr_err("failed to calculating buffer size!\n"); + rga_dump_memory_parm(&external_buffer->memory_parm); + return ex_buffer_size == 0 ? -EINVAL : ex_buffer_size; } /* @@ -402,6 +431,15 @@ pr_err("%s core[%d] map dma buffer error!\n", __func__, scheduler->core); goto free_buffer; + } + + if (buffer->size < ex_buffer_size) { + pr_err("Only get buffer %ld byte from %s = 0x%lx, but current image required %d byte\n", + buffer->size, rga_get_memory_type_str(external_buffer->type), + (unsigned long)external_buffer->memory, ex_buffer_size); + rga_dump_memory_parm(&external_buffer->memory_parm); + ret = -EINVAL; + goto unmap_buffer; } buffer->scheduler = scheduler; @@ -576,8 +614,8 @@ if (mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS) break; - pr_err("Current RGA mmu[%d] cannot support virtual address!\n", - scheduler->data->mmu); + pr_err("Current %s[%d] cannot support virtual address!\n", + rga_get_mmu_type_str(scheduler->data->mmu), scheduler->data->mmu); goto free_dma_buffer; } @@ -589,7 +627,7 @@ internal_buffer->virt_addr = virt_addr; internal_buffer->dma_buffer = buffer; internal_buffer->mm_flag = mm_flag; - internal_buffer->phys_addr = phys_addr ? phys_addr : 0; + internal_buffer->phys_addr = phys_addr ? phys_addr + virt_addr->offset : 0; return 0; @@ -649,7 +687,8 @@ internal_buffer->memory_parm.format, NULL, NULL, NULL); if (buffer_size <= 0) { - pr_err("Fault to get phys addr size!\n"); + pr_err("Failed to get phys addr size!\n"); + rga_dump_memory_parm(&internal_buffer->memory_parm); return buffer_size == 0 ? -EINVAL : buffer_size; } @@ -674,7 +713,7 @@ ret = rga_iommu_map(phys_addr, buffer_size, buffer, scheduler->dev); if (ret < 0) { pr_err("%s core[%d] map phys_addr error!\n", __func__, scheduler->core); - return ret; + goto free_dma_buffer; } } @@ -686,6 +725,11 @@ internal_buffer->dma_buffer = buffer; return 0; + +free_dma_buffer: + kfree(buffer); + + return ret; } static int rga_mm_unmap_buffer(struct rga_internal_buffer *internal_buffer) @@ -738,7 +782,7 @@ ret = rga_mm_map_virt_addr(external_buffer, internal_buffer, job, write_flag); if (ret < 0) { - pr_err("%s iommu_map virtual address error!\n", __func__); + pr_err("%s map virtual address error!\n", __func__); return ret; } @@ -751,7 +795,7 @@ ret = rga_mm_map_phys_addr(external_buffer, internal_buffer, job); if (ret < 0) { - pr_err("%s iommu_map physical address error!\n", __func__); + pr_err("%s map physical address error!\n", __func__); return ret; } @@ -1130,9 +1174,15 @@ if (job->flags & RGA_JOB_USE_HANDLE) { order = get_order(page_count * sizeof(uint32_t *)); + if (order >= MAX_ORDER) { + pr_err("Can not alloc pages with order[%d] for page_table, max_order = %d\n", + order, MAX_ORDER); + return -ENOMEM; + } + page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order); if (page_table == NULL) { - pr_err("%s can not alloc pages for pages, order = %d\n", + pr_err("%s can not alloc pages for page_table, order = %d\n", __func__, order); return -ENOMEM; } @@ -1189,9 +1239,15 @@ if (job->flags & RGA_JOB_USE_HANDLE) { order = get_order(page_count * sizeof(uint32_t *)); + if (order >= MAX_ORDER) { + pr_err("Can not alloc pages with order[%d] for page_table, max_order = %d\n", + order, MAX_ORDER); + return -ENOMEM; + } + page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order); if (page_table == NULL) { - pr_err("%s can not alloc pages for pages, order = %d\n", + pr_err("%s can not alloc pages for page_table, order = %d\n", __func__, order); return -ENOMEM; } @@ -1334,6 +1390,7 @@ uint64_t handle, uint64_t *channel_addr, struct rga_internal_buffer **buf, + int require_size, enum dma_data_direction dir) { int ret = 0; @@ -1369,6 +1426,14 @@ return ret; } + if (internal_buffer->size < require_size) { + ret = -EINVAL; + pr_err("Only get buffer %ld byte from handle[%ld], but current required %d byte\n", + internal_buffer->size, (unsigned long)handle, require_size); + + goto put_internal_buffer; + } + if (internal_buffer->type == RGA_VIRTUAL_ADDRESS) { /* * Some userspace virtual addresses do not have an @@ -1378,11 +1443,19 @@ ret = rga_mm_sync_dma_sg_for_device(internal_buffer, job, dir); if (ret < 0) { pr_err("sync sgt for device error!\n"); - return ret; + goto put_internal_buffer; } } return 0; + +put_internal_buffer: + mutex_lock(&mm->lock); + kref_put(&internal_buffer->refcount, rga_mm_kref_release_buffer); + mutex_unlock(&mm->lock); + + return ret; + } static void rga_mm_put_buffer(struct rga_mm *mm, @@ -1397,72 +1470,6 @@ mutex_lock(&mm->lock); kref_put(&internal_buffer->refcount, rga_mm_kref_release_buffer); mutex_unlock(&mm->lock); -} - -static int rga_mm_get_channel_handle_info(struct rga_mm *mm, - struct rga_job *job, - struct rga_img_info_t *img, - struct rga_job_buffer *job_buf, - enum dma_data_direction dir) -{ - int ret = 0; - int handle = 0; - - /* using third-address */ - if (img->uv_addr > 0) { - handle = img->yrgb_addr; - if (handle > 0) { - ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr, - &job_buf->y_addr, dir); - if (ret < 0) { - pr_err("handle[%d] Can't get src y/rgb address info!\n", handle); - return ret; - } - } - - handle = img->uv_addr; - if (handle > 0) { - ret = rga_mm_get_buffer(mm, job, handle, &img->uv_addr, - &job_buf->uv_addr, dir); - if (ret < 0) { - pr_err("handle[%d] Can't get src uv address info!\n", handle); - return ret; - } - } - - handle = img->v_addr; - if (handle > 0) { - ret = rga_mm_get_buffer(mm, job, handle, &img->v_addr, - &job_buf->v_addr, dir); - if (ret < 0) { - pr_err("handle[%d] Can't get src uv address info!\n", handle); - return ret; - } - } - } else { - handle = img->yrgb_addr; - if (handle > 0) { - ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr, - &job_buf->addr, dir); - if (ret < 0) { - pr_err("handle[%d] Can't get src y/rgb address info!\n", handle); - return ret; - } - } - - rga_convert_addr(img, false); - } - - if (job->scheduler->data->mmu == RGA_MMU && - rga_mm_is_need_mmu(job, job_buf->addr)) { - ret = rga_mm_set_mmu_base(job, img, job_buf); - if (ret < 0) { - pr_err("Can't set RGA2 MMU_BASE from handle!\n"); - return ret; - } - } - - return 0; } static void rga_mm_put_channel_handle_info(struct rga_mm *mm, @@ -1481,6 +1488,83 @@ free_pages((unsigned long)job_buf->page_table, job_buf->order); } +static int rga_mm_get_channel_handle_info(struct rga_mm *mm, + struct rga_job *job, + struct rga_img_info_t *img, + struct rga_job_buffer *job_buf, + enum dma_data_direction dir) +{ + int ret = 0; + int handle = 0; + int img_size, yrgb_size, uv_size, v_size; + + img_size = rga_image_size_cal(img->vir_w, img->vir_h, img->format, + &yrgb_size, &uv_size, &v_size); + if (img_size <= 0) { + pr_err("Image size cal error! width = %d, height = %d, format = %s\n", + img->vir_w, img->vir_h, rga_get_format_name(img->format)); + return -EINVAL; + } + + /* using third-address */ + if (img->uv_addr > 0) { + handle = img->yrgb_addr; + if (handle > 0) { + ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr, + &job_buf->y_addr, yrgb_size, dir); + if (ret < 0) { + pr_err("handle[%d] Can't get y/rgb address info!\n", handle); + return ret; + } + } + + handle = img->uv_addr; + if (handle > 0) { + ret = rga_mm_get_buffer(mm, job, handle, &img->uv_addr, + &job_buf->uv_addr, uv_size, dir); + if (ret < 0) { + pr_err("handle[%d] Can't get uv address info!\n", handle); + return ret; + } + } + + handle = img->v_addr; + if (handle > 0) { + ret = rga_mm_get_buffer(mm, job, handle, &img->v_addr, + &job_buf->v_addr, v_size, dir); + if (ret < 0) { + pr_err("handle[%d] Can't get uv address info!\n", handle); + return ret; + } + } + } else { + handle = img->yrgb_addr; + if (handle > 0) { + ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr, + &job_buf->addr, img_size, dir); + if (ret < 0) { + pr_err("handle[%d] Can't get y/rgb address info!\n", handle); + return ret; + } + } + + rga_convert_addr(img, false); + } + + if (job->scheduler->data->mmu == RGA_MMU && + rga_mm_is_need_mmu(job, job_buf->addr)) { + ret = rga_mm_set_mmu_base(job, img, job_buf); + if (ret < 0) { + pr_err("Can't set RGA2 MMU_BASE from handle!\n"); + + rga_mm_put_channel_handle_info(mm, job, job_buf, dir); + return ret; + } + } + + return 0; +} + static int rga_mm_get_handle_info(struct rga_job *job) { int ret = 0; @@ -1496,7 +1580,7 @@ &job->src_buffer, DMA_TO_DEVICE); if (ret < 0) { - pr_err("Can't get src buffer third info!\n"); + pr_err("Can't get src buffer info from handle!\n"); return ret; } } @@ -1506,7 +1590,7 @@ &job->dst_buffer, DMA_TO_DEVICE); if (ret < 0) { - pr_err("Can't get dst buffer third info!\n"); + pr_err("Can't get dst buffer info from handle!\n"); return ret; } } @@ -1528,7 +1612,7 @@ DMA_BIDIRECTIONAL); } if (ret < 0) { - pr_err("Can't get pat buffer third info!\n"); + pr_err("Can't get pat buffer info from handle!\n"); return ret; } } @@ -1869,7 +1953,7 @@ uint32_t rga_mm_import_buffer(struct rga_external_buffer *external_buffer, struct rga_session *session) { - int ret = 0; + int ret = 0, new_id; struct rga_mm *mm; struct rga_internal_buffer *internal_buffer; @@ -1911,9 +1995,14 @@ * allocation under our spinlock. */ idr_preload(GFP_KERNEL); - internal_buffer->handle = idr_alloc(&mm->memory_idr, internal_buffer, 1, 0, GFP_KERNEL); + new_id = idr_alloc_cyclic(&mm->memory_idr, internal_buffer, 1, 0, GFP_NOWAIT); idr_preload_end(); + if (new_id < 0) { + pr_err("internal_buffer alloc id failed!\n"); + goto FREE_INTERNAL_BUFFER; + } + internal_buffer->handle = new_id; mm->buffer_count++; if (DEBUGGER_EN(MM)) { diff --git a/kernel/drivers/video/rockchip/rga3/rga_policy.c b/kernel/drivers/video/rockchip/rga3/rga_policy.c index 4e26797..9801e6d 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_policy.c +++ b/kernel/drivers/video/rockchip/rga3/rga_policy.c @@ -118,6 +118,12 @@ if (!rga_check_resolution(&data->input_range, src0->act_w, src0->act_h)) return false; + if (data == &rga3_data && + !rga_check_resolution(&data->input_range, + src0->act_w + src0->x_offset, + src0->act_h + src0->y_offset)) + return false; + if (!rga_check_format(data, src0->rd_mode, src0->format, 0)) return false; @@ -133,6 +139,12 @@ if (!rga_check_resolution(&data->input_range, src1->act_w, src1->act_h)) return false; + if (data == &rga3_data && + !rga_check_resolution(&data->input_range, + src1->act_w + src1->x_offset, + src1->act_h + src1->y_offset)) + return false; + if (!rga_check_format(data, src1->rd_mode, src1->format, 1)) return false; @@ -148,6 +160,12 @@ if (!rga_check_resolution(&data->output_range, dst->act_w, dst->act_h)) return false; + if (data == &rga3_data && + !rga_check_resolution(&data->output_range, + dst->act_w + dst->x_offset, + dst->act_h + dst->y_offset)) + return false; + if (!rga_check_format(data, dst->rd_mode, dst->format, 2)) return false; diff --git a/kernel/drivers/watchdog/watchdog_dev.c b/kernel/drivers/watchdog/watchdog_dev.c index 8fe59b7..516782c 100644 --- a/kernel/drivers/watchdog/watchdog_dev.c +++ b/kernel/drivers/watchdog/watchdog_dev.c @@ -145,7 +145,7 @@ ktime_t t = watchdog_next_keepalive(wdd); if (t > 0) - hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL); + hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL_HARD); } else { hrtimer_cancel(&wd_data->timer); } @@ -164,7 +164,7 @@ if (ktime_after(earliest_keepalive, now)) { hrtimer_start(&wd_data->timer, ktime_sub(earliest_keepalive, now), - HRTIMER_MODE_REL); + HRTIMER_MODE_REL_HARD); return 0; } @@ -959,7 +959,7 @@ dev_set_name(&wd_data->dev, "watchdog%d", wdd->id); kthread_init_work(&wd_data->work, watchdog_ping_work); - hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); wd_data->timer.function = watchdog_timer_expired; if (wdd->id == 0) { @@ -1007,7 +1007,7 @@ __module_get(wdd->ops->owner); get_device(&wd_data->dev); if (handle_boot_enabled) - hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL); + hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL_HARD); else pr_info("watchdog%d running and kernel based pre-userspace handler disabled\n", wdd->id); diff --git a/kernel/fs/aio.c b/kernel/fs/aio.c index 9635c29..6deff68 100644 --- a/kernel/fs/aio.c +++ b/kernel/fs/aio.c @@ -121,6 +121,7 @@ long nr_pages; struct rcu_work free_rwork; /* see free_ioctx() */ + struct work_struct free_work; /* see free_ioctx() */ /* * signals when all in-flight requests are done @@ -608,9 +609,9 @@ * and ctx->users has dropped to 0, so we know no more kiocbs can be submitted - * now it's safe to cancel any that need to be. */ -static void free_ioctx_users(struct percpu_ref *ref) +static void free_ioctx_users_work(struct work_struct *work) { - struct kioctx *ctx = container_of(ref, struct kioctx, users); + struct kioctx *ctx = container_of(work, struct kioctx, free_work); struct aio_kiocb *req; spin_lock_irq(&ctx->ctx_lock); @@ -628,6 +629,14 @@ percpu_ref_put(&ctx->reqs); } +static void free_ioctx_users(struct percpu_ref *ref) +{ + struct kioctx *ctx = container_of(ref, struct kioctx, users); + + INIT_WORK(&ctx->free_work, free_ioctx_users_work); + schedule_work(&ctx->free_work); +} + static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm) { unsigned i, new_nr; diff --git a/kernel/fs/autofs/expire.c b/kernel/fs/autofs/expire.c index 70e9afe..1a6b88a 100644 --- a/kernel/fs/autofs/expire.c +++ b/kernel/fs/autofs/expire.c @@ -8,6 +8,7 @@ * option, any later version, incorporated herein by reference. */ +#include <linux/delay.h> #include "autofs_i.h" /* Check if a dentry can be expired */ @@ -153,7 +154,7 @@ parent = p->d_parent; if (!spin_trylock(&parent->d_lock)) { spin_unlock(&p->d_lock); - cpu_relax(); + cpu_chill(); goto relock; } spin_unlock(&p->d_lock); diff --git a/kernel/fs/buffer.c b/kernel/fs/buffer.c index 2fa1ad5..b9164e5 100644 --- a/kernel/fs/buffer.c +++ b/kernel/fs/buffer.c @@ -275,8 +275,7 @@ * decide that the page is now completely done. */ first = page_buffers(page); - local_irq_save(flags); - bit_spin_lock(BH_Uptodate_Lock, &first->b_state); + flags = bh_uptodate_lock_irqsave(first); clear_buffer_async_read(bh); unlock_buffer(bh); tmp = bh; @@ -289,8 +288,7 @@ } tmp = tmp->b_this_page; } while (tmp != bh); - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); - local_irq_restore(flags); + bh_uptodate_unlock_irqrestore(first, flags); /* * If none of the buffers had errors and they are all @@ -302,9 +300,7 @@ return; still_busy: - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); - local_irq_restore(flags); - return; + bh_uptodate_unlock_irqrestore(first, flags); } /* @@ -331,8 +327,7 @@ } first = page_buffers(page); - local_irq_save(flags); - bit_spin_lock(BH_Uptodate_Lock, &first->b_state); + flags = bh_uptodate_lock_irqsave(first); clear_buffer_async_write(bh); unlock_buffer(bh); @@ -344,15 +339,12 @@ } tmp = tmp->b_this_page; } - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); - local_irq_restore(flags); + bh_uptodate_unlock_irqrestore(first, flags); end_page_writeback(page); return; still_busy: - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); - local_irq_restore(flags); - return; + bh_uptodate_unlock_irqrestore(first, flags); } EXPORT_SYMBOL(end_buffer_async_write); @@ -3375,6 +3367,7 @@ struct buffer_head *ret = kmem_cache_zalloc(bh_cachep, gfp_flags); if (ret) { INIT_LIST_HEAD(&ret->b_assoc_buffers); + buffer_head_init_locks(ret); preempt_disable(); __this_cpu_inc(bh_accounting.nr); recalc_bh_state(); diff --git a/kernel/fs/cifs/readdir.c b/kernel/fs/cifs/readdir.c index 3925a7b..33f7723 100644 --- a/kernel/fs/cifs/readdir.c +++ b/kernel/fs/cifs/readdir.c @@ -80,7 +80,7 @@ struct inode *inode; struct super_block *sb = parent->d_sb; struct cifs_sb_info *cifs_sb = CIFS_SB(sb); - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); cifs_dbg(FYI, "%s: for %s\n", __func__, name->name); diff --git a/kernel/fs/dcache.c b/kernel/fs/dcache.c index d3553ca..7893359 100644 --- a/kernel/fs/dcache.c +++ b/kernel/fs/dcache.c @@ -2387,9 +2387,10 @@ static inline unsigned start_dir_add(struct inode *dir) { + preempt_disable_rt(); for (;;) { - unsigned n = dir->i_dir_seq; - if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) + unsigned n = dir->__i_dir_seq; + if (!(n & 1) && cmpxchg(&dir->__i_dir_seq, n, n + 1) == n) return n; cpu_relax(); } @@ -2397,26 +2398,30 @@ static inline void end_dir_add(struct inode *dir, unsigned n) { - smp_store_release(&dir->i_dir_seq, n + 2); + smp_store_release(&dir->__i_dir_seq, n + 2); + preempt_enable_rt(); } static void d_wait_lookup(struct dentry *dentry) { - if (d_in_lookup(dentry)) { - DECLARE_WAITQUEUE(wait, current); - add_wait_queue(dentry->d_wait, &wait); - do { - set_current_state(TASK_UNINTERRUPTIBLE); - spin_unlock(&dentry->d_lock); - schedule(); - spin_lock(&dentry->d_lock); - } while (d_in_lookup(dentry)); - } + struct swait_queue __wait; + + if (!d_in_lookup(dentry)) + return; + + INIT_LIST_HEAD(&__wait.task_list); + do { + prepare_to_swait_exclusive(dentry->d_wait, &__wait, TASK_UNINTERRUPTIBLE); + spin_unlock(&dentry->d_lock); + schedule(); + spin_lock(&dentry->d_lock); + } while (d_in_lookup(dentry)); + finish_swait(dentry->d_wait, &__wait); } struct dentry *d_alloc_parallel(struct dentry *parent, const struct qstr *name, - wait_queue_head_t *wq) + struct swait_queue_head *wq) { unsigned int hash = name->hash; struct hlist_bl_head *b = in_lookup_hash(parent, hash); @@ -2430,7 +2435,7 @@ retry: rcu_read_lock(); - seq = smp_load_acquire(&parent->d_inode->i_dir_seq); + seq = smp_load_acquire(&parent->d_inode->__i_dir_seq); r_seq = read_seqbegin(&rename_lock); dentry = __d_lookup_rcu(parent, name, &d_seq); if (unlikely(dentry)) { @@ -2458,7 +2463,7 @@ } hlist_bl_lock(b); - if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) { + if (unlikely(READ_ONCE(parent->d_inode->__i_dir_seq) != seq)) { hlist_bl_unlock(b); rcu_read_unlock(); goto retry; @@ -2531,7 +2536,7 @@ hlist_bl_lock(b); dentry->d_flags &= ~DCACHE_PAR_LOOKUP; __hlist_bl_del(&dentry->d_u.d_in_lookup_hash); - wake_up_all(dentry->d_wait); + swake_up_all(dentry->d_wait); dentry->d_wait = NULL; hlist_bl_unlock(b); INIT_HLIST_NODE(&dentry->d_u.d_alias); @@ -3044,6 +3049,8 @@ static void __init dcache_init_early(void) { + unsigned int loop; + /* If hashes are distributed across NUMA nodes, defer * hash allocation until vmalloc space is available. */ @@ -3060,11 +3067,16 @@ NULL, 0, 0); + + for (loop = 0; loop < (1U << d_hash_shift); loop++) + INIT_HLIST_BL_HEAD(dentry_hashtable + loop); + d_hash_shift = 32 - d_hash_shift; } static void __init dcache_init(void) { + unsigned int loop; /* * A constructor could be added for stable state like the lists, * but it is probably not worth it because of the cache nature @@ -3088,6 +3100,10 @@ NULL, 0, 0); + + for (loop = 0; loop < (1U << d_hash_shift); loop++) + INIT_HLIST_BL_HEAD(dentry_hashtable + loop); + d_hash_shift = 32 - d_hash_shift; } diff --git a/kernel/fs/eventpoll.c b/kernel/fs/eventpoll.c index 9a81b56..f080c7b 100644 --- a/kernel/fs/eventpoll.c +++ b/kernel/fs/eventpoll.c @@ -570,12 +570,12 @@ static void ep_poll_safewake(wait_queue_head_t *wq) { - int this_cpu = get_cpu(); + int this_cpu = get_cpu_light(); ep_call_nested(&poll_safewake_ncalls, EP_MAX_NESTS, ep_poll_wakeup_proc, NULL, wq, (void *) (long) this_cpu); - put_cpu(); + put_cpu_light(); } #else diff --git a/kernel/fs/exec.c b/kernel/fs/exec.c index f1d7ee6..bbeec1f 100644 --- a/kernel/fs/exec.c +++ b/kernel/fs/exec.c @@ -1028,6 +1028,7 @@ } } task_lock(tsk); + preempt_disable_rt(); local_irq_disable(); active_mm = tsk->active_mm; @@ -1047,6 +1048,7 @@ local_irq_enable(); tsk->mm->vmacache_seqnum = 0; vmacache_flush(tsk); + preempt_enable_rt(); task_unlock(tsk); if (old_mm) { up_read(&old_mm->mmap_sem); diff --git a/kernel/fs/ext4/page-io.c b/kernel/fs/ext4/page-io.c index e2fad25..9dcc036 100644 --- a/kernel/fs/ext4/page-io.c +++ b/kernel/fs/ext4/page-io.c @@ -90,8 +90,7 @@ * We check all buffers in the page under BH_Uptodate_Lock * to avoid races with other end io clearing async_write flags */ - local_irq_save(flags); - bit_spin_lock(BH_Uptodate_Lock, &head->b_state); + flags = bh_uptodate_lock_irqsave(head); do { if (bh_offset(bh) < bio_start || bh_offset(bh) + bh->b_size > bio_end) { @@ -103,8 +102,7 @@ if (bio->bi_status) buffer_io_error(bh); } while ((bh = bh->b_this_page) != head); - bit_spin_unlock(BH_Uptodate_Lock, &head->b_state); - local_irq_restore(flags); + bh_uptodate_unlock_irqrestore(head, flags); if (!under_io) { fscrypt_free_bounce_page(bounce_page); end_page_writeback(page); diff --git a/kernel/fs/fscache/cookie.c b/kernel/fs/fscache/cookie.c index 2ff05ad..84e5719 100644 --- a/kernel/fs/fscache/cookie.c +++ b/kernel/fs/fscache/cookie.c @@ -950,3 +950,11 @@ return -ESTALE; } EXPORT_SYMBOL(__fscache_check_consistency); + +void __init fscache_cookie_init(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(fscache_cookie_hash); i++) + INIT_HLIST_BL_HEAD(&fscache_cookie_hash[i]); +} diff --git a/kernel/fs/fscache/main.c b/kernel/fs/fscache/main.c index aa49234..95a0798 100644 --- a/kernel/fs/fscache/main.c +++ b/kernel/fs/fscache/main.c @@ -188,6 +188,7 @@ ret = -ENOMEM; goto error_cookie_jar; } + fscache_cookie_init(); fscache_root = kobject_create_and_add("fscache", kernel_kobj); if (!fscache_root) diff --git a/kernel/fs/fuse/dir.c b/kernel/fs/fuse/dir.c index ace6002..2bc20cd 100644 --- a/kernel/fs/fuse/dir.c +++ b/kernel/fs/fuse/dir.c @@ -1273,7 +1273,7 @@ struct inode *dir = d_inode(parent); struct fuse_conn *fc; struct inode *inode; - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); if (!o->nodeid) { /* diff --git a/kernel/fs/inode.c b/kernel/fs/inode.c index 9e46350..3317c75 100644 --- a/kernel/fs/inode.c +++ b/kernel/fs/inode.c @@ -157,7 +157,7 @@ inode->i_bdev = NULL; inode->i_cdev = NULL; inode->i_link = NULL; - inode->i_dir_seq = 0; + inode->__i_dir_seq = 0; inode->i_rdev = 0; inode->dirtied_when = 0; diff --git a/kernel/fs/locks.c b/kernel/fs/locks.c index 28270e7..552476d 100644 --- a/kernel/fs/locks.c +++ b/kernel/fs/locks.c @@ -936,7 +936,7 @@ return -ENOMEM; } - percpu_down_read_preempt_disable(&file_rwsem); + percpu_down_read(&file_rwsem); spin_lock(&ctx->flc_lock); if (request->fl_flags & FL_ACCESS) goto find_conflict; @@ -977,7 +977,7 @@ out: spin_unlock(&ctx->flc_lock); - percpu_up_read_preempt_enable(&file_rwsem); + percpu_up_read(&file_rwsem); if (new_fl) locks_free_lock(new_fl); locks_dispose_list(&dispose); @@ -1015,7 +1015,7 @@ new_fl2 = locks_alloc_lock(); } - percpu_down_read_preempt_disable(&file_rwsem); + percpu_down_read(&file_rwsem); spin_lock(&ctx->flc_lock); /* * New lock request. Walk all POSIX locks and look for conflicts. If @@ -1187,7 +1187,7 @@ } out: spin_unlock(&ctx->flc_lock); - percpu_up_read_preempt_enable(&file_rwsem); + percpu_up_read(&file_rwsem); /* * Free any unused locks. */ @@ -1462,7 +1462,7 @@ return error; } - percpu_down_read_preempt_disable(&file_rwsem); + percpu_down_read(&file_rwsem); spin_lock(&ctx->flc_lock); time_out_leases(inode, &dispose); @@ -1514,13 +1514,13 @@ locks_insert_block(fl, new_fl); trace_break_lease_block(inode, new_fl); spin_unlock(&ctx->flc_lock); - percpu_up_read_preempt_enable(&file_rwsem); + percpu_up_read(&file_rwsem); locks_dispose_list(&dispose); error = wait_event_interruptible_timeout(new_fl->fl_wait, !new_fl->fl_next, break_time); - percpu_down_read_preempt_disable(&file_rwsem); + percpu_down_read(&file_rwsem); spin_lock(&ctx->flc_lock); trace_break_lease_unblock(inode, new_fl); locks_delete_block(new_fl); @@ -1537,7 +1537,7 @@ } out: spin_unlock(&ctx->flc_lock); - percpu_up_read_preempt_enable(&file_rwsem); + percpu_up_read(&file_rwsem); locks_dispose_list(&dispose); locks_free_lock(new_fl); return error; @@ -1609,7 +1609,7 @@ ctx = smp_load_acquire(&inode->i_flctx); if (ctx && !list_empty_careful(&ctx->flc_lease)) { - percpu_down_read_preempt_disable(&file_rwsem); + percpu_down_read(&file_rwsem); spin_lock(&ctx->flc_lock); time_out_leases(inode, &dispose); list_for_each_entry(fl, &ctx->flc_lease, fl_list) { @@ -1619,7 +1619,7 @@ break; } spin_unlock(&ctx->flc_lock); - percpu_up_read_preempt_enable(&file_rwsem); + percpu_up_read(&file_rwsem); locks_dispose_list(&dispose); } @@ -1693,7 +1693,7 @@ return -EINVAL; } - percpu_down_read_preempt_disable(&file_rwsem); + percpu_down_read(&file_rwsem); spin_lock(&ctx->flc_lock); time_out_leases(inode, &dispose); error = check_conflicting_open(dentry, arg, lease->fl_flags); @@ -1764,7 +1764,7 @@ lease->fl_lmops->lm_setup(lease, priv); out: spin_unlock(&ctx->flc_lock); - percpu_up_read_preempt_enable(&file_rwsem); + percpu_up_read(&file_rwsem); locks_dispose_list(&dispose); if (is_deleg) inode_unlock(inode); @@ -1787,7 +1787,7 @@ return error; } - percpu_down_read_preempt_disable(&file_rwsem); + percpu_down_read(&file_rwsem); spin_lock(&ctx->flc_lock); list_for_each_entry(fl, &ctx->flc_lease, fl_list) { if (fl->fl_file == filp && @@ -1800,7 +1800,7 @@ if (victim) error = fl->fl_lmops->lm_change(victim, F_UNLCK, &dispose); spin_unlock(&ctx->flc_lock); - percpu_up_read_preempt_enable(&file_rwsem); + percpu_up_read(&file_rwsem); locks_dispose_list(&dispose); return error; } @@ -2531,13 +2531,13 @@ if (list_empty(&ctx->flc_lease)) return; - percpu_down_read_preempt_disable(&file_rwsem); + percpu_down_read(&file_rwsem); spin_lock(&ctx->flc_lock); list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list) if (filp == fl->fl_file) lease_modify(fl, F_UNLCK, &dispose); spin_unlock(&ctx->flc_lock); - percpu_up_read_preempt_enable(&file_rwsem); + percpu_up_read(&file_rwsem); locks_dispose_list(&dispose); } diff --git a/kernel/fs/namei.c b/kernel/fs/namei.c index 8492dc6..1eab029 100644 --- a/kernel/fs/namei.c +++ b/kernel/fs/namei.c @@ -1740,7 +1740,7 @@ { struct dentry *dentry, *old; struct inode *inode = dir->d_inode; - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); /* Don't go there if it's already dead */ if (unlikely(IS_DEADDIR(inode))) @@ -3253,7 +3253,7 @@ struct dentry *dentry; int error, create_error = 0; umode_t mode = op->mode; - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); if (unlikely(IS_DEADDIR(dir_inode))) return -ENOENT; diff --git a/kernel/fs/namespace.c b/kernel/fs/namespace.c index 8775302..db572d7 100644 --- a/kernel/fs/namespace.c +++ b/kernel/fs/namespace.c @@ -14,6 +14,7 @@ #include <linux/mnt_namespace.h> #include <linux/user_namespace.h> #include <linux/namei.h> +#include <linux/delay.h> #include <linux/security.h> #include <linux/cred.h> #include <linux/idr.h> @@ -328,8 +329,11 @@ * incremented count after it has set MNT_WRITE_HOLD. */ smp_mb(); - while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) - cpu_relax(); + while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) { + preempt_enable(); + cpu_chill(); + preempt_disable(); + } /* * After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will * be set to match its requirements. So we must not load that until diff --git a/kernel/fs/nfs/delegation.c b/kernel/fs/nfs/delegation.c index b0c0c2f..26565ba 100644 --- a/kernel/fs/nfs/delegation.c +++ b/kernel/fs/nfs/delegation.c @@ -162,11 +162,11 @@ sp = state->owner; /* Block nfs4_proc_unlck */ mutex_lock(&sp->so_delegreturn_mutex); - seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); + seq = read_seqbegin(&sp->so_reclaim_seqlock); err = nfs4_open_delegation_recall(ctx, state, stateid); if (!err) err = nfs_delegation_claim_locks(state, stateid); - if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) + if (!err && read_seqretry(&sp->so_reclaim_seqlock, seq)) err = -EAGAIN; mutex_unlock(&sp->so_delegreturn_mutex); put_nfs_open_context(ctx); diff --git a/kernel/fs/nfs/dir.c b/kernel/fs/nfs/dir.c index d06f7cd..2ba4d6e 100644 --- a/kernel/fs/nfs/dir.c +++ b/kernel/fs/nfs/dir.c @@ -457,7 +457,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) { struct qstr filename = QSTR_INIT(entry->name, entry->len); - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); struct dentry *dentry; struct dentry *alias; struct inode *dir = d_inode(parent); @@ -1520,7 +1520,7 @@ struct file *file, unsigned open_flags, umode_t mode) { - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); struct nfs_open_context *ctx; struct dentry *res; struct iattr attr = { .ia_valid = ATTR_OPEN }; @@ -1858,7 +1858,11 @@ trace_nfs_rmdir_enter(dir, dentry); if (d_really_is_positive(dentry)) { +#ifdef CONFIG_PREEMPT_RT_BASE + down(&NFS_I(d_inode(dentry))->rmdir_sem); +#else down_write(&NFS_I(d_inode(dentry))->rmdir_sem); +#endif error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); /* Ensure the VFS deletes this inode */ switch (error) { @@ -1868,7 +1872,11 @@ case -ENOENT: nfs_dentry_handle_enoent(dentry); } +#ifdef CONFIG_PREEMPT_RT_BASE + up(&NFS_I(d_inode(dentry))->rmdir_sem); +#else up_write(&NFS_I(d_inode(dentry))->rmdir_sem); +#endif } else error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); trace_nfs_rmdir_exit(dir, dentry, error); diff --git a/kernel/fs/nfs/inode.c b/kernel/fs/nfs/inode.c index 592b95a..4fc14fb 100644 --- a/kernel/fs/nfs/inode.c +++ b/kernel/fs/nfs/inode.c @@ -2105,7 +2105,11 @@ atomic_long_set(&nfsi->nrequests, 0); atomic_long_set(&nfsi->commit_info.ncommit, 0); atomic_set(&nfsi->commit_info.rpcs_out, 0); +#ifdef CONFIG_PREEMPT_RT_BASE + sema_init(&nfsi->rmdir_sem, 1); +#else init_rwsem(&nfsi->rmdir_sem); +#endif mutex_init(&nfsi->commit_mutex); nfs4_init_once(nfsi); } diff --git a/kernel/fs/nfs/nfs4_fs.h b/kernel/fs/nfs/nfs4_fs.h index 5ac7bf2..b15a7a2 100644 --- a/kernel/fs/nfs/nfs4_fs.h +++ b/kernel/fs/nfs/nfs4_fs.h @@ -114,7 +114,7 @@ unsigned long so_flags; struct list_head so_states; struct nfs_seqid_counter so_seqid; - seqcount_t so_reclaim_seqcount; + seqlock_t so_reclaim_seqlock; struct mutex so_delegreturn_mutex; }; diff --git a/kernel/fs/nfs/nfs4proc.c b/kernel/fs/nfs/nfs4proc.c index 759c834..256a4b0 100644 --- a/kernel/fs/nfs/nfs4proc.c +++ b/kernel/fs/nfs/nfs4proc.c @@ -2874,7 +2874,7 @@ unsigned int seq; int ret; - seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); + seq = raw_seqcount_begin(&sp->so_reclaim_seqlock.seqcount); ret = _nfs4_proc_open(opendata, ctx); if (ret != 0) @@ -2915,7 +2915,7 @@ if (d_inode(dentry) == state->inode) { nfs_inode_attach_open_context(ctx); - if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) + if (read_seqretry(&sp->so_reclaim_seqlock, seq)) nfs4_schedule_stateid_recovery(server, state); } diff --git a/kernel/fs/nfs/nfs4state.c b/kernel/fs/nfs/nfs4state.c index 9c98547..184b549 100644 --- a/kernel/fs/nfs/nfs4state.c +++ b/kernel/fs/nfs/nfs4state.c @@ -515,7 +515,7 @@ nfs4_init_seqid_counter(&sp->so_seqid); atomic_set(&sp->so_count, 1); INIT_LIST_HEAD(&sp->so_lru); - seqcount_init(&sp->so_reclaim_seqcount); + seqlock_init(&sp->so_reclaim_seqlock); mutex_init(&sp->so_delegreturn_mutex); return sp; } @@ -1583,8 +1583,12 @@ * recovering after a network partition or a reboot from a * server that doesn't support a grace period. */ +#ifdef CONFIG_PREEMPT_RT_FULL + write_seqlock(&sp->so_reclaim_seqlock); +#else + write_seqcount_begin(&sp->so_reclaim_seqlock.seqcount); +#endif spin_lock(&sp->so_lock); - raw_write_seqcount_begin(&sp->so_reclaim_seqcount); restart: list_for_each_entry(state, &sp->so_states, open_states) { if (!test_and_clear_bit(ops->state_flag_bit, &state->flags)) @@ -1671,14 +1675,20 @@ spin_lock(&sp->so_lock); goto restart; } - raw_write_seqcount_end(&sp->so_reclaim_seqcount); spin_unlock(&sp->so_lock); +#ifdef CONFIG_PREEMPT_RT_FULL + write_sequnlock(&sp->so_reclaim_seqlock); +#else + write_seqcount_end(&sp->so_reclaim_seqlock.seqcount); +#endif return 0; out_err: nfs4_put_open_state(state); - spin_lock(&sp->so_lock); - raw_write_seqcount_end(&sp->so_reclaim_seqcount); - spin_unlock(&sp->so_lock); +#ifdef CONFIG_PREEMPT_RT_FULL + write_sequnlock(&sp->so_reclaim_seqlock); +#else + write_seqcount_end(&sp->so_reclaim_seqlock.seqcount); +#endif return status; } diff --git a/kernel/fs/nfs/unlink.c b/kernel/fs/nfs/unlink.c index fd61bf0..839bfa7 100644 --- a/kernel/fs/nfs/unlink.c +++ b/kernel/fs/nfs/unlink.c @@ -13,7 +13,7 @@ #include <linux/sunrpc/clnt.h> #include <linux/nfs_fs.h> #include <linux/sched.h> -#include <linux/wait.h> +#include <linux/swait.h> #include <linux/namei.h> #include <linux/fsnotify.h> @@ -52,6 +52,29 @@ rpc_restart_call_prepare(task); } +#ifdef CONFIG_PREEMPT_RT_BASE +static void nfs_down_anon(struct semaphore *sema) +{ + down(sema); +} + +static void nfs_up_anon(struct semaphore *sema) +{ + up(sema); +} + +#else +static void nfs_down_anon(struct rw_semaphore *rwsem) +{ + down_read_non_owner(rwsem); +} + +static void nfs_up_anon(struct rw_semaphore *rwsem) +{ + up_read_non_owner(rwsem); +} +#endif + /** * nfs_async_unlink_release - Release the sillydelete data. * @task: rpc_task of the sillydelete @@ -65,7 +88,7 @@ struct dentry *dentry = data->dentry; struct super_block *sb = dentry->d_sb; - up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); + nfs_up_anon(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); d_lookup_done(dentry); nfs_free_unlinkdata(data); dput(dentry); @@ -118,10 +141,10 @@ struct inode *dir = d_inode(dentry->d_parent); struct dentry *alias; - down_read_non_owner(&NFS_I(dir)->rmdir_sem); + nfs_down_anon(&NFS_I(dir)->rmdir_sem); alias = d_alloc_parallel(dentry->d_parent, &data->args.name, &data->wq); if (IS_ERR(alias)) { - up_read_non_owner(&NFS_I(dir)->rmdir_sem); + nfs_up_anon(&NFS_I(dir)->rmdir_sem); return 0; } if (!d_in_lookup(alias)) { @@ -143,7 +166,7 @@ ret = 0; spin_unlock(&alias->d_lock); dput(alias); - up_read_non_owner(&NFS_I(dir)->rmdir_sem); + nfs_up_anon(&NFS_I(dir)->rmdir_sem); /* * If we'd displaced old cached devname, free it. At that * point dentry is definitely not a root, so we won't need @@ -183,7 +206,7 @@ goto out_free_name; } data->res.dir_attr = &data->dir_attr; - init_waitqueue_head(&data->wq); + init_swait_queue_head(&data->wq); status = -EBUSY; spin_lock(&dentry->d_lock); diff --git a/kernel/fs/ntfs/aops.c b/kernel/fs/ntfs/aops.c index 8946130..71d0b3b 100644 --- a/kernel/fs/ntfs/aops.c +++ b/kernel/fs/ntfs/aops.c @@ -106,8 +106,7 @@ "0x%llx.", (unsigned long long)bh->b_blocknr); } first = page_buffers(page); - local_irq_save(flags); - bit_spin_lock(BH_Uptodate_Lock, &first->b_state); + flags = bh_uptodate_lock_irqsave(first); clear_buffer_async_read(bh); unlock_buffer(bh); tmp = bh; @@ -122,8 +121,7 @@ } tmp = tmp->b_this_page; } while (tmp != bh); - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); - local_irq_restore(flags); + bh_uptodate_unlock_irqrestore(first, flags); /* * If none of the buffers had errors then we can set the page uptodate, * but we first have to perform the post read mst fixups, if the @@ -156,9 +154,7 @@ unlock_page(page); return; still_busy: - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); - local_irq_restore(flags); - return; + bh_uptodate_unlock_irqrestore(first, flags); } /** diff --git a/kernel/fs/proc/array.c b/kernel/fs/proc/array.c index 9eb99a4..e4d0cfe 100644 --- a/kernel/fs/proc/array.c +++ b/kernel/fs/proc/array.c @@ -381,9 +381,9 @@ static void task_cpus_allowed(struct seq_file *m, struct task_struct *task) { seq_printf(m, "Cpus_allowed:\t%*pb\n", - cpumask_pr_args(&task->cpus_allowed)); + cpumask_pr_args(task->cpus_ptr)); seq_printf(m, "Cpus_allowed_list:\t%*pbl\n", - cpumask_pr_args(&task->cpus_allowed)); + cpumask_pr_args(task->cpus_ptr)); } static inline void task_core_dumping(struct seq_file *m, struct mm_struct *mm) diff --git a/kernel/fs/proc/base.c b/kernel/fs/proc/base.c index 0dd4439..a5aa2f0 100644 --- a/kernel/fs/proc/base.c +++ b/kernel/fs/proc/base.c @@ -96,6 +96,7 @@ #include <linux/posix-timers.h> #include <linux/cpufreq_times.h> #include <trace/events/oom.h> +#include <linux/swait.h> #include "internal.h" #include "fd.h" @@ -1890,7 +1891,7 @@ child = d_hash_and_lookup(dir, &qname); if (!child) { - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); child = d_alloc_parallel(dir, &qname, &wq); if (IS_ERR(child)) goto end_instantiate; diff --git a/kernel/fs/proc/proc_sysctl.c b/kernel/fs/proc/proc_sysctl.c index c95f32b..75f500c 100644 --- a/kernel/fs/proc/proc_sysctl.c +++ b/kernel/fs/proc/proc_sysctl.c @@ -681,7 +681,7 @@ child = d_lookup(dir, &qname); if (!child) { - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); child = d_alloc_parallel(dir, &qname, &wq); if (IS_ERR(child)) return false; diff --git a/kernel/fs/pstore/Kconfig b/kernel/fs/pstore/Kconfig index af8a858..e4599c5 100644 --- a/kernel/fs/pstore/Kconfig +++ b/kernel/fs/pstore/Kconfig @@ -166,10 +166,10 @@ For more information, see Documentation/admin-guide/ramoops.rst. -config PSTORE_MCU_LOG - bool "Print mcu log by linux" +config PSTORE_BOOT_LOG + bool "Print boot log by linux" depends on PSTORE help - When your soc has several mcu, you can get their log by cat command + Collect log from loader,uboot,ATF and so on, you can get their log by cat command through linux shell If unsure, say N. diff --git a/kernel/fs/pstore/inode.c b/kernel/fs/pstore/inode.c index 39926e5..c82db67 100644 --- a/kernel/fs/pstore/inode.c +++ b/kernel/fs/pstore/inode.c @@ -37,7 +37,7 @@ #include <linux/spinlock.h> #include <linux/uaccess.h> -#ifdef CONFIG_PSTORE_MCU_LOG +#ifdef CONFIG_PSTORE_BOOT_LOG #include <linux/pstore_ram.h> #include <linux/io.h> #endif @@ -144,7 +144,7 @@ { struct seq_file *sf = file->private_data; struct pstore_private *ps = sf->private; -#ifdef CONFIG_PSTORE_MCU_LOG +#ifdef CONFIG_PSTORE_BOOT_LOG struct pstore_record *record = ps->record; struct ramoops_context *cxt = record->psi->data; struct persistent_ram_zone *prz; @@ -152,12 +152,12 @@ char *log_tmp; size_t size, start, n; - if (ps->record->type == PSTORE_TYPE_MCU_LOG) { + if (ps->record->type == PSTORE_TYPE_BOOT_LOG) { if (!cxt) return count; - prz = cxt->mcu_przs[record->id]; + prz = cxt->boot_przs[record->id]; if (!prz) return count; @@ -412,9 +412,9 @@ scnprintf(name, sizeof(name), "powerpc-opal-%s-%llu", record->psi->name, record->id); break; -#ifdef CONFIG_PSTORE_MCU_LOG - case PSTORE_TYPE_MCU_LOG: - scnprintf(name, sizeof(name), "mcu-log-%llu", record->id); +#ifdef CONFIG_PSTORE_BOOT_LOG + case PSTORE_TYPE_BOOT_LOG: + scnprintf(name, sizeof(name), "boot-log-%llu", record->id); break; #endif case PSTORE_TYPE_UNKNOWN: diff --git a/kernel/fs/pstore/ram.c b/kernel/fs/pstore/ram.c index 86b61bd..e531c04 100644 --- a/kernel/fs/pstore/ram.c +++ b/kernel/fs/pstore/ram.c @@ -301,13 +301,13 @@ } } -#ifdef CONFIG_PSTORE_MCU_LOG +#ifdef CONFIG_PSTORE_BOOT_LOG if (!prz_ok(prz)) { - while (cxt->mcu_log_read_cnt < cxt->max_mcu_log_cnt && !prz) { - prz = ramoops_get_next_prz(cxt->mcu_przs, &cxt->mcu_log_read_cnt, - cxt->max_mcu_log_cnt, &record->id, + while (cxt->boot_log_read_cnt < cxt->max_boot_log_cnt && !prz) { + prz = ramoops_get_next_prz(cxt->boot_przs, &cxt->boot_log_read_cnt, + cxt->max_boot_log_cnt, &record->id, &record->type, - PSTORE_TYPE_MCU_LOG, 0); + PSTORE_TYPE_BOOT_LOG, 0); if (!prz_ok(prz)) continue; } @@ -320,9 +320,9 @@ } size = persistent_ram_old_size(prz) - header_length; -#ifdef CONFIG_PSTORE_MCU_LOG - /* don't copy mcu log */ - if (record->type == PSTORE_TYPE_MCU_LOG) +#ifdef CONFIG_PSTORE_BOOT_LOG + /* don't copy boot log */ + if (record->type == PSTORE_TYPE_BOOT_LOG) goto out; #endif /* ECC correction notice */ @@ -529,13 +529,13 @@ kfree(cxt->fprzs); cxt->max_ftrace_cnt = 0; } -#ifdef CONFIG_PSTORE_MCU_LOG - /* Free mcu log PRZs */ - if (cxt->mcu_przs) { - for (i = 0; i < cxt->max_mcu_log_cnt; i++) - persistent_ram_free(cxt->mcu_przs[i]); - kfree(cxt->mcu_przs); - cxt->max_mcu_log_cnt = 0; +#ifdef CONFIG_PSTORE_BOOT_LOG + /* Free boot log PRZs */ + if (cxt->boot_przs) { + for (i = 0; i < cxt->max_boot_log_cnt; i++) + persistent_ram_free(cxt->boot_przs[i]); + kfree(cxt->boot_przs); + cxt->max_boot_log_cnt = 0; } #endif } @@ -716,9 +716,9 @@ parse_size("pmsg-size", pdata->pmsg_size); parse_size("ecc-size", pdata->ecc_info.ecc_size); parse_size("flags", pdata->flags); -#ifdef CONFIG_PSTORE_MCU_LOG - parse_size("mcu-log-size", pdata->mcu_log_size); - parse_size("mcu-log-count", pdata->max_mcu_log_cnt); +#ifdef CONFIG_PSTORE_BOOT_LOG + parse_size("boot-log-size", pdata->boot_log_size); + parse_size("boot-log-count", pdata->max_boot_log_cnt); #endif #undef parse_size @@ -760,9 +760,9 @@ goto fail_out; } -#ifdef CONFIG_PSTORE_MCU_LOG +#ifdef CONFIG_PSTORE_BOOT_LOG if (!pdata->mem_size || (!pdata->record_size && !pdata->console_size && - !pdata->ftrace_size && !pdata->pmsg_size && !pdata->mcu_log_size)) { + !pdata->ftrace_size && !pdata->pmsg_size && !pdata->boot_log_size)) { pr_err("The memory size and the record/console size must be " "non-zero\n"); goto fail_out; @@ -797,17 +797,28 @@ cxt->dump_oops = pdata->dump_oops; cxt->flags = pdata->flags; cxt->ecc_info = pdata->ecc_info; -#ifdef CONFIG_PSTORE_MCU_LOG - cxt->mcu_log_size = pdata->mcu_log_size; - cxt->max_mcu_log_cnt = pdata->max_mcu_log_cnt; +#ifdef CONFIG_PSTORE_BOOT_LOG + cxt->boot_log_size = pdata->boot_log_size; + cxt->max_boot_log_cnt = pdata->max_boot_log_cnt; #endif paddr = cxt->phys_addr; dump_mem_sz = cxt->size - cxt->console_size - cxt->ftrace_size - cxt->pmsg_size; -#ifdef CONFIG_PSTORE_MCU_LOG - dump_mem_sz -= cxt->mcu_log_size; +#ifdef CONFIG_PSTORE_BOOT_LOG + dump_mem_sz -= cxt->boot_log_size; +#endif + +#ifdef CONFIG_PSTORE_BOOT_LOG + err = ramoops_init_przs("boot_log", dev, cxt, &cxt->boot_przs, &paddr, + cxt->boot_log_size, -1, + &cxt->max_boot_log_cnt, 0, 0); + if (err) + goto fail_clear; + if (cxt->boot_log_size > 0) + for (i = 0; i < cxt->max_boot_log_cnt; i++) + pr_info("boot-log-%d\t0x%zx@%pa\n", i, cxt->boot_przs[i]->size, &cxt->boot_przs[i]->paddr); #endif err = ramoops_init_przs("dump", dev, cxt, &cxt->dprzs, &paddr, @@ -848,17 +859,6 @@ if (cxt->pmsg_size > 0) pr_info("pmsg\t0x%zx@%pa\n", cxt->mprz->size, &cxt->mprz->paddr); -#ifdef CONFIG_PSTORE_MCU_LOG - err = ramoops_init_przs("mcu_log", dev, cxt, &cxt->mcu_przs, &paddr, - cxt->mcu_log_size, -1, - &cxt->max_mcu_log_cnt, 0, 0); - if (err) - goto fail_clear; - if (cxt->mcu_log_size > 0) - for (i = 0; i < cxt->max_mcu_log_cnt; i++) - pr_info("mcu-log-%d\t0x%zx@%pa\n", i, cxt->mcu_przs[i]->size, &cxt->mcu_przs[i]->paddr); -#endif - cxt->pstore.data = cxt; /* * Prepare frontend flags based on which areas are initialized. @@ -875,9 +875,9 @@ cxt->pstore.flags |= PSTORE_FLAGS_FTRACE; if (cxt->pmsg_size) cxt->pstore.flags |= PSTORE_FLAGS_PMSG; -#ifdef CONFIG_PSTORE_MCU_LOG - if (cxt->mcu_log_size) - cxt->pstore.flags |= PSTORE_FLAGS_MCU_LOG; +#ifdef CONFIG_PSTORE_BOOT_LOG + if (cxt->boot_log_size) + cxt->pstore.flags |= PSTORE_FLAGS_BOOT_LOG; #endif /* diff --git a/kernel/fs/squashfs/decompressor_multi_percpu.c b/kernel/fs/squashfs/decompressor_multi_percpu.c index 23a9c28..6a73c4f 100644 --- a/kernel/fs/squashfs/decompressor_multi_percpu.c +++ b/kernel/fs/squashfs/decompressor_multi_percpu.c @@ -10,6 +10,7 @@ #include <linux/slab.h> #include <linux/percpu.h> #include <linux/buffer_head.h> +#include <linux/locallock.h> #include "squashfs_fs.h" #include "squashfs_fs_sb.h" @@ -24,6 +25,8 @@ struct squashfs_stream { void *stream; }; + +static DEFINE_LOCAL_IRQ_LOCK(stream_lock); void *squashfs_decompressor_create(struct squashfs_sb_info *msblk, void *comp_opts) @@ -79,10 +82,15 @@ { struct squashfs_stream __percpu *percpu = (struct squashfs_stream __percpu *) msblk->stream; - struct squashfs_stream *stream = get_cpu_ptr(percpu); - int res = msblk->decompressor->decompress(msblk, stream->stream, bh, b, - offset, length, output); - put_cpu_ptr(stream); + struct squashfs_stream *stream; + int res; + + stream = get_locked_ptr(stream_lock, percpu); + + res = msblk->decompressor->decompress(msblk, stream->stream, bh, b, + offset, length, output); + + put_locked_ptr(stream_lock, stream); if (res < 0) ERROR("%s decompression failed, data probably corrupt\n", diff --git a/kernel/fs/timerfd.c b/kernel/fs/timerfd.c index d69ad80..f845093 100644 --- a/kernel/fs/timerfd.c +++ b/kernel/fs/timerfd.c @@ -471,7 +471,11 @@ break; } spin_unlock_irq(&ctx->wqh.lock); - cpu_relax(); + + if (isalarm(ctx)) + hrtimer_grab_expiry_lock(&ctx->t.alarm.timer); + else + hrtimer_grab_expiry_lock(&ctx->t.tmr); } /* diff --git a/kernel/fs/userfaultfd.c b/kernel/fs/userfaultfd.c index 0c6e16e..c927ade 100644 --- a/kernel/fs/userfaultfd.c +++ b/kernel/fs/userfaultfd.c @@ -56,7 +56,7 @@ /* waitqueue head for events */ wait_queue_head_t event_wqh; /* a refile sequence protected by fault_pending_wqh lock */ - struct seqcount refile_seq; + seqlock_t refile_seq; /* pseudo fd refcounting */ atomic_t refcount; /* userfaultfd syscall flags */ @@ -1060,7 +1060,7 @@ * waitqueue could become empty if this is the * only userfault. */ - write_seqcount_begin(&ctx->refile_seq); + write_seqlock(&ctx->refile_seq); /* * The fault_pending_wqh.lock prevents the uwq @@ -1086,7 +1086,7 @@ list_del(&uwq->wq.entry); add_wait_queue(&ctx->fault_wqh, &uwq->wq); - write_seqcount_end(&ctx->refile_seq); + write_sequnlock(&ctx->refile_seq); /* careful to always initialize msg if ret == 0 */ *msg = uwq->msg; @@ -1259,11 +1259,11 @@ * sure we've userfaults to wake. */ do { - seq = read_seqcount_begin(&ctx->refile_seq); + seq = read_seqbegin(&ctx->refile_seq); need_wakeup = waitqueue_active(&ctx->fault_pending_wqh) || waitqueue_active(&ctx->fault_wqh); cond_resched(); - } while (read_seqcount_retry(&ctx->refile_seq, seq)); + } while (read_seqretry(&ctx->refile_seq, seq)); if (need_wakeup) __wake_userfault(ctx, range); } @@ -1941,7 +1941,7 @@ init_waitqueue_head(&ctx->fault_wqh); init_waitqueue_head(&ctx->event_wqh); init_waitqueue_head(&ctx->fd_wqh); - seqcount_init(&ctx->refile_seq); + seqlock_init(&ctx->refile_seq); } SYSCALL_DEFINE1(userfaultfd, int, flags) diff --git a/kernel/include/asm-generic/percpu.h b/kernel/include/asm-generic/percpu.h index 1817a84..942d64c 100644 --- a/kernel/include/asm-generic/percpu.h +++ b/kernel/include/asm-generic/percpu.h @@ -5,6 +5,7 @@ #include <linux/compiler.h> #include <linux/threads.h> #include <linux/percpu-defs.h> +#include <linux/irqflags.h> #ifdef CONFIG_SMP diff --git a/kernel/include/drm/bridge/dw_hdmi.h b/kernel/include/drm/bridge/dw_hdmi.h index ad0b749..bd59595 100644 --- a/kernel/include/drm/bridge/dw_hdmi.h +++ b/kernel/include/drm/bridge/dw_hdmi.h @@ -180,6 +180,11 @@ struct drm_property *(*get_hdr_property)(void *data); struct drm_property_blob *(*get_hdr_blob)(void *data); bool (*get_color_changed)(void *data); + void (*update_color_format)(struct drm_connector_state *conn_state, void *data); + bool (*check_hdr_color_change)(struct drm_connector_state *conn_state, void *data); + void (*set_prev_bus_format)(void *data, unsigned long bus_format); + void (*set_ddc_io)(void *data, bool enable); + int (*dclk_set)(void *data, bool enable, int vp_id); /* Vendor Property support */ const struct dw_hdmi_property_ops *property_ops; @@ -223,5 +228,6 @@ void dw_hdmi_set_output_type(struct dw_hdmi *hdmi, u64 val); bool dw_hdmi_get_output_whether_hdmi(struct dw_hdmi *hdmi); int dw_hdmi_get_output_type_cap(struct dw_hdmi *hdmi); +void dw_hdmi_set_hpd_wake(struct dw_hdmi *hdmi); #endif /* __IMX_HDMI_H__ */ diff --git a/kernel/include/dt-bindings/clock/rk3528-cru.h b/kernel/include/dt-bindings/clock/rk3528-cru.h new file mode 100644 index 0000000..7cfbc8c --- /dev/null +++ b/kernel/include/dt-bindings/clock/rk3528-cru.h @@ -0,0 +1,747 @@ +/* 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 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 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/kernel/include/dt-bindings/display/rockchip-tve.h b/kernel/include/dt-bindings/display/rockchip-tve.h new file mode 100644 index 0000000..d72d692 --- /dev/null +++ b/kernel/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/kernel/include/dt-bindings/input/rk-ir.h b/kernel/include/dt-bindings/input/rk-ir.h new file mode 100644 index 0000000..cc646e3 --- /dev/null +++ b/kernel/include/dt-bindings/input/rk-ir.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ +#ifndef _DT_BINDINGS_RK_IR_H +#define _DT_BINDINGS_RK_IR_H + +/* STB KEYS */ +#define KEY_CHANNEL_UP 249 +#define KEY_CHANNEL_DN 250 +#define KEY_HOME_PAGE 251 +#define KEY_CH_CUT_BACK 252 +#define KEY_DIRECT_SEEDING 253 +#define KEY_REVIEW 254 +#define KEY_ON_DEMAND 255 +#define KEY_INFO1 256 +#define KEY_SOUND1 257 +#define KEY_X1 258 +#define KEY_X2 259 +#define KEY_LOCAL 260 +#define KEY_APPLICATION 261 +#define KEY_POS 262 +#define KEY_GO_BEGINNING 263 +#define KEY_INTERX 264 +#define KEY_FAVORITE 265 +#define KEY_CHANNEL_POS 266 +#define KEY_EVENT 267 +#define KEY_COMM 268 +#define KEY_LAUNCH 269 +#define KEY_TRACK 270 +#define KEY_PORTAL 271 +#define KEY_AUTOPAIR 703//0x2BF + +#endif diff --git a/kernel/include/dt-bindings/power/rk3528-power.h b/kernel/include/dt-bindings/power/rk3528-power.h new file mode 100644 index 0000000..4f7c978 --- /dev/null +++ b/kernel/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/kernel/include/dt-bindings/soc/rockchip-system-status.h b/kernel/include/dt-bindings/soc/rockchip-system-status.h index 837a1a9..54e6206 100644 --- a/kernel/include/dt-bindings/soc/rockchip-system-status.h +++ b/kernel/include/dt-bindings/soc/rockchip-system-status.h @@ -34,10 +34,12 @@ #define SYS_STATUS_HDMI (1 << 15) #define SYS_STATUS_VIDEO_4K_10B (1 << 16) #define SYS_STATUS_LOW_POWER (1 << 17) +#define SYS_STATUS_VIDEO_4K_60P (1 << 20) #define SYS_STATUS_VIDEO (SYS_STATUS_VIDEO_4K | \ SYS_STATUS_VIDEO_1080P | \ - SYS_STATUS_VIDEO_4K_10B) + SYS_STATUS_VIDEO_4K_10B | \ + SYS_STATUS_VIDEO_4K_60P) #define SYS_STATUS_DUALVIEW (SYS_STATUS_LCDC0 | SYS_STATUS_LCDC1) #define DMC_FREQ_LEVEL_LOW (0x1 << 0) diff --git a/kernel/include/dt-bindings/suspend/rockchip-rk3528.h b/kernel/include/dt-bindings/suspend/rockchip-rk3528.h new file mode 100644 index 0000000..7f81bf8 --- /dev/null +++ b/kernel/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/kernel/include/linux/arm_sdei.h b/kernel/include/linux/arm_sdei.h index d3f1d27..d8bd2a1 100644 --- a/kernel/include/linux/arm_sdei.h +++ b/kernel/include/linux/arm_sdei.h @@ -40,13 +40,51 @@ int sdei_event_disable(u32 event_num); #ifdef CONFIG_FIQ_DEBUGGER_TRUST_ZONE +#ifdef CONFIG_ARM_SDE_INTERFACE int sdei_event_enable_nolock(u32 event_num); int sdei_event_disable_nolock(u32 event_num); int sdei_event_routing_set_nolock(u32 event_num, unsigned long flags, unsigned long affinity); int sdei_event_routing_set(u32 event_num, unsigned long flags, unsigned long affinity); -#endif +int sdei_interrupt_bind(u32 intr_num, u32 *event_num); +int sdei_interrupt_release(u32 event_num); +#else +static inline int sdei_event_enable_nolock(u32 event_num) +{ + return SDEI_NOT_SUPPORTED; +} + +static inline int sdei_event_disable_nolock(u32 event_num) +{ + return SDEI_NOT_SUPPORTED; +} + +static inline int sdei_event_routing_set_nolock(u32 event_num, + unsigned long flags, + unsigned long affinity) +{ + return SDEI_NOT_SUPPORTED; +} + +static inline int sdei_event_routing_set(u32 event_num, + unsigned long flags, + unsigned long affinity) +{ + return SDEI_NOT_SUPPORTED; +} + +static inline int sdei_interrupt_bind(u32 intr_num, u32 *event_num) +{ + return SDEI_NOT_SUPPORTED; +} + +static inline int sdei_interrupt_release(u32 event_num) +{ + return SDEI_NOT_SUPPORTED; +} +#endif /* CONFIG_ARM_SDE_INTERFACE */ +#endif /* CONFIG_FIQ_DEBUGGER_TRUST_ZONE */ #ifdef CONFIG_ARM_SDE_INTERFACE /* For use by arch code when CPU hotplug notifiers are not appropriate. */ diff --git a/kernel/include/linux/blk-cgroup.h b/kernel/include/linux/blk-cgroup.h index 6d766a1..da587e6 100644 --- a/kernel/include/linux/blk-cgroup.h +++ b/kernel/include/linux/blk-cgroup.h @@ -14,7 +14,7 @@ * Nauman Rafique <nauman@google.com> */ -#include <linux/cgroup.h> +#include <linux/kthread.h> #include <linux/percpu_counter.h> #include <linux/seq_file.h> #include <linux/radix-tree.h> diff --git a/kernel/include/linux/blk-mq.h b/kernel/include/linux/blk-mq.h index 2885dce..8dbb9ec 100644 --- a/kernel/include/linux/blk-mq.h +++ b/kernel/include/linux/blk-mq.h @@ -256,7 +256,7 @@ return unique_tag & BLK_MQ_UNIQUE_TAG_MASK; } - +void __blk_mq_complete_request_remote_work(struct work_struct *work); int blk_mq_request_started(struct request *rq); void blk_mq_start_request(struct request *rq); void blk_mq_end_request(struct request *rq, blk_status_t error); diff --git a/kernel/include/linux/blkdev.h b/kernel/include/linux/blkdev.h index b587a3b..cfe14fc 100644 --- a/kernel/include/linux/blkdev.h +++ b/kernel/include/linux/blkdev.h @@ -13,6 +13,7 @@ #include <linux/llist.h> #include <linux/timer.h> #include <linux/workqueue.h> +#include <linux/kthread.h> #include <linux/pagemap.h> #include <linux/backing-dev-defs.h> #include <linux/wait.h> @@ -150,6 +151,9 @@ */ struct request { struct request_queue *q; +#ifdef CONFIG_PREEMPT_RT_FULL + struct work_struct work; +#endif struct blk_mq_ctx *mq_ctx; int cpu; @@ -655,6 +659,7 @@ #endif struct rcu_head rcu_head; wait_queue_head_t mq_freeze_wq; + struct work_struct mq_pcpu_wake; struct percpu_ref q_usage_counter; struct list_head all_q_node; diff --git a/kernel/include/linux/bottom_half.h b/kernel/include/linux/bottom_half.h index a19519f..40dd5ef 100644 --- a/kernel/include/linux/bottom_half.h +++ b/kernel/include/linux/bottom_half.h @@ -4,6 +4,39 @@ #include <linux/preempt.h> +#ifdef CONFIG_PREEMPT_RT_FULL + +extern void __local_bh_disable(void); +extern void _local_bh_enable(void); +extern void __local_bh_enable(void); + +static inline void local_bh_disable(void) +{ + __local_bh_disable(); +} + +static inline void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) +{ + __local_bh_disable(); +} + +static inline void local_bh_enable(void) +{ + __local_bh_enable(); +} + +static inline void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) +{ + __local_bh_enable(); +} + +static inline void local_bh_enable_ip(unsigned long ip) +{ + __local_bh_enable(); +} + +#else + #ifdef CONFIG_TRACE_IRQFLAGS extern void __local_bh_disable_ip(unsigned long ip, unsigned int cnt); #else @@ -31,5 +64,6 @@ { __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET); } +#endif #endif /* _LINUX_BH_H */ diff --git a/kernel/include/linux/buffer_head.h b/kernel/include/linux/buffer_head.h index 9168fc3..703bf33 100644 --- a/kernel/include/linux/buffer_head.h +++ b/kernel/include/linux/buffer_head.h @@ -76,8 +76,50 @@ struct address_space *b_assoc_map; /* mapping this buffer is associated with */ atomic_t b_count; /* users using this buffer_head */ +#ifdef CONFIG_PREEMPT_RT_BASE + spinlock_t b_uptodate_lock; +#if IS_ENABLED(CONFIG_JBD2) + spinlock_t b_state_lock; + spinlock_t b_journal_head_lock; +#endif +#endif }; +static inline unsigned long bh_uptodate_lock_irqsave(struct buffer_head *bh) +{ + unsigned long flags; + +#ifndef CONFIG_PREEMPT_RT_BASE + local_irq_save(flags); + bit_spin_lock(BH_Uptodate_Lock, &bh->b_state); +#else + spin_lock_irqsave(&bh->b_uptodate_lock, flags); +#endif + return flags; +} + +static inline void +bh_uptodate_unlock_irqrestore(struct buffer_head *bh, unsigned long flags) +{ +#ifndef CONFIG_PREEMPT_RT_BASE + bit_spin_unlock(BH_Uptodate_Lock, &bh->b_state); + local_irq_restore(flags); +#else + spin_unlock_irqrestore(&bh->b_uptodate_lock, flags); +#endif +} + +static inline void buffer_head_init_locks(struct buffer_head *bh) +{ +#ifdef CONFIG_PREEMPT_RT_BASE + spin_lock_init(&bh->b_uptodate_lock); +#if IS_ENABLED(CONFIG_JBD2) + spin_lock_init(&bh->b_state_lock); + spin_lock_init(&bh->b_journal_head_lock); +#endif +#endif +} + /* * macro tricks to expand the set_buffer_foo(), clear_buffer_foo() * and buffer_foo() functions. diff --git a/kernel/include/linux/cgroup-defs.h b/kernel/include/linux/cgroup-defs.h index 57ce109..eb77eb7 100644 --- a/kernel/include/linux/cgroup-defs.h +++ b/kernel/include/linux/cgroup-defs.h @@ -21,6 +21,7 @@ #include <linux/workqueue.h> #include <linux/bpf-cgroup.h> #include <linux/psi_types.h> +#include <linux/swork.h> #ifdef CONFIG_CGROUPS @@ -166,6 +167,7 @@ /* percpu_ref killing and RCU release */ struct work_struct destroy_work; + struct swork_event destroy_swork; struct rcu_work destroy_rwork; /* diff --git a/kernel/include/linux/completion.h b/kernel/include/linux/completion.h index 519e949..bf8e770 100644 --- a/kernel/include/linux/completion.h +++ b/kernel/include/linux/completion.h @@ -9,7 +9,7 @@ * See kernel/sched/completion.c for details. */ -#include <linux/wait.h> +#include <linux/swait.h> /* * struct completion - structure used to maintain state for a "completion" @@ -25,7 +25,7 @@ */ struct completion { unsigned int done; - wait_queue_head_t wait; + struct swait_queue_head wait; }; #define init_completion_map(x, m) __init_completion(x) @@ -34,7 +34,7 @@ static inline void complete_release(struct completion *x) {} #define COMPLETION_INITIALIZER(work) \ - { 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) } + { 0, __SWAIT_QUEUE_HEAD_INITIALIZER((work).wait) } #define COMPLETION_INITIALIZER_ONSTACK_MAP(work, map) \ (*({ init_completion_map(&(work), &(map)); &(work); })) @@ -85,7 +85,7 @@ static inline void __init_completion(struct completion *x) { x->done = 0; - init_waitqueue_head(&x->wait); + init_swait_queue_head(&x->wait); } /** diff --git a/kernel/include/linux/cpu.h b/kernel/include/linux/cpu.h index 26c5087..6440b89 100644 --- a/kernel/include/linux/cpu.h +++ b/kernel/include/linux/cpu.h @@ -129,6 +129,7 @@ static inline void lockdep_assert_cpus_held(void) { } static inline void cpu_hotplug_disable(void) { } static inline void cpu_hotplug_enable(void) { } + #endif /* !CONFIG_HOTPLUG_CPU */ /* Wrappers which go away once all code is converted */ diff --git a/kernel/include/linux/dcache.h b/kernel/include/linux/dcache.h index ee2d177..668d880 100644 --- a/kernel/include/linux/dcache.h +++ b/kernel/include/linux/dcache.h @@ -106,7 +106,7 @@ union { struct list_head d_lru; /* LRU list */ - wait_queue_head_t *d_wait; /* in-lookup ones only */ + struct swait_queue_head *d_wait; /* in-lookup ones only */ }; struct list_head d_child; /* child of parent list */ struct list_head d_subdirs; /* our children */ @@ -246,7 +246,7 @@ extern struct dentry * d_alloc_anon(struct super_block *); extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *); extern struct dentry * d_alloc_parallel(struct dentry *, const struct qstr *, - wait_queue_head_t *); + struct swait_queue_head *); extern struct dentry * d_splice_alias(struct inode *, struct dentry *); extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *); extern struct dentry * d_exact_alias(struct dentry *, struct inode *); diff --git a/kernel/include/linux/delay.h b/kernel/include/linux/delay.h index b78bab4..7c4bc41 100644 --- a/kernel/include/linux/delay.h +++ b/kernel/include/linux/delay.h @@ -64,4 +64,10 @@ msleep(seconds * 1000); } +#ifdef CONFIG_PREEMPT_RT_FULL +extern void cpu_chill(void); +#else +# define cpu_chill() cpu_relax() +#endif + #endif /* defined(_LINUX_DELAY_H) */ diff --git a/kernel/include/linux/device.h b/kernel/include/linux/device.h index 6a7b0c5..d91fe50 100644 --- a/kernel/include/linux/device.h +++ b/kernel/include/linux/device.h @@ -1711,17 +1711,6 @@ } \ module_exit(__driver##_exit); -#define module_driver1(__driver, __register, __unregister, ...) \ -static int __init __driver##_init(void) \ -{ \ - return __register(&(__driver) , ##__VA_ARGS__); \ -} \ -arch_initcall(__driver##_init); \ -static void __exit __driver##_exit(void) \ -{ \ - __unregister(&(__driver) , ##__VA_ARGS__); \ -} \ -module_exit(__driver##_exit); /** * builtin_driver() - Helper macro for drivers that don't do anything * special in init and have no exit. This eliminates some boilerplate. diff --git a/kernel/include/linux/extcon.h b/kernel/include/linux/extcon.h index dfe0b89..9ffa1a6 100644 --- a/kernel/include/linux/extcon.h +++ b/kernel/include/linux/extcon.h @@ -85,6 +85,7 @@ #define EXTCON_DISP_VGA 43 /* Video Graphics Array */ #define EXTCON_DISP_DP 44 /* Display Port */ #define EXTCON_DISP_HMD 45 /* Head-Mounted Display */ +#define EXTCON_DISP_HDMI_AUDIO 46 /* High-Definition Multimedia Interface Audio */ /* Miscellaneous external connector */ #define EXTCON_DOCK 60 diff --git a/kernel/include/linux/fs.h b/kernel/include/linux/fs.h index 1e76576..2d44116 100644 --- a/kernel/include/linux/fs.h +++ b/kernel/include/linux/fs.h @@ -697,7 +697,7 @@ struct block_device *i_bdev; struct cdev *i_cdev; char *i_link; - unsigned i_dir_seq; + unsigned __i_dir_seq; }; __u32 i_generation; diff --git a/kernel/include/linux/fscache.h b/kernel/include/linux/fscache.h index 84b90a7..87a9330 100644 --- a/kernel/include/linux/fscache.h +++ b/kernel/include/linux/fscache.h @@ -230,6 +230,7 @@ extern void __fscache_disable_cookie(struct fscache_cookie *, const void *, bool); extern void __fscache_enable_cookie(struct fscache_cookie *, const void *, loff_t, bool (*)(void *), void *); +extern void fscache_cookie_init(void); /** * fscache_register_netfs - Register a filesystem as desiring caching services diff --git a/kernel/include/linux/highmem.h b/kernel/include/linux/highmem.h index e80602e..d6c89c3 100644 --- a/kernel/include/linux/highmem.h +++ b/kernel/include/linux/highmem.h @@ -8,6 +8,7 @@ #include <linux/mm.h> #include <linux/uaccess.h> #include <linux/hardirq.h> +#include <linux/sched.h> #include <asm/cacheflush.h> @@ -66,7 +67,7 @@ static inline void *kmap_atomic(struct page *page) { - preempt_disable(); + preempt_disable_nort(); pagefault_disable(); return page_address(page); } @@ -75,7 +76,7 @@ static inline void __kunmap_atomic(void *addr) { pagefault_enable(); - preempt_enable(); + preempt_enable_nort(); } #define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) @@ -87,32 +88,51 @@ #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) +#ifndef CONFIG_PREEMPT_RT_FULL DECLARE_PER_CPU(int, __kmap_atomic_idx); +#endif static inline int kmap_atomic_idx_push(void) { +#ifndef CONFIG_PREEMPT_RT_FULL int idx = __this_cpu_inc_return(__kmap_atomic_idx) - 1; -#ifdef CONFIG_DEBUG_HIGHMEM +# ifdef CONFIG_DEBUG_HIGHMEM WARN_ON_ONCE(in_irq() && !irqs_disabled()); BUG_ON(idx >= KM_TYPE_NR); -#endif +# endif return idx; +#else + current->kmap_idx++; + BUG_ON(current->kmap_idx > KM_TYPE_NR); + return current->kmap_idx - 1; +#endif } static inline int kmap_atomic_idx(void) { +#ifndef CONFIG_PREEMPT_RT_FULL return __this_cpu_read(__kmap_atomic_idx) - 1; +#else + return current->kmap_idx - 1; +#endif } static inline void kmap_atomic_idx_pop(void) { -#ifdef CONFIG_DEBUG_HIGHMEM +#ifndef CONFIG_PREEMPT_RT_FULL +# ifdef CONFIG_DEBUG_HIGHMEM int idx = __this_cpu_dec_return(__kmap_atomic_idx); BUG_ON(idx < 0); -#else +# else __this_cpu_dec(__kmap_atomic_idx); +# endif +#else + current->kmap_idx--; +# ifdef CONFIG_DEBUG_HIGHMEM + BUG_ON(current->kmap_idx < 0); +# endif #endif } diff --git a/kernel/include/linux/hrtimer.h b/kernel/include/linux/hrtimer.h index 1e9e5b1..f7c86b6 100644 --- a/kernel/include/linux/hrtimer.h +++ b/kernel/include/linux/hrtimer.h @@ -42,6 +42,7 @@ HRTIMER_MODE_REL = 0x01, HRTIMER_MODE_PINNED = 0x02, HRTIMER_MODE_SOFT = 0x04, + HRTIMER_MODE_HARD = 0x08, HRTIMER_MODE_ABS_PINNED = HRTIMER_MODE_ABS | HRTIMER_MODE_PINNED, HRTIMER_MODE_REL_PINNED = HRTIMER_MODE_REL | HRTIMER_MODE_PINNED, @@ -52,6 +53,11 @@ HRTIMER_MODE_ABS_PINNED_SOFT = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_SOFT, HRTIMER_MODE_REL_PINNED_SOFT = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_SOFT, + HRTIMER_MODE_ABS_HARD = HRTIMER_MODE_ABS | HRTIMER_MODE_HARD, + HRTIMER_MODE_REL_HARD = HRTIMER_MODE_REL | HRTIMER_MODE_HARD, + + HRTIMER_MODE_ABS_PINNED_HARD = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_HARD, + HRTIMER_MODE_REL_PINNED_HARD = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_HARD, }; /* @@ -189,6 +195,8 @@ * @nr_retries: Total number of hrtimer interrupt retries * @nr_hangs: Total number of hrtimer interrupt hangs * @max_hang_time: Maximum time spent in hrtimer_interrupt + * @softirq_expiry_lock: Lock which is taken while softirq based hrtimer are + * expired * @expires_next: absolute time of the next event, is required for remote * hrtimer enqueue; it is the total first expiry time (hard * and soft hrtimer are taken into account) @@ -216,6 +224,7 @@ unsigned short nr_hangs; unsigned int max_hang_time; #endif + spinlock_t softirq_expiry_lock; ktime_t expires_next; struct hrtimer *next_timer; ktime_t softirq_expires_next; @@ -353,10 +362,17 @@ /* Initialize timers: */ extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock, enum hrtimer_mode mode); +extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, + enum hrtimer_mode mode, + struct task_struct *task); #ifdef CONFIG_DEBUG_OBJECTS_TIMERS extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clock, enum hrtimer_mode mode); +extern void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, + clockid_t clock_id, + enum hrtimer_mode mode, + struct task_struct *task); extern void destroy_hrtimer_on_stack(struct hrtimer *timer); #else @@ -366,6 +382,15 @@ { hrtimer_init(timer, which_clock, mode); } + +static inline void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, + clockid_t clock_id, + enum hrtimer_mode mode, + struct task_struct *task) +{ + hrtimer_init_sleeper(sl, clock_id, mode, task); +} + static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { } #endif @@ -389,6 +414,7 @@ extern int hrtimer_cancel(struct hrtimer *timer); extern int hrtimer_try_to_cancel(struct hrtimer *timer); +extern void hrtimer_grab_expiry_lock(const struct hrtimer *timer); static inline void hrtimer_start_expires(struct hrtimer *timer, enum hrtimer_mode mode) @@ -474,9 +500,6 @@ extern long hrtimer_nanosleep(const struct timespec64 *rqtp, const enum hrtimer_mode mode, const clockid_t clockid); - -extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, - struct task_struct *tsk); extern int schedule_hrtimeout_range(ktime_t *expires, u64 delta, const enum hrtimer_mode mode); diff --git a/kernel/include/linux/idr.h b/kernel/include/linux/idr.h index b6c6151..81c9df5 100644 --- a/kernel/include/linux/idr.h +++ b/kernel/include/linux/idr.h @@ -169,10 +169,7 @@ * Each idr_preload() should be matched with an invocation of this * function. See idr_preload() for details. */ -static inline void idr_preload_end(void) -{ - preempt_enable(); -} +void idr_preload_end(void); /** * idr_for_each_entry() - Iterate over an IDR's elements of a given type. diff --git a/kernel/include/linux/interrupt.h b/kernel/include/linux/interrupt.h index eeceac3..a3b5edb 100644 --- a/kernel/include/linux/interrupt.h +++ b/kernel/include/linux/interrupt.h @@ -61,6 +61,7 @@ * interrupt handler after suspending interrupts. For system * wakeup devices users need to implement wakeup detection in * their interrupt handlers. + * IRQF_NO_SOFTIRQ_CALL - Do not process softirqs in the irq thread context (RT) */ #define IRQF_SHARED 0x00000080 #define IRQF_PROBE_SHARED 0x00000100 @@ -74,6 +75,7 @@ #define IRQF_NO_THREAD 0x00010000 #define IRQF_EARLY_RESUME 0x00020000 #define IRQF_COND_SUSPEND 0x00040000 +#define IRQF_NO_SOFTIRQ_CALL 0x00080000 #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) @@ -427,7 +429,11 @@ bool state); #ifdef CONFIG_IRQ_FORCED_THREADING +# ifdef CONFIG_PREEMPT_RT_BASE +# define force_irqthreads (true) +# else extern bool force_irqthreads; +# endif #else #define force_irqthreads (0) #endif @@ -493,9 +499,10 @@ void (*action)(struct softirq_action *); }; +#ifndef CONFIG_PREEMPT_RT_FULL asmlinkage void do_softirq(void); asmlinkage void __do_softirq(void); - +static inline void thread_do_softirq(void) { do_softirq(); } #ifdef __ARCH_HAS_DO_SOFTIRQ void do_softirq_own_stack(void); #else @@ -504,13 +511,25 @@ __do_softirq(); } #endif +#else +extern void thread_do_softirq(void); +#endif extern void open_softirq(int nr, void (*action)(struct softirq_action *)); extern void softirq_init(void); extern void __raise_softirq_irqoff(unsigned int nr); +#ifdef CONFIG_PREEMPT_RT_FULL +extern void __raise_softirq_irqoff_ksoft(unsigned int nr); +#else +static inline void __raise_softirq_irqoff_ksoft(unsigned int nr) +{ + __raise_softirq_irqoff(nr); +} +#endif extern void raise_softirq_irqoff(unsigned int nr); extern void raise_softirq(unsigned int nr); +extern void softirq_check_pending_idle(void); DECLARE_PER_CPU(struct task_struct *, ksoftirqd); @@ -532,8 +551,9 @@ to be executed on some cpu at least once after this. * If the tasklet is already scheduled, but its execution is still not started, it will be executed only once. - * If this tasklet is already running on another CPU (or schedule is called - from tasklet itself), it is rescheduled for later. + * If this tasklet is already running on another CPU, it is rescheduled + for later. + * Schedule must not be called from the tasklet itself (a lockup occurs) * Tasklet is strictly serialized wrt itself, but not wrt another tasklets. If client needs some intertask synchronization, he makes it with spinlocks. @@ -558,13 +578,26 @@ enum { TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */ - TASKLET_STATE_RUN /* Tasklet is running (SMP only) */ + TASKLET_STATE_RUN, /* Tasklet is running (SMP only) */ + TASKLET_STATE_PENDING, /* Tasklet is pending */ + TASKLET_STATE_CHAINED /* Tasklet is chained */ }; -#ifdef CONFIG_SMP +#define TASKLET_STATEF_SCHED (1 << TASKLET_STATE_SCHED) +#define TASKLET_STATEF_RUN (1 << TASKLET_STATE_RUN) +#define TASKLET_STATEF_PENDING (1 << TASKLET_STATE_PENDING) +#define TASKLET_STATEF_CHAINED (1 << TASKLET_STATE_CHAINED) +#define TASKLET_STATEF_RC (TASKLET_STATEF_RUN | TASKLET_STATEF_CHAINED) + +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) static inline int tasklet_trylock(struct tasklet_struct *t) { return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state); +} + +static inline int tasklet_tryunlock(struct tasklet_struct *t) +{ + return cmpxchg(&t->state, TASKLET_STATEF_RUN, 0) == TASKLET_STATEF_RUN; } static inline void tasklet_unlock(struct tasklet_struct *t) @@ -573,12 +606,11 @@ clear_bit(TASKLET_STATE_RUN, &(t)->state); } -static inline void tasklet_unlock_wait(struct tasklet_struct *t) -{ - while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); } -} +extern void tasklet_unlock_wait(struct tasklet_struct *t); + #else #define tasklet_trylock(t) 1 +#define tasklet_tryunlock(t) 1 #define tasklet_unlock_wait(t) do { } while (0) #define tasklet_unlock(t) do { } while (0) #endif @@ -612,17 +644,18 @@ smp_mb(); } -static inline void tasklet_enable(struct tasklet_struct *t) -{ - smp_mb__before_atomic(); - atomic_dec(&t->count); -} - +extern void tasklet_enable(struct tasklet_struct *t); extern void tasklet_kill(struct tasklet_struct *t); extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu); extern void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data); +#ifdef CONFIG_PREEMPT_RT_FULL +extern void softirq_early_init(void); +#else +static inline void softirq_early_init(void) { } +#endif + struct tasklet_hrtimer { struct hrtimer timer; struct tasklet_struct tasklet; diff --git a/kernel/include/linux/iommu.h b/kernel/include/linux/iommu.h index c5470ac..6d48388 100644 --- a/kernel/include/linux/iommu.h +++ b/kernel/include/linux/iommu.h @@ -45,10 +45,7 @@ #define IOMMU_USE_UPSTREAM_HINT (1 << 6) /* Use upstream device's bus attribute with no write-allocate cache policy */ -#define IOMMU_USE_LLC_NWA (1 << 7) - -/* For shoting entire IOMMU tlb once */ -#define IOMMU_TLB_SHOT_ENTIRE (1 << 6) +#define IOMMU_USE_LLC_NWA (1 << 7) struct iommu_ops; struct iommu_group; diff --git a/kernel/include/linux/irq.h b/kernel/include/linux/irq.h index 6d54677..e07cfbb 100644 --- a/kernel/include/linux/irq.h +++ b/kernel/include/linux/irq.h @@ -69,6 +69,7 @@ * IRQ_IS_POLLED - Always polled by another interrupt. Exclude * it from the spurious interrupt detection * mechanism and from core side polling. + * IRQ_NO_SOFTIRQ_CALL - No softirq processing in the irq thread context (RT) * IRQ_DISABLE_UNLAZY - Disable lazy irq disable */ enum { @@ -96,13 +97,14 @@ IRQ_PER_CPU_DEVID = (1 << 17), IRQ_IS_POLLED = (1 << 18), IRQ_DISABLE_UNLAZY = (1 << 19), + IRQ_NO_SOFTIRQ_CALL = (1 << 20), }; #define IRQF_MODIFY_MASK \ (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID | \ - IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY) + IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY | IRQ_NO_SOFTIRQ_CALL) #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) diff --git a/kernel/include/linux/irq_work.h b/kernel/include/linux/irq_work.h index b11fcdf..0c50559 100644 --- a/kernel/include/linux/irq_work.h +++ b/kernel/include/linux/irq_work.h @@ -18,6 +18,8 @@ /* Doesn't want IPI, wait for tick: */ #define IRQ_WORK_LAZY BIT(2) +/* Run hard IRQ context, even on RT */ +#define IRQ_WORK_HARD_IRQ BIT(3) #define IRQ_WORK_CLAIMED (IRQ_WORK_PENDING | IRQ_WORK_BUSY) @@ -52,4 +54,10 @@ static inline void irq_work_run(void) { } #endif +#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL) +void irq_work_tick_soft(void); +#else +static inline void irq_work_tick_soft(void) { } +#endif + #endif /* _LINUX_IRQ_WORK_H */ diff --git a/kernel/include/linux/irqchip/arm-gic-v3.h b/kernel/include/linux/irqchip/arm-gic-v3.h index 1d21e98..fdddead 100644 --- a/kernel/include/linux/irqchip/arm-gic-v3.h +++ b/kernel/include/linux/irqchip/arm-gic-v3.h @@ -585,6 +585,7 @@ void __iomem *rd_base; struct page *pend_page; phys_addr_t phys_base; + bool lpi_enabled; } __percpu *rdist; struct page *prop_page; u64 flags; diff --git a/kernel/include/linux/irqdesc.h b/kernel/include/linux/irqdesc.h index 875c41b..ff5eb8d 100644 --- a/kernel/include/linux/irqdesc.h +++ b/kernel/include/linux/irqdesc.h @@ -71,6 +71,7 @@ unsigned int irqs_unhandled; atomic_t threads_handled; int threads_handled_last; + u64 random_ip; raw_spinlock_t lock; struct cpumask *percpu_enabled; const struct cpumask *percpu_affinity; diff --git a/kernel/include/linux/irqflags.h b/kernel/include/linux/irqflags.h index 21619c9..b20eeb2 100644 --- a/kernel/include/linux/irqflags.h +++ b/kernel/include/linux/irqflags.h @@ -43,14 +43,6 @@ do { \ current->hardirq_context--; \ } while (0) -# define lockdep_softirq_enter() \ -do { \ - current->softirq_context++; \ -} while (0) -# define lockdep_softirq_exit() \ -do { \ - current->softirq_context--; \ -} while (0) #else # define trace_hardirqs_on() do { } while (0) # define trace_hardirqs_off() do { } while (0) @@ -64,6 +56,21 @@ # define lockdep_softirq_exit() do { } while (0) #endif +#if defined(CONFIG_TRACE_IRQFLAGS) && !defined(CONFIG_PREEMPT_RT_FULL) +# define lockdep_softirq_enter() \ +do { \ + current->softirq_context++; \ +} while (0) +# define lockdep_softirq_exit() \ +do { \ + current->softirq_context--; \ +} while (0) + +#else +# define lockdep_softirq_enter() do { } while (0) +# define lockdep_softirq_exit() do { } while (0) +#endif + #if defined(CONFIG_IRQSOFF_TRACER) || \ defined(CONFIG_PREEMPT_TRACER) extern void stop_critical_timings(void); diff --git a/kernel/include/linux/jbd2.h b/kernel/include/linux/jbd2.h index 268f300..8f5d6ec 100644 --- a/kernel/include/linux/jbd2.h +++ b/kernel/include/linux/jbd2.h @@ -347,32 +347,56 @@ static inline void jbd_lock_bh_state(struct buffer_head *bh) { +#ifndef CONFIG_PREEMPT_RT_BASE bit_spin_lock(BH_State, &bh->b_state); +#else + spin_lock(&bh->b_state_lock); +#endif } static inline int jbd_trylock_bh_state(struct buffer_head *bh) { +#ifndef CONFIG_PREEMPT_RT_BASE return bit_spin_trylock(BH_State, &bh->b_state); +#else + return spin_trylock(&bh->b_state_lock); +#endif } static inline int jbd_is_locked_bh_state(struct buffer_head *bh) { +#ifndef CONFIG_PREEMPT_RT_BASE return bit_spin_is_locked(BH_State, &bh->b_state); +#else + return spin_is_locked(&bh->b_state_lock); +#endif } static inline void jbd_unlock_bh_state(struct buffer_head *bh) { +#ifndef CONFIG_PREEMPT_RT_BASE bit_spin_unlock(BH_State, &bh->b_state); +#else + spin_unlock(&bh->b_state_lock); +#endif } static inline void jbd_lock_bh_journal_head(struct buffer_head *bh) { +#ifndef CONFIG_PREEMPT_RT_BASE bit_spin_lock(BH_JournalHead, &bh->b_state); +#else + spin_lock(&bh->b_journal_head_lock); +#endif } static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh) { +#ifndef CONFIG_PREEMPT_RT_BASE bit_spin_unlock(BH_JournalHead, &bh->b_state); +#else + spin_unlock(&bh->b_journal_head_lock); +#endif } #define J_ASSERT(assert) BUG_ON(!(assert)) diff --git a/kernel/include/linux/kdb.h b/kernel/include/linux/kdb.h index 68bd882..e033b25 100644 --- a/kernel/include/linux/kdb.h +++ b/kernel/include/linux/kdb.h @@ -167,6 +167,7 @@ extern __printf(1, 2) int kdb_printf(const char *, ...); typedef __printf(1, 2) int (*kdb_printf_t)(const char *, ...); +#define in_kdb_printk() (kdb_trap_printk) extern void kdb_init(int level); /* Access to kdb specific polling devices */ @@ -201,6 +202,7 @@ extern int kdb_unregister(char *); #else /* ! CONFIG_KGDB_KDB */ static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; } +#define in_kdb_printk() (0) static inline void kdb_init(int level) {} static inline int kdb_register(char *cmd, kdb_func_t func, char *usage, char *help, short minlen) { return 0; } diff --git a/kernel/include/linux/kernel.h b/kernel/include/linux/kernel.h index 7a4e8e2..e0e7b0f 100644 --- a/kernel/include/linux/kernel.h +++ b/kernel/include/linux/kernel.h @@ -232,6 +232,9 @@ */ # define might_sleep() \ do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) + +# define might_sleep_no_state_check() \ + do { ___might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) # define sched_annotate_sleep() (current->task_state_change = 0) #else static inline void ___might_sleep(const char *file, int line, @@ -239,6 +242,7 @@ static inline void __might_sleep(const char *file, int line, int preempt_offset) { } # define might_sleep() do { might_resched(); } while (0) +# define might_sleep_no_state_check() do { might_resched(); } while (0) # define sched_annotate_sleep() do { } while (0) #endif diff --git a/kernel/include/linux/kthread.h b/kernel/include/linux/kthread.h index 3359bbd..8d19da1 100644 --- a/kernel/include/linux/kthread.h +++ b/kernel/include/linux/kthread.h @@ -87,7 +87,7 @@ struct kthread_worker { unsigned int flags; - spinlock_t lock; + raw_spinlock_t lock; struct list_head work_list; struct list_head delayed_work_list; struct task_struct *task; @@ -108,7 +108,7 @@ }; #define KTHREAD_WORKER_INIT(worker) { \ - .lock = __SPIN_LOCK_UNLOCKED((worker).lock), \ + .lock = __RAW_SPIN_LOCK_UNLOCKED((worker).lock), \ .work_list = LIST_HEAD_INIT((worker).work_list), \ .delayed_work_list = LIST_HEAD_INIT((worker).delayed_work_list),\ } diff --git a/kernel/include/linux/list_bl.h b/kernel/include/linux/list_bl.h index 3fc2cc5..0b5de7d 100644 --- a/kernel/include/linux/list_bl.h +++ b/kernel/include/linux/list_bl.h @@ -3,6 +3,7 @@ #define _LINUX_LIST_BL_H #include <linux/list.h> +#include <linux/spinlock.h> #include <linux/bit_spinlock.h> /* @@ -33,13 +34,24 @@ struct hlist_bl_head { struct hlist_bl_node *first; +#ifdef CONFIG_PREEMPT_RT_BASE + raw_spinlock_t lock; +#endif }; struct hlist_bl_node { struct hlist_bl_node *next, **pprev; }; -#define INIT_HLIST_BL_HEAD(ptr) \ - ((ptr)->first = NULL) + +#ifdef CONFIG_PREEMPT_RT_BASE +#define INIT_HLIST_BL_HEAD(h) \ +do { \ + (h)->first = NULL; \ + raw_spin_lock_init(&(h)->lock); \ +} while (0) +#else +#define INIT_HLIST_BL_HEAD(h) (h)->first = NULL +#endif static inline void INIT_HLIST_BL_NODE(struct hlist_bl_node *h) { @@ -119,12 +131,26 @@ static inline void hlist_bl_lock(struct hlist_bl_head *b) { +#ifndef CONFIG_PREEMPT_RT_BASE bit_spin_lock(0, (unsigned long *)b); +#else + raw_spin_lock(&b->lock); +#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) + __set_bit(0, (unsigned long *)b); +#endif +#endif } static inline void hlist_bl_unlock(struct hlist_bl_head *b) { +#ifndef CONFIG_PREEMPT_RT_BASE __bit_spin_unlock(0, (unsigned long *)b); +#else +#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) + __clear_bit(0, (unsigned long *)b); +#endif + raw_spin_unlock(&b->lock); +#endif } static inline bool hlist_bl_is_locked(struct hlist_bl_head *b) diff --git a/kernel/include/linux/locallock.h b/kernel/include/linux/locallock.h new file mode 100644 index 0000000..81c89d8 --- /dev/null +++ b/kernel/include/linux/locallock.h @@ -0,0 +1,282 @@ +#ifndef _LINUX_LOCALLOCK_H +#define _LINUX_LOCALLOCK_H + +#include <linux/percpu.h> +#include <linux/spinlock.h> +#include <asm/current.h> + +#ifdef CONFIG_PREEMPT_RT_BASE + +#ifdef CONFIG_DEBUG_SPINLOCK +# define LL_WARN(cond) WARN_ON(cond) +#else +# define LL_WARN(cond) do { } while (0) +#endif + +/* + * per cpu lock based substitute for local_irq_*() + */ +struct local_irq_lock { + spinlock_t lock; + struct task_struct *owner; + int nestcnt; + unsigned long flags; +}; + +#define DEFINE_LOCAL_IRQ_LOCK(lvar) \ + DEFINE_PER_CPU(struct local_irq_lock, lvar) = { \ + .lock = __SPIN_LOCK_UNLOCKED((lvar).lock) } + +#define DECLARE_LOCAL_IRQ_LOCK(lvar) \ + DECLARE_PER_CPU(struct local_irq_lock, lvar) + +#define local_irq_lock_init(lvar) \ + do { \ + int __cpu; \ + for_each_possible_cpu(__cpu) \ + spin_lock_init(&per_cpu(lvar, __cpu).lock); \ + } while (0) + +static inline void __local_lock(struct local_irq_lock *lv) +{ + if (lv->owner != current) { + spin_lock(&lv->lock); + LL_WARN(lv->owner); + LL_WARN(lv->nestcnt); + lv->owner = current; + } + lv->nestcnt++; +} + +#define local_lock(lvar) \ + do { __local_lock(&get_local_var(lvar)); } while (0) + +#define local_lock_on(lvar, cpu) \ + do { __local_lock(&per_cpu(lvar, cpu)); } while (0) + +static inline int __local_trylock(struct local_irq_lock *lv) +{ + if (lv->owner != current && spin_trylock(&lv->lock)) { + LL_WARN(lv->owner); + LL_WARN(lv->nestcnt); + lv->owner = current; + lv->nestcnt = 1; + return 1; + } else if (lv->owner == current) { + lv->nestcnt++; + return 1; + } + return 0; +} + +#define local_trylock(lvar) \ + ({ \ + int __locked; \ + __locked = __local_trylock(&get_local_var(lvar)); \ + if (!__locked) \ + put_local_var(lvar); \ + __locked; \ + }) + +static inline void __local_unlock(struct local_irq_lock *lv) +{ + LL_WARN(lv->nestcnt == 0); + LL_WARN(lv->owner != current); + if (--lv->nestcnt) + return; + + lv->owner = NULL; + spin_unlock(&lv->lock); +} + +#define local_unlock(lvar) \ + do { \ + __local_unlock(this_cpu_ptr(&lvar)); \ + put_local_var(lvar); \ + } while (0) + +#define local_unlock_on(lvar, cpu) \ + do { __local_unlock(&per_cpu(lvar, cpu)); } while (0) + +static inline void __local_lock_irq(struct local_irq_lock *lv) +{ + spin_lock_irqsave(&lv->lock, lv->flags); + LL_WARN(lv->owner); + LL_WARN(lv->nestcnt); + lv->owner = current; + lv->nestcnt = 1; +} + +#define local_lock_irq(lvar) \ + do { __local_lock_irq(&get_local_var(lvar)); } while (0) + +#define local_lock_irq_on(lvar, cpu) \ + do { __local_lock_irq(&per_cpu(lvar, cpu)); } while (0) + +static inline void __local_unlock_irq(struct local_irq_lock *lv) +{ + LL_WARN(!lv->nestcnt); + LL_WARN(lv->owner != current); + lv->owner = NULL; + lv->nestcnt = 0; + spin_unlock_irq(&lv->lock); +} + +#define local_unlock_irq(lvar) \ + do { \ + __local_unlock_irq(this_cpu_ptr(&lvar)); \ + put_local_var(lvar); \ + } while (0) + +#define local_unlock_irq_on(lvar, cpu) \ + do { \ + __local_unlock_irq(&per_cpu(lvar, cpu)); \ + } while (0) + +static inline int __local_lock_irqsave(struct local_irq_lock *lv) +{ + if (lv->owner != current) { + __local_lock_irq(lv); + return 0; + } else { + lv->nestcnt++; + return 1; + } +} + +#define local_lock_irqsave(lvar, _flags) \ + do { \ + if (__local_lock_irqsave(&get_local_var(lvar))) \ + put_local_var(lvar); \ + _flags = __this_cpu_read(lvar.flags); \ + } while (0) + +#define local_lock_irqsave_on(lvar, _flags, cpu) \ + do { \ + __local_lock_irqsave(&per_cpu(lvar, cpu)); \ + _flags = per_cpu(lvar, cpu).flags; \ + } while (0) + +static inline int __local_unlock_irqrestore(struct local_irq_lock *lv, + unsigned long flags) +{ + LL_WARN(!lv->nestcnt); + LL_WARN(lv->owner != current); + if (--lv->nestcnt) + return 0; + + lv->owner = NULL; + spin_unlock_irqrestore(&lv->lock, lv->flags); + return 1; +} + +#define local_unlock_irqrestore(lvar, flags) \ + do { \ + if (__local_unlock_irqrestore(this_cpu_ptr(&lvar), flags)) \ + put_local_var(lvar); \ + } while (0) + +#define local_unlock_irqrestore_on(lvar, flags, cpu) \ + do { \ + __local_unlock_irqrestore(&per_cpu(lvar, cpu), flags); \ + } while (0) + +#define local_spin_trylock_irq(lvar, lock) \ + ({ \ + int __locked; \ + local_lock_irq(lvar); \ + __locked = spin_trylock(lock); \ + if (!__locked) \ + local_unlock_irq(lvar); \ + __locked; \ + }) + +#define local_spin_lock_irq(lvar, lock) \ + do { \ + local_lock_irq(lvar); \ + spin_lock(lock); \ + } while (0) + +#define local_spin_unlock_irq(lvar, lock) \ + do { \ + spin_unlock(lock); \ + local_unlock_irq(lvar); \ + } while (0) + +#define local_spin_lock_irqsave(lvar, lock, flags) \ + do { \ + local_lock_irqsave(lvar, flags); \ + spin_lock(lock); \ + } while (0) + +#define local_spin_unlock_irqrestore(lvar, lock, flags) \ + do { \ + spin_unlock(lock); \ + local_unlock_irqrestore(lvar, flags); \ + } while (0) + +#define get_locked_var(lvar, var) \ + (*({ \ + local_lock(lvar); \ + this_cpu_ptr(&var); \ + })) + +#define put_locked_var(lvar, var) local_unlock(lvar); + +#define get_locked_ptr(lvar, var) \ + ({ \ + local_lock(lvar); \ + this_cpu_ptr(var); \ + }) + +#define put_locked_ptr(lvar, var) local_unlock(lvar); + +#define local_lock_cpu(lvar) \ + ({ \ + local_lock(lvar); \ + smp_processor_id(); \ + }) + +#define local_unlock_cpu(lvar) local_unlock(lvar) + +#else /* PREEMPT_RT_BASE */ + +#define DEFINE_LOCAL_IRQ_LOCK(lvar) __typeof__(const int) lvar +#define DECLARE_LOCAL_IRQ_LOCK(lvar) extern __typeof__(const int) lvar + +static inline void local_irq_lock_init(int lvar) { } + +#define local_trylock(lvar) \ + ({ \ + preempt_disable(); \ + 1; \ + }) + +#define local_lock(lvar) preempt_disable() +#define local_unlock(lvar) preempt_enable() +#define local_lock_irq(lvar) local_irq_disable() +#define local_lock_irq_on(lvar, cpu) local_irq_disable() +#define local_unlock_irq(lvar) local_irq_enable() +#define local_unlock_irq_on(lvar, cpu) local_irq_enable() +#define local_lock_irqsave(lvar, flags) local_irq_save(flags) +#define local_unlock_irqrestore(lvar, flags) local_irq_restore(flags) + +#define local_spin_trylock_irq(lvar, lock) spin_trylock_irq(lock) +#define local_spin_lock_irq(lvar, lock) spin_lock_irq(lock) +#define local_spin_unlock_irq(lvar, lock) spin_unlock_irq(lock) +#define local_spin_lock_irqsave(lvar, lock, flags) \ + spin_lock_irqsave(lock, flags) +#define local_spin_unlock_irqrestore(lvar, lock, flags) \ + spin_unlock_irqrestore(lock, flags) + +#define get_locked_var(lvar, var) get_cpu_var(var) +#define put_locked_var(lvar, var) put_cpu_var(var) +#define get_locked_ptr(lvar, var) get_cpu_ptr(var) +#define put_locked_ptr(lvar, var) put_cpu_ptr(var) + +#define local_lock_cpu(lvar) get_cpu() +#define local_unlock_cpu(lvar) put_cpu() + +#endif + +#endif diff --git a/kernel/include/linux/memcontrol.h b/kernel/include/linux/memcontrol.h index cc6b653..dbb2c4e 100644 --- a/kernel/include/linux/memcontrol.h +++ b/kernel/include/linux/memcontrol.h @@ -665,6 +665,7 @@ pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); + preempt_disable_rt(); /* Update memcg */ __mod_memcg_state(pn->memcg, idx, val); @@ -675,6 +676,7 @@ x = 0; } __this_cpu_write(pn->lruvec_stat_cpu->count[idx], x); + preempt_enable_rt(); } static inline void mod_lruvec_state(struct lruvec *lruvec, diff --git a/kernel/include/linux/mm_types.h b/kernel/include/linux/mm_types.h index 718ba2e..3205791 100644 --- a/kernel/include/linux/mm_types.h +++ b/kernel/include/linux/mm_types.h @@ -12,6 +12,7 @@ #include <linux/completion.h> #include <linux/cpumask.h> #include <linux/uprobes.h> +#include <linux/rcupdate.h> #include <linux/page-flags-layout.h> #include <linux/workqueue.h> #include <linux/android_kabi.h> @@ -500,6 +501,9 @@ bool tlb_flush_batched; #endif struct uprobes_state uprobes_state; +#ifdef CONFIG_PREEMPT_RT_BASE + struct rcu_head delayed_drop; +#endif #ifdef CONFIG_HUGETLB_PAGE atomic_long_t hugetlb_usage; #endif diff --git a/kernel/include/linux/mutex.h b/kernel/include/linux/mutex.h index 8f7cdf8..6aa217c 100644 --- a/kernel/include/linux/mutex.h +++ b/kernel/include/linux/mutex.h @@ -22,6 +22,17 @@ struct ww_acquire_ctx; +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ + , .dep_map = { .name = #lockname } +#else +# define __DEP_MAP_MUTEX_INITIALIZER(lockname) +#endif + +#ifdef CONFIG_PREEMPT_RT_FULL +# include <linux/mutex_rt.h> +#else + /* * Simple, straightforward mutexes with strict semantics: * @@ -117,13 +128,6 @@ \ __mutex_init((mutex), #mutex, &__key); \ } while (0) - -#ifdef CONFIG_DEBUG_LOCK_ALLOC -# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ - , .dep_map = { .name = #lockname } -#else -# define __DEP_MAP_MUTEX_INITIALIZER(lockname) -#endif #define __MUTEX_INITIALIZER(lockname) \ { .owner = ATOMIC_LONG_INIT(0) \ @@ -229,4 +233,6 @@ return mutex_trylock(lock); } +#endif /* !PREEMPT_RT_FULL */ + #endif /* __LINUX_MUTEX_H */ diff --git a/kernel/include/linux/mutex_rt.h b/kernel/include/linux/mutex_rt.h new file mode 100644 index 0000000..3fcb5ed --- /dev/null +++ b/kernel/include/linux/mutex_rt.h @@ -0,0 +1,130 @@ +#ifndef __LINUX_MUTEX_RT_H +#define __LINUX_MUTEX_RT_H + +#ifndef __LINUX_MUTEX_H +#error "Please include mutex.h" +#endif + +#include <linux/rtmutex.h> + +/* FIXME: Just for __lockfunc */ +#include <linux/spinlock.h> + +struct mutex { + struct rt_mutex lock; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif +}; + +#define __MUTEX_INITIALIZER(mutexname) \ + { \ + .lock = __RT_MUTEX_INITIALIZER(mutexname.lock) \ + __DEP_MAP_MUTEX_INITIALIZER(mutexname) \ + } + +#define DEFINE_MUTEX(mutexname) \ + struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) + +extern void __mutex_do_init(struct mutex *lock, const char *name, struct lock_class_key *key); +extern void __lockfunc _mutex_lock(struct mutex *lock); +extern void __lockfunc _mutex_lock_io(struct mutex *lock); +extern void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass); +extern int __lockfunc _mutex_lock_interruptible(struct mutex *lock); +extern int __lockfunc _mutex_lock_killable(struct mutex *lock); +extern void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass); +extern void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest_lock); +extern int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass); +extern int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass); +extern int __lockfunc _mutex_trylock(struct mutex *lock); +extern void __lockfunc _mutex_unlock(struct mutex *lock); + +#define mutex_is_locked(l) rt_mutex_is_locked(&(l)->lock) +#define mutex_lock(l) _mutex_lock(l) +#define mutex_lock_interruptible(l) _mutex_lock_interruptible(l) +#define mutex_lock_killable(l) _mutex_lock_killable(l) +#define mutex_trylock(l) _mutex_trylock(l) +#define mutex_unlock(l) _mutex_unlock(l) +#define mutex_lock_io(l) _mutex_lock_io(l); + +#define __mutex_owner(l) ((l)->lock.owner) + +#ifdef CONFIG_DEBUG_MUTEXES +#define mutex_destroy(l) rt_mutex_destroy(&(l)->lock) +#else +static inline void mutex_destroy(struct mutex *lock) {} +#endif + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define mutex_lock_nested(l, s) _mutex_lock_nested(l, s) +# define mutex_lock_interruptible_nested(l, s) \ + _mutex_lock_interruptible_nested(l, s) +# define mutex_lock_killable_nested(l, s) \ + _mutex_lock_killable_nested(l, s) +# define mutex_lock_io_nested(l, s) _mutex_lock_io_nested(l, s) + +# define mutex_lock_nest_lock(lock, nest_lock) \ +do { \ + typecheck(struct lockdep_map *, &(nest_lock)->dep_map); \ + _mutex_lock_nest_lock(lock, &(nest_lock)->dep_map); \ +} while (0) + +#else +# define mutex_lock_nested(l, s) _mutex_lock(l) +# define mutex_lock_interruptible_nested(l, s) \ + _mutex_lock_interruptible(l) +# define mutex_lock_killable_nested(l, s) \ + _mutex_lock_killable(l) +# define mutex_lock_nest_lock(lock, nest_lock) mutex_lock(lock) +# define mutex_lock_io_nested(l, s) _mutex_lock_io(l) +#endif + +# define mutex_init(mutex) \ +do { \ + static struct lock_class_key __key; \ + \ + rt_mutex_init(&(mutex)->lock); \ + __mutex_do_init((mutex), #mutex, &__key); \ +} while (0) + +# define __mutex_init(mutex, name, key) \ +do { \ + rt_mutex_init(&(mutex)->lock); \ + __mutex_do_init((mutex), name, key); \ +} while (0) + +/** + * These values are chosen such that FAIL and SUCCESS match the + * values of the regular mutex_trylock(). + */ +enum mutex_trylock_recursive_enum { + MUTEX_TRYLOCK_FAILED = 0, + MUTEX_TRYLOCK_SUCCESS = 1, + MUTEX_TRYLOCK_RECURSIVE, +}; +/** + * mutex_trylock_recursive - trylock variant that allows recursive locking + * @lock: mutex to be locked + * + * This function should not be used, _ever_. It is purely for hysterical GEM + * raisins, and once those are gone this will be removed. + * + * Returns: + * MUTEX_TRYLOCK_FAILED - trylock failed, + * MUTEX_TRYLOCK_SUCCESS - lock acquired, + * MUTEX_TRYLOCK_RECURSIVE - we already owned the lock. + */ +int __rt_mutex_owner_current(struct rt_mutex *lock); + +static inline /* __deprecated */ __must_check enum mutex_trylock_recursive_enum +mutex_trylock_recursive(struct mutex *lock) +{ + if (unlikely(__rt_mutex_owner_current(&lock->lock))) + return MUTEX_TRYLOCK_RECURSIVE; + + return mutex_trylock(lock); +} + +extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); + +#endif diff --git a/kernel/include/linux/netdevice.h b/kernel/include/linux/netdevice.h index 0f4009d..16606e1 100644 --- a/kernel/include/linux/netdevice.h +++ b/kernel/include/linux/netdevice.h @@ -431,7 +431,19 @@ typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb); void __napi_schedule(struct napi_struct *n); + +/* + * When PREEMPT_RT_FULL is defined, all device interrupt handlers + * run as threads, and they can also be preempted (without PREEMPT_RT + * interrupt threads can not be preempted). Which means that calling + * __napi_schedule_irqoff() from an interrupt handler can be preempted + * and can corrupt the napi->poll_list. + */ +#ifdef CONFIG_PREEMPT_RT_FULL +#define __napi_schedule_irqoff(n) __napi_schedule(n) +#else void __napi_schedule_irqoff(struct napi_struct *n); +#endif static inline bool napi_disable_pending(struct napi_struct *n) { @@ -596,7 +608,11 @@ * write-mostly part */ spinlock_t _xmit_lock ____cacheline_aligned_in_smp; +#ifdef CONFIG_PREEMPT_RT_FULL + struct task_struct *xmit_lock_owner; +#else int xmit_lock_owner; +#endif /* * Time (in jiffies) of last Tx */ @@ -3036,6 +3052,7 @@ unsigned int dropped; struct sk_buff_head input_pkt_queue; struct napi_struct backlog; + struct sk_buff_head tofree_queue; }; @@ -3054,14 +3071,38 @@ #endif } +#define XMIT_RECURSION_LIMIT 8 DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data); + +#ifdef CONFIG_PREEMPT_RT_FULL +static inline int dev_recursion_level(void) +{ + return current->xmit_recursion; +} + +static inline bool dev_xmit_recursion(void) +{ + return unlikely(current->xmit_recursion > + XMIT_RECURSION_LIMIT); +} + +static inline void dev_xmit_recursion_inc(void) +{ + current->xmit_recursion++; +} + +static inline void dev_xmit_recursion_dec(void) +{ + current->xmit_recursion--; +} + +#else static inline int dev_recursion_level(void) { return this_cpu_read(softnet_data.xmit.recursion); } -#define XMIT_RECURSION_LIMIT 8 static inline bool dev_xmit_recursion(void) { return unlikely(__this_cpu_read(softnet_data.xmit.recursion) > @@ -3077,6 +3118,7 @@ { __this_cpu_dec(softnet_data.xmit.recursion); } +#endif void __netif_schedule(struct Qdisc *q); void netif_schedule_queue(struct netdev_queue *txq); @@ -3885,11 +3927,50 @@ return (1U << debug_value) - 1; } +#ifdef CONFIG_PREEMPT_RT_FULL +static inline void netdev_queue_set_owner(struct netdev_queue *txq, int cpu) +{ + WRITE_ONCE(txq->xmit_lock_owner, current); +} + +static inline void netdev_queue_clear_owner(struct netdev_queue *txq) +{ + WRITE_ONCE(txq->xmit_lock_owner, NULL); +} + +static inline bool netdev_queue_has_owner(struct netdev_queue *txq) +{ + if (READ_ONCE(txq->xmit_lock_owner) != NULL) + return true; + return false; +} + +#else + +static inline void netdev_queue_set_owner(struct netdev_queue *txq, int cpu) +{ + /* Pairs with READ_ONCE() in __dev_queue_xmit() */ + WRITE_ONCE(txq->xmit_lock_owner, cpu); +} + +static inline void netdev_queue_clear_owner(struct netdev_queue *txq) +{ + /* Pairs with READ_ONCE() in __dev_queue_xmit() */ + WRITE_ONCE(txq->xmit_lock_owner, -1); +} + +static inline bool netdev_queue_has_owner(struct netdev_queue *txq) +{ + if (READ_ONCE(txq->xmit_lock_owner) != -1) + return true; + return false; +} +#endif + static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu) { spin_lock(&txq->_xmit_lock); - /* Pairs with READ_ONCE() in __dev_queue_xmit() */ - WRITE_ONCE(txq->xmit_lock_owner, cpu); + netdev_queue_set_owner(txq, cpu); } static inline bool __netif_tx_acquire(struct netdev_queue *txq) @@ -3906,8 +3987,7 @@ static inline void __netif_tx_lock_bh(struct netdev_queue *txq) { spin_lock_bh(&txq->_xmit_lock); - /* Pairs with READ_ONCE() in __dev_queue_xmit() */ - WRITE_ONCE(txq->xmit_lock_owner, smp_processor_id()); + netdev_queue_set_owner(txq, smp_processor_id()); } static inline bool __netif_tx_trylock(struct netdev_queue *txq) @@ -3915,29 +3995,26 @@ bool ok = spin_trylock(&txq->_xmit_lock); if (likely(ok)) { - /* Pairs with READ_ONCE() in __dev_queue_xmit() */ - WRITE_ONCE(txq->xmit_lock_owner, smp_processor_id()); + netdev_queue_set_owner(txq, smp_processor_id()); } return ok; } static inline void __netif_tx_unlock(struct netdev_queue *txq) { - /* Pairs with READ_ONCE() in __dev_queue_xmit() */ - WRITE_ONCE(txq->xmit_lock_owner, -1); + netdev_queue_clear_owner(txq); spin_unlock(&txq->_xmit_lock); } static inline void __netif_tx_unlock_bh(struct netdev_queue *txq) { - /* Pairs with READ_ONCE() in __dev_queue_xmit() */ - WRITE_ONCE(txq->xmit_lock_owner, -1); + netdev_queue_clear_owner(txq); spin_unlock_bh(&txq->_xmit_lock); } static inline void txq_trans_update(struct netdev_queue *txq) { - if (txq->xmit_lock_owner != -1) + if (netdev_queue_has_owner(txq)) txq->trans_start = jiffies; } diff --git a/kernel/include/linux/netfilter/x_tables.h b/kernel/include/linux/netfilter/x_tables.h index 0ade4d1..3e21ce6 100644 --- a/kernel/include/linux/netfilter/x_tables.h +++ b/kernel/include/linux/netfilter/x_tables.h @@ -6,6 +6,7 @@ #include <linux/netdevice.h> #include <linux/static_key.h> #include <linux/netfilter.h> +#include <linux/locallock.h> #include <uapi/linux/netfilter/x_tables.h> /* Test a struct->invflags and a boolean for inequality */ @@ -345,6 +346,8 @@ */ DECLARE_PER_CPU(seqcount_t, xt_recseq); +DECLARE_LOCAL_IRQ_LOCK(xt_write_lock); + /* xt_tee_enabled - true if x_tables needs to handle reentrancy * * Enabled if current ip(6)tables ruleset has at least one -j TEE rule. @@ -364,6 +367,9 @@ static inline unsigned int xt_write_recseq_begin(void) { unsigned int addend; + + /* RT protection */ + local_lock(xt_write_lock); /* * Low order bit of sequence is set if we already @@ -395,6 +401,7 @@ /* this is kind of a write_seqcount_end(), but addend is 0 or 1 */ smp_wmb(); __this_cpu_add(xt_recseq.sequence, addend); + local_unlock(xt_write_lock); } /* diff --git a/kernel/include/linux/nfs_fs.h b/kernel/include/linux/nfs_fs.h index 0ff7dd2..91e7bb5 100644 --- a/kernel/include/linux/nfs_fs.h +++ b/kernel/include/linux/nfs_fs.h @@ -164,7 +164,11 @@ /* Readers: in-flight sillydelete RPC calls */ /* Writers: rmdir */ +#ifdef CONFIG_PREEMPT_RT_BASE + struct semaphore rmdir_sem; +#else struct rw_semaphore rmdir_sem; +#endif struct mutex commit_mutex; #if IS_ENABLED(CONFIG_NFS_V4) diff --git a/kernel/include/linux/nfs_xdr.h b/kernel/include/linux/nfs_xdr.h index cab24a1..73b0d19 100644 --- a/kernel/include/linux/nfs_xdr.h +++ b/kernel/include/linux/nfs_xdr.h @@ -1549,7 +1549,7 @@ struct nfs_removeargs args; struct nfs_removeres res; struct dentry *dentry; - wait_queue_head_t wq; + struct swait_queue_head wq; struct rpc_cred *cred; struct nfs_fattr dir_attr; long timeout; diff --git a/kernel/include/linux/percpu-rwsem.h b/kernel/include/linux/percpu-rwsem.h index 79b99d6..fb44e23 100644 --- a/kernel/include/linux/percpu-rwsem.h +++ b/kernel/include/linux/percpu-rwsem.h @@ -29,7 +29,7 @@ extern int __percpu_down_read(struct percpu_rw_semaphore *, int); extern void __percpu_up_read(struct percpu_rw_semaphore *); -static inline void percpu_down_read_preempt_disable(struct percpu_rw_semaphore *sem) +static inline void percpu_down_read(struct percpu_rw_semaphore *sem) { might_sleep(); @@ -47,16 +47,10 @@ __this_cpu_inc(*sem->read_count); if (unlikely(!rcu_sync_is_idle(&sem->rss))) __percpu_down_read(sem, false); /* Unconditional memory barrier */ - barrier(); /* - * The barrier() prevents the compiler from + * The preempt_enable() prevents the compiler from * bleeding the critical section out. */ -} - -static inline void percpu_down_read(struct percpu_rw_semaphore *sem) -{ - percpu_down_read_preempt_disable(sem); preempt_enable(); } @@ -83,13 +77,9 @@ return ret; } -static inline void percpu_up_read_preempt_enable(struct percpu_rw_semaphore *sem) +static inline void percpu_up_read(struct percpu_rw_semaphore *sem) { - /* - * The barrier() prevents the compiler from - * bleeding the critical section out. - */ - barrier(); + preempt_disable(); /* * Same as in percpu_down_read(). */ @@ -100,12 +90,6 @@ preempt_enable(); rwsem_release(&sem->rw_sem.dep_map, 1, _RET_IP_); -} - -static inline void percpu_up_read(struct percpu_rw_semaphore *sem) -{ - preempt_disable(); - percpu_up_read_preempt_enable(sem); } extern void percpu_down_write(struct percpu_rw_semaphore *); diff --git a/kernel/include/linux/percpu.h b/kernel/include/linux/percpu.h index 70b7123..24421bf 100644 --- a/kernel/include/linux/percpu.h +++ b/kernel/include/linux/percpu.h @@ -19,6 +19,35 @@ #define PERCPU_MODULE_RESERVE 0 #endif +#ifdef CONFIG_PREEMPT_RT_FULL + +#define get_local_var(var) (*({ \ + migrate_disable(); \ + this_cpu_ptr(&var); })) + +#define put_local_var(var) do { \ + (void)&(var); \ + migrate_enable(); \ +} while (0) + +# define get_local_ptr(var) ({ \ + migrate_disable(); \ + this_cpu_ptr(var); }) + +# define put_local_ptr(var) do { \ + (void)(var); \ + migrate_enable(); \ +} while (0) + +#else + +#define get_local_var(var) get_cpu_var(var) +#define put_local_var(var) put_cpu_var(var) +#define get_local_ptr(var) get_cpu_ptr(var) +#define put_local_ptr(var) put_cpu_ptr(var) + +#endif + /* minimum unit size, also is the maximum supported allocation size */ #define PCPU_MIN_UNIT_SIZE PFN_ALIGN(32 << 10) diff --git a/kernel/include/linux/pid.h b/kernel/include/linux/pid.h index a82d2f7..a85b65f 100644 --- a/kernel/include/linux/pid.h +++ b/kernel/include/linux/pid.h @@ -4,6 +4,7 @@ #include <linux/rculist.h> #include <linux/wait.h> +#include <linux/atomic.h> enum pid_type { diff --git a/kernel/include/linux/platform_device.h b/kernel/include/linux/platform_device.h index 67d1bca..1de7ea6 100644 --- a/kernel/include/linux/platform_device.h +++ b/kernel/include/linux/platform_device.h @@ -234,10 +234,6 @@ module_driver(__platform_driver, platform_driver_register, \ platform_driver_unregister) -#define module_platform_driver1(__platform_driver) \ - module_driver1(__platform_driver, platform_driver_register, \ - platform_driver_unregister) - /* builtin_platform_driver() - Helper macro for builtin drivers that * don't do anything special in driver init. This eliminates some * boilerplate. Each driver may only use this macro once, and diff --git a/kernel/include/linux/posix-timers.h b/kernel/include/linux/posix-timers.h index ee7e987..3e6c91b 100644 --- a/kernel/include/linux/posix-timers.h +++ b/kernel/include/linux/posix-timers.h @@ -15,6 +15,7 @@ u64 expires, incr; struct task_struct *task; int firing; + int firing_cpu; }; /* @@ -114,8 +115,8 @@ struct { struct alarm alarmtimer; } alarm; - struct rcu_head rcu; } it; + struct rcu_head rcu; }; void run_posix_cpu_timers(struct task_struct *task); diff --git a/kernel/include/linux/preempt.h b/kernel/include/linux/preempt.h index c01813c..9c74a01 100644 --- a/kernel/include/linux/preempt.h +++ b/kernel/include/linux/preempt.h @@ -51,7 +51,11 @@ #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT) #define NMI_OFFSET (1UL << NMI_SHIFT) -#define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) +#ifndef CONFIG_PREEMPT_RT_FULL +# define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) +#else +# define SOFTIRQ_DISABLE_OFFSET (0) +#endif /* We use the MSB mostly because its available */ #define PREEMPT_NEED_RESCHED 0x80000000 @@ -81,9 +85,15 @@ #include <asm/preempt.h> #define hardirq_count() (preempt_count() & HARDIRQ_MASK) -#define softirq_count() (preempt_count() & SOFTIRQ_MASK) #define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \ | NMI_MASK)) +#ifndef CONFIG_PREEMPT_RT_FULL +# define softirq_count() (preempt_count() & SOFTIRQ_MASK) +# define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) +#else +# define softirq_count() ((unsigned long)current->softirq_nestcnt) +extern int in_serving_softirq(void); +#endif /* * Are we doing bottom half or hardware interrupt processing? @@ -101,7 +111,6 @@ #define in_irq() (hardirq_count()) #define in_softirq() (softirq_count()) #define in_interrupt() (irq_count()) -#define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) #define in_nmi() (preempt_count() & NMI_MASK) #define in_task() (!(preempt_count() & \ (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET))) @@ -118,7 +127,11 @@ /* * The preempt_count offset after spin_lock() */ +#if !defined(CONFIG_PREEMPT_RT_FULL) #define PREEMPT_LOCK_OFFSET PREEMPT_DISABLE_OFFSET +#else +#define PREEMPT_LOCK_OFFSET 0 +#endif /* * The preempt_count offset needed for things like: @@ -167,11 +180,31 @@ #define preempt_count_inc() preempt_count_add(1) #define preempt_count_dec() preempt_count_sub(1) +#ifdef CONFIG_PREEMPT_LAZY +#define add_preempt_lazy_count(val) do { preempt_lazy_count() += (val); } while (0) +#define sub_preempt_lazy_count(val) do { preempt_lazy_count() -= (val); } while (0) +#define inc_preempt_lazy_count() add_preempt_lazy_count(1) +#define dec_preempt_lazy_count() sub_preempt_lazy_count(1) +#define preempt_lazy_count() (current_thread_info()->preempt_lazy_count) +#else +#define add_preempt_lazy_count(val) do { } while (0) +#define sub_preempt_lazy_count(val) do { } while (0) +#define inc_preempt_lazy_count() do { } while (0) +#define dec_preempt_lazy_count() do { } while (0) +#define preempt_lazy_count() (0) +#endif + #ifdef CONFIG_PREEMPT_COUNT #define preempt_disable() \ do { \ preempt_count_inc(); \ + barrier(); \ +} while (0) + +#define preempt_lazy_disable() \ +do { \ + inc_preempt_lazy_count(); \ barrier(); \ } while (0) @@ -181,9 +214,40 @@ preempt_count_dec(); \ } while (0) -#define preempt_enable_no_resched() sched_preempt_enable_no_resched() +#ifdef CONFIG_PREEMPT_RT_BASE +# define preempt_enable_no_resched() sched_preempt_enable_no_resched() +# define preempt_check_resched_rt() preempt_check_resched() +#else +# define preempt_enable_no_resched() preempt_enable() +# define preempt_check_resched_rt() barrier(); +#endif #define preemptible() (preempt_count() == 0 && !irqs_disabled()) + +#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + +extern void migrate_disable(void); +extern void migrate_enable(void); + +int __migrate_disabled(struct task_struct *p); + +#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + +extern void migrate_disable(void); +extern void migrate_enable(void); +static inline int __migrate_disabled(struct task_struct *p) +{ + return 0; +} + +#else +#define migrate_disable() preempt_disable() +#define migrate_enable() preempt_enable() +static inline int __migrate_disabled(struct task_struct *p) +{ + return 0; +} +#endif #ifdef CONFIG_PREEMPT #define preempt_enable() \ @@ -206,11 +270,24 @@ __preempt_schedule(); \ } while (0) +#define preempt_lazy_enable() \ +do { \ + dec_preempt_lazy_count(); \ + barrier(); \ + preempt_check_resched(); \ +} while (0) + #else /* !CONFIG_PREEMPT */ #define preempt_enable() \ do { \ barrier(); \ preempt_count_dec(); \ +} while (0) + +#define preempt_lazy_enable() \ +do { \ + dec_preempt_lazy_count(); \ + barrier(); \ } while (0) #define preempt_enable_notrace() \ @@ -251,8 +328,16 @@ #define preempt_disable_notrace() barrier() #define preempt_enable_no_resched_notrace() barrier() #define preempt_enable_notrace() barrier() +#define preempt_check_resched_rt() barrier() #define preemptible() 0 +#define migrate_disable() barrier() +#define migrate_enable() barrier() + +static inline int __migrate_disabled(struct task_struct *p) +{ + return 0; +} #endif /* CONFIG_PREEMPT_COUNT */ #ifdef MODULE @@ -271,10 +356,22 @@ } while (0) #define preempt_fold_need_resched() \ do { \ - if (tif_need_resched()) \ + if (tif_need_resched_now()) \ set_preempt_need_resched(); \ } while (0) +#ifdef CONFIG_PREEMPT_RT_FULL +# define preempt_disable_rt() preempt_disable() +# define preempt_enable_rt() preempt_enable() +# define preempt_disable_nort() barrier() +# define preempt_enable_nort() barrier() +#else +# define preempt_disable_rt() barrier() +# define preempt_enable_rt() barrier() +# define preempt_disable_nort() preempt_disable() +# define preempt_enable_nort() preempt_enable() +#endif + #ifdef CONFIG_PREEMPT_NOTIFIERS struct preempt_notifier; diff --git a/kernel/include/linux/printk.h b/kernel/include/linux/printk.h index d3195ea..fdc167b 100644 --- a/kernel/include/linux/printk.h +++ b/kernel/include/linux/printk.h @@ -141,9 +141,11 @@ #ifdef CONFIG_EARLY_PRINTK extern asmlinkage __printf(1, 2) void early_printk(const char *fmt, ...); +extern void printk_kill(void); #else static inline __printf(1, 2) __cold void early_printk(const char *s, ...) { } +static inline void printk_kill(void) { } #endif #ifdef CONFIG_PRINTK_NMI diff --git a/kernel/include/linux/pstore.h b/kernel/include/linux/pstore.h index d3d5214..09b6d65 100644 --- a/kernel/include/linux/pstore.h +++ b/kernel/include/linux/pstore.h @@ -44,8 +44,8 @@ PSTORE_TYPE_PPC_COMMON = 6, PSTORE_TYPE_PMSG = 7, PSTORE_TYPE_PPC_OPAL = 8, -#ifdef CONFIG_PSTORE_MCU_LOG - PSTORE_TYPE_MCU_LOG = 9, +#ifdef CONFIG_PSTORE_BOOT_LOG + PSTORE_TYPE_BOOT_LOG = 9, #endif PSTORE_TYPE_UNKNOWN = 255 }; @@ -199,8 +199,8 @@ #define PSTORE_FLAGS_CONSOLE (1 << 1) #define PSTORE_FLAGS_FTRACE (1 << 2) #define PSTORE_FLAGS_PMSG (1 << 3) -#ifdef CONFIG_PSTORE_MCU_LOG -#define PSTORE_FLAGS_MCU_LOG (1 << 4) +#ifdef CONFIG_PSTORE_BOOT_LOG +#define PSTORE_FLAGS_BOOT_LOG (1 << 4) #endif extern int pstore_register(struct pstore_info *); extern void pstore_unregister(struct pstore_info *); diff --git a/kernel/include/linux/pstore_ram.h b/kernel/include/linux/pstore_ram.h index 69e580b..82ffcac 100644 --- a/kernel/include/linux/pstore_ram.h +++ b/kernel/include/linux/pstore_ram.h @@ -76,8 +76,8 @@ struct persistent_ram_zone *cprz; /* Console zone */ struct persistent_ram_zone **fprzs; /* Ftrace zones */ struct persistent_ram_zone *mprz; /* PMSG zone */ -#ifdef CONFIG_PSTORE_MCU_LOG - struct persistent_ram_zone **mcu_przs; /* MCU log zones */ +#ifdef CONFIG_PSTORE_BOOT_LOG + struct persistent_ram_zone **boot_przs; /* BOOT log zones */ #endif phys_addr_t phys_addr; unsigned long size; @@ -86,8 +86,8 @@ size_t console_size; size_t ftrace_size; size_t pmsg_size; -#ifdef CONFIG_PSTORE_MCU_LOG - size_t mcu_log_size; +#ifdef CONFIG_PSTORE_BOOT_LOG + size_t boot_log_size; #endif int dump_oops; u32 flags; @@ -100,9 +100,9 @@ unsigned int max_ftrace_cnt; unsigned int ftrace_read_cnt; unsigned int pmsg_read_cnt; -#ifdef CONFIG_PSTORE_MCU_LOG - unsigned int mcu_log_read_cnt; - unsigned int max_mcu_log_cnt; +#ifdef CONFIG_PSTORE_BOOT_LOG + unsigned int boot_log_read_cnt; + unsigned int max_boot_log_cnt; #endif struct pstore_info pstore; }; @@ -141,9 +141,9 @@ unsigned long console_size; unsigned long ftrace_size; unsigned long pmsg_size; -#ifdef CONFIG_PSTORE_MCU_LOG - unsigned long mcu_log_size; - unsigned long max_mcu_log_cnt; +#ifdef CONFIG_PSTORE_BOOT_LOG + unsigned long boot_log_size; + unsigned long max_boot_log_cnt; #endif int dump_oops; u32 flags; diff --git a/kernel/include/linux/radix-tree.h b/kernel/include/linux/radix-tree.h index 34149e8..affb0fc 100644 --- a/kernel/include/linux/radix-tree.h +++ b/kernel/include/linux/radix-tree.h @@ -330,6 +330,8 @@ int radix_tree_preload(gfp_t gfp_mask); int radix_tree_maybe_preload(gfp_t gfp_mask); int radix_tree_maybe_preload_order(gfp_t gfp_mask, int order); +void radix_tree_preload_end(void); + void radix_tree_init(void); void *radix_tree_tag_set(struct radix_tree_root *, unsigned long index, unsigned int tag); @@ -348,11 +350,6 @@ void __rcu ***results, unsigned long first_index, unsigned int max_items, unsigned int tag); int radix_tree_tagged(const struct radix_tree_root *, unsigned int tag); - -static inline void radix_tree_preload_end(void) -{ - preempt_enable(); -} int radix_tree_split_preload(unsigned old_order, unsigned new_order, gfp_t); int radix_tree_split(struct radix_tree_root *, unsigned long index, diff --git a/kernel/include/linux/random.h b/kernel/include/linux/random.h index 04e4ee9..3728a12 100644 --- a/kernel/include/linux/random.h +++ b/kernel/include/linux/random.h @@ -33,7 +33,7 @@ extern void add_input_randomness(unsigned int type, unsigned int code, unsigned int value) __latent_entropy; -extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy; +extern void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) __latent_entropy; extern void get_random_bytes(void *buf, int nbytes); extern int wait_for_random_bytes(void); diff --git a/kernel/include/linux/rbtree.h b/kernel/include/linux/rbtree.h index fcbeed4..2aa2aec 100644 --- a/kernel/include/linux/rbtree.h +++ b/kernel/include/linux/rbtree.h @@ -31,7 +31,7 @@ #include <linux/kernel.h> #include <linux/stddef.h> -#include <linux/rcupdate.h> +#include <linux/rcu_assign_pointer.h> struct rb_node { unsigned long __rb_parent_color; diff --git a/kernel/include/linux/rcu_assign_pointer.h b/kernel/include/linux/rcu_assign_pointer.h new file mode 100644 index 0000000..7066962 --- /dev/null +++ b/kernel/include/linux/rcu_assign_pointer.h @@ -0,0 +1,54 @@ +#ifndef __LINUX_RCU_ASSIGN_POINTER_H__ +#define __LINUX_RCU_ASSIGN_POINTER_H__ +#include <linux/compiler.h> +#include <asm/barrier.h> + +/** + * RCU_INITIALIZER() - statically initialize an RCU-protected global variable + * @v: The value to statically initialize with. + */ +#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v) + +/** + * rcu_assign_pointer() - assign to RCU-protected pointer + * @p: pointer to assign to + * @v: value to assign (publish) + * + * Assigns the specified value to the specified RCU-protected + * pointer, ensuring that any concurrent RCU readers will see + * any prior initialization. + * + * Inserts memory barriers on architectures that require them + * (which is most of them), and also prevents the compiler from + * reordering the code that initializes the structure after the pointer + * assignment. More importantly, this call documents which pointers + * will be dereferenced by RCU read-side code. + * + * In some special cases, you may use RCU_INIT_POINTER() instead + * of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due + * to the fact that it does not constrain either the CPU or the compiler. + * That said, using RCU_INIT_POINTER() when you should have used + * rcu_assign_pointer() is a very bad thing that results in + * impossible-to-diagnose memory corruption. So please be careful. + * See the RCU_INIT_POINTER() comment header for details. + * + * Note that rcu_assign_pointer() evaluates each of its arguments only + * once, appearances notwithstanding. One of the "extra" evaluations + * is in typeof() and the other visible only to sparse (__CHECKER__), + * neither of which actually execute the argument. As with most cpp + * macros, this execute-arguments-only-once property is important, so + * please be careful when making changes to rcu_assign_pointer() and the + * other macros that it invokes. + */ +#define rcu_assign_pointer(p, v) \ +({ \ + uintptr_t _r_a_p__v = (uintptr_t)(v); \ + \ + if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL) \ + WRITE_ONCE((p), (typeof(p))(_r_a_p__v)); \ + else \ + smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \ + _r_a_p__v; \ +}) + +#endif diff --git a/kernel/include/linux/rcupdate.h b/kernel/include/linux/rcupdate.h index 68cbe11..08d64e5 100644 --- a/kernel/include/linux/rcupdate.h +++ b/kernel/include/linux/rcupdate.h @@ -42,6 +42,7 @@ #include <linux/lockdep.h> #include <asm/processor.h> #include <linux/cpumask.h> +#include <linux/rcu_assign_pointer.h> #define ULONG_CMP_GE(a, b) (ULONG_MAX / 2 >= (a) - (b)) #define ULONG_CMP_LT(a, b) (ULONG_MAX / 2 < (a) - (b)) @@ -55,7 +56,11 @@ #define call_rcu call_rcu_sched #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ +#ifdef CONFIG_PREEMPT_RT_FULL +#define call_rcu_bh call_rcu +#else void call_rcu_bh(struct rcu_head *head, rcu_callback_t func); +#endif void call_rcu_sched(struct rcu_head *head, rcu_callback_t func); void synchronize_sched(void); void rcu_barrier_tasks(void); @@ -73,6 +78,11 @@ * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. */ #define rcu_preempt_depth() (current->rcu_read_lock_nesting) +#ifndef CONFIG_PREEMPT_RT_FULL +#define sched_rcu_preempt_depth() rcu_preempt_depth() +#else +static inline int sched_rcu_preempt_depth(void) { return 0; } +#endif #else /* #ifdef CONFIG_PREEMPT_RCU */ @@ -95,6 +105,8 @@ { return 0; } + +#define sched_rcu_preempt_depth() rcu_preempt_depth() #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ @@ -253,7 +265,14 @@ extern struct lockdep_map rcu_callback_map; int debug_lockdep_rcu_enabled(void); int rcu_read_lock_held(void); +#ifdef CONFIG_PREEMPT_RT_FULL +static inline int rcu_read_lock_bh_held(void) +{ + return rcu_read_lock_held(); +} +#else int rcu_read_lock_bh_held(void); +#endif int rcu_read_lock_sched_held(void); #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ @@ -360,54 +379,6 @@ /* Dependency order vs. p above. */ \ typeof(p) ________p1 = READ_ONCE(p); \ ((typeof(*p) __force __kernel *)(________p1)); \ -}) - -/** - * RCU_INITIALIZER() - statically initialize an RCU-protected global variable - * @v: The value to statically initialize with. - */ -#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v) - -/** - * rcu_assign_pointer() - assign to RCU-protected pointer - * @p: pointer to assign to - * @v: value to assign (publish) - * - * Assigns the specified value to the specified RCU-protected - * pointer, ensuring that any concurrent RCU readers will see - * any prior initialization. - * - * Inserts memory barriers on architectures that require them - * (which is most of them), and also prevents the compiler from - * reordering the code that initializes the structure after the pointer - * assignment. More importantly, this call documents which pointers - * will be dereferenced by RCU read-side code. - * - * In some special cases, you may use RCU_INIT_POINTER() instead - * of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due - * to the fact that it does not constrain either the CPU or the compiler. - * That said, using RCU_INIT_POINTER() when you should have used - * rcu_assign_pointer() is a very bad thing that results in - * impossible-to-diagnose memory corruption. So please be careful. - * See the RCU_INIT_POINTER() comment header for details. - * - * Note that rcu_assign_pointer() evaluates each of its arguments only - * once, appearances notwithstanding. One of the "extra" evaluations - * is in typeof() and the other visible only to sparse (__CHECKER__), - * neither of which actually execute the argument. As with most cpp - * macros, this execute-arguments-only-once property is important, so - * please be careful when making changes to rcu_assign_pointer() and the - * other macros that it invokes. - */ -#define rcu_assign_pointer(p, v) \ -({ \ - uintptr_t _r_a_p__v = (uintptr_t)(v); \ - \ - if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL) \ - WRITE_ONCE((p), (typeof(p))(_r_a_p__v)); \ - else \ - smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \ - _r_a_p__v; \ }) /** @@ -701,10 +672,14 @@ static inline void rcu_read_lock_bh(void) { local_bh_disable(); +#ifdef CONFIG_PREEMPT_RT_FULL + rcu_read_lock(); +#else __acquire(RCU_BH); rcu_lock_acquire(&rcu_bh_lock_map); RCU_LOCKDEP_WARN(!rcu_is_watching(), "rcu_read_lock_bh() used illegally while idle"); +#endif } /* @@ -714,10 +689,14 @@ */ static inline void rcu_read_unlock_bh(void) { +#ifdef CONFIG_PREEMPT_RT_FULL + rcu_read_unlock(); +#else RCU_LOCKDEP_WARN(!rcu_is_watching(), "rcu_read_unlock_bh() used illegally while idle"); rcu_lock_release(&rcu_bh_lock_map); __release(RCU_BH); +#endif local_bh_enable(); } diff --git a/kernel/include/linux/rcutree.h b/kernel/include/linux/rcutree.h index 9146558..462ce06 100644 --- a/kernel/include/linux/rcutree.h +++ b/kernel/include/linux/rcutree.h @@ -44,7 +44,11 @@ rcu_note_context_switch(false); } +#ifdef CONFIG_PREEMPT_RT_FULL +# define synchronize_rcu_bh synchronize_rcu +#else void synchronize_rcu_bh(void); +#endif void synchronize_sched_expedited(void); void synchronize_rcu_expedited(void); @@ -72,7 +76,11 @@ } void rcu_barrier(void); +#ifdef CONFIG_PREEMPT_RT_FULL +# define rcu_barrier_bh rcu_barrier +#else void rcu_barrier_bh(void); +#endif void rcu_barrier_sched(void); bool rcu_eqs_special_set(int cpu); unsigned long get_state_synchronize_rcu(void); diff --git a/kernel/include/linux/regulator/consumer.h b/kernel/include/linux/regulator/consumer.h index b07601f..54fa3ee 100644 --- a/kernel/include/linux/regulator/consumer.h +++ b/kernel/include/linux/regulator/consumer.h @@ -488,6 +488,11 @@ return 0; } +static inline unsigned int regulator_get_linear_step(struct regulator *regulator) +{ + return 0; +} + static inline int regulator_set_current_limit(struct regulator *regulator, int min_uA, int max_uA) { diff --git a/kernel/include/linux/reservation.h b/kernel/include/linux/reservation.h index 02166e8..0b31df1 100644 --- a/kernel/include/linux/reservation.h +++ b/kernel/include/linux/reservation.h @@ -72,7 +72,7 @@ */ struct reservation_object { struct ww_mutex lock; - seqcount_t seq; + seqlock_t seq; struct dma_fence __rcu *fence_excl; struct reservation_object_list __rcu *fence; @@ -92,7 +92,7 @@ { ww_mutex_init(&obj->lock, &reservation_ww_class); - __seqcount_init(&obj->seq, reservation_seqcount_string, &reservation_seqcount_class); + seqlock_init(&obj->seq); RCU_INIT_POINTER(obj->fence, NULL); RCU_INIT_POINTER(obj->fence_excl, NULL); obj->staged = NULL; diff --git a/kernel/include/linux/rockchip/cpu.h b/kernel/include/linux/rockchip/cpu.h index eef266c..feac680 100644 --- a/kernel/include/linux/rockchip/cpu.h +++ b/kernel/include/linux/rockchip/cpu.h @@ -24,6 +24,7 @@ #define ROCKCHIP_CPU_RK312X 0x31260000 #define ROCKCHIP_CPU_RK3288 0x32880000 #define ROCKCHIP_CPU_RK3308 0x33080000 +#define ROCKCHIP_CPU_RK3528 0x35280000 #define ROCKCHIP_CPU_RK3566 0x35660000 #define ROCKCHIP_CPU_RK3568 0x35680000 @@ -153,6 +154,17 @@ static inline bool cpu_is_rk3308(void) { return false; } #endif +#if defined(CONFIG_CPU_RK3528) +static inline bool cpu_is_rk3528(void) +{ + if (rockchip_soc_id) + return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3528; + return of_machine_is_compatible("rockchip,rk3528"); +} +#else +static inline bool cpu_is_rk3528(void) { return false; } +#endif + #if defined(CONFIG_CPU_RK3568) static inline bool cpu_is_rk3566(void) { @@ -185,6 +197,7 @@ #define ROCKCHIP_SOC_RK3288W (ROCKCHIP_CPU_RK3288 | 0x01) #define ROCKCHIP_SOC_RK3308 (ROCKCHIP_CPU_RK3308 | 0x00) #define ROCKCHIP_SOC_RK3308B (ROCKCHIP_CPU_RK3308 | 0x01) +#define ROCKCHIP_SOC_RK3528 (ROCKCHIP_CPU_RK3528 | 0x00) #define ROCKCHIP_SOC_RK3566 (ROCKCHIP_CPU_RK3566 | 0x00) #define ROCKCHIP_SOC_RK3568 (ROCKCHIP_CPU_RK3568 | 0x00) @@ -208,6 +221,7 @@ ROCKCHIP_SOC(rk3288w, RK3288W) ROCKCHIP_SOC(rk3308, RK3308) ROCKCHIP_SOC(rk3308b, RK3308B) +ROCKCHIP_SOC(rk3528, RK3528) ROCKCHIP_SOC(rk3566, RK3566) ROCKCHIP_SOC(rk3568, RK3568) diff --git a/kernel/include/linux/rockchip/rockchip_sip.h b/kernel/include/linux/rockchip/rockchip_sip.h index 960db55..6682ffb 100644 --- a/kernel/include/linux/rockchip/rockchip_sip.h +++ b/kernel/include/linux/rockchip/rockchip_sip.h @@ -153,6 +153,9 @@ SHARE_PAGE_TYPE_MAX, } share_page_type_t; +struct pt_regs; +typedef void (*sip_fiq_debugger_uart_irq_tf_cb_t)(struct pt_regs *_pt_regs, unsigned long cpu); + /* * Rules: struct arm_smccc_res contains result and data, details: * @@ -184,7 +187,7 @@ /***************************fiq debugger **************************************/ void sip_fiq_debugger_enable_fiq(bool enable, uint32_t tgt_cpu); void sip_fiq_debugger_enable_debug(bool enable); -int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, void *callback_fn); +int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, sip_fiq_debugger_uart_irq_tf_cb_t callback_fn); int sip_fiq_debugger_set_print_port(u32 port_phyaddr, u32 baudrate); int sip_fiq_debugger_request_share_memory(void); int sip_fiq_debugger_get_target_cpu(void); @@ -283,7 +286,7 @@ static inline void sip_fiq_debugger_enable_debug(bool enable) { return; } static inline int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, - void *callback_fn) + sip_fiq_debugger_uart_irq_tf_cb_t callback_fn) { return 0; } diff --git a/kernel/include/linux/rtmutex.h b/kernel/include/linux/rtmutex.h index 6fd615a..138bd1e 100644 --- a/kernel/include/linux/rtmutex.h +++ b/kernel/include/linux/rtmutex.h @@ -14,10 +14,14 @@ #define __LINUX_RT_MUTEX_H #include <linux/linkage.h> +#include <linux/spinlock_types_raw.h> #include <linux/rbtree.h> -#include <linux/spinlock_types.h> extern int max_lock_depth; /* for sysctl */ + +#ifdef CONFIG_DEBUG_MUTEXES +#include <linux/debug_locks.h> +#endif /** * The rt_mutex structure @@ -31,8 +35,8 @@ raw_spinlock_t wait_lock; struct rb_root_cached waiters; struct task_struct *owner; -#ifdef CONFIG_DEBUG_RT_MUTEXES int save_state; +#ifdef CONFIG_DEBUG_RT_MUTEXES const char *name, *file; int line; void *magic; @@ -82,15 +86,22 @@ #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) #endif -#define __RT_MUTEX_INITIALIZER(mutexname) \ - { .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ +#define __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ + .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ , .waiters = RB_ROOT_CACHED \ , .owner = NULL \ __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ - __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)} + __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) + +#define __RT_MUTEX_INITIALIZER(mutexname) \ + { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) } #define DEFINE_RT_MUTEX(mutexname) \ struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname) + +#define __RT_MUTEX_INITIALIZER_SAVE_STATE(mutexname) \ + { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ + , .save_state = 1 } /** * rt_mutex_is_locked - is the mutex locked @@ -115,6 +126,7 @@ #endif extern int rt_mutex_lock_interruptible(struct rt_mutex *lock); +extern int rt_mutex_lock_killable(struct rt_mutex *lock); extern int rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout); diff --git a/kernel/include/linux/rwlock_rt.h b/kernel/include/linux/rwlock_rt.h new file mode 100644 index 0000000..a9c4c2a --- /dev/null +++ b/kernel/include/linux/rwlock_rt.h @@ -0,0 +1,119 @@ +#ifndef __LINUX_RWLOCK_RT_H +#define __LINUX_RWLOCK_RT_H + +#ifndef __LINUX_SPINLOCK_H +#error Do not include directly. Use spinlock.h +#endif + +extern void __lockfunc rt_write_lock(rwlock_t *rwlock); +extern void __lockfunc rt_read_lock(rwlock_t *rwlock); +extern int __lockfunc rt_write_trylock(rwlock_t *rwlock); +extern int __lockfunc rt_read_trylock(rwlock_t *rwlock); +extern void __lockfunc rt_write_unlock(rwlock_t *rwlock); +extern void __lockfunc rt_read_unlock(rwlock_t *rwlock); +extern int __lockfunc rt_read_can_lock(rwlock_t *rwlock); +extern int __lockfunc rt_write_can_lock(rwlock_t *rwlock); +extern void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key); + +#define read_can_lock(rwlock) rt_read_can_lock(rwlock) +#define write_can_lock(rwlock) rt_write_can_lock(rwlock) + +#define read_trylock(lock) __cond_lock(lock, rt_read_trylock(lock)) +#define write_trylock(lock) __cond_lock(lock, rt_write_trylock(lock)) + +static inline int __write_trylock_rt_irqsave(rwlock_t *lock, unsigned long *flags) +{ + /* XXX ARCH_IRQ_ENABLED */ + *flags = 0; + return rt_write_trylock(lock); +} + +#define write_trylock_irqsave(lock, flags) \ + __cond_lock(lock, __write_trylock_rt_irqsave(lock, &(flags))) + +#define read_lock_irqsave(lock, flags) \ + do { \ + typecheck(unsigned long, flags); \ + rt_read_lock(lock); \ + flags = 0; \ + } while (0) + +#define write_lock_irqsave(lock, flags) \ + do { \ + typecheck(unsigned long, flags); \ + rt_write_lock(lock); \ + flags = 0; \ + } while (0) + +#define read_lock(lock) rt_read_lock(lock) + +#define read_lock_bh(lock) \ + do { \ + local_bh_disable(); \ + rt_read_lock(lock); \ + } while (0) + +#define read_lock_irq(lock) read_lock(lock) + +#define write_lock(lock) rt_write_lock(lock) + +#define write_lock_bh(lock) \ + do { \ + local_bh_disable(); \ + rt_write_lock(lock); \ + } while (0) + +#define write_lock_irq(lock) write_lock(lock) + +#define read_unlock(lock) rt_read_unlock(lock) + +#define read_unlock_bh(lock) \ + do { \ + rt_read_unlock(lock); \ + local_bh_enable(); \ + } while (0) + +#define read_unlock_irq(lock) read_unlock(lock) + +#define write_unlock(lock) rt_write_unlock(lock) + +#define write_unlock_bh(lock) \ + do { \ + rt_write_unlock(lock); \ + local_bh_enable(); \ + } while (0) + +#define write_unlock_irq(lock) write_unlock(lock) + +#define read_unlock_irqrestore(lock, flags) \ + do { \ + typecheck(unsigned long, flags); \ + (void) flags; \ + rt_read_unlock(lock); \ + } while (0) + +#define write_unlock_irqrestore(lock, flags) \ + do { \ + typecheck(unsigned long, flags); \ + (void) flags; \ + rt_write_unlock(lock); \ + } while (0) + +#define rwlock_init(rwl) \ +do { \ + static struct lock_class_key __key; \ + \ + __rt_rwlock_init(rwl, #rwl, &__key); \ +} while (0) + +/* + * Internal functions made global for CPU pinning + */ +void __read_rt_lock(struct rt_rw_lock *lock); +int __read_rt_trylock(struct rt_rw_lock *lock); +void __write_rt_lock(struct rt_rw_lock *lock); +int __write_rt_trylock(struct rt_rw_lock *lock); +void __read_rt_unlock(struct rt_rw_lock *lock); +void __write_rt_unlock(struct rt_rw_lock *lock); + +#endif diff --git a/kernel/include/linux/rwlock_types.h b/kernel/include/linux/rwlock_types.h index 857a72c..c21683f 100644 --- a/kernel/include/linux/rwlock_types.h +++ b/kernel/include/linux/rwlock_types.h @@ -1,6 +1,10 @@ #ifndef __LINUX_RWLOCK_TYPES_H #define __LINUX_RWLOCK_TYPES_H +#if !defined(__LINUX_SPINLOCK_TYPES_H) +# error "Do not include directly, include spinlock_types.h" +#endif + /* * include/linux/rwlock_types.h - generic rwlock type definitions * and initializers diff --git a/kernel/include/linux/rwlock_types_rt.h b/kernel/include/linux/rwlock_types_rt.h new file mode 100644 index 0000000..546a1f8 --- /dev/null +++ b/kernel/include/linux/rwlock_types_rt.h @@ -0,0 +1,55 @@ +#ifndef __LINUX_RWLOCK_TYPES_RT_H +#define __LINUX_RWLOCK_TYPES_RT_H + +#ifndef __LINUX_SPINLOCK_TYPES_H +#error "Do not include directly. Include spinlock_types.h instead" +#endif + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } +#else +# define RW_DEP_MAP_INIT(lockname) +#endif + +typedef struct rt_rw_lock rwlock_t; + +#define __RW_LOCK_UNLOCKED(name) __RWLOCK_RT_INITIALIZER(name) + +#define DEFINE_RWLOCK(name) \ + rwlock_t name = __RW_LOCK_UNLOCKED(name) + +/* + * A reader biased implementation primarily for CPU pinning. + * + * Can be selected as general replacement for the single reader RT rwlock + * variant + */ +struct rt_rw_lock { + struct rt_mutex rtmutex; + atomic_t readers; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif +}; + +#define READER_BIAS (1U << 31) +#define WRITER_BIAS (1U << 30) + +#define __RWLOCK_RT_INITIALIZER(name) \ +{ \ + .readers = ATOMIC_INIT(READER_BIAS), \ + .rtmutex = __RT_MUTEX_INITIALIZER_SAVE_STATE(name.rtmutex), \ + RW_DEP_MAP_INIT(name) \ +} + +void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, + struct lock_class_key *key); + +#define rwlock_biased_rt_init(rwlock) \ + do { \ + static struct lock_class_key __key; \ + \ + __rwlock_biased_rt_init((rwlock), #rwlock, &__key); \ + } while (0) + +#endif diff --git a/kernel/include/linux/rwsem.h b/kernel/include/linux/rwsem.h index 93c2235..3122c77 100644 --- a/kernel/include/linux/rwsem.h +++ b/kernel/include/linux/rwsem.h @@ -20,6 +20,10 @@ #include <linux/osq_lock.h> #endif +#ifdef CONFIG_PREEMPT_RT_FULL +#include <linux/rwsem_rt.h> +#else /* PREEMPT_RT_FULL */ + struct rw_semaphore; #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK @@ -119,6 +123,13 @@ return !list_empty(&sem->wait_list); } +#endif /* !PREEMPT_RT_FULL */ + +/* + * The functions below are the same for all rwsem implementations including + * the RT specific variant. + */ + /* * lock for reading */ diff --git a/kernel/include/linux/rwsem_rt.h b/kernel/include/linux/rwsem_rt.h new file mode 100644 index 0000000..3fb092b --- /dev/null +++ b/kernel/include/linux/rwsem_rt.h @@ -0,0 +1,69 @@ +#ifndef _LINUX_RWSEM_RT_H +#define _LINUX_RWSEM_RT_H + +#ifndef _LINUX_RWSEM_H +#error "Include rwsem.h" +#endif + +#include <linux/rtmutex.h> +#include <linux/swait.h> + +#define READER_BIAS (1U << 31) +#define WRITER_BIAS (1U << 30) + +struct rw_semaphore { + atomic_t readers; + struct rt_mutex rtmutex; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif +}; + +#define __RWSEM_INITIALIZER(name) \ +{ \ + .readers = ATOMIC_INIT(READER_BIAS), \ + .rtmutex = __RT_MUTEX_INITIALIZER(name.rtmutex), \ + RW_DEP_MAP_INIT(name) \ +} + +#define DECLARE_RWSEM(lockname) \ + struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname) + +extern void __rwsem_init(struct rw_semaphore *rwsem, const char *name, + struct lock_class_key *key); + +#define __init_rwsem(sem, name, key) \ +do { \ + rt_mutex_init(&(sem)->rtmutex); \ + __rwsem_init((sem), (name), (key)); \ +} while (0) + +#define init_rwsem(sem) \ +do { \ + static struct lock_class_key __key; \ + \ + __init_rwsem((sem), #sem, &__key); \ +} while (0) + +static inline int rwsem_is_locked(struct rw_semaphore *sem) +{ + return atomic_read(&sem->readers) != READER_BIAS; +} + +static inline int rwsem_is_contended(struct rw_semaphore *sem) +{ + return atomic_read(&sem->readers) > 0; +} + +extern void __down_read(struct rw_semaphore *sem); +extern int __down_read_interruptible(struct rw_semaphore *sem); +extern int __down_read_killable(struct rw_semaphore *sem); +extern int __down_read_trylock(struct rw_semaphore *sem); +extern void __down_write(struct rw_semaphore *sem); +extern int __must_check __down_write_killable(struct rw_semaphore *sem); +extern int __down_write_trylock(struct rw_semaphore *sem); +extern void __up_read(struct rw_semaphore *sem); +extern void __up_write(struct rw_semaphore *sem); +extern void __downgrade_write(struct rw_semaphore *sem); + +#endif diff --git a/kernel/include/linux/sched.h b/kernel/include/linux/sched.h index 497cfcc..85ddd3b 100644 --- a/kernel/include/linux/sched.h +++ b/kernel/include/linux/sched.h @@ -30,6 +30,7 @@ #include <linux/task_io_accounting.h> #include <linux/rseq.h> #include <linux/android_kabi.h> +#include <asm/kmap_types.h> /* task_struct member predeclarations (sorted alphabetically): */ struct audit_context; @@ -103,11 +104,7 @@ __TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \ TASK_PARKED) -#define task_is_traced(task) ((task->state & __TASK_TRACED) != 0) - #define task_is_stopped(task) ((task->state & __TASK_STOPPED) != 0) - -#define task_is_stopped_or_traced(task) ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) #define task_contributes_to_load(task) ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ (task->flags & PF_FROZEN) == 0 && \ @@ -136,6 +133,9 @@ smp_store_mb(current->state, (state_value)); \ } while (0) +#define __set_current_state_no_track(state_value) \ + current->state = (state_value); + #define set_special_state(state_value) \ do { \ unsigned long flags; /* may shadow */ \ @@ -145,6 +145,7 @@ current->state = (state_value); \ raw_spin_unlock_irqrestore(¤t->pi_lock, flags); \ } while (0) + #else /* * set_current_state() includes a barrier so that the write of current->state @@ -189,6 +190,9 @@ #define set_current_state(state_value) \ smp_store_mb(current->state, (state_value)) +#define __set_current_state_no_track(state_value) \ + __set_current_state(state_value) + /* * set_special_state() should be used for those states when the blocking task * can not use the regular condition based wait-loop. In that case we must @@ -224,6 +228,8 @@ extern void io_schedule_finish(int token); extern long io_schedule_timeout(long timeout); extern void io_schedule(void); + +int cpu_nr_pinned(int cpu); /** * struct prev_cputime - snapshot of system and user cputime @@ -654,6 +660,8 @@ #endif /* -1 unrunnable, 0 runnable, >0 stopped: */ volatile long state; + /* saved state for "spinlock sleepers" */ + volatile long saved_state; /* * This begins the randomizable portion of task_struct. Only @@ -728,8 +736,24 @@ unsigned int policy; int nr_cpus_allowed; - cpumask_t cpus_allowed; +// cpumask_t cpus_allowed; cpumask_t cpus_requested; + const cpumask_t *cpus_ptr; + cpumask_t cpus_mask; +#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + int migrate_disable; + bool migrate_disable_scheduled; +# ifdef CONFIG_SCHED_DEBUG + int pinned_on_cpu; +# endif +#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) +# ifdef CONFIG_SCHED_DEBUG + int migrate_disable; +# endif +#endif +#ifdef CONFIG_PREEMPT_RT_FULL + int sleeping_lock; +#endif #ifdef CONFIG_PREEMPT_RCU int rcu_read_lock_nesting; @@ -901,6 +925,9 @@ #ifdef CONFIG_POSIX_TIMERS struct task_cputime cputime_expires; struct list_head cpu_timers[3]; +#ifdef CONFIG_PREEMPT_RT_BASE + struct task_struct *posix_timer_list; +#endif #endif /* Process credentials: */ @@ -945,11 +972,17 @@ /* Signal handlers: */ struct signal_struct *signal; struct sighand_struct *sighand; + struct sigqueue *sigqueue_cache; + sigset_t blocked; sigset_t real_blocked; /* Restored if set_restore_sigmask() was used: */ sigset_t saved_sigmask; struct sigpending pending; +#ifdef CONFIG_PREEMPT_RT_FULL + /* TODO: move me into ->restart_block ? */ + struct siginfo forced_info; +#endif unsigned long sas_ss_sp; size_t sas_ss_size; unsigned int sas_ss_flags; @@ -974,6 +1007,7 @@ raw_spinlock_t pi_lock; struct wake_q_node wake_q; + struct wake_q_node wake_q_sleeper; #ifdef CONFIG_RT_MUTEXES /* PI waiters blocked on a rt_mutex held by this task: */ @@ -1271,8 +1305,22 @@ unsigned int sequential_io; unsigned int sequential_io_avg; #endif +#ifdef CONFIG_PREEMPT_RT_BASE + struct rcu_head put_rcu; + int softirq_nestcnt; + unsigned int softirqs_raised; +#endif +#ifdef CONFIG_PREEMPT_RT_FULL +# if defined CONFIG_HIGHMEM || defined CONFIG_X86_32 + int kmap_idx; + pte_t kmap_pte[KM_TYPE_NR]; +# endif +#endif #ifdef CONFIG_DEBUG_ATOMIC_SLEEP unsigned long task_state_change; +#endif +#ifdef CONFIG_PREEMPT_RT_FULL + int xmit_recursion; #endif int pagefault_disabled; #ifdef CONFIG_MMU @@ -1490,6 +1538,7 @@ /* * Per process flags */ +#define PF_IN_SOFTIRQ 0x00000001 /* Task is serving softirq */ #define PF_IDLE 0x00000002 /* I am an IDLE thread */ #define PF_EXITING 0x00000004 /* Getting shut down */ #define PF_VCPU 0x00000010 /* I'm a virtual CPU */ @@ -1717,6 +1766,7 @@ extern int wake_up_state(struct task_struct *tsk, unsigned int state); extern int wake_up_process(struct task_struct *tsk); +extern int wake_up_lock_sleeper(struct task_struct *tsk); extern void wake_up_new_task(struct task_struct *tsk); #ifdef CONFIG_SMP @@ -1799,6 +1849,89 @@ return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); } +#ifdef CONFIG_PREEMPT_LAZY +static inline void set_tsk_need_resched_lazy(struct task_struct *tsk) +{ + set_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); +} + +static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) +{ + clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); +} + +static inline int test_tsk_need_resched_lazy(struct task_struct *tsk) +{ + return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY)); +} + +static inline int need_resched_lazy(void) +{ + return test_thread_flag(TIF_NEED_RESCHED_LAZY); +} + +static inline int need_resched_now(void) +{ + return test_thread_flag(TIF_NEED_RESCHED); +} + +#else +static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) { } +static inline int need_resched_lazy(void) { return 0; } + +static inline int need_resched_now(void) +{ + return test_thread_flag(TIF_NEED_RESCHED); +} + +#endif + + +static inline bool __task_is_stopped_or_traced(struct task_struct *task) +{ + if (task->state & (__TASK_STOPPED | __TASK_TRACED)) + return true; +#ifdef CONFIG_PREEMPT_RT_FULL + if (task->saved_state & (__TASK_STOPPED | __TASK_TRACED)) + return true; +#endif + return false; +} + +static inline bool task_is_stopped_or_traced(struct task_struct *task) +{ + bool traced_stopped; + +#ifdef CONFIG_PREEMPT_RT_FULL + unsigned long flags; + + raw_spin_lock_irqsave(&task->pi_lock, flags); + traced_stopped = __task_is_stopped_or_traced(task); + raw_spin_unlock_irqrestore(&task->pi_lock, flags); +#else + traced_stopped = __task_is_stopped_or_traced(task); +#endif + return traced_stopped; +} + +static inline bool task_is_traced(struct task_struct *task) +{ + bool traced = false; + + if (task->state & __TASK_TRACED) + return true; +#ifdef CONFIG_PREEMPT_RT_FULL + /* in case the task is sleeping on tasklist_lock */ + raw_spin_lock_irq(&task->pi_lock); + if (task->state & __TASK_TRACED) + traced = true; + else if (task->saved_state & __TASK_TRACED) + traced = true; + raw_spin_unlock_irq(&task->pi_lock); +#endif + return traced; +} + /* * cond_resched() and cond_resched_lock(): latency reduction via * explicit rescheduling in places that are safe. The return @@ -1850,6 +1983,23 @@ { return unlikely(tif_need_resched()); } + +#ifdef CONFIG_PREEMPT_RT_FULL +static inline void sleeping_lock_inc(void) +{ + current->sleeping_lock++; +} + +static inline void sleeping_lock_dec(void) +{ + current->sleeping_lock--; +} + +#else + +static inline void sleeping_lock_inc(void) { } +static inline void sleeping_lock_dec(void) { } +#endif /* * Wrappers for p->thread_info->cpu access. No-op on UP. @@ -2022,4 +2172,6 @@ #endif +extern struct task_struct *takedown_cpu_task; + #endif diff --git a/kernel/include/linux/sched/mm.h b/kernel/include/linux/sched/mm.h index ef54f4b..88e1a56 100644 --- a/kernel/include/linux/sched/mm.h +++ b/kernel/include/linux/sched/mm.h @@ -49,6 +49,17 @@ __mmdrop(mm); } +#ifdef CONFIG_PREEMPT_RT_BASE +extern void __mmdrop_delayed(struct rcu_head *rhp); +static inline void mmdrop_delayed(struct mm_struct *mm) +{ + if (atomic_dec_and_test(&mm->mm_count)) + call_rcu(&mm->delayed_drop, __mmdrop_delayed); +} +#else +# define mmdrop_delayed(mm) mmdrop(mm) +#endif + void mmdrop(struct mm_struct *mm); /* diff --git a/kernel/include/linux/sched/task.h b/kernel/include/linux/sched/task.h index 9140130..5f8c1d5 100644 --- a/kernel/include/linux/sched/task.h +++ b/kernel/include/linux/sched/task.h @@ -90,6 +90,15 @@ #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) +#ifdef CONFIG_PREEMPT_RT_BASE +extern void __put_task_struct_cb(struct rcu_head *rhp); + +static inline void put_task_struct(struct task_struct *t) +{ + if (atomic_dec_and_test(&t->usage)) + call_rcu(&t->put_rcu, __put_task_struct_cb); +} +#else extern void __put_task_struct(struct task_struct *t); static inline void put_task_struct(struct task_struct *t) @@ -97,7 +106,7 @@ if (atomic_dec_and_test(&t->usage)) __put_task_struct(t); } - +#endif struct task_struct *task_rcu_dereference(struct task_struct **ptask); #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT diff --git a/kernel/include/linux/sched/wake_q.h b/kernel/include/linux/sched/wake_q.h index a3661e9..1c4438f 100644 --- a/kernel/include/linux/sched/wake_q.h +++ b/kernel/include/linux/sched/wake_q.h @@ -49,8 +49,29 @@ head->count = 0; } -extern void wake_q_add(struct wake_q_head *head, - struct task_struct *task); -extern void wake_up_q(struct wake_q_head *head); +extern void __wake_q_add(struct wake_q_head *head, + struct task_struct *task, bool sleeper); +static inline void wake_q_add(struct wake_q_head *head, + struct task_struct *task) +{ + __wake_q_add(head, task, false); +} + +static inline void wake_q_add_sleeper(struct wake_q_head *head, + struct task_struct *task) +{ + __wake_q_add(head, task, true); +} + +extern void __wake_up_q(struct wake_q_head *head, bool sleeper); +static inline void wake_up_q(struct wake_q_head *head) +{ + __wake_up_q(head, false); +} + +static inline void wake_up_q_sleeper(struct wake_q_head *head) +{ + __wake_up_q(head, true); +} #endif /* _LINUX_SCHED_WAKE_Q_H */ diff --git a/kernel/include/linux/seqlock.h b/kernel/include/linux/seqlock.h index a42a299..31bc2cc 100644 --- a/kernel/include/linux/seqlock.h +++ b/kernel/include/linux/seqlock.h @@ -221,18 +221,28 @@ return __read_seqcount_retry(s, start); } - - -static inline void raw_write_seqcount_begin(seqcount_t *s) +static inline void __raw_write_seqcount_begin(seqcount_t *s) { s->sequence++; smp_wmb(); } -static inline void raw_write_seqcount_end(seqcount_t *s) +static inline void raw_write_seqcount_begin(seqcount_t *s) +{ + preempt_disable_rt(); + __raw_write_seqcount_begin(s); +} + +static inline void __raw_write_seqcount_end(seqcount_t *s) { smp_wmb(); s->sequence++; +} + +static inline void raw_write_seqcount_end(seqcount_t *s) +{ + __raw_write_seqcount_end(s); + preempt_enable_rt(); } /** @@ -435,10 +445,33 @@ /* * Read side functions for starting and finalizing a read side section. */ +#ifndef CONFIG_PREEMPT_RT_FULL static inline unsigned read_seqbegin(const seqlock_t *sl) { return read_seqcount_begin(&sl->seqcount); } +#else +/* + * Starvation safe read side for RT + */ +static inline unsigned read_seqbegin(seqlock_t *sl) +{ + unsigned ret; + +repeat: + ret = READ_ONCE(sl->seqcount.sequence); + if (unlikely(ret & 1)) { + /* + * Take the lock and let the writer proceed (i.e. evtl + * boost it), otherwise we could loop here forever. + */ + spin_unlock_wait(&sl->lock); + goto repeat; + } + smp_rmb(); + return ret; +} +#endif static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start) { @@ -453,36 +486,45 @@ static inline void write_seqlock(seqlock_t *sl) { spin_lock(&sl->lock); - write_seqcount_begin(&sl->seqcount); + __raw_write_seqcount_begin(&sl->seqcount); +} + +static inline int try_write_seqlock(seqlock_t *sl) +{ + if (spin_trylock(&sl->lock)) { + __raw_write_seqcount_begin(&sl->seqcount); + return 1; + } + return 0; } static inline void write_sequnlock(seqlock_t *sl) { - write_seqcount_end(&sl->seqcount); + __raw_write_seqcount_end(&sl->seqcount); spin_unlock(&sl->lock); } static inline void write_seqlock_bh(seqlock_t *sl) { spin_lock_bh(&sl->lock); - write_seqcount_begin(&sl->seqcount); + __raw_write_seqcount_begin(&sl->seqcount); } static inline void write_sequnlock_bh(seqlock_t *sl) { - write_seqcount_end(&sl->seqcount); + __raw_write_seqcount_end(&sl->seqcount); spin_unlock_bh(&sl->lock); } static inline void write_seqlock_irq(seqlock_t *sl) { spin_lock_irq(&sl->lock); - write_seqcount_begin(&sl->seqcount); + __raw_write_seqcount_begin(&sl->seqcount); } static inline void write_sequnlock_irq(seqlock_t *sl) { - write_seqcount_end(&sl->seqcount); + __raw_write_seqcount_end(&sl->seqcount); spin_unlock_irq(&sl->lock); } @@ -491,7 +533,7 @@ unsigned long flags; spin_lock_irqsave(&sl->lock, flags); - write_seqcount_begin(&sl->seqcount); + __raw_write_seqcount_begin(&sl->seqcount); return flags; } @@ -501,7 +543,7 @@ static inline void write_sequnlock_irqrestore(seqlock_t *sl, unsigned long flags) { - write_seqcount_end(&sl->seqcount); + __raw_write_seqcount_end(&sl->seqcount); spin_unlock_irqrestore(&sl->lock, flags); } diff --git a/kernel/include/linux/signal.h b/kernel/include/linux/signal.h index 0be5ce2..6495fda 100644 --- a/kernel/include/linux/signal.h +++ b/kernel/include/linux/signal.h @@ -245,6 +245,7 @@ } extern void flush_sigqueue(struct sigpending *queue); +extern void flush_task_sigqueue(struct task_struct *tsk); /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ static inline int valid_signal(unsigned long sig) diff --git a/kernel/include/linux/skbuff.h b/kernel/include/linux/skbuff.h index 2bb6429..93de9f6 100644 --- a/kernel/include/linux/skbuff.h +++ b/kernel/include/linux/skbuff.h @@ -286,6 +286,7 @@ __u32 qlen; spinlock_t lock; + raw_spinlock_t raw_lock; }; struct sk_buff; @@ -1735,6 +1736,12 @@ __skb_queue_head_init(list); } +static inline void skb_queue_head_init_raw(struct sk_buff_head *list) +{ + raw_spin_lock_init(&list->raw_lock); + __skb_queue_head_init(list); +} + static inline void skb_queue_head_init_class(struct sk_buff_head *list, struct lock_class_key *class) { diff --git a/kernel/include/linux/smp.h b/kernel/include/linux/smp.h index 6bb7f07..039da08 100644 --- a/kernel/include/linux/smp.h +++ b/kernel/include/linux/smp.h @@ -202,6 +202,9 @@ #define get_cpu() ({ preempt_disable(); smp_processor_id(); }) #define put_cpu() preempt_enable() +#define get_cpu_light() ({ migrate_disable(); smp_processor_id(); }) +#define put_cpu_light() migrate_enable() + /* * Callback to arch code if there's nosmp or maxcpus=0 on the * boot command line: diff --git a/kernel/include/linux/soc/rockchip/rk_vendor_storage.h b/kernel/include/linux/soc/rockchip/rk_vendor_storage.h index e3ee20f..5891840 100644 --- a/kernel/include/linux/soc/rockchip/rk_vendor_storage.h +++ b/kernel/include/linux/soc/rockchip/rk_vendor_storage.h @@ -29,6 +29,43 @@ #define LAN_RGMII_DL_ID 16 #define EINK_VCOM_ID 17 +#define VENDOR_HEAD_TAG 0x524B5644 +#define FLASH_VENDOR_PART_SIZE 8 +#define VENDOR_PART_SIZE 128 + +struct vendor_item { + u16 id; + u16 offset; + u16 size; + u16 flag; +}; + +struct vendor_info { + u32 tag; + u32 version; + u16 next_index; + u16 item_num; + u16 free_offset; + u16 free_size; + struct vendor_item item[126]; /* 126 * 8 */ + u8 data[VENDOR_PART_SIZE * 512 - 1024 - 8]; + u32 hash; + u32 version2; +}; + +struct flash_vendor_info { + u32 tag; + u32 version; + u16 next_index; + u16 item_num; + u16 free_offset; + u16 free_size; + struct vendor_item item[62]; /* 62 * 8 */ + u8 data[FLASH_VENDOR_PART_SIZE * 512 - 512 - 8]; + u32 hash; + u32 version2; +}; + int rk_vendor_read(u32 id, void *pbuf, u32 size); int rk_vendor_write(u32 id, void *pbuf, u32 size); int rk_vendor_register(void *read, void *write); diff --git a/kernel/include/linux/spinlock.h b/kernel/include/linux/spinlock.h index e089157..5f5ad06 100644 --- a/kernel/include/linux/spinlock.h +++ b/kernel/include/linux/spinlock.h @@ -298,7 +298,11 @@ }) /* Include rwlock functions */ -#include <linux/rwlock.h> +#ifdef CONFIG_PREEMPT_RT_FULL +# include <linux/rwlock_rt.h> +#else +# include <linux/rwlock.h> +#endif /* * Pull the _spin_*()/_read_*()/_write_*() functions/declarations: @@ -308,6 +312,10 @@ #else # include <linux/spinlock_api_up.h> #endif + +#ifdef CONFIG_PREEMPT_RT_FULL +# include <linux/spinlock_rt.h> +#else /* PREEMPT_RT_FULL */ /* * Map the spin_lock functions to the raw variants for PREEMPT_RT=n @@ -429,6 +437,8 @@ #define assert_spin_locked(lock) assert_raw_spin_locked(&(lock)->rlock) +#endif /* !PREEMPT_RT_FULL */ + /* * Pull the atomic_t declaration: * (asm-mips/atomic.h needs above definitions) diff --git a/kernel/include/linux/spinlock_api_smp.h b/kernel/include/linux/spinlock_api_smp.h index 42dfab8..29d99ae 100644 --- a/kernel/include/linux/spinlock_api_smp.h +++ b/kernel/include/linux/spinlock_api_smp.h @@ -187,6 +187,8 @@ return 0; } -#include <linux/rwlock_api_smp.h> +#ifndef CONFIG_PREEMPT_RT_FULL +# include <linux/rwlock_api_smp.h> +#endif #endif /* __LINUX_SPINLOCK_API_SMP_H */ diff --git a/kernel/include/linux/spinlock_rt.h b/kernel/include/linux/spinlock_rt.h new file mode 100644 index 0000000..3696a77 --- /dev/null +++ b/kernel/include/linux/spinlock_rt.h @@ -0,0 +1,156 @@ +#ifndef __LINUX_SPINLOCK_RT_H +#define __LINUX_SPINLOCK_RT_H + +#ifndef __LINUX_SPINLOCK_H +#error Do not include directly. Use spinlock.h +#endif + +#include <linux/bug.h> + +extern void +__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key); + +#define spin_lock_init(slock) \ +do { \ + static struct lock_class_key __key; \ + \ + rt_mutex_init(&(slock)->lock); \ + __rt_spin_lock_init(slock, #slock, &__key); \ +} while (0) + +extern void __lockfunc rt_spin_lock(spinlock_t *lock); +extern unsigned long __lockfunc rt_spin_lock_trace_flags(spinlock_t *lock); +extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass); +extern void __lockfunc rt_spin_unlock(spinlock_t *lock); +extern void __lockfunc rt_spin_unlock_wait(spinlock_t *lock); +extern int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags); +extern int __lockfunc rt_spin_trylock_bh(spinlock_t *lock); +extern int __lockfunc rt_spin_trylock(spinlock_t *lock); +extern int atomic_dec_and_spin_lock(atomic_t *atomic, spinlock_t *lock); + +/* + * lockdep-less calls, for derived types like rwlock: + * (for trylock they can use rt_mutex_trylock() directly. + * Migrate disable handling must be done at the call site. + */ +extern void __lockfunc __rt_spin_lock(struct rt_mutex *lock); +extern void __lockfunc __rt_spin_trylock(struct rt_mutex *lock); +extern void __lockfunc __rt_spin_unlock(struct rt_mutex *lock); + +#define spin_lock(lock) rt_spin_lock(lock) + +#define spin_lock_bh(lock) \ + do { \ + local_bh_disable(); \ + rt_spin_lock(lock); \ + } while (0) + +#define spin_lock_irq(lock) spin_lock(lock) + +#define spin_do_trylock(lock) __cond_lock(lock, rt_spin_trylock(lock)) + +#define spin_trylock(lock) \ +({ \ + int __locked; \ + __locked = spin_do_trylock(lock); \ + __locked; \ +}) + +#ifdef CONFIG_LOCKDEP +# define spin_lock_nested(lock, subclass) \ + do { \ + rt_spin_lock_nested(lock, subclass); \ + } while (0) + +#define spin_lock_bh_nested(lock, subclass) \ + do { \ + local_bh_disable(); \ + rt_spin_lock_nested(lock, subclass); \ + } while (0) + +# define spin_lock_irqsave_nested(lock, flags, subclass) \ + do { \ + typecheck(unsigned long, flags); \ + flags = 0; \ + rt_spin_lock_nested(lock, subclass); \ + } while (0) +#else +# define spin_lock_nested(lock, subclass) spin_lock(lock) +# define spin_lock_bh_nested(lock, subclass) spin_lock_bh(lock) + +# define spin_lock_irqsave_nested(lock, flags, subclass) \ + do { \ + typecheck(unsigned long, flags); \ + flags = 0; \ + spin_lock(lock); \ + } while (0) +#endif + +#define spin_lock_irqsave(lock, flags) \ + do { \ + typecheck(unsigned long, flags); \ + flags = 0; \ + spin_lock(lock); \ + } while (0) + +static inline unsigned long spin_lock_trace_flags(spinlock_t *lock) +{ + unsigned long flags = 0; +#ifdef CONFIG_TRACE_IRQFLAGS + flags = rt_spin_lock_trace_flags(lock); +#else + spin_lock(lock); /* lock_local */ +#endif + return flags; +} + +/* FIXME: we need rt_spin_lock_nest_lock */ +#define spin_lock_nest_lock(lock, nest_lock) spin_lock_nested(lock, 0) + +#define spin_unlock(lock) rt_spin_unlock(lock) + +#define spin_unlock_bh(lock) \ + do { \ + rt_spin_unlock(lock); \ + local_bh_enable(); \ + } while (0) + +#define spin_unlock_irq(lock) spin_unlock(lock) + +#define spin_unlock_irqrestore(lock, flags) \ + do { \ + typecheck(unsigned long, flags); \ + (void) flags; \ + spin_unlock(lock); \ + } while (0) + +#define spin_trylock_bh(lock) __cond_lock(lock, rt_spin_trylock_bh(lock)) +#define spin_trylock_irq(lock) spin_trylock(lock) + +#define spin_trylock_irqsave(lock, flags) \ + rt_spin_trylock_irqsave(lock, &(flags)) + +#define spin_unlock_wait(lock) rt_spin_unlock_wait(lock) + +#ifdef CONFIG_GENERIC_LOCKBREAK +# define spin_is_contended(lock) ((lock)->break_lock) +#else +# define spin_is_contended(lock) (((void)(lock), 0)) +#endif + +static inline int spin_can_lock(spinlock_t *lock) +{ + return !rt_mutex_is_locked(&lock->lock); +} + +static inline int spin_is_locked(spinlock_t *lock) +{ + return rt_mutex_is_locked(&lock->lock); +} + +static inline void assert_spin_locked(spinlock_t *lock) +{ + BUG_ON(!spin_is_locked(lock)); +} + +#endif diff --git a/kernel/include/linux/spinlock_types.h b/kernel/include/linux/spinlock_types.h index 24b4e6f..10bac71 100644 --- a/kernel/include/linux/spinlock_types.h +++ b/kernel/include/linux/spinlock_types.h @@ -9,77 +9,15 @@ * Released under the General Public License (GPL). */ -#if defined(CONFIG_SMP) -# include <asm/spinlock_types.h> +#include <linux/spinlock_types_raw.h> + +#ifndef CONFIG_PREEMPT_RT_FULL +# include <linux/spinlock_types_nort.h> +# include <linux/rwlock_types.h> #else -# include <linux/spinlock_types_up.h> +# include <linux/rtmutex.h> +# include <linux/spinlock_types_rt.h> +# include <linux/rwlock_types_rt.h> #endif - -#include <linux/lockdep.h> - -typedef struct raw_spinlock { - arch_spinlock_t raw_lock; -#ifdef CONFIG_DEBUG_SPINLOCK - unsigned int magic, owner_cpu; - void *owner; -#endif -#ifdef CONFIG_DEBUG_LOCK_ALLOC - struct lockdep_map dep_map; -#endif -} raw_spinlock_t; - -#define SPINLOCK_MAGIC 0xdead4ead - -#define SPINLOCK_OWNER_INIT ((void *)-1L) - -#ifdef CONFIG_DEBUG_LOCK_ALLOC -# define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } -#else -# define SPIN_DEP_MAP_INIT(lockname) -#endif - -#ifdef CONFIG_DEBUG_SPINLOCK -# define SPIN_DEBUG_INIT(lockname) \ - .magic = SPINLOCK_MAGIC, \ - .owner_cpu = -1, \ - .owner = SPINLOCK_OWNER_INIT, -#else -# define SPIN_DEBUG_INIT(lockname) -#endif - -#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ - { \ - .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ - SPIN_DEBUG_INIT(lockname) \ - SPIN_DEP_MAP_INIT(lockname) } - -#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ - (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) - -#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) - -typedef struct spinlock { - union { - struct raw_spinlock rlock; - -#ifdef CONFIG_DEBUG_LOCK_ALLOC -# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) - struct { - u8 __padding[LOCK_PADSIZE]; - struct lockdep_map dep_map; - }; -#endif - }; -} spinlock_t; - -#define __SPIN_LOCK_INITIALIZER(lockname) \ - { { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } } - -#define __SPIN_LOCK_UNLOCKED(lockname) \ - (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) - -#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) - -#include <linux/rwlock_types.h> #endif /* __LINUX_SPINLOCK_TYPES_H */ diff --git a/kernel/include/linux/spinlock_types_nort.h b/kernel/include/linux/spinlock_types_nort.h new file mode 100644 index 0000000..f1dac1f --- /dev/null +++ b/kernel/include/linux/spinlock_types_nort.h @@ -0,0 +1,33 @@ +#ifndef __LINUX_SPINLOCK_TYPES_NORT_H +#define __LINUX_SPINLOCK_TYPES_NORT_H + +#ifndef __LINUX_SPINLOCK_TYPES_H +#error "Do not include directly. Include spinlock_types.h instead" +#endif + +/* + * The non RT version maps spinlocks to raw_spinlocks + */ +typedef struct spinlock { + union { + struct raw_spinlock rlock; + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) + struct { + u8 __padding[LOCK_PADSIZE]; + struct lockdep_map dep_map; + }; +#endif + }; +} spinlock_t; + +#define __SPIN_LOCK_INITIALIZER(lockname) \ + { { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } } + +#define __SPIN_LOCK_UNLOCKED(lockname) \ + (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) + +#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) + +#endif diff --git a/kernel/include/linux/spinlock_types_raw.h b/kernel/include/linux/spinlock_types_raw.h new file mode 100644 index 0000000..822bf64 --- /dev/null +++ b/kernel/include/linux/spinlock_types_raw.h @@ -0,0 +1,55 @@ +#ifndef __LINUX_SPINLOCK_TYPES_RAW_H +#define __LINUX_SPINLOCK_TYPES_RAW_H + +#include <linux/types.h> + +#if defined(CONFIG_SMP) +# include <asm/spinlock_types.h> +#else +# include <linux/spinlock_types_up.h> +#endif + +#include <linux/lockdep.h> + +typedef struct raw_spinlock { + arch_spinlock_t raw_lock; +#ifdef CONFIG_DEBUG_SPINLOCK + unsigned int magic, owner_cpu; + void *owner; +#endif +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif +} raw_spinlock_t; + +#define SPINLOCK_MAGIC 0xdead4ead + +#define SPINLOCK_OWNER_INIT ((void *)-1L) + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } +#else +# define SPIN_DEP_MAP_INIT(lockname) +#endif + +#ifdef CONFIG_DEBUG_SPINLOCK +# define SPIN_DEBUG_INIT(lockname) \ + .magic = SPINLOCK_MAGIC, \ + .owner_cpu = -1, \ + .owner = SPINLOCK_OWNER_INIT, +#else +# define SPIN_DEBUG_INIT(lockname) +#endif + +#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ + { \ + .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ + SPIN_DEBUG_INIT(lockname) \ + SPIN_DEP_MAP_INIT(lockname) } + +#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ + (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) + +#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) + +#endif diff --git a/kernel/include/linux/spinlock_types_rt.h b/kernel/include/linux/spinlock_types_rt.h new file mode 100644 index 0000000..3e3d8c5 --- /dev/null +++ b/kernel/include/linux/spinlock_types_rt.h @@ -0,0 +1,48 @@ +#ifndef __LINUX_SPINLOCK_TYPES_RT_H +#define __LINUX_SPINLOCK_TYPES_RT_H + +#ifndef __LINUX_SPINLOCK_TYPES_H +#error "Do not include directly. Include spinlock_types.h instead" +#endif + +#include <linux/cache.h> + +/* + * PREEMPT_RT: spinlocks - an RT mutex plus lock-break field: + */ +typedef struct spinlock { + struct rt_mutex lock; + unsigned int break_lock; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif +} spinlock_t; + +#ifdef CONFIG_DEBUG_RT_MUTEXES +# define __RT_SPIN_INITIALIZER(name) \ + { \ + .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ + .save_state = 1, \ + .file = __FILE__, \ + .line = __LINE__ , \ + } +#else +# define __RT_SPIN_INITIALIZER(name) \ + { \ + .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ + .save_state = 1, \ + } +#endif + +/* +.wait_list = PLIST_HEAD_INIT_RAW((name).lock.wait_list, (name).lock.wait_lock) +*/ + +#define __SPIN_LOCK_UNLOCKED(name) \ + { .lock = __RT_SPIN_INITIALIZER(name.lock), \ + SPIN_DEP_MAP_INIT(name) } + +#define DEFINE_SPINLOCK(name) \ + spinlock_t name = __SPIN_LOCK_UNLOCKED(name) + +#endif diff --git a/kernel/include/linux/spinlock_types_up.h b/kernel/include/linux/spinlock_types_up.h index c09b6407..b0243ba 100644 --- a/kernel/include/linux/spinlock_types_up.h +++ b/kernel/include/linux/spinlock_types_up.h @@ -1,10 +1,6 @@ #ifndef __LINUX_SPINLOCK_TYPES_UP_H #define __LINUX_SPINLOCK_TYPES_UP_H -#ifndef __LINUX_SPINLOCK_TYPES_H -# error "please don't include this file directly" -#endif - /* * include/linux/spinlock_types_up.h - spinlock type definitions for UP * diff --git a/kernel/include/linux/stop_machine.h b/kernel/include/linux/stop_machine.h index ccdaa8f..150e886 100644 --- a/kernel/include/linux/stop_machine.h +++ b/kernel/include/linux/stop_machine.h @@ -26,6 +26,8 @@ cpu_stop_fn_t fn; void *arg; struct cpu_stop_done *done; + /* Did not run due to disabled stopper; for nowait debug checks */ + bool disabled; }; int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg); diff --git a/kernel/include/linux/suspend.h b/kernel/include/linux/suspend.h index 5ee7e53..ec488a3 100644 --- a/kernel/include/linux/suspend.h +++ b/kernel/include/linux/suspend.h @@ -198,6 +198,12 @@ void (*end)(void); }; +#if defined(CONFIG_SUSPEND) || defined(CONFIG_HIBERNATION) +extern bool pm_in_action; +#else +# define pm_in_action false +#endif + #ifdef CONFIG_SUSPEND extern suspend_state_t mem_sleep_current; extern suspend_state_t mem_sleep_default; diff --git a/kernel/include/linux/swait.h b/kernel/include/linux/swait.h index 73e06e9..21ae66c 100644 --- a/kernel/include/linux/swait.h +++ b/kernel/include/linux/swait.h @@ -160,7 +160,9 @@ extern void swake_up_one(struct swait_queue_head *q); extern void swake_up_all(struct swait_queue_head *q); extern void swake_up_locked(struct swait_queue_head *q); +extern void swake_up_all_locked(struct swait_queue_head *q); +extern void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait); extern void prepare_to_swait_exclusive(struct swait_queue_head *q, struct swait_queue *wait, int state); extern long prepare_to_swait_event(struct swait_queue_head *q, struct swait_queue *wait, int state); @@ -297,4 +299,18 @@ __ret; \ }) +#define __swait_event_lock_irq(wq, condition, lock, cmd) \ + ___swait_event(wq, condition, TASK_UNINTERRUPTIBLE, 0, \ + raw_spin_unlock_irq(&lock); \ + cmd; \ + schedule(); \ + raw_spin_lock_irq(&lock)) + +#define swait_event_lock_irq(wq_head, condition, lock) \ + do { \ + if (condition) \ + break; \ + __swait_event_lock_irq(wq_head, condition, lock, ); \ + } while (0) + #endif /* _LINUX_SWAIT_H */ diff --git a/kernel/include/linux/swap.h b/kernel/include/linux/swap.h index 8bd2b0f..8fba0d4 100644 --- a/kernel/include/linux/swap.h +++ b/kernel/include/linux/swap.h @@ -12,6 +12,7 @@ #include <linux/fs.h> #include <linux/atomic.h> #include <linux/page-flags.h> +#include <linux/locallock.h> #include <asm/page.h> struct notifier_block; @@ -335,6 +336,7 @@ /* linux/mm/swap.c */ +DECLARE_LOCAL_IRQ_LOCK(swapvec_lock); extern void lru_cache_add(struct page *); extern void lru_cache_add_anon(struct page *page); extern void lru_cache_add_file(struct page *page); diff --git a/kernel/include/linux/swork.h b/kernel/include/linux/swork.h new file mode 100644 index 0000000..f175fa9 --- /dev/null +++ b/kernel/include/linux/swork.h @@ -0,0 +1,24 @@ +#ifndef _LINUX_SWORK_H +#define _LINUX_SWORK_H + +#include <linux/list.h> + +struct swork_event { + struct list_head item; + unsigned long flags; + void (*func)(struct swork_event *); +}; + +static inline void INIT_SWORK(struct swork_event *event, + void (*func)(struct swork_event *)) +{ + event->flags = 0; + event->func = func; +} + +bool swork_queue(struct swork_event *sev); + +int swork_get(void); +void swork_put(void); + +#endif /* _LINUX_SWORK_H */ diff --git a/kernel/include/linux/thread_info.h b/kernel/include/linux/thread_info.h index 62dbecf..57a3d99 100644 --- a/kernel/include/linux/thread_info.h +++ b/kernel/include/linux/thread_info.h @@ -110,7 +110,17 @@ #define test_thread_flag(flag) \ test_ti_thread_flag(current_thread_info(), flag) -#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) +#ifdef CONFIG_PREEMPT_LAZY +#define tif_need_resched() (test_thread_flag(TIF_NEED_RESCHED) || \ + test_thread_flag(TIF_NEED_RESCHED_LAZY)) +#define tif_need_resched_now() (test_thread_flag(TIF_NEED_RESCHED)) +#define tif_need_resched_lazy() test_thread_flag(TIF_NEED_RESCHED_LAZY)) + +#else +#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) +#define tif_need_resched_now() test_thread_flag(TIF_NEED_RESCHED) +#define tif_need_resched_lazy() 0 +#endif #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES static inline int arch_within_stack_frames(const void * const stack, diff --git a/kernel/include/linux/timer.h b/kernel/include/linux/timer.h index 611dd95..afe84c2 100644 --- a/kernel/include/linux/timer.h +++ b/kernel/include/linux/timer.h @@ -176,7 +176,7 @@ extern int try_to_del_timer_sync(struct timer_list *timer); -#ifdef CONFIG_SMP +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) extern int del_timer_sync(struct timer_list *timer); #else # define del_timer_sync(t) del_timer(t) diff --git a/kernel/include/linux/trace_events.h b/kernel/include/linux/trace_events.h index 0643c08..e26a85c 100644 --- a/kernel/include/linux/trace_events.h +++ b/kernel/include/linux/trace_events.h @@ -62,6 +62,8 @@ unsigned char flags; unsigned char preempt_count; int pid; + unsigned char migrate_disable; + unsigned char preempt_lazy_count; }; #define TRACE_EVENT_TYPE_MAX \ diff --git a/kernel/include/linux/uaccess.h b/kernel/include/linux/uaccess.h index 1a5b23a..0704e99 100644 --- a/kernel/include/linux/uaccess.h +++ b/kernel/include/linux/uaccess.h @@ -185,6 +185,7 @@ */ static inline void pagefault_disable(void) { + migrate_disable(); pagefault_disabled_inc(); /* * make sure to have issued the store before a pagefault @@ -201,6 +202,7 @@ */ barrier(); pagefault_disabled_dec(); + migrate_enable(); } /* diff --git a/kernel/include/linux/usb/hcd.h b/kernel/include/linux/usb/hcd.h index e34faee..84b46e1 100644 --- a/kernel/include/linux/usb/hcd.h +++ b/kernel/include/linux/usb/hcd.h @@ -119,6 +119,7 @@ #define HCD_FLAG_DEAD 6 /* controller has died? */ #define HCD_FLAG_INTF_AUTHORIZED 7 /* authorize interfaces? */ #define HCD_FLAG_DEV_AUTHORIZED 8 /* authorize devices? */ +#define HCD_FLAG_POWER_ON 9 /* power on */ /* The flags can be tested using these macros; they are likely to * be slightly faster than test_bit(). @@ -146,6 +147,8 @@ #define HCD_DEV_AUTHORIZED(hcd) \ ((hcd)->flags & (1U << HCD_FLAG_DEV_AUTHORIZED)) +#define HCD_POWER_ON(hcd) ((hcd)->flags & (1U << HCD_FLAG_POWER_ON)) + /* Flags that get set only during HCD registration or removal. */ unsigned rh_registered:1;/* is root hub registered? */ unsigned rh_pollable:1; /* may we poll the root hub? */ diff --git a/kernel/include/linux/vmstat.h b/kernel/include/linux/vmstat.h index f25cef8..febee86 100644 --- a/kernel/include/linux/vmstat.h +++ b/kernel/include/linux/vmstat.h @@ -54,7 +54,9 @@ */ static inline void __count_vm_event(enum vm_event_item item) { + preempt_disable_rt(); raw_cpu_inc(vm_event_states.event[item]); + preempt_enable_rt(); } static inline void count_vm_event(enum vm_event_item item) @@ -64,7 +66,9 @@ static inline void __count_vm_events(enum vm_event_item item, long delta) { + preempt_disable_rt(); raw_cpu_add(vm_event_states.event[item], delta); + preempt_enable_rt(); } static inline void count_vm_events(enum vm_event_item item, long delta) diff --git a/kernel/include/linux/wait.h b/kernel/include/linux/wait.h index ec2e8e8..a6690bc 100644 --- a/kernel/include/linux/wait.h +++ b/kernel/include/linux/wait.h @@ -11,6 +11,7 @@ #include <asm/current.h> #include <uapi/linux/wait.h> +#include <linux/atomic.h> typedef struct wait_queue_entry wait_queue_entry_t; @@ -515,8 +516,8 @@ int __ret = 0; \ struct hrtimer_sleeper __t; \ \ - hrtimer_init_on_stack(&__t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); \ - hrtimer_init_sleeper(&__t, current); \ + hrtimer_init_sleeper_on_stack(&__t, CLOCK_MONOTONIC, HRTIMER_MODE_REL, \ + current); \ if ((timeout) != KTIME_MAX) \ hrtimer_start_range_ns(&__t.timer, timeout, \ current->timer_slack_ns, \ diff --git a/kernel/include/linux/workqueue.h b/kernel/include/linux/workqueue.h index 342f374..6e17fe4 100644 --- a/kernel/include/linux/workqueue.h +++ b/kernel/include/linux/workqueue.h @@ -461,10 +461,6 @@ extern void destroy_workqueue(struct workqueue_struct *wq); -struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask); -void free_workqueue_attrs(struct workqueue_attrs *attrs); -int apply_workqueue_attrs(struct workqueue_struct *wq, - const struct workqueue_attrs *attrs); int workqueue_set_unbound_cpumask(cpumask_var_t cpumask); extern bool queue_work_on(int cpu, struct workqueue_struct *wq, diff --git a/kernel/include/net/cfg80211.h b/kernel/include/net/cfg80211.h index dec1f43..5de4f9a 100644 --- a/kernel/include/net/cfg80211.h +++ b/kernel/include/net/cfg80211.h @@ -5782,8 +5782,11 @@ * case. * @bssid: The BSSID of the AP (may be %NULL) * @bss: Entry of bss to which STA got connected to, can be obtained through - * cfg80211_get_bss() (may be %NULL). Only one parameter among @bssid and - * @bss needs to be specified. + * cfg80211_get_bss() (may be %NULL). But it is recommended to store the + * bss from the connect_request and hold a reference to it and return + * through this param to avoid a warning if the bss is expired during the + * connection, esp. for those drivers implementing connect op. + * Only one parameter among @bssid and @bss needs to be specified. * @req_ie: Association request IEs (may be %NULL) * @req_ie_len: Association request IEs length * @resp_ie: Association response IEs (may be %NULL) @@ -5831,8 +5834,12 @@ * * @dev: network device * @bssid: the BSSID of the AP - * @bss: entry of bss to which STA got connected to, can be obtained - * through cfg80211_get_bss (may be %NULL) + * @bss: Entry of bss to which STA got connected to, can be obtained through + * cfg80211_get_bss() (may be %NULL). But it is recommended to store the + * bss from the connect_request and hold a reference to it and return + * through this param to avoid a warning if the bss is expired during the + * connection, esp. for those drivers implementing connect op. + * Only one parameter among @bssid and @bss needs to be specified. * @req_ie: association request IEs (maybe be %NULL) * @req_ie_len: association request IEs length * @resp_ie: association response IEs (may be %NULL) diff --git a/kernel/include/net/gen_stats.h b/kernel/include/net/gen_stats.h index 883bb90..3b593cd 100644 --- a/kernel/include/net/gen_stats.h +++ b/kernel/include/net/gen_stats.h @@ -6,6 +6,7 @@ #include <linux/socket.h> #include <linux/rtnetlink.h> #include <linux/pkt_sched.h> +#include <net/net_seq_lock.h> struct gnet_stats_basic_cpu { struct gnet_stats_basic_packed bstats; @@ -36,11 +37,11 @@ spinlock_t *lock, struct gnet_dump *d, int padattr); -int gnet_stats_copy_basic(const seqcount_t *running, +int gnet_stats_copy_basic(net_seqlock_t *running, struct gnet_dump *d, struct gnet_stats_basic_cpu __percpu *cpu, struct gnet_stats_basic_packed *b); -void __gnet_stats_copy_basic(const seqcount_t *running, +void __gnet_stats_copy_basic(net_seqlock_t *running, struct gnet_stats_basic_packed *bstats, struct gnet_stats_basic_cpu __percpu *cpu, struct gnet_stats_basic_packed *b); @@ -60,13 +61,13 @@ struct gnet_stats_basic_cpu __percpu *cpu_bstats, struct net_rate_estimator __rcu **rate_est, spinlock_t *lock, - seqcount_t *running, struct nlattr *opt); + net_seqlock_t *running, struct nlattr *opt); void gen_kill_estimator(struct net_rate_estimator __rcu **ptr); int gen_replace_estimator(struct gnet_stats_basic_packed *bstats, struct gnet_stats_basic_cpu __percpu *cpu_bstats, struct net_rate_estimator __rcu **ptr, spinlock_t *lock, - seqcount_t *running, struct nlattr *opt); + net_seqlock_t *running, struct nlattr *opt); bool gen_estimator_active(struct net_rate_estimator __rcu **ptr); bool gen_estimator_read(struct net_rate_estimator __rcu **ptr, struct gnet_stats_rate_est64 *sample); diff --git a/kernel/include/net/neighbour.h b/kernel/include/net/neighbour.h index 5ce0359..1166fc1 100644 --- a/kernel/include/net/neighbour.h +++ b/kernel/include/net/neighbour.h @@ -451,7 +451,7 @@ } #endif -static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb) +static inline int neigh_hh_output(struct hh_cache *hh, struct sk_buff *skb) { unsigned int hh_alen = 0; unsigned int seq; @@ -493,7 +493,7 @@ static inline int neigh_output(struct neighbour *n, struct sk_buff *skb) { - const struct hh_cache *hh = &n->hh; + struct hh_cache *hh = &n->hh; if ((n->nud_state & NUD_CONNECTED) && hh->hh_len) return neigh_hh_output(hh, skb); @@ -534,7 +534,7 @@ #define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb) -static inline void neigh_ha_snapshot(char *dst, const struct neighbour *n, +static inline void neigh_ha_snapshot(char *dst, struct neighbour *n, const struct net_device *dev) { unsigned int seq; diff --git a/kernel/include/net/net_seq_lock.h b/kernel/include/net/net_seq_lock.h new file mode 100644 index 0000000..a703429 --- /dev/null +++ b/kernel/include/net/net_seq_lock.h @@ -0,0 +1,15 @@ +#ifndef __NET_NET_SEQ_LOCK_H__ +#define __NET_NET_SEQ_LOCK_H__ + +#ifdef CONFIG_PREEMPT_RT_BASE +# define net_seqlock_t seqlock_t +# define net_seq_begin(__r) read_seqbegin(__r) +# define net_seq_retry(__r, __s) read_seqretry(__r, __s) + +#else +# define net_seqlock_t seqcount_t +# define net_seq_begin(__r) read_seqcount_begin(__r) +# define net_seq_retry(__r, __s) read_seqcount_retry(__r, __s) +#endif + +#endif diff --git a/kernel/include/net/sch_generic.h b/kernel/include/net/sch_generic.h index f571833..6876326 100644 --- a/kernel/include/net/sch_generic.h +++ b/kernel/include/net/sch_generic.h @@ -10,6 +10,7 @@ #include <linux/percpu.h> #include <linux/dynamic_queue_limits.h> #include <linux/list.h> +#include <net/net_seq_lock.h> #include <linux/refcount.h> #include <linux/workqueue.h> #include <net/gen_stats.h> @@ -100,7 +101,7 @@ struct sk_buff_head gso_skb ____cacheline_aligned_in_smp; struct qdisc_skb_head q; struct gnet_stats_basic_packed bstats; - seqcount_t running; + net_seqlock_t running; struct gnet_stats_queue qstats; unsigned long state; struct Qdisc *next_sched; @@ -137,7 +138,11 @@ { if (qdisc->flags & TCQ_F_NOLOCK) return spin_is_locked(&qdisc->seqlock); +#ifdef CONFIG_PREEMPT_RT_BASE + return spin_is_locked(&qdisc->running.lock) ? true : false; +#else return (raw_read_seqcount(&qdisc->running) & 1) ? true : false; +#endif } static inline bool qdisc_run_begin(struct Qdisc *qdisc) @@ -148,17 +153,27 @@ } else if (qdisc_is_running(qdisc)) { return false; } +#ifdef CONFIG_PREEMPT_RT_BASE + if (try_write_seqlock(&qdisc->running)) + return true; + return false; +#else /* Variant of write_seqcount_begin() telling lockdep a trylock * was attempted. */ raw_write_seqcount_begin(&qdisc->running); seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_); return true; +#endif } static inline void qdisc_run_end(struct Qdisc *qdisc) { +#ifdef CONFIG_PREEMPT_RT_BASE + write_sequnlock(&qdisc->running); +#else write_seqcount_end(&qdisc->running); +#endif if (qdisc->flags & TCQ_F_NOLOCK) spin_unlock(&qdisc->seqlock); } @@ -475,7 +490,7 @@ return qdisc_lock(root); } -static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) +static inline net_seqlock_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) { struct Qdisc *root = qdisc_root_sleeping(qdisc); diff --git a/kernel/include/net/sock.h b/kernel/include/net/sock.h index 79dde11..c080fc9 100644 --- a/kernel/include/net/sock.h +++ b/kernel/include/net/sock.h @@ -472,7 +472,7 @@ u32 sk_ack_backlog; u32 sk_max_ack_backlog; kuid_t sk_uid; -#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC) +#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC) || IS_ENABLED(CONFIG_PREEMPT_RT) spinlock_t sk_peer_lock; #else /* sk_peer_lock is in the ANDROID_KABI_RESERVE(1) field below */ @@ -517,7 +517,7 @@ struct sock_reuseport __rcu *sk_reuseport_cb; struct rcu_head sk_rcu; -#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC) +#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC) || IS_ENABLED(CONFIG_PREEMPT_RT) ANDROID_KABI_RESERVE(1); #else ANDROID_KABI_USE(1, spinlock_t sk_peer_lock); diff --git a/kernel/include/soc/at91/atmel_tcb.h b/kernel/include/soc/at91/atmel_tcb.h new file mode 100644 index 0000000..657e234 --- /dev/null +++ b/kernel/include/soc/at91/atmel_tcb.h @@ -0,0 +1,183 @@ +//SPDX-License-Identifier: GPL-2.0 +/* Copyright (C) 2018 Microchip */ + +#ifndef __SOC_ATMEL_TCB_H +#define __SOC_ATMEL_TCB_H + +/* Channel registers */ +#define ATMEL_TC_COFFS(c) ((c) * 0x40) +#define ATMEL_TC_CCR(c) ATMEL_TC_COFFS(c) +#define ATMEL_TC_CMR(c) (ATMEL_TC_COFFS(c) + 0x4) +#define ATMEL_TC_SMMR(c) (ATMEL_TC_COFFS(c) + 0x8) +#define ATMEL_TC_RAB(c) (ATMEL_TC_COFFS(c) + 0xc) +#define ATMEL_TC_CV(c) (ATMEL_TC_COFFS(c) + 0x10) +#define ATMEL_TC_RA(c) (ATMEL_TC_COFFS(c) + 0x14) +#define ATMEL_TC_RB(c) (ATMEL_TC_COFFS(c) + 0x18) +#define ATMEL_TC_RC(c) (ATMEL_TC_COFFS(c) + 0x1c) +#define ATMEL_TC_SR(c) (ATMEL_TC_COFFS(c) + 0x20) +#define ATMEL_TC_IER(c) (ATMEL_TC_COFFS(c) + 0x24) +#define ATMEL_TC_IDR(c) (ATMEL_TC_COFFS(c) + 0x28) +#define ATMEL_TC_IMR(c) (ATMEL_TC_COFFS(c) + 0x2c) +#define ATMEL_TC_EMR(c) (ATMEL_TC_COFFS(c) + 0x30) + +/* Block registers */ +#define ATMEL_TC_BCR 0xc0 +#define ATMEL_TC_BMR 0xc4 +#define ATMEL_TC_QIER 0xc8 +#define ATMEL_TC_QIDR 0xcc +#define ATMEL_TC_QIMR 0xd0 +#define ATMEL_TC_QISR 0xd4 +#define ATMEL_TC_FMR 0xd8 +#define ATMEL_TC_WPMR 0xe4 + +/* CCR fields */ +#define ATMEL_TC_CCR_CLKEN BIT(0) +#define ATMEL_TC_CCR_CLKDIS BIT(1) +#define ATMEL_TC_CCR_SWTRG BIT(2) + +/* Common CMR fields */ +#define ATMEL_TC_CMR_TCLKS_MSK GENMASK(2, 0) +#define ATMEL_TC_CMR_TCLK(x) (x) +#define ATMEL_TC_CMR_XC(x) ((x) + 5) +#define ATMEL_TC_CMR_CLKI BIT(3) +#define ATMEL_TC_CMR_BURST_MSK GENMASK(5, 4) +#define ATMEL_TC_CMR_BURST_XC(x) (((x) + 1) << 4) +#define ATMEL_TC_CMR_WAVE BIT(15) + +/* Capture mode CMR fields */ +#define ATMEL_TC_CMR_LDBSTOP BIT(6) +#define ATMEL_TC_CMR_LDBDIS BIT(7) +#define ATMEL_TC_CMR_ETRGEDG_MSK GENMASK(9, 8) +#define ATMEL_TC_CMR_ETRGEDG_NONE (0 << 8) +#define ATMEL_TC_CMR_ETRGEDG_RISING (1 << 8) +#define ATMEL_TC_CMR_ETRGEDG_FALLING (2 << 8) +#define ATMEL_TC_CMR_ETRGEDG_BOTH (3 << 8) +#define ATMEL_TC_CMR_ABETRG BIT(10) +#define ATMEL_TC_CMR_CPCTRG BIT(14) +#define ATMEL_TC_CMR_LDRA_MSK GENMASK(17, 16) +#define ATMEL_TC_CMR_LDRA_NONE (0 << 16) +#define ATMEL_TC_CMR_LDRA_RISING (1 << 16) +#define ATMEL_TC_CMR_LDRA_FALLING (2 << 16) +#define ATMEL_TC_CMR_LDRA_BOTH (3 << 16) +#define ATMEL_TC_CMR_LDRB_MSK GENMASK(19, 18) +#define ATMEL_TC_CMR_LDRB_NONE (0 << 18) +#define ATMEL_TC_CMR_LDRB_RISING (1 << 18) +#define ATMEL_TC_CMR_LDRB_FALLING (2 << 18) +#define ATMEL_TC_CMR_LDRB_BOTH (3 << 18) +#define ATMEL_TC_CMR_SBSMPLR_MSK GENMASK(22, 20) +#define ATMEL_TC_CMR_SBSMPLR(x) ((x) << 20) + +/* Waveform mode CMR fields */ +#define ATMEL_TC_CMR_CPCSTOP BIT(6) +#define ATMEL_TC_CMR_CPCDIS BIT(7) +#define ATMEL_TC_CMR_EEVTEDG_MSK GENMASK(9, 8) +#define ATMEL_TC_CMR_EEVTEDG_NONE (0 << 8) +#define ATMEL_TC_CMR_EEVTEDG_RISING (1 << 8) +#define ATMEL_TC_CMR_EEVTEDG_FALLING (2 << 8) +#define ATMEL_TC_CMR_EEVTEDG_BOTH (3 << 8) +#define ATMEL_TC_CMR_EEVT_MSK GENMASK(11, 10) +#define ATMEL_TC_CMR_EEVT_XC(x) (((x) + 1) << 10) +#define ATMEL_TC_CMR_ENETRG BIT(12) +#define ATMEL_TC_CMR_WAVESEL_MSK GENMASK(14, 13) +#define ATMEL_TC_CMR_WAVESEL_UP (0 << 13) +#define ATMEL_TC_CMR_WAVESEL_UPDOWN (1 << 13) +#define ATMEL_TC_CMR_WAVESEL_UPRC (2 << 13) +#define ATMEL_TC_CMR_WAVESEL_UPDOWNRC (3 << 13) +#define ATMEL_TC_CMR_ACPA_MSK GENMASK(17, 16) +#define ATMEL_TC_CMR_ACPA(a) (ATMEL_TC_CMR_ACTION_##a << 16) +#define ATMEL_TC_CMR_ACPC_MSK GENMASK(19, 18) +#define ATMEL_TC_CMR_ACPC(a) (ATMEL_TC_CMR_ACTION_##a << 18) +#define ATMEL_TC_CMR_AEEVT_MSK GENMASK(21, 20) +#define ATMEL_TC_CMR_AEEVT(a) (ATMEL_TC_CMR_ACTION_##a << 20) +#define ATMEL_TC_CMR_ASWTRG_MSK GENMASK(23, 22) +#define ATMEL_TC_CMR_ASWTRG(a) (ATMEL_TC_CMR_ACTION_##a << 22) +#define ATMEL_TC_CMR_BCPB_MSK GENMASK(25, 24) +#define ATMEL_TC_CMR_BCPB(a) (ATMEL_TC_CMR_ACTION_##a << 24) +#define ATMEL_TC_CMR_BCPC_MSK GENMASK(27, 26) +#define ATMEL_TC_CMR_BCPC(a) (ATMEL_TC_CMR_ACTION_##a << 26) +#define ATMEL_TC_CMR_BEEVT_MSK GENMASK(29, 28) +#define ATMEL_TC_CMR_BEEVT(a) (ATMEL_TC_CMR_ACTION_##a << 28) +#define ATMEL_TC_CMR_BSWTRG_MSK GENMASK(31, 30) +#define ATMEL_TC_CMR_BSWTRG(a) (ATMEL_TC_CMR_ACTION_##a << 30) +#define ATMEL_TC_CMR_ACTION_NONE 0 +#define ATMEL_TC_CMR_ACTION_SET 1 +#define ATMEL_TC_CMR_ACTION_CLEAR 2 +#define ATMEL_TC_CMR_ACTION_TOGGLE 3 + +/* SMMR fields */ +#define ATMEL_TC_SMMR_GCEN BIT(0) +#define ATMEL_TC_SMMR_DOWN BIT(1) + +/* SR/IER/IDR/IMR fields */ +#define ATMEL_TC_COVFS BIT(0) +#define ATMEL_TC_LOVRS BIT(1) +#define ATMEL_TC_CPAS BIT(2) +#define ATMEL_TC_CPBS BIT(3) +#define ATMEL_TC_CPCS BIT(4) +#define ATMEL_TC_LDRAS BIT(5) +#define ATMEL_TC_LDRBS BIT(6) +#define ATMEL_TC_ETRGS BIT(7) +#define ATMEL_TC_CLKSTA BIT(16) +#define ATMEL_TC_MTIOA BIT(17) +#define ATMEL_TC_MTIOB BIT(18) + +/* EMR fields */ +#define ATMEL_TC_EMR_TRIGSRCA_MSK GENMASK(1, 0) +#define ATMEL_TC_EMR_TRIGSRCA_TIOA 0 +#define ATMEL_TC_EMR_TRIGSRCA_PWMX 1 +#define ATMEL_TC_EMR_TRIGSRCB_MSK GENMASK(5, 4) +#define ATMEL_TC_EMR_TRIGSRCB_TIOB (0 << 4) +#define ATMEL_TC_EMR_TRIGSRCB_PWM (1 << 4) +#define ATMEL_TC_EMR_NOCLKDIV BIT(8) + +/* BCR fields */ +#define ATMEL_TC_BCR_SYNC BIT(0) + +/* BMR fields */ +#define ATMEL_TC_BMR_TCXC_MSK(c) GENMASK(((c) * 2) + 1, (c) * 2) +#define ATMEL_TC_BMR_TCXC(x, c) ((x) << (2 * (c))) +#define ATMEL_TC_BMR_QDEN BIT(8) +#define ATMEL_TC_BMR_POSEN BIT(9) +#define ATMEL_TC_BMR_SPEEDEN BIT(10) +#define ATMEL_TC_BMR_QDTRANS BIT(11) +#define ATMEL_TC_BMR_EDGPHA BIT(12) +#define ATMEL_TC_BMR_INVA BIT(13) +#define ATMEL_TC_BMR_INVB BIT(14) +#define ATMEL_TC_BMR_INVIDX BIT(15) +#define ATMEL_TC_BMR_SWAP BIT(16) +#define ATMEL_TC_BMR_IDXPHB BIT(17) +#define ATMEL_TC_BMR_AUTOC BIT(18) +#define ATMEL_TC_MAXFILT_MSK GENMASK(25, 20) +#define ATMEL_TC_MAXFILT(x) (((x) - 1) << 20) +#define ATMEL_TC_MAXCMP_MSK GENMASK(29, 26) +#define ATMEL_TC_MAXCMP(x) ((x) << 26) + +/* QEDC fields */ +#define ATMEL_TC_QEDC_IDX BIT(0) +#define ATMEL_TC_QEDC_DIRCHG BIT(1) +#define ATMEL_TC_QEDC_QERR BIT(2) +#define ATMEL_TC_QEDC_MPE BIT(3) +#define ATMEL_TC_QEDC_DIR BIT(8) + +/* FMR fields */ +#define ATMEL_TC_FMR_ENCF(x) BIT(x) + +/* WPMR fields */ +#define ATMEL_TC_WPMR_WPKEY (0x54494d << 8) +#define ATMEL_TC_WPMR_WPEN BIT(0) + +static const u8 atmel_tc_divisors[5] = { 2, 8, 32, 128, 0, }; + +static const struct of_device_id atmel_tcb_dt_ids[] = { + { + .compatible = "atmel,at91rm9200-tcb", + .data = (void *)16, + }, { + .compatible = "atmel,at91sam9x5-tcb", + .data = (void *)32, + }, { + /* sentinel */ + } +}; + +#endif /* __SOC_ATMEL_TCB_H */ diff --git a/kernel/include/soc/rockchip/rockchip_iommu.h b/kernel/include/soc/rockchip/rockchip_iommu.h index 5a2d58e..cfae9b3 100644 --- a/kernel/include/soc/rockchip/rockchip_iommu.h +++ b/kernel/include/soc/rockchip/rockchip_iommu.h @@ -11,6 +11,9 @@ int rockchip_iommu_enable(struct device *dev); int rockchip_iommu_disable(struct device *dev); bool rockchip_iommu_is_enabled(struct device *dev); +int rockchip_pagefault_done(struct device *master_dev); +void __iomem *rockchip_get_iommu_base(struct device *master_dev, int idx); +int rockchip_iommu_force_reset(struct device *dev); #else static inline int rockchip_iommu_enable(struct device *dev) { @@ -24,6 +27,18 @@ { return false; } +static inline int rockchip_pagefault_done(struct device *master_dev) +{ + return 0; +} +static inline void __iomem *rockchip_get_iommu_base(struct device *master_dev, int idx) +{ + return NULL; +} +static inline int rockchip_iommu_force_reset(struct device *dev) +{ + return -ENODEV; +} #endif #endif diff --git a/kernel/include/soc/rockchip/rockchip_system_monitor.h b/kernel/include/soc/rockchip/rockchip_system_monitor.h index 1f8bffc..5eec720 100644 --- a/kernel/include/soc/rockchip/rockchip_system_monitor.h +++ b/kernel/include/soc/rockchip/rockchip_system_monitor.h @@ -103,11 +103,13 @@ bool is_high_temp; bool is_low_temp_enabled; bool is_status_freq_fixed; + bool boosted; }; struct monitor_dev_profile { enum monitor_dev_type type; void *data; + int (*low_temp_adjust_volt)(struct monitor_dev_info *info); int (*low_temp_adjust)(struct monitor_dev_info *info, bool is_low); int (*high_temp_adjust)(struct monitor_dev_info *info, bool is_low); struct cpumask allowed_cpus; @@ -132,6 +134,8 @@ int temp, unsigned long *state); int rockchip_monitor_opp_set_rate(struct monitor_dev_info *info, unsigned long target_freq); +void rockchip_monitor_set_boosted(void); +void rockchip_monitor_clear_boosted(void); #else static inline struct monitor_dev_info * rockchip_system_monitor_register(struct device *dev, @@ -188,6 +192,8 @@ { return 0; } +static inline void rockchip_monitor_set_boosted(void) {}; +static inline void rockchip_monitor_set_boosted(void) {}; #endif /* CONFIG_ROCKCHIP_SYSTEM_MONITOR */ #endif diff --git a/kernel/include/uapi/linux/cec.h b/kernel/include/uapi/linux/cec.h index d6ba688..2ad8638 100644 --- a/kernel/include/uapi/linux/cec.h +++ b/kernel/include/uapi/linux/cec.h @@ -475,6 +475,12 @@ #define CEC_G_MODE _IOR('a', 8, __u32) #define CEC_S_MODE _IOW('a', 9, __u32) +/* set cec into standby mode */ +#define CEC_STANDBY _IOW('a', 10, __u8) + +/* set cec wake up function enable */ +#define CEC_FUNC_EN _IOW('a', 11, int) + /* * The remainder of this header defines all CEC messages and operands. * The format matters since it the cec-ctl utility parses it to generate diff --git a/kernel/include/uapi/linux/rk-pcie-ep.h b/kernel/include/uapi/linux/rk-pcie-ep.h index 37726a6..b6e3ac0 100644 --- a/kernel/include/uapi/linux/rk-pcie-ep.h +++ b/kernel/include/uapi/linux/rk-pcie-ep.h @@ -8,13 +8,77 @@ #include <linux/types.h> +/* rkep device mode status definition */ +#define RKEP_MODE_BOOTROM 1 +#define RKEP_MODE_LOADER 2 +#define RKEP_MODE_KERNEL 3 +#define RKEP_MODE_FUN0 4 +/* 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 + +/* + * rockchip pcie driver elbi ioctrl output data + */ struct pcie_ep_user_data { + __u64 bar0_phys_addr; __u32 elbi_app_user[11]; }; +/* + * rockchip driver cache ioctrl input param + */ struct pcie_ep_dma_cache_cfg { __u64 addr; __u32 size; +}; + +#define PCIE_EP_OBJ_INFO_MAGIC 0x524B4550 + +enum pcie_ep_obj_irq_type { + OBJ_IRQ_UNKNOWN, + OBJ_IRQ_DMA, + OBJ_IRQ_USER, + OBJ_IRQ_ELBI, +}; + +struct pcie_ep_obj_irq_dma_status { + __u32 wr; + __u32 rd; +}; + +enum pcie_ep_mmap_resource { + PCIE_EP_MMAP_RESOURCE_DBI, + PCIE_EP_MMAP_RESOURCE_BAR0, + PCIE_EP_MMAP_RESOURCE_BAR2, + PCIE_EP_MMAP_RESOURCE_BAR4, + PCIE_EP_MMAP_RESOURCE_MAX, +}; + +/* + * rockchip ep device information which is store in BAR0 + */ +struct pcie_ep_obj_info { + __u32 magic; + __u32 version; + struct { + __u16 mode; + __u16 submode; + } devmode; + __u8 reserved[0x1F4]; + + __u32 irq_type_rc; /* Generate in ep isr, valid only for rc, clear in rc */ + struct pcie_ep_obj_irq_dma_status dma_status_rc; /* Generate in ep isr, valid only for rc, clear in rc */ + __u32 irq_type_ep; /* Generate in ep isr, valid only for ep, clear in ep */ + struct pcie_ep_obj_irq_dma_status dma_status_ep; /* Generate in ep isr, valid only for ep, clear in ep */ + __u32 obj_irq_user_data; /* OBJ_IRQ_USER userspace data */ }; #define PCIE_BASE 'P' @@ -22,5 +86,8 @@ #define PCIE_DMA_CACHE_INVALIDE _IOW(PCIE_BASE, 1, struct pcie_ep_dma_cache_cfg) #define PCIE_DMA_CACHE_FLUSH _IOW(PCIE_BASE, 2, struct pcie_ep_dma_cache_cfg) #define PCIE_DMA_IRQ_MASK_ALL _IOW(PCIE_BASE, 3, int) +#define PCIE_DMA_RAISE_MSI_OBJ_IRQ_USER _IOW(PCIE_BASE, 4, int) +#define PCIE_EP_GET_USER_INFO _IOR(PCIE_BASE, 5, struct pcie_ep_user_data) +#define PCIE_EP_SET_MMAP_RESOURCE _IOW(PCIE_BASE, 6, enum pcie_ep_mmap_resource) #endif diff --git a/kernel/include/uapi/linux/rkisp21-config.h b/kernel/include/uapi/linux/rkisp21-config.h index fc72ef9..3e83014 100644 --- a/kernel/include/uapi/linux/rkisp21-config.h +++ b/kernel/include/uapi/linux/rkisp21-config.h @@ -805,6 +805,7 @@ struct rkisp_isp21_stat_buffer { unsigned int meas_type; unsigned int frame_id; + unsigned int params_id; struct isp21_stat params; } __attribute__ ((packed)); diff --git a/kernel/init/Kconfig b/kernel/init/Kconfig index 0e0d8f2..46618c6 100644 --- a/kernel/init/Kconfig +++ b/kernel/init/Kconfig @@ -900,6 +900,7 @@ config RT_GROUP_SCHED bool "Group scheduling for SCHED_RR/FIFO" depends on CGROUP_SCHED + depends on !PREEMPT_RT_FULL default n help This feature lets you explicitly allocate real CPU bandwidth @@ -1827,6 +1828,7 @@ config SLAB bool "SLAB" + depends on !PREEMPT_RT_FULL select HAVE_HARDENED_USERCOPY_ALLOCATOR help The regular slab allocator that is established and known to work @@ -1847,6 +1849,7 @@ config SLOB depends on EXPERT bool "SLOB (Simple Allocator)" + depends on !PREEMPT_RT_FULL help SLOB replaces the stock allocator with a drastically simpler allocator. SLOB is generally more space efficient but @@ -1888,7 +1891,7 @@ config SLUB_CPU_PARTIAL default y - depends on SLUB && SMP + depends on SLUB && SMP && !PREEMPT_RT_FULL bool "SLUB per cpu partial cache" help Per cpu partial caches accellerate objects allocation and freeing diff --git a/kernel/init/Makefile b/kernel/init/Makefile index c94fd10..6c74aa3 100644 --- a/kernel/init/Makefile +++ b/kernel/init/Makefile @@ -31,5 +31,5 @@ include/generated/compile.h: FORCE @$($(quiet)chk_compile.h) $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \ - "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" \ + "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CONFIG_PREEMPT_RT_FULL)" \ "$(CC) $(KBUILD_CFLAGS)" "$(LD)" diff --git a/kernel/init/init_task.c b/kernel/init/init_task.c index b31109d..eedcb1b 100644 --- a/kernel/init/init_task.c +++ b/kernel/init/init_task.c @@ -51,6 +51,12 @@ .signalfd_wqh = __WAIT_QUEUE_HEAD_INITIALIZER(init_sighand.signalfd_wqh), }; +#if defined(CONFIG_POSIX_TIMERS) && defined(CONFIG_PREEMPT_RT_BASE) +# define INIT_TIMER_LIST .posix_timer_list = NULL, +#else +# define INIT_TIMER_LIST +#endif + /* * Set up the first task table, touch at your own risk!. Base=0, * limit=0x1fffff (=2MB) @@ -72,9 +78,14 @@ .static_prio = MAX_PRIO - 20, .normal_prio = MAX_PRIO - 20, .policy = SCHED_NORMAL, - .cpus_allowed = CPU_MASK_ALL, + .cpus_ptr = &init_task.cpus_mask, + .cpus_mask = CPU_MASK_ALL, .nr_cpus_allowed= NR_CPUS, .cpus_requested = CPU_MASK_ALL, +#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) && \ + defined(CONFIG_SCHED_DEBUG) + .pinned_on_cpu = -1, +#endif .mm = NULL, .active_mm = &init_mm, .restart_block = { @@ -120,6 +131,7 @@ INIT_CPU_TIMERS(init_task) .pi_lock = __RAW_SPIN_LOCK_UNLOCKED(init_task.pi_lock), .timer_slack_ns = 50000, /* 50 usec default slack */ + INIT_TIMER_LIST .thread_pid = &init_struct_pid, .thread_group = LIST_HEAD_INIT(init_task.thread_group), .thread_node = LIST_HEAD_INIT(init_signals.thread_head), diff --git a/kernel/init/main.c b/kernel/init/main.c index e61c5db..6091067 100644 --- a/kernel/init/main.c +++ b/kernel/init/main.c @@ -580,6 +580,7 @@ setup_command_line(command_line); setup_nr_cpu_ids(); setup_per_cpu_areas(); + softirq_early_init(); smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ boot_cpu_hotplug_init(); diff --git a/kernel/kernel/Kconfig.locks b/kernel/kernel/Kconfig.locks index 84d882f..af27c40 100644 --- a/kernel/kernel/Kconfig.locks +++ b/kernel/kernel/Kconfig.locks @@ -225,11 +225,11 @@ config MUTEX_SPIN_ON_OWNER def_bool y - depends on SMP && ARCH_SUPPORTS_ATOMIC_RMW + depends on SMP && ARCH_SUPPORTS_ATOMIC_RMW && !PREEMPT_RT_FULL config RWSEM_SPIN_ON_OWNER def_bool y - depends on SMP && RWSEM_XCHGADD_ALGORITHM && ARCH_SUPPORTS_ATOMIC_RMW + depends on SMP && RWSEM_XCHGADD_ALGORITHM && ARCH_SUPPORTS_ATOMIC_RMW && !PREEMPT_RT_FULL config LOCK_SPIN_ON_OWNER def_bool y diff --git a/kernel/kernel/Kconfig.preempt b/kernel/kernel/Kconfig.preempt index cd16551..fd924c0 100644 --- a/kernel/kernel/Kconfig.preempt +++ b/kernel/kernel/Kconfig.preempt @@ -1,3 +1,19 @@ +config PREEMPT + bool + select PREEMPT_COUNT + +config PREEMPT_RT_BASE + bool + select PREEMPT + +config PREEMPT_RT + bool + +config HAVE_PREEMPT_LAZY + bool + +config PREEMPT_LAZY + def_bool y if HAVE_PREEMPT_LAZY && PREEMPT_RT_FULL choice prompt "Preemption Model" @@ -34,10 +50,10 @@ Select this if you are building a kernel for a desktop system. -config PREEMPT +config PREEMPT__LL bool "Preemptible Kernel (Low-Latency Desktop)" depends on !ARCH_NO_PREEMPT - select PREEMPT_COUNT + select PREEMPT select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK help This option reduces the latency of the kernel by making @@ -54,7 +70,24 @@ embedded system with latency requirements in the milliseconds range. +config PREEMPT_RTB + bool "Preemptible Kernel (Basic RT)" + select PREEMPT_RT_BASE + help + This option is basically the same as (Low-Latency Desktop) but + enables changes which are preliminary for the full preemptible + RT kernel. + +config PREEMPT_RT_FULL + bool "Fully Preemptible Kernel (RT)" + depends on IRQ_FORCED_THREADING + select PREEMPT_RT_BASE + select PREEMPT_RCU + select PREEMPT_RT + help + All and everything + endchoice config PREEMPT_COUNT - bool \ No newline at end of file + bool diff --git a/kernel/kernel/cgroup/cgroup.c b/kernel/kernel/cgroup/cgroup.c index 712839b..c0430df 100644 --- a/kernel/kernel/cgroup/cgroup.c +++ b/kernel/kernel/cgroup/cgroup.c @@ -4927,10 +4927,10 @@ } } -static void css_release_work_fn(struct work_struct *work) +static void css_release_work_fn(struct swork_event *sev) { struct cgroup_subsys_state *css = - container_of(work, struct cgroup_subsys_state, destroy_work); + container_of(sev, struct cgroup_subsys_state, destroy_swork); struct cgroup_subsys *ss = css->ss; struct cgroup *cgrp = css->cgroup; @@ -4992,8 +4992,8 @@ struct cgroup_subsys_state *css = container_of(ref, struct cgroup_subsys_state, refcnt); - INIT_WORK(&css->destroy_work, css_release_work_fn); - queue_work(cgroup_destroy_wq, &css->destroy_work); + INIT_SWORK(&css->destroy_swork, css_release_work_fn); + swork_queue(&css->destroy_swork); } static void init_and_link_css(struct cgroup_subsys_state *css, @@ -5751,6 +5751,7 @@ */ cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1); BUG_ON(!cgroup_destroy_wq); + BUG_ON(swork_get()); return 0; } core_initcall(cgroup_wq_init); diff --git a/kernel/kernel/cgroup/cpuset.c b/kernel/kernel/cgroup/cpuset.c index 45b4dbf..38367e6 100644 --- a/kernel/kernel/cgroup/cpuset.c +++ b/kernel/kernel/cgroup/cpuset.c @@ -289,7 +289,7 @@ */ static DEFINE_MUTEX(cpuset_mutex); -static DEFINE_SPINLOCK(callback_lock); +static DEFINE_RAW_SPINLOCK(callback_lock); static struct workqueue_struct *cpuset_migrate_mm_wq; @@ -929,9 +929,9 @@ continue; rcu_read_unlock(); - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); cpumask_copy(cp->effective_cpus, new_cpus); - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); WARN_ON(!is_in_v2_mode() && !cpumask_equal(cp->cpus_allowed, cp->effective_cpus)); @@ -997,10 +997,10 @@ if (retval < 0) return retval; - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed); cpumask_copy(cs->cpus_requested, trialcs->cpus_requested); - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); /* use trialcs->cpus_allowed as a temp variable */ update_cpumasks_hier(cs, trialcs->cpus_allowed); @@ -1184,9 +1184,9 @@ continue; rcu_read_unlock(); - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); cp->effective_mems = *new_mems; - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); WARN_ON(!is_in_v2_mode() && !nodes_equal(cp->mems_allowed, cp->effective_mems)); @@ -1254,9 +1254,9 @@ if (retval < 0) goto done; - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); cs->mems_allowed = trialcs->mems_allowed; - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); /* use trialcs->mems_allowed as a temp variable */ update_nodemasks_hier(cs, &trialcs->mems_allowed); @@ -1347,9 +1347,9 @@ spread_flag_changed = ((is_spread_slab(cs) != is_spread_slab(trialcs)) || (is_spread_page(cs) != is_spread_page(trialcs))); - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); cs->flags = trialcs->flags; - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); if (!cpumask_empty(trialcs->cpus_allowed) && balance_flag_changed) rebuild_sched_domains_locked(); @@ -1766,7 +1766,7 @@ cpuset_filetype_t type = seq_cft(sf)->private; int ret = 0; - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); switch (type) { case FILE_CPULIST: @@ -1785,7 +1785,7 @@ ret = -EINVAL; } - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); return ret; } @@ -2005,12 +2005,12 @@ cpuset_inc(); - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); if (is_in_v2_mode()) { cpumask_copy(cs->effective_cpus, parent->effective_cpus); cs->effective_mems = parent->effective_mems; } - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags)) goto out_unlock; @@ -2037,13 +2037,13 @@ } rcu_read_unlock(); - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); cs->mems_allowed = parent->mems_allowed; cs->effective_mems = parent->mems_allowed; cpumask_copy(cs->cpus_allowed, parent->cpus_allowed); cpumask_copy(cs->cpus_requested, parent->cpus_requested); cpumask_copy(cs->effective_cpus, parent->cpus_allowed); - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); out_unlock: mutex_unlock(&cpuset_mutex); return 0; @@ -2083,7 +2083,7 @@ static void cpuset_bind(struct cgroup_subsys_state *root_css) { mutex_lock(&cpuset_mutex); - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); if (is_in_v2_mode()) { cpumask_copy(top_cpuset.cpus_allowed, cpu_possible_mask); @@ -2094,7 +2094,7 @@ top_cpuset.mems_allowed = top_cpuset.effective_mems; } - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); mutex_unlock(&cpuset_mutex); } @@ -2108,7 +2108,7 @@ if (task_css_is_root(task, cpuset_cgrp_id)) return; - set_cpus_allowed_ptr(task, ¤t->cpus_allowed); + set_cpus_allowed_ptr(task, current->cpus_ptr); task->mems_allowed = current->mems_allowed; } @@ -2194,12 +2194,12 @@ { bool is_empty; - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); cpumask_copy(cs->cpus_allowed, new_cpus); cpumask_copy(cs->effective_cpus, new_cpus); cs->mems_allowed = *new_mems; cs->effective_mems = *new_mems; - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); /* * Don't call update_tasks_cpumask() if the cpuset becomes empty, @@ -2236,10 +2236,10 @@ if (nodes_empty(*new_mems)) *new_mems = parent_cs(cs)->effective_mems; - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); cpumask_copy(cs->effective_cpus, new_cpus); cs->effective_mems = *new_mems; - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); if (cpus_updated) update_tasks_cpumask(cs); @@ -2332,21 +2332,21 @@ /* synchronize cpus_allowed to cpu_active_mask */ if (cpus_updated) { - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); if (!on_dfl) cpumask_copy(top_cpuset.cpus_allowed, &new_cpus); cpumask_copy(top_cpuset.effective_cpus, &new_cpus); - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); /* we don't mess with cpumasks of tasks in top_cpuset */ } /* synchronize mems_allowed to N_MEMORY */ if (mems_updated) { - spin_lock_irq(&callback_lock); + raw_spin_lock_irq(&callback_lock); if (!on_dfl) top_cpuset.mems_allowed = new_mems; top_cpuset.effective_mems = new_mems; - spin_unlock_irq(&callback_lock); + raw_spin_unlock_irq(&callback_lock); update_tasks_nodemask(&top_cpuset); } @@ -2445,11 +2445,11 @@ { unsigned long flags; - spin_lock_irqsave(&callback_lock, flags); + raw_spin_lock_irqsave(&callback_lock, flags); rcu_read_lock(); guarantee_online_cpus(task_cs(tsk), pmask); rcu_read_unlock(); - spin_unlock_irqrestore(&callback_lock, flags); + raw_spin_unlock_irqrestore(&callback_lock, flags); } /** @@ -2510,11 +2510,11 @@ nodemask_t mask; unsigned long flags; - spin_lock_irqsave(&callback_lock, flags); + raw_spin_lock_irqsave(&callback_lock, flags); rcu_read_lock(); guarantee_online_mems(task_cs(tsk), &mask); rcu_read_unlock(); - spin_unlock_irqrestore(&callback_lock, flags); + raw_spin_unlock_irqrestore(&callback_lock, flags); return mask; } @@ -2606,14 +2606,14 @@ return true; /* Not hardwall and node outside mems_allowed: scan up cpusets */ - spin_lock_irqsave(&callback_lock, flags); + raw_spin_lock_irqsave(&callback_lock, flags); rcu_read_lock(); cs = nearest_hardwall_ancestor(task_cs(current)); allowed = node_isset(node, cs->mems_allowed); rcu_read_unlock(); - spin_unlock_irqrestore(&callback_lock, flags); + raw_spin_unlock_irqrestore(&callback_lock, flags); return allowed; } diff --git a/kernel/kernel/cgroup/rstat.c b/kernel/kernel/cgroup/rstat.c index d0ed410..3c949c4 100644 --- a/kernel/kernel/cgroup/rstat.c +++ b/kernel/kernel/cgroup/rstat.c @@ -149,8 +149,9 @@ raw_spinlock_t *cpu_lock = per_cpu_ptr(&cgroup_rstat_cpu_lock, cpu); struct cgroup *pos = NULL; + unsigned long flags; - raw_spin_lock(cpu_lock); + raw_spin_lock_irqsave(cpu_lock, flags); while ((pos = cgroup_rstat_cpu_pop_updated(pos, cgrp, cpu))) { struct cgroup_subsys_state *css; @@ -162,7 +163,7 @@ css->ss->css_rstat_flush(css, cpu); rcu_read_unlock(); } - raw_spin_unlock(cpu_lock); + raw_spin_unlock_irqrestore(cpu_lock, flags); /* if @may_sleep, play nice and yield if necessary */ if (may_sleep && (need_resched() || diff --git a/kernel/kernel/cpu.c b/kernel/kernel/cpu.c index c664ec4..51b17e4 100644 --- a/kernel/kernel/cpu.c +++ b/kernel/kernel/cpu.c @@ -876,6 +876,15 @@ int err, cpu = smp_processor_id(); int ret; +#ifdef CONFIG_PREEMPT_RT_BASE + /* + * If any tasks disabled migration before we got here, + * go back and sleep again. + */ + if (cpu_nr_pinned(cpu)) + return -EAGAIN; +#endif + /* Ensure this CPU doesn't handle any more interrupts. */ err = __cpu_disable(); if (err < 0) @@ -903,6 +912,10 @@ return 0; } +#ifdef CONFIG_PREEMPT_RT_BASE +struct task_struct *takedown_cpu_task; +#endif + static int takedown_cpu(unsigned int cpu) { struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu); @@ -917,11 +930,39 @@ */ irq_lock_sparse(); +#ifdef CONFIG_PREEMPT_RT_BASE + WARN_ON_ONCE(takedown_cpu_task); + takedown_cpu_task = current; + +again: + /* + * If a task pins this CPU after we pass this check, take_cpu_down + * will return -EAGAIN. + */ + for (;;) { + int nr_pinned; + + set_current_state(TASK_UNINTERRUPTIBLE); + nr_pinned = cpu_nr_pinned(cpu); + if (nr_pinned == 0) + break; + schedule(); + } + set_current_state(TASK_RUNNING); +#endif + /* * So now all preempt/rcu users must observe !cpu_active(). */ err = stop_machine_cpuslocked(take_cpu_down, NULL, cpumask_of(cpu)); +#ifdef CONFIG_PREEMPT_RT_BASE + if (err == -EAGAIN) + goto again; +#endif if (err) { +#ifdef CONFIG_PREEMPT_RT_BASE + takedown_cpu_task = NULL; +#endif /* CPU refused to die */ irq_unlock_sparse(); /* Unpark the hotplug thread so we can rollback there */ @@ -940,6 +981,9 @@ wait_for_ap_thread(st, false); BUG_ON(st->state != CPUHP_AP_IDLE_DEAD); +#ifdef CONFIG_PREEMPT_RT_BASE + takedown_cpu_task = NULL; +#endif /* Interrupts are moved away from the dying cpu, reenable alloc/free */ irq_unlock_sparse(); diff --git a/kernel/kernel/debug/kdb/kdb_io.c b/kernel/kernel/debug/kdb/kdb_io.c index b45576c..ad1a3bc 100644 --- a/kernel/kernel/debug/kdb/kdb_io.c +++ b/kernel/kernel/debug/kdb/kdb_io.c @@ -861,9 +861,11 @@ va_list ap; int r; + kdb_trap_printk++; va_start(ap, fmt); r = vkdb_printf(KDB_MSGSRC_INTERNAL, fmt, ap); va_end(ap); + kdb_trap_printk--; return r; } diff --git a/kernel/kernel/events/core.c b/kernel/kernel/events/core.c index a2899b6..7b769fa 100644 --- a/kernel/kernel/events/core.c +++ b/kernel/kernel/events/core.c @@ -1113,7 +1113,7 @@ cpuctx->hrtimer_interval = ns_to_ktime(NSEC_PER_MSEC * interval); raw_spin_lock_init(&cpuctx->hrtimer_lock); - hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); + hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED_HARD); timer->function = perf_mux_hrtimer_handler; } @@ -9307,7 +9307,7 @@ if (!is_sampling_event(event)) return; - hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); hwc->hrtimer.function = perf_swevent_hrtimer; /* diff --git a/kernel/kernel/exit.c b/kernel/kernel/exit.c index f36ad1b..bc3aa8c 100644 --- a/kernel/kernel/exit.c +++ b/kernel/kernel/exit.c @@ -160,7 +160,7 @@ * Do this under ->siglock, we can race with another thread * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals. */ - flush_sigqueue(&tsk->pending); + flush_task_sigqueue(tsk); tsk->sighand = NULL; spin_unlock(&sighand->siglock); diff --git a/kernel/kernel/fork.c b/kernel/kernel/fork.c index 1891a2a..6e880eb 100644 --- a/kernel/kernel/fork.c +++ b/kernel/kernel/fork.c @@ -42,6 +42,7 @@ #include <linux/hmm.h> #include <linux/fs.h> #include <linux/mm.h> +#include <linux/kprobes.h> #include <linux/vmacache.h> #include <linux/nsproxy.h> #include <linux/capability.h> @@ -649,6 +650,19 @@ } EXPORT_SYMBOL_GPL(__mmdrop); +#ifdef CONFIG_PREEMPT_RT_BASE +/* + * RCU callback for delayed mm drop. Not strictly rcu, but we don't + * want another facility to make this work. + */ +void __mmdrop_delayed(struct rcu_head *rhp) +{ + struct mm_struct *mm = container_of(rhp, struct mm_struct, delayed_drop); + + __mmdrop(mm); +} +#endif + static void mmdrop_async_fn(struct work_struct *work) { struct mm_struct *mm; @@ -683,12 +697,23 @@ if (atomic_dec_and_test(&sig->sigcnt)) free_signal_struct(sig); } - +#ifdef CONFIG_PREEMPT_RT_BASE +static +#endif void __put_task_struct(struct task_struct *tsk) { WARN_ON(!tsk->exit_state); WARN_ON(atomic_read(&tsk->usage)); WARN_ON(tsk == current); + + /* + * Remove function-return probe instances associated with this + * task and put them back on the free list. + */ + kprobe_flush_task(tsk); + + /* Task is done with its stack. */ + put_task_stack(tsk); cgroup_free(tsk); task_numa_free(tsk, true); @@ -700,7 +725,18 @@ if (!profile_handoff_task(tsk)) free_task(tsk); } +#ifndef CONFIG_PREEMPT_RT_BASE EXPORT_SYMBOL_GPL(__put_task_struct); +#else +void __put_task_struct_cb(struct rcu_head *rhp) +{ + struct task_struct *tsk = container_of(rhp, struct task_struct, put_rcu); + + __put_task_struct(tsk); + +} +EXPORT_SYMBOL_GPL(__put_task_struct_cb); +#endif void __init __weak arch_task_cache_init(void) { } @@ -863,6 +899,8 @@ #ifdef CONFIG_STACKPROTECTOR tsk->stack_canary = get_random_canary(); #endif + if (orig->cpus_ptr == &orig->cpus_mask) + tsk->cpus_ptr = &tsk->cpus_mask; /* * One for us, one for whoever does the "release_task()" (usually @@ -875,6 +913,7 @@ tsk->splice_pipe = NULL; tsk->task_frag.page = NULL; tsk->wake_q.next = NULL; + tsk->wake_q_sleeper.next = NULL; account_kernel_stack(tsk, 1); @@ -1600,6 +1639,9 @@ */ static void posix_cpu_timers_init(struct task_struct *tsk) { +#ifdef CONFIG_PREEMPT_RT_BASE + tsk->posix_timer_list = NULL; +#endif tsk->cputime_expires.prof_exp = 0; tsk->cputime_expires.virt_exp = 0; tsk->cputime_expires.sched_exp = 0; @@ -1915,6 +1957,7 @@ spin_lock_init(&p->alloc_lock); init_sigpending(&p->pending); + p->sigqueue_cache = NULL; p->utime = p->stime = p->gtime = 0; #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME diff --git a/kernel/kernel/futex.c b/kernel/kernel/futex.c index 3c67da9..81090f7 100644 --- a/kernel/kernel/futex.c +++ b/kernel/kernel/futex.c @@ -962,7 +962,9 @@ if (head->next != next) { /* retain curr->pi_lock for the loop invariant */ raw_spin_unlock(&pi_state->pi_mutex.wait_lock); + raw_spin_unlock_irq(&curr->pi_lock); spin_unlock(&hb->lock); + raw_spin_lock_irq(&curr->pi_lock); put_pi_state(pi_state); continue; } @@ -1573,6 +1575,7 @@ struct task_struct *new_owner; bool postunlock = false; DEFINE_WAKE_Q(wake_q); + DEFINE_WAKE_Q(wake_sleeper_q); int ret = 0; new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); @@ -1622,14 +1625,15 @@ * not fail. */ pi_state_update_owner(pi_state, new_owner); - postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q); + postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q, + &wake_sleeper_q); } out_unlock: raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); if (postunlock) - rt_mutex_postunlock(&wake_q); + rt_mutex_postunlock(&wake_q, &wake_sleeper_q); return ret; } @@ -2253,6 +2257,16 @@ requeue_pi_wake_futex(this, &key2, hb2); drop_count++; continue; + } else if (ret == -EAGAIN) { + /* + * Waiter was woken by timeout or + * signal and has set pi_blocked_on to + * PI_WAKEUP_INPROGRESS before we + * tried to enqueue it on the rtmutex. + */ + this->pi_state = NULL; + put_pi_state(pi_state); + continue; } else if (ret) { /* * rt_mutex_start_proxy_lock() detected a @@ -2816,10 +2830,9 @@ if (abs_time) { to = &timeout; - hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? - CLOCK_REALTIME : CLOCK_MONOTONIC, - HRTIMER_MODE_ABS); - hrtimer_init_sleeper(to, current); + hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ? + CLOCK_REALTIME : CLOCK_MONOTONIC, + HRTIMER_MODE_ABS, current); hrtimer_set_expires_range_ns(&to->timer, *abs_time, current->timer_slack_ns); } @@ -2917,9 +2930,8 @@ if (time) { to = &timeout; - hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME, - HRTIMER_MODE_ABS); - hrtimer_init_sleeper(to, current); + hrtimer_init_sleeper_on_stack(to, CLOCK_REALTIME, + HRTIMER_MODE_ABS, current); hrtimer_set_expires(&to->timer, *time); } @@ -2982,7 +2994,7 @@ goto no_block; } - rt_mutex_init_waiter(&rt_waiter); + rt_mutex_init_waiter(&rt_waiter, false); /* * On PREEMPT_RT_FULL, when hb->lock becomes an rt_mutex, we must not @@ -2998,6 +3010,14 @@ * before __rt_mutex_start_proxy_lock() is done. */ raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock); + /* + * the migrate_disable() here disables migration in the in_atomic() fast + * path which is enabled again in the following spin_unlock(). We have + * one migrate_disable() pending in the slow-path which is reversed + * after the raw_spin_unlock_irq() where we leave the atomic context. + */ + migrate_disable(); + spin_unlock(q.lock_ptr); /* * __rt_mutex_start_proxy_lock() unconditionally enqueues the @rt_waiter @@ -3006,6 +3026,7 @@ */ ret = __rt_mutex_start_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter, current); raw_spin_unlock_irq(&q.pi_state->pi_mutex.wait_lock); + migrate_enable(); if (ret) { if (ret == 1) @@ -3140,10 +3161,19 @@ * rt_waiter. Also see the WARN in wake_futex_pi(). */ raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); + /* + * Magic trickery for now to make the RT migrate disable + * logic happy. The following spin_unlock() happens with + * interrupts disabled so the internal migrate_enable() + * won't undo the migrate_disable() which was issued when + * locking hb->lock. + */ + migrate_disable(); spin_unlock(&hb->lock); /* drops pi_state->pi_mutex.wait_lock */ ret = wake_futex_pi(uaddr, uval, pi_state); + migrate_enable(); put_pi_state(pi_state); @@ -3314,7 +3344,7 @@ { struct hrtimer_sleeper timeout, *to = NULL; struct rt_mutex_waiter rt_waiter; - struct futex_hash_bucket *hb; + struct futex_hash_bucket *hb, *hb2; union futex_key key2 = FUTEX_KEY_INIT; struct futex_q q = futex_q_init; int res, ret; @@ -3330,10 +3360,9 @@ if (abs_time) { to = &timeout; - hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? - CLOCK_REALTIME : CLOCK_MONOTONIC, - HRTIMER_MODE_ABS); - hrtimer_init_sleeper(to, current); + hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ? + CLOCK_REALTIME : CLOCK_MONOTONIC, + HRTIMER_MODE_ABS, current); hrtimer_set_expires_range_ns(&to->timer, *abs_time, current->timer_slack_ns); } @@ -3342,7 +3371,7 @@ * The waiter is allocated on our stack, manipulated by the requeue * code while we sleep on uaddr. */ - rt_mutex_init_waiter(&rt_waiter); + rt_mutex_init_waiter(&rt_waiter, false); ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE); if (unlikely(ret != 0)) @@ -3373,20 +3402,55 @@ /* Queue the futex_q, drop the hb lock, wait for wakeup. */ futex_wait_queue_me(hb, &q, to); - spin_lock(&hb->lock); - ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); - spin_unlock(&hb->lock); - if (ret) - goto out_put_keys; + /* + * On RT we must avoid races with requeue and trying to block + * on two mutexes (hb->lock and uaddr2's rtmutex) by + * serializing access to pi_blocked_on with pi_lock. + */ + raw_spin_lock_irq(¤t->pi_lock); + if (current->pi_blocked_on) { + /* + * We have been requeued or are in the process of + * being requeued. + */ + raw_spin_unlock_irq(¤t->pi_lock); + } else { + /* + * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS + * prevents a concurrent requeue from moving us to the + * uaddr2 rtmutex. After that we can safely acquire + * (and possibly block on) hb->lock. + */ + current->pi_blocked_on = PI_WAKEUP_INPROGRESS; + raw_spin_unlock_irq(¤t->pi_lock); + + spin_lock(&hb->lock); + + /* + * Clean up pi_blocked_on. We might leak it otherwise + * when we succeeded with the hb->lock in the fast + * path. + */ + raw_spin_lock_irq(¤t->pi_lock); + current->pi_blocked_on = NULL; + raw_spin_unlock_irq(¤t->pi_lock); + + ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); + spin_unlock(&hb->lock); + if (ret) + goto out_put_keys; + } /* - * In order for us to be here, we know our q.key == key2, and since - * we took the hb->lock above, we also know that futex_requeue() has - * completed and we no longer have to concern ourselves with a wakeup - * race with the atomic proxy lock acquisition by the requeue code. The - * futex_requeue dropped our key1 reference and incremented our key2 - * reference count. + * In order to be here, we have either been requeued, are in + * the process of being requeued, or requeue successfully + * acquired uaddr2 on our behalf. If pi_blocked_on was + * non-null above, we may be racing with a requeue. Do not + * rely on q->lock_ptr to be hb2->lock until after blocking on + * hb->lock or hb2->lock. The futex_requeue dropped our key1 + * reference and incremented our key2 reference count. */ + hb2 = hash_futex(&key2); /* Check if the requeue code acquired the second futex for us. */ if (!q.rt_waiter) { @@ -3395,14 +3459,15 @@ * did a lock-steal - fix up the PI-state in that case. */ if (q.pi_state && (q.pi_state->owner != current)) { - spin_lock(q.lock_ptr); + spin_lock(&hb2->lock); + BUG_ON(&hb2->lock != q.lock_ptr); ret = fixup_pi_state_owner(uaddr2, &q, current); /* * Drop the reference to the pi state which * the requeue_pi() code acquired for us. */ put_pi_state(q.pi_state); - spin_unlock(q.lock_ptr); + spin_unlock(&hb2->lock); /* * Adjust the return value. It's either -EFAULT or * success (1) but the caller expects 0 for success. @@ -3421,7 +3486,8 @@ pi_mutex = &q.pi_state->pi_mutex; ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); - spin_lock(q.lock_ptr); + spin_lock(&hb2->lock); + BUG_ON(&hb2->lock != q.lock_ptr); if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) ret = 0; diff --git a/kernel/kernel/irq/handle.c b/kernel/kernel/irq/handle.c index 38554bc..06a80bb 100644 --- a/kernel/kernel/irq/handle.c +++ b/kernel/kernel/irq/handle.c @@ -185,10 +185,16 @@ { irqreturn_t retval; unsigned int flags = 0; + struct pt_regs *regs = get_irq_regs(); + u64 ip = regs ? instruction_pointer(regs) : 0; retval = __handle_irq_event_percpu(desc, &flags); - add_interrupt_randomness(desc->irq_data.irq, flags); +#ifdef CONFIG_PREEMPT_RT_FULL + desc->random_ip = ip; +#else + add_interrupt_randomness(desc->irq_data.irq, flags, ip); +#endif if (!noirqdebug) note_interrupt(desc, retval); diff --git a/kernel/kernel/irq/manage.c b/kernel/kernel/irq/manage.c index 39d6bc9..c7ee23f 100644 --- a/kernel/kernel/irq/manage.c +++ b/kernel/kernel/irq/manage.c @@ -24,6 +24,7 @@ #include "internals.h" #ifdef CONFIG_IRQ_FORCED_THREADING +# ifndef CONFIG_PREEMPT_RT_BASE __read_mostly bool force_irqthreads; EXPORT_SYMBOL_GPL(force_irqthreads); @@ -33,6 +34,7 @@ return 0; } early_param("threadirqs", setup_forced_irqthreads); +# endif #endif static void __synchronize_hardirq(struct irq_desc *desc, bool sync_chip) @@ -1095,6 +1097,12 @@ if (action_ret == IRQ_WAKE_THREAD) irq_wake_secondary(desc, action); +#ifdef CONFIG_PREEMPT_RT_FULL + migrate_disable(); + add_interrupt_randomness(action->irq, 0, + desc->random_ip ^ (unsigned long) action); + migrate_enable(); +#endif wake_threads_waitq(desc); } @@ -1506,6 +1514,9 @@ irq_settings_set_no_balancing(desc); irqd_set(&desc->irq_data, IRQD_NO_BALANCING); } + + if (new->flags & IRQF_NO_SOFTIRQ_CALL) + irq_settings_set_no_softirq_call(desc); if (irq_settings_can_autoenable(desc)) { irq_startup(desc, IRQ_RESEND, IRQ_START_COND); @@ -2312,7 +2323,7 @@ * This call sets the internal irqchip state of an interrupt, * depending on the value of @which. * - * This function should be called with preemption disabled if the + * This function should be called with migration disabled if the * interrupt controller has per-cpu registers. */ int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which, diff --git a/kernel/kernel/irq/settings.h b/kernel/kernel/irq/settings.h index e43795c..47e2f9e 100644 --- a/kernel/kernel/irq/settings.h +++ b/kernel/kernel/irq/settings.h @@ -17,6 +17,7 @@ _IRQ_PER_CPU_DEVID = IRQ_PER_CPU_DEVID, _IRQ_IS_POLLED = IRQ_IS_POLLED, _IRQ_DISABLE_UNLAZY = IRQ_DISABLE_UNLAZY, + _IRQ_NO_SOFTIRQ_CALL = IRQ_NO_SOFTIRQ_CALL, _IRQF_MODIFY_MASK = IRQF_MODIFY_MASK, }; @@ -31,6 +32,7 @@ #define IRQ_PER_CPU_DEVID GOT_YOU_MORON #define IRQ_IS_POLLED GOT_YOU_MORON #define IRQ_DISABLE_UNLAZY GOT_YOU_MORON +#define IRQ_NO_SOFTIRQ_CALL GOT_YOU_MORON #undef IRQF_MODIFY_MASK #define IRQF_MODIFY_MASK GOT_YOU_MORON @@ -41,6 +43,16 @@ desc->status_use_accessors |= (set & _IRQF_MODIFY_MASK); } +static inline bool irq_settings_no_softirq_call(struct irq_desc *desc) +{ + return desc->status_use_accessors & _IRQ_NO_SOFTIRQ_CALL; +} + +static inline void irq_settings_set_no_softirq_call(struct irq_desc *desc) +{ + desc->status_use_accessors |= _IRQ_NO_SOFTIRQ_CALL; +} + static inline bool irq_settings_is_per_cpu(struct irq_desc *desc) { return desc->status_use_accessors & _IRQ_PER_CPU; diff --git a/kernel/kernel/irq/spurious.c b/kernel/kernel/irq/spurious.c index d867d6d..cd12ee8 100644 --- a/kernel/kernel/irq/spurious.c +++ b/kernel/kernel/irq/spurious.c @@ -442,6 +442,10 @@ static int __init irqfixup_setup(char *str) { +#ifdef CONFIG_PREEMPT_RT_BASE + pr_warn("irqfixup boot option not supported w/ CONFIG_PREEMPT_RT_BASE\n"); + return 1; +#endif irqfixup = 1; printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n"); printk(KERN_WARNING "This may impact system performance.\n"); @@ -454,6 +458,10 @@ static int __init irqpoll_setup(char *str) { +#ifdef CONFIG_PREEMPT_RT_BASE + pr_warn("irqpoll boot option not supported w/ CONFIG_PREEMPT_RT_BASE\n"); + return 1; +#endif irqfixup = 2; printk(KERN_WARNING "Misrouted IRQ fixup and polling support " "enabled\n"); diff --git a/kernel/kernel/irq_work.c b/kernel/kernel/irq_work.c index 7328891..b6d9d35 100644 --- a/kernel/kernel/irq_work.c +++ b/kernel/kernel/irq_work.c @@ -17,6 +17,7 @@ #include <linux/cpu.h> #include <linux/notifier.h> #include <linux/smp.h> +#include <linux/interrupt.h> #include <asm/processor.h> @@ -57,29 +58,40 @@ } /* Enqueue on current CPU, work must already be claimed and preempt disabled */ -static void __irq_work_queue_local(struct irq_work *work) +static void __irq_work_queue_local(struct irq_work *work, struct llist_head *list) { - /* If the work is "lazy", handle it from next tick if any */ - if (work->flags & IRQ_WORK_LAZY) { - if (llist_add(&work->llnode, this_cpu_ptr(&lazy_list)) && - tick_nohz_tick_stopped()) - arch_irq_work_raise(); - } else { - if (llist_add(&work->llnode, this_cpu_ptr(&raised_list))) - arch_irq_work_raise(); - } + bool empty; + + empty = llist_add(&work->llnode, list); + + if (empty && + (!(work->flags & IRQ_WORK_LAZY) || + tick_nohz_tick_stopped())) + arch_irq_work_raise(); +} + +static inline bool use_lazy_list(struct irq_work *work) +{ + return (IS_ENABLED(CONFIG_PREEMPT_RT_FULL) && !(work->flags & IRQ_WORK_HARD_IRQ)) + || (work->flags & IRQ_WORK_LAZY); } /* Enqueue the irq work @work on the current CPU */ bool irq_work_queue(struct irq_work *work) { + struct llist_head *list; + /* Only queue if not already pending */ if (!irq_work_claim(work)) return false; /* Queue the entry and raise the IPI if needed. */ preempt_disable(); - __irq_work_queue_local(work); + if (use_lazy_list(work)) + list = this_cpu_ptr(&lazy_list); + else + list = this_cpu_ptr(&raised_list); + __irq_work_queue_local(work, list); preempt_enable(); return true; @@ -98,6 +110,8 @@ return irq_work_queue(work); #else /* CONFIG_SMP: */ + struct llist_head *list; + /* All work should have been flushed before going offline */ WARN_ON_ONCE(cpu_is_offline(cpu)); @@ -106,13 +120,18 @@ return false; preempt_disable(); + if (use_lazy_list(work)) + list = &per_cpu(lazy_list, cpu); + else + list = &per_cpu(raised_list, cpu); + if (cpu != smp_processor_id()) { /* Arch remote IPI send/receive backend aren't NMI safe */ WARN_ON_ONCE(in_nmi()); - if (llist_add(&work->llnode, &per_cpu(raised_list, cpu))) + if (llist_add(&work->llnode, list)) arch_send_call_function_single_ipi(cpu); } else { - __irq_work_queue_local(work); + __irq_work_queue_local(work, list); } preempt_enable(); @@ -128,9 +147,8 @@ raised = this_cpu_ptr(&raised_list); lazy = this_cpu_ptr(&lazy_list); - if (llist_empty(raised) || arch_irq_work_has_interrupt()) - if (llist_empty(lazy)) - return false; + if (llist_empty(raised) && llist_empty(lazy)) + return false; /* All work should have been flushed before going offline */ WARN_ON_ONCE(cpu_is_offline(smp_processor_id())); @@ -144,8 +162,12 @@ struct llist_node *llnode; unsigned long flags; +#ifndef CONFIG_PREEMPT_RT_FULL + /* + * nort: On RT IRQ-work may run in SOFTIRQ context. + */ BUG_ON(!irqs_disabled()); - +#endif if (llist_empty(list)) return; @@ -177,7 +199,16 @@ void irq_work_run(void) { irq_work_run_list(this_cpu_ptr(&raised_list)); - irq_work_run_list(this_cpu_ptr(&lazy_list)); + if (IS_ENABLED(CONFIG_PREEMPT_RT_FULL)) { + /* + * NOTE: we raise softirq via IPI for safety, + * and execute in irq_work_tick() to move the + * overhead from hard to soft irq context. + */ + if (!llist_empty(this_cpu_ptr(&lazy_list))) + raise_softirq(TIMER_SOFTIRQ); + } else + irq_work_run_list(this_cpu_ptr(&lazy_list)); } EXPORT_SYMBOL_GPL(irq_work_run); @@ -187,8 +218,17 @@ if (!llist_empty(raised) && !arch_irq_work_has_interrupt()) irq_work_run_list(raised); + + if (!IS_ENABLED(CONFIG_PREEMPT_RT_FULL)) + irq_work_run_list(this_cpu_ptr(&lazy_list)); +} + +#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL) +void irq_work_tick_soft(void) +{ irq_work_run_list(this_cpu_ptr(&lazy_list)); } +#endif /* * Synchronize against the irq_work @entry, ensures the entry is not diff --git a/kernel/kernel/ksysfs.c b/kernel/kernel/ksysfs.c index d5fb460..a23135b 100644 --- a/kernel/kernel/ksysfs.c +++ b/kernel/kernel/ksysfs.c @@ -140,6 +140,15 @@ #endif /* CONFIG_CRASH_CORE */ +#if defined(CONFIG_PREEMPT_RT_FULL) +static ssize_t realtime_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, "%d\n", 1); +} +KERNEL_ATTR_RO(realtime); +#endif + /* whether file capabilities are enabled */ static ssize_t fscaps_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) @@ -231,6 +240,9 @@ &rcu_expedited_attr.attr, &rcu_normal_attr.attr, #endif +#ifdef CONFIG_PREEMPT_RT_FULL + &realtime_attr.attr, +#endif NULL }; diff --git a/kernel/kernel/kthread.c b/kernel/kernel/kthread.c index e7a8797..f09fe68 100644 --- a/kernel/kernel/kthread.c +++ b/kernel/kernel/kthread.c @@ -638,7 +638,7 @@ struct lock_class_key *key) { memset(worker, 0, sizeof(struct kthread_worker)); - spin_lock_init(&worker->lock); + raw_spin_lock_init(&worker->lock); lockdep_set_class_and_name(&worker->lock, key, name); INIT_LIST_HEAD(&worker->work_list); INIT_LIST_HEAD(&worker->delayed_work_list); @@ -680,21 +680,21 @@ if (kthread_should_stop()) { __set_current_state(TASK_RUNNING); - spin_lock_irq(&worker->lock); + raw_spin_lock_irq(&worker->lock); worker->task = NULL; - spin_unlock_irq(&worker->lock); + raw_spin_unlock_irq(&worker->lock); return 0; } work = NULL; - spin_lock_irq(&worker->lock); + raw_spin_lock_irq(&worker->lock); if (!list_empty(&worker->work_list)) { work = list_first_entry(&worker->work_list, struct kthread_work, node); list_del_init(&work->node); } worker->current_work = work; - spin_unlock_irq(&worker->lock); + raw_spin_unlock_irq(&worker->lock); if (work) { __set_current_state(TASK_RUNNING); @@ -851,12 +851,12 @@ bool ret = false; unsigned long flags; - spin_lock_irqsave(&worker->lock, flags); + raw_spin_lock_irqsave(&worker->lock, flags); if (!queuing_blocked(worker, work)) { kthread_insert_work(worker, work, &worker->work_list); ret = true; } - spin_unlock_irqrestore(&worker->lock, flags); + raw_spin_unlock_irqrestore(&worker->lock, flags); return ret; } EXPORT_SYMBOL_GPL(kthread_queue_work); @@ -882,7 +882,7 @@ if (WARN_ON_ONCE(!worker)) return; - spin_lock(&worker->lock); + raw_spin_lock(&worker->lock); /* Work must not be used with >1 worker, see kthread_queue_work(). */ WARN_ON_ONCE(work->worker != worker); @@ -892,7 +892,7 @@ if (!work->canceling) kthread_insert_work(worker, work, &worker->work_list); - spin_unlock(&worker->lock); + raw_spin_unlock(&worker->lock); } EXPORT_SYMBOL(kthread_delayed_work_timer_fn); @@ -948,14 +948,14 @@ unsigned long flags; bool ret = false; - spin_lock_irqsave(&worker->lock, flags); + raw_spin_lock_irqsave(&worker->lock, flags); if (!queuing_blocked(worker, work)) { __kthread_queue_delayed_work(worker, dwork, delay); ret = true; } - spin_unlock_irqrestore(&worker->lock, flags); + raw_spin_unlock_irqrestore(&worker->lock, flags); return ret; } EXPORT_SYMBOL_GPL(kthread_queue_delayed_work); @@ -991,7 +991,7 @@ if (!worker) return; - spin_lock_irq(&worker->lock); + raw_spin_lock_irq(&worker->lock); /* Work must not be used with >1 worker, see kthread_queue_work(). */ WARN_ON_ONCE(work->worker != worker); @@ -1003,7 +1003,7 @@ else noop = true; - spin_unlock_irq(&worker->lock); + raw_spin_unlock_irq(&worker->lock); if (!noop) wait_for_completion(&fwork.done); @@ -1031,9 +1031,9 @@ * any queuing is blocked by setting the canceling counter. */ work->canceling++; - spin_unlock_irqrestore(&worker->lock, *flags); + raw_spin_unlock_irqrestore(&worker->lock, *flags); del_timer_sync(&dwork->timer); - spin_lock_irqsave(&worker->lock, *flags); + raw_spin_lock_irqsave(&worker->lock, *flags); work->canceling--; } @@ -1095,7 +1095,7 @@ unsigned long flags; int ret = false; - spin_lock_irqsave(&worker->lock, flags); + raw_spin_lock_irqsave(&worker->lock, flags); /* Do not bother with canceling when never queued. */ if (!work->worker) @@ -1124,7 +1124,7 @@ fast_queue: __kthread_queue_delayed_work(worker, dwork, delay); out: - spin_unlock_irqrestore(&worker->lock, flags); + raw_spin_unlock_irqrestore(&worker->lock, flags); return ret; } EXPORT_SYMBOL_GPL(kthread_mod_delayed_work); @@ -1138,7 +1138,7 @@ if (!worker) goto out; - spin_lock_irqsave(&worker->lock, flags); + raw_spin_lock_irqsave(&worker->lock, flags); /* Work must not be used with >1 worker, see kthread_queue_work(). */ WARN_ON_ONCE(work->worker != worker); @@ -1155,13 +1155,13 @@ * In the meantime, block any queuing by setting the canceling counter. */ work->canceling++; - spin_unlock_irqrestore(&worker->lock, flags); + raw_spin_unlock_irqrestore(&worker->lock, flags); kthread_flush_work(work); - spin_lock_irqsave(&worker->lock, flags); + raw_spin_lock_irqsave(&worker->lock, flags); work->canceling--; out_fast: - spin_unlock_irqrestore(&worker->lock, flags); + raw_spin_unlock_irqrestore(&worker->lock, flags); out: return ret; } diff --git a/kernel/kernel/locking/Makefile b/kernel/kernel/locking/Makefile index 392c7f2..c0bf04b 100644 --- a/kernel/kernel/locking/Makefile +++ b/kernel/kernel/locking/Makefile @@ -3,7 +3,7 @@ # and is generally not a function of system call inputs. KCOV_INSTRUMENT := n -obj-y += mutex.o semaphore.o rwsem.o percpu-rwsem.o +obj-y += semaphore.o percpu-rwsem.o ifdef CONFIG_FUNCTION_TRACER CFLAGS_REMOVE_lockdep.o = $(CC_FLAGS_FTRACE) @@ -12,7 +12,11 @@ CFLAGS_REMOVE_rtmutex-debug.o = $(CC_FLAGS_FTRACE) endif +ifneq ($(CONFIG_PREEMPT_RT_FULL),y) +obj-y += mutex.o obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o +endif +obj-y += rwsem.o obj-$(CONFIG_LOCKDEP) += lockdep.o ifeq ($(CONFIG_PROC_FS),y) obj-$(CONFIG_LOCKDEP) += lockdep_proc.o @@ -25,8 +29,11 @@ obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o +ifneq ($(CONFIG_PREEMPT_RT_FULL),y) obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem-xadd.o +endif +obj-$(CONFIG_PREEMPT_RT_FULL) += mutex-rt.o rwsem-rt.o rwlock-rt.o obj-$(CONFIG_QUEUED_RWLOCKS) += qrwlock.o obj-$(CONFIG_LOCK_TORTURE_TEST) += locktorture.o obj-$(CONFIG_WW_MUTEX_SELFTEST) += test-ww_mutex.o diff --git a/kernel/kernel/locking/lockdep.c b/kernel/kernel/locking/lockdep.c index 4dc79f5..4dd8342 100644 --- a/kernel/kernel/locking/lockdep.c +++ b/kernel/kernel/locking/lockdep.c @@ -3831,6 +3831,7 @@ } } +#ifndef CONFIG_PREEMPT_RT_FULL /* * We dont accurately track softirq state in e.g. * hardirq contexts (such as on 4KSTACKS), so only @@ -3845,6 +3846,7 @@ DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled); } } +#endif if (!debug_locks) print_irqtrace_events(current); diff --git a/kernel/kernel/locking/locktorture.c b/kernel/kernel/locking/locktorture.c index 95395ef..5748c19 100644 --- a/kernel/kernel/locking/locktorture.c +++ b/kernel/kernel/locking/locktorture.c @@ -29,7 +29,6 @@ #include <linux/kthread.h> #include <linux/sched/rt.h> #include <linux/spinlock.h> -#include <linux/rwlock.h> #include <linux/mutex.h> #include <linux/rwsem.h> #include <linux/smp.h> diff --git a/kernel/kernel/locking/mutex-rt.c b/kernel/kernel/locking/mutex-rt.c new file mode 100644 index 0000000..4f81595 --- /dev/null +++ b/kernel/kernel/locking/mutex-rt.c @@ -0,0 +1,223 @@ +/* + * kernel/rt.c + * + * Real-Time Preemption Support + * + * started by Ingo Molnar: + * + * Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> + * Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com> + * + * historic credit for proving that Linux spinlocks can be implemented via + * RT-aware mutexes goes to many people: The Pmutex project (Dirk Grambow + * and others) who prototyped it on 2.4 and did lots of comparative + * research and analysis; TimeSys, for proving that you can implement a + * fully preemptible kernel via the use of IRQ threading and mutexes; + * Bill Huey for persuasively arguing on lkml that the mutex model is the + * right one; and to MontaVista, who ported pmutexes to 2.6. + * + * This code is a from-scratch implementation and is not based on pmutexes, + * but the idea of converting spinlocks to mutexes is used here too. + * + * lock debugging, locking tree, deadlock detection: + * + * Copyright (C) 2004, LynuxWorks, Inc., Igor Manyilov, Bill Huey + * Released under the General Public License (GPL). + * + * Includes portions of the generic R/W semaphore implementation from: + * + * Copyright (c) 2001 David Howells (dhowells@redhat.com). + * - Derived partially from idea by Andrea Arcangeli <andrea@suse.de> + * - Derived also from comments by Linus + * + * Pending ownership of locks and ownership stealing: + * + * Copyright (C) 2005, Kihon Technologies Inc., Steven Rostedt + * + * (also by Steven Rostedt) + * - Converted single pi_lock to individual task locks. + * + * By Esben Nielsen: + * Doing priority inheritance with help of the scheduler. + * + * Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com> + * - major rework based on Esben Nielsens initial patch + * - replaced thread_info references by task_struct refs + * - removed task->pending_owner dependency + * - BKL drop/reacquire for semaphore style locks to avoid deadlocks + * in the scheduler return path as discussed with Steven Rostedt + * + * Copyright (C) 2006, Kihon Technologies Inc. + * Steven Rostedt <rostedt@goodmis.org> + * - debugged and patched Thomas Gleixner's rework. + * - added back the cmpxchg to the rework. + * - turned atomic require back on for SMP. + */ + +#include <linux/spinlock.h> +#include <linux/rtmutex.h> +#include <linux/sched.h> +#include <linux/delay.h> +#include <linux/module.h> +#include <linux/kallsyms.h> +#include <linux/syscalls.h> +#include <linux/interrupt.h> +#include <linux/plist.h> +#include <linux/fs.h> +#include <linux/futex.h> +#include <linux/hrtimer.h> + +#include "rtmutex_common.h" + +/* + * struct mutex functions + */ +void __mutex_do_init(struct mutex *mutex, const char *name, + struct lock_class_key *key) +{ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + /* + * Make sure we are not reinitializing a held lock: + */ + debug_check_no_locks_freed((void *)mutex, sizeof(*mutex)); + lockdep_init_map(&mutex->dep_map, name, key, 0); +#endif + mutex->lock.save_state = 0; +} +EXPORT_SYMBOL(__mutex_do_init); + +void __lockfunc _mutex_lock(struct mutex *lock) +{ + mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); + __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); +} +EXPORT_SYMBOL(_mutex_lock); + +void __lockfunc _mutex_lock_io(struct mutex *lock) +{ + int token; + + token = io_schedule_prepare(); + _mutex_lock(lock); + io_schedule_finish(token); +} +EXPORT_SYMBOL_GPL(_mutex_lock_io); + +int __lockfunc _mutex_lock_interruptible(struct mutex *lock) +{ + int ret; + + mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); + ret = __rt_mutex_lock_state(&lock->lock, TASK_INTERRUPTIBLE); + if (ret) + mutex_release(&lock->dep_map, 1, _RET_IP_); + return ret; +} +EXPORT_SYMBOL(_mutex_lock_interruptible); + +int __lockfunc _mutex_lock_killable(struct mutex *lock) +{ + int ret; + + mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); + ret = __rt_mutex_lock_state(&lock->lock, TASK_KILLABLE); + if (ret) + mutex_release(&lock->dep_map, 1, _RET_IP_); + return ret; +} +EXPORT_SYMBOL(_mutex_lock_killable); + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass) +{ + mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); + __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); +} +EXPORT_SYMBOL(_mutex_lock_nested); + +void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass) +{ + int token; + + token = io_schedule_prepare(); + + mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); + __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); + + io_schedule_finish(token); +} +EXPORT_SYMBOL_GPL(_mutex_lock_io_nested); + +void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest) +{ + mutex_acquire_nest(&lock->dep_map, 0, 0, nest, _RET_IP_); + __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); +} +EXPORT_SYMBOL(_mutex_lock_nest_lock); + +int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass) +{ + int ret; + + mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); + ret = __rt_mutex_lock_state(&lock->lock, TASK_INTERRUPTIBLE); + if (ret) + mutex_release(&lock->dep_map, 1, _RET_IP_); + return ret; +} +EXPORT_SYMBOL(_mutex_lock_interruptible_nested); + +int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass) +{ + int ret; + + mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); + ret = __rt_mutex_lock_state(&lock->lock, TASK_KILLABLE); + if (ret) + mutex_release(&lock->dep_map, 1, _RET_IP_); + return ret; +} +EXPORT_SYMBOL(_mutex_lock_killable_nested); +#endif + +int __lockfunc _mutex_trylock(struct mutex *lock) +{ + int ret = __rt_mutex_trylock(&lock->lock); + + if (ret) + mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); + + return ret; +} +EXPORT_SYMBOL(_mutex_trylock); + +void __lockfunc _mutex_unlock(struct mutex *lock) +{ + mutex_release(&lock->dep_map, 1, _RET_IP_); + __rt_mutex_unlock(&lock->lock); +} +EXPORT_SYMBOL(_mutex_unlock); + +/** + * atomic_dec_and_mutex_lock - return holding mutex if we dec to 0 + * @cnt: the atomic which we are to dec + * @lock: the mutex to return holding if we dec to 0 + * + * return true and hold lock if we dec to 0, return false otherwise + */ +int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock) +{ + /* dec if we can't possibly hit 0 */ + if (atomic_add_unless(cnt, -1, 1)) + return 0; + /* we might hit 0, so take the lock */ + mutex_lock(lock); + if (!atomic_dec_and_test(cnt)) { + /* when we actually did the dec, we didn't hit 0 */ + mutex_unlock(lock); + return 0; + } + /* we hit 0, and we hold the lock */ + return 1; +} +EXPORT_SYMBOL(atomic_dec_and_mutex_lock); diff --git a/kernel/kernel/locking/rtmutex.c b/kernel/kernel/locking/rtmutex.c index a5ec4f6..fe5153f 100644 --- a/kernel/kernel/locking/rtmutex.c +++ b/kernel/kernel/locking/rtmutex.c @@ -7,6 +7,11 @@ * Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner <tglx@timesys.com> * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt * Copyright (C) 2006 Esben Nielsen + * Adaptive Spinlocks: + * Copyright (C) 2008 Novell, Inc., Gregory Haskins, Sven Dietrich, + * and Peter Morreale, + * Adaptive Spinlocks simplification: + * Copyright (C) 2008 Red Hat, Inc., Steven Rostedt <srostedt@redhat.com> * * See Documentation/locking/rt-mutex-design.txt for details. */ @@ -18,6 +23,8 @@ #include <linux/sched/wake_q.h> #include <linux/sched/debug.h> #include <linux/timer.h> +#include <linux/ww_mutex.h> +#include <linux/blkdev.h> #include "rtmutex_common.h" @@ -135,6 +142,12 @@ WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS); } +static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) +{ + return waiter && waiter != PI_WAKEUP_INPROGRESS && + waiter != PI_REQUEUE_INPROGRESS; +} + /* * We can speed up the acquire/release, if there's no debugging state to be * set up. @@ -228,7 +241,7 @@ * Only use with rt_mutex_waiter_{less,equal}() */ #define task_to_waiter(p) \ - &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline } + &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline, .task = (p) } static inline int rt_mutex_waiter_less(struct rt_mutex_waiter *left, @@ -266,6 +279,27 @@ return left->deadline == right->deadline; return 1; +} + +#define STEAL_NORMAL 0 +#define STEAL_LATERAL 1 + +static inline int +rt_mutex_steal(struct rt_mutex *lock, struct rt_mutex_waiter *waiter, int mode) +{ + struct rt_mutex_waiter *top_waiter = rt_mutex_top_waiter(lock); + + if (waiter == top_waiter || rt_mutex_waiter_less(waiter, top_waiter)) + return 1; + + /* + * Note that RT tasks are excluded from lateral-steals + * to prevent the introduction of an unbounded latency. + */ + if (mode == STEAL_NORMAL || rt_task(waiter->task)) + return 0; + + return rt_mutex_waiter_equal(waiter, top_waiter); } static void @@ -372,6 +406,14 @@ return debug_rt_mutex_detect_deadlock(waiter, chwalk); } +static void rt_mutex_wake_waiter(struct rt_mutex_waiter *waiter) +{ + if (waiter->savestate) + wake_up_lock_sleeper(waiter->task); + else + wake_up_process(waiter->task); +} + /* * Max number of times we'll walk the boosting chain: */ @@ -379,7 +421,8 @@ static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) { - return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; + return rt_mutex_real_waiter(p->pi_blocked_on) ? + p->pi_blocked_on->lock : NULL; } /* @@ -515,7 +558,7 @@ * reached or the state of the chain has changed while we * dropped the locks. */ - if (!waiter) + if (!rt_mutex_real_waiter(waiter)) goto out_unlock_pi; /* @@ -696,13 +739,16 @@ * follow here. This is the end of the chain we are walking. */ if (!rt_mutex_owner(lock)) { + struct rt_mutex_waiter *lock_top_waiter; + /* * If the requeue [7] above changed the top waiter, * then we need to wake the new top waiter up to try * to get the lock. */ - if (prerequeue_top_waiter != rt_mutex_top_waiter(lock)) - wake_up_process(rt_mutex_top_waiter(lock)->task); + lock_top_waiter = rt_mutex_top_waiter(lock); + if (prerequeue_top_waiter != lock_top_waiter) + rt_mutex_wake_waiter(lock_top_waiter); raw_spin_unlock_irq(&lock->wait_lock); return 0; } @@ -804,9 +850,11 @@ * @task: The task which wants to acquire the lock * @waiter: The waiter that is queued to the lock's wait tree if the * callsite called task_blocked_on_lock(), otherwise NULL + * @mode: Lock steal mode (STEAL_NORMAL, STEAL_LATERAL) */ -static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, - struct rt_mutex_waiter *waiter) +static int __try_to_take_rt_mutex(struct rt_mutex *lock, + struct task_struct *task, + struct rt_mutex_waiter *waiter, int mode) { lockdep_assert_held(&lock->wait_lock); @@ -842,12 +890,11 @@ */ if (waiter) { /* - * If waiter is not the highest priority waiter of - * @lock, give up. + * If waiter is not the highest priority waiter of @lock, + * or its peer when lateral steal is allowed, give up. */ - if (waiter != rt_mutex_top_waiter(lock)) + if (!rt_mutex_steal(lock, waiter, mode)) return 0; - /* * We can acquire the lock. Remove the waiter from the * lock waiters tree. @@ -865,14 +912,12 @@ */ if (rt_mutex_has_waiters(lock)) { /* - * If @task->prio is greater than or equal to - * the top waiter priority (kernel view), - * @task lost. + * If @task->prio is greater than the top waiter + * priority (kernel view), or equal to it when a + * lateral steal is forbidden, @task lost. */ - if (!rt_mutex_waiter_less(task_to_waiter(task), - rt_mutex_top_waiter(lock))) + if (!rt_mutex_steal(lock, task_to_waiter(task), mode)) return 0; - /* * The current top waiter stays enqueued. We * don't have to change anything in the lock @@ -919,6 +964,344 @@ return 1; } +#ifdef CONFIG_PREEMPT_RT_FULL +/* + * preemptible spin_lock functions: + */ +static inline void rt_spin_lock_fastlock(struct rt_mutex *lock, + void (*slowfn)(struct rt_mutex *lock)) +{ + might_sleep_no_state_check(); + + if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) + return; + else + slowfn(lock); +} + +static inline void rt_spin_lock_fastunlock(struct rt_mutex *lock, + void (*slowfn)(struct rt_mutex *lock)) +{ + if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) + return; + else + slowfn(lock); +} +#ifdef CONFIG_SMP +/* + * Note that owner is a speculative pointer and dereferencing relies + * on rcu_read_lock() and the check against the lock owner. + */ +static int adaptive_wait(struct rt_mutex *lock, + struct task_struct *owner) +{ + int res = 0; + + rcu_read_lock(); + for (;;) { + if (owner != rt_mutex_owner(lock)) + break; + /* + * Ensure that owner->on_cpu is dereferenced _after_ + * checking the above to be valid. + */ + barrier(); + if (!owner->on_cpu) { + res = 1; + break; + } + cpu_relax(); + } + rcu_read_unlock(); + return res; +} +#else +static int adaptive_wait(struct rt_mutex *lock, + struct task_struct *orig_owner) +{ + return 1; +} +#endif + +static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + struct rt_mutex_waiter *waiter, + struct task_struct *task, + enum rtmutex_chainwalk chwalk); +/* + * Slow path lock function spin_lock style: this variant is very + * careful not to miss any non-lock wakeups. + * + * We store the current state under p->pi_lock in p->saved_state and + * the try_to_wake_up() code handles this accordingly. + */ +void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, + struct rt_mutex_waiter *waiter, + unsigned long flags) +{ + struct task_struct *lock_owner, *self = current; + struct rt_mutex_waiter *top_waiter; + int ret; + + if (__try_to_take_rt_mutex(lock, self, NULL, STEAL_LATERAL)) + return; + + BUG_ON(rt_mutex_owner(lock) == self); + + /* + * We save whatever state the task is in and we'll restore it + * after acquiring the lock taking real wakeups into account + * as well. We are serialized via pi_lock against wakeups. See + * try_to_wake_up(). + */ + raw_spin_lock(&self->pi_lock); + self->saved_state = self->state; + __set_current_state_no_track(TASK_UNINTERRUPTIBLE); + raw_spin_unlock(&self->pi_lock); + + ret = task_blocks_on_rt_mutex(lock, waiter, self, RT_MUTEX_MIN_CHAINWALK); + BUG_ON(ret); + + for (;;) { + /* Try to acquire the lock again. */ + if (__try_to_take_rt_mutex(lock, self, waiter, STEAL_LATERAL)) + break; + + top_waiter = rt_mutex_top_waiter(lock); + lock_owner = rt_mutex_owner(lock); + + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + + debug_rt_mutex_print_deadlock(waiter); + + if (top_waiter != waiter || adaptive_wait(lock, lock_owner)) + schedule(); + + raw_spin_lock_irqsave(&lock->wait_lock, flags); + + raw_spin_lock(&self->pi_lock); + __set_current_state_no_track(TASK_UNINTERRUPTIBLE); + raw_spin_unlock(&self->pi_lock); + } + + /* + * Restore the task state to current->saved_state. We set it + * to the original state above and the try_to_wake_up() code + * has possibly updated it when a real (non-rtmutex) wakeup + * happened while we were blocked. Clear saved_state so + * try_to_wakeup() does not get confused. + */ + raw_spin_lock(&self->pi_lock); + __set_current_state_no_track(self->saved_state); + self->saved_state = TASK_RUNNING; + raw_spin_unlock(&self->pi_lock); + + /* + * try_to_take_rt_mutex() sets the waiter bit + * unconditionally. We might have to fix that up: + */ + fixup_rt_mutex_waiters(lock); + + BUG_ON(rt_mutex_has_waiters(lock) && waiter == rt_mutex_top_waiter(lock)); + BUG_ON(!RB_EMPTY_NODE(&waiter->tree_entry)); +} + +static void noinline __sched rt_spin_lock_slowlock(struct rt_mutex *lock) +{ + struct rt_mutex_waiter waiter; + unsigned long flags; + + rt_mutex_init_waiter(&waiter, true); + + raw_spin_lock_irqsave(&lock->wait_lock, flags); + rt_spin_lock_slowlock_locked(lock, &waiter, flags); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + debug_rt_mutex_free_waiter(&waiter); +} + +static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, + struct wake_q_head *wake_q, + struct wake_q_head *wq_sleeper); +/* + * Slow path to release a rt_mutex spin_lock style + */ +void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock) +{ + unsigned long flags; + DEFINE_WAKE_Q(wake_q); + DEFINE_WAKE_Q(wake_sleeper_q); + bool postunlock; + + raw_spin_lock_irqsave(&lock->wait_lock, flags); + postunlock = __rt_mutex_unlock_common(lock, &wake_q, &wake_sleeper_q); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + + if (postunlock) + rt_mutex_postunlock(&wake_q, &wake_sleeper_q); +} + +void __lockfunc rt_spin_lock(spinlock_t *lock) +{ + sleeping_lock_inc(); + rcu_read_lock(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); +} +EXPORT_SYMBOL(rt_spin_lock); + +void __lockfunc __rt_spin_lock(struct rt_mutex *lock) +{ + rt_spin_lock_fastlock(lock, rt_spin_lock_slowlock); +} + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) +{ + sleeping_lock_inc(); + rcu_read_lock(); + migrate_disable(); + spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); +} +EXPORT_SYMBOL(rt_spin_lock_nested); +#endif + +void __lockfunc rt_spin_unlock(spinlock_t *lock) +{ + /* NOTE: we always pass in '1' for nested, for simplicity */ + spin_release(&lock->dep_map, 1, _RET_IP_); + rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); + migrate_enable(); + rcu_read_unlock(); + sleeping_lock_dec(); +} +EXPORT_SYMBOL(rt_spin_unlock); + +void __lockfunc __rt_spin_unlock(struct rt_mutex *lock) +{ + rt_spin_lock_fastunlock(lock, rt_spin_lock_slowunlock); +} +EXPORT_SYMBOL(__rt_spin_unlock); + +/* + * Wait for the lock to get unlocked: instead of polling for an unlock + * (like raw spinlocks do), we lock and unlock, to force the kernel to + * schedule if there's contention: + */ +void __lockfunc rt_spin_unlock_wait(spinlock_t *lock) +{ + spin_lock(lock); + spin_unlock(lock); +} +EXPORT_SYMBOL(rt_spin_unlock_wait); + +int __lockfunc rt_spin_trylock(spinlock_t *lock) +{ + int ret; + + sleeping_lock_inc(); + migrate_disable(); + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); + rcu_read_lock(); + } else { + migrate_enable(); + sleeping_lock_dec(); + } + return ret; +} +EXPORT_SYMBOL(rt_spin_trylock); + +int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) +{ + int ret; + + local_bh_disable(); + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { + sleeping_lock_inc(); + rcu_read_lock(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); + } else + local_bh_enable(); + return ret; +} +EXPORT_SYMBOL(rt_spin_trylock_bh); + +int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags) +{ + int ret; + + *flags = 0; + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { + sleeping_lock_inc(); + rcu_read_lock(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); + } + return ret; +} +EXPORT_SYMBOL(rt_spin_trylock_irqsave); + +void +__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key) +{ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + /* + * Make sure we are not reinitializing a held lock: + */ + debug_check_no_locks_freed((void *)lock, sizeof(*lock)); + lockdep_init_map(&lock->dep_map, name, key, 0); +#endif +} +EXPORT_SYMBOL(__rt_spin_lock_init); + +#endif /* PREEMPT_RT_FULL */ + +#ifdef CONFIG_PREEMPT_RT_FULL + static inline int __sched +__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) +{ + struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); + struct ww_acquire_ctx *hold_ctx = READ_ONCE(ww->ctx); + + if (!hold_ctx) + return 0; + + if (unlikely(ctx == hold_ctx)) + return -EALREADY; + + if (ctx->stamp - hold_ctx->stamp <= LONG_MAX && + (ctx->stamp != hold_ctx->stamp || ctx > hold_ctx)) { +#ifdef CONFIG_DEBUG_MUTEXES + DEBUG_LOCKS_WARN_ON(ctx->contending_lock); + ctx->contending_lock = ww; +#endif + return -EDEADLK; + } + + return 0; +} +#else + static inline int __sched +__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) +{ + BUG(); + return 0; +} + +#endif + +static inline int +try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, + struct rt_mutex_waiter *waiter) +{ + return __try_to_take_rt_mutex(lock, task, waiter, STEAL_NORMAL); +} + /* * Task blocks on lock. * @@ -951,6 +1334,22 @@ return -EDEADLK; raw_spin_lock(&task->pi_lock); + /* + * In the case of futex requeue PI, this will be a proxy + * lock. The task will wake unaware that it is enqueueed on + * this lock. Avoid blocking on two locks and corrupting + * pi_blocked_on via the PI_WAKEUP_INPROGRESS + * flag. futex_wait_requeue_pi() sets this when it wakes up + * before requeue (due to a signal or timeout). Do not enqueue + * the task if PI_WAKEUP_INPROGRESS is set. + */ + if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) { + raw_spin_unlock(&task->pi_lock); + return -EAGAIN; + } + + BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)); + waiter->task = task; waiter->lock = lock; waiter->prio = task->prio; @@ -974,7 +1373,7 @@ rt_mutex_enqueue_pi(owner, waiter); rt_mutex_adjust_prio(owner); - if (owner->pi_blocked_on) + if (rt_mutex_real_waiter(owner->pi_blocked_on)) chain_walk = 1; } else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) { chain_walk = 1; @@ -1016,6 +1415,7 @@ * Called with lock->wait_lock held and interrupts disabled. */ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, + struct wake_q_head *wake_sleeper_q, struct rt_mutex *lock) { struct rt_mutex_waiter *waiter; @@ -1055,7 +1455,10 @@ * Pairs with preempt_enable() in rt_mutex_postunlock(); */ preempt_disable(); - wake_q_add(wake_q, waiter->task); + if (waiter->savestate) + wake_q_add_sleeper(wake_sleeper_q, waiter->task); + else + wake_q_add(wake_q, waiter->task); raw_spin_unlock(¤t->pi_lock); } @@ -1070,7 +1473,7 @@ { bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock)); struct task_struct *owner = rt_mutex_owner(lock); - struct rt_mutex *next_lock; + struct rt_mutex *next_lock = NULL; lockdep_assert_held(&lock->wait_lock); @@ -1096,7 +1499,8 @@ rt_mutex_adjust_prio(owner); /* Store the lock on which owner is blocked or NULL */ - next_lock = task_blocked_on_lock(owner); + if (rt_mutex_real_waiter(owner->pi_blocked_on)) + next_lock = task_blocked_on_lock(owner); raw_spin_unlock(&owner->pi_lock); @@ -1132,26 +1536,28 @@ raw_spin_lock_irqsave(&task->pi_lock, flags); waiter = task->pi_blocked_on; - if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { + if (!rt_mutex_real_waiter(waiter) || + rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { raw_spin_unlock_irqrestore(&task->pi_lock, flags); return; } next_lock = waiter->lock; - raw_spin_unlock_irqrestore(&task->pi_lock, flags); /* gets dropped in rt_mutex_adjust_prio_chain()! */ get_task_struct(task); + raw_spin_unlock_irqrestore(&task->pi_lock, flags); rt_mutex_adjust_prio_chain(task, RT_MUTEX_MIN_CHAINWALK, NULL, next_lock, NULL, task); } -void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) +void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate) { debug_rt_mutex_init_waiter(waiter); RB_CLEAR_NODE(&waiter->pi_tree_entry); RB_CLEAR_NODE(&waiter->tree_entry); waiter->task = NULL; + waiter->savestate = savestate; } /** @@ -1167,7 +1573,8 @@ static int __sched __rt_mutex_slowlock(struct rt_mutex *lock, int state, struct hrtimer_sleeper *timeout, - struct rt_mutex_waiter *waiter) + struct rt_mutex_waiter *waiter, + struct ww_acquire_ctx *ww_ctx) { int ret = 0; @@ -1176,16 +1583,17 @@ if (try_to_take_rt_mutex(lock, current, waiter)) break; - /* - * TASK_INTERRUPTIBLE checks for signals and - * timeout. Ignored otherwise. - */ - if (likely(state == TASK_INTERRUPTIBLE)) { - /* Signal pending? */ - if (signal_pending(current)) - ret = -EINTR; - if (timeout && !timeout->task) - ret = -ETIMEDOUT; + if (timeout && !timeout->task) { + ret = -ETIMEDOUT; + break; + } + if (signal_pending_state(state, current)) { + ret = -EINTR; + break; + } + + if (ww_ctx && ww_ctx->acquired > 0) { + ret = __mutex_lock_check_stamp(lock, ww_ctx); if (ret) break; } @@ -1224,19 +1632,157 @@ } } +static __always_inline void ww_mutex_lock_acquired(struct ww_mutex *ww, + struct ww_acquire_ctx *ww_ctx) +{ +#ifdef CONFIG_DEBUG_MUTEXES + /* + * If this WARN_ON triggers, you used ww_mutex_lock to acquire, + * but released with a normal mutex_unlock in this call. + * + * This should never happen, always use ww_mutex_unlock. + */ + DEBUG_LOCKS_WARN_ON(ww->ctx); + + /* + * Not quite done after calling ww_acquire_done() ? + */ + DEBUG_LOCKS_WARN_ON(ww_ctx->done_acquire); + + if (ww_ctx->contending_lock) { + /* + * After -EDEADLK you tried to + * acquire a different ww_mutex? Bad! + */ + DEBUG_LOCKS_WARN_ON(ww_ctx->contending_lock != ww); + + /* + * You called ww_mutex_lock after receiving -EDEADLK, + * but 'forgot' to unlock everything else first? + */ + DEBUG_LOCKS_WARN_ON(ww_ctx->acquired > 0); + ww_ctx->contending_lock = NULL; + } + + /* + * Naughty, using a different class will lead to undefined behavior! + */ + DEBUG_LOCKS_WARN_ON(ww_ctx->ww_class != ww->ww_class); +#endif + ww_ctx->acquired++; +} + +#ifdef CONFIG_PREEMPT_RT_FULL +static void ww_mutex_account_lock(struct rt_mutex *lock, + struct ww_acquire_ctx *ww_ctx) +{ + struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); + struct rt_mutex_waiter *waiter, *n; + + /* + * This branch gets optimized out for the common case, + * and is only important for ww_mutex_lock. + */ + ww_mutex_lock_acquired(ww, ww_ctx); + ww->ctx = ww_ctx; + + /* + * Give any possible sleeping processes the chance to wake up, + * so they can recheck if they have to back off. + */ + rbtree_postorder_for_each_entry_safe(waiter, n, &lock->waiters.rb_root, + tree_entry) { + /* XXX debug rt mutex waiter wakeup */ + + BUG_ON(waiter->lock != lock); + rt_mutex_wake_waiter(waiter); + } +} + +#else + +static void ww_mutex_account_lock(struct rt_mutex *lock, + struct ww_acquire_ctx *ww_ctx) +{ + BUG(); +} +#endif + +int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, + enum rtmutex_chainwalk chwalk, + struct ww_acquire_ctx *ww_ctx, + struct rt_mutex_waiter *waiter) +{ + int ret; + +#ifdef CONFIG_PREEMPT_RT_FULL + if (ww_ctx) { + struct ww_mutex *ww; + + ww = container_of(lock, struct ww_mutex, base.lock); + if (unlikely(ww_ctx == READ_ONCE(ww->ctx))) + return -EALREADY; + } +#endif + + /* Try to acquire the lock again: */ + if (try_to_take_rt_mutex(lock, current, NULL)) { + if (ww_ctx) + ww_mutex_account_lock(lock, ww_ctx); + return 0; + } + + set_current_state(state); + + /* Setup the timer, when timeout != NULL */ + if (unlikely(timeout)) + hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS); + + ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk); + + if (likely(!ret)) { + /* sleep on the mutex */ + ret = __rt_mutex_slowlock(lock, state, timeout, waiter, + ww_ctx); + } else if (ww_ctx) { + /* ww_mutex received EDEADLK, let it become EALREADY */ + ret = __mutex_lock_check_stamp(lock, ww_ctx); + BUG_ON(!ret); + } + + if (unlikely(ret)) { + __set_current_state(TASK_RUNNING); + remove_waiter(lock, waiter); + /* ww_mutex wants to report EDEADLK/EALREADY, let it */ + if (!ww_ctx) + rt_mutex_handle_deadlock(ret, chwalk, waiter); + } else if (ww_ctx) { + ww_mutex_account_lock(lock, ww_ctx); + } + + /* + * try_to_take_rt_mutex() sets the waiter bit + * unconditionally. We might have to fix that up. + */ + fixup_rt_mutex_waiters(lock); + return ret; +} + /* * Slow path lock function: */ static int __sched rt_mutex_slowlock(struct rt_mutex *lock, int state, struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk) + enum rtmutex_chainwalk chwalk, + struct ww_acquire_ctx *ww_ctx) { struct rt_mutex_waiter waiter; unsigned long flags; int ret = 0; - rt_mutex_init_waiter(&waiter); + rt_mutex_init_waiter(&waiter, false); /* * Technically we could use raw_spin_[un]lock_irq() here, but this can @@ -1248,35 +1794,8 @@ */ raw_spin_lock_irqsave(&lock->wait_lock, flags); - /* Try to acquire the lock again: */ - if (try_to_take_rt_mutex(lock, current, NULL)) { - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - return 0; - } - - set_current_state(state); - - /* Setup the timer, when timeout != NULL */ - if (unlikely(timeout)) - hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS); - - ret = task_blocks_on_rt_mutex(lock, &waiter, current, chwalk); - - if (likely(!ret)) - /* sleep on the mutex */ - ret = __rt_mutex_slowlock(lock, state, timeout, &waiter); - - if (unlikely(ret)) { - __set_current_state(TASK_RUNNING); - remove_waiter(lock, &waiter); - rt_mutex_handle_deadlock(ret, chwalk, &waiter); - } - - /* - * try_to_take_rt_mutex() sets the waiter bit - * unconditionally. We might have to fix that up. - */ - fixup_rt_mutex_waiters(lock); + ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, ww_ctx, + &waiter); raw_spin_unlock_irqrestore(&lock->wait_lock, flags); @@ -1337,7 +1856,8 @@ * Return whether the current task needs to call rt_mutex_postunlock(). */ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, - struct wake_q_head *wake_q) + struct wake_q_head *wake_q, + struct wake_q_head *wake_sleeper_q) { unsigned long flags; @@ -1391,7 +1911,7 @@ * * Queue the next waiter for wakeup once we release the wait_lock. */ - mark_wakeup_next_waiter(wake_q, lock); + mark_wakeup_next_waiter(wake_q, wake_sleeper_q, lock); raw_spin_unlock_irqrestore(&lock->wait_lock, flags); return true; /* call rt_mutex_postunlock() */ @@ -1405,29 +1925,45 @@ */ static inline int rt_mutex_fastlock(struct rt_mutex *lock, int state, + struct ww_acquire_ctx *ww_ctx, int (*slowfn)(struct rt_mutex *lock, int state, struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk)) + enum rtmutex_chainwalk chwalk, + struct ww_acquire_ctx *ww_ctx)) { if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) return 0; - return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK); + /* + * If rt_mutex blocks, the function sched_submit_work will not call + * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true). + * We must call blk_schedule_flush_plug here, if we don't call it, + * a deadlock in I/O may happen. + */ + if (unlikely(blk_needs_flush_plug(current))) + blk_schedule_flush_plug(current); + + return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx); } static inline int rt_mutex_timed_fastlock(struct rt_mutex *lock, int state, struct hrtimer_sleeper *timeout, enum rtmutex_chainwalk chwalk, + struct ww_acquire_ctx *ww_ctx, int (*slowfn)(struct rt_mutex *lock, int state, struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk)) + enum rtmutex_chainwalk chwalk, + struct ww_acquire_ctx *ww_ctx)) { if (chwalk == RT_MUTEX_MIN_CHAINWALK && likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) return 0; - return slowfn(lock, state, timeout, chwalk); + if (unlikely(blk_needs_flush_plug(current))) + blk_schedule_flush_plug(current); + + return slowfn(lock, state, timeout, chwalk, ww_ctx); } static inline int @@ -1443,9 +1979,11 @@ /* * Performs the wakeup of the the top-waiter and re-enables preemption. */ -void rt_mutex_postunlock(struct wake_q_head *wake_q) +void rt_mutex_postunlock(struct wake_q_head *wake_q, + struct wake_q_head *wake_sleeper_q) { wake_up_q(wake_q); + wake_up_q_sleeper(wake_sleeper_q); /* Pairs with preempt_disable() in rt_mutex_slowunlock() */ preempt_enable(); @@ -1454,23 +1992,46 @@ static inline void rt_mutex_fastunlock(struct rt_mutex *lock, bool (*slowfn)(struct rt_mutex *lock, - struct wake_q_head *wqh)) + struct wake_q_head *wqh, + struct wake_q_head *wq_sleeper)) { DEFINE_WAKE_Q(wake_q); + DEFINE_WAKE_Q(wake_sleeper_q); if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) return; - if (slowfn(lock, &wake_q)) - rt_mutex_postunlock(&wake_q); + if (slowfn(lock, &wake_q, &wake_sleeper_q)) + rt_mutex_postunlock(&wake_q, &wake_sleeper_q); +} + +int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) +{ + might_sleep(); + return rt_mutex_fastlock(lock, state, NULL, rt_mutex_slowlock); +} + +/** + * rt_mutex_lock_state - lock a rt_mutex with a given state + * + * @lock: The rt_mutex to be locked + * @state: The state to set when blocking on the rt_mutex + */ +static inline int __sched rt_mutex_lock_state(struct rt_mutex *lock, + unsigned int subclass, int state) +{ + int ret; + + mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); + ret = __rt_mutex_lock_state(lock, state); + if (ret) + mutex_release(&lock->dep_map, 1, _RET_IP_); + return ret; } static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) { - might_sleep(); - - mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); - rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, rt_mutex_slowlock); + rt_mutex_lock_state(lock, subclass, TASK_UNINTERRUPTIBLE); } #ifdef CONFIG_DEBUG_LOCK_ALLOC @@ -1511,16 +2072,7 @@ */ int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock) { - int ret; - - might_sleep(); - - mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); - ret = rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, rt_mutex_slowlock); - if (ret) - mutex_release(&lock->dep_map, 1, _RET_IP_); - - return ret; + return rt_mutex_lock_state(lock, 0, TASK_INTERRUPTIBLE); } EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible); @@ -1536,6 +2088,22 @@ { return __rt_mutex_slowtrylock(lock); } + +/** + * rt_mutex_lock_killable - lock a rt_mutex killable + * + * @lock: the rt_mutex to be locked + * @detect_deadlock: deadlock detection on/off + * + * Returns: + * 0 on success + * -EINTR when interrupted by a signal + */ +int __sched rt_mutex_lock_killable(struct rt_mutex *lock) +{ + return rt_mutex_lock_state(lock, 0, TASK_KILLABLE); +} +EXPORT_SYMBOL_GPL(rt_mutex_lock_killable); /** * rt_mutex_timed_lock - lock a rt_mutex interruptible @@ -1560,6 +2128,7 @@ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); ret = rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout, RT_MUTEX_MIN_CHAINWALK, + NULL, rt_mutex_slowlock); if (ret) mutex_release(&lock->dep_map, 1, _RET_IP_); @@ -1567,6 +2136,18 @@ return ret; } EXPORT_SYMBOL_GPL(rt_mutex_timed_lock); + +int __sched __rt_mutex_trylock(struct rt_mutex *lock) +{ +#ifdef CONFIG_PREEMPT_RT_FULL + if (WARN_ON_ONCE(in_irq() || in_nmi())) +#else + if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) +#endif + return 0; + + return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); +} /** * rt_mutex_trylock - try to lock a rt_mutex @@ -1583,16 +2164,18 @@ { int ret; - if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) - return 0; - - ret = rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); + ret = __rt_mutex_trylock(lock); if (ret) mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); return ret; } EXPORT_SYMBOL_GPL(rt_mutex_trylock); + +void __sched __rt_mutex_unlock(struct rt_mutex *lock) +{ + rt_mutex_fastunlock(lock, rt_mutex_slowunlock); +} /** * rt_mutex_unlock - unlock a rt_mutex @@ -1602,16 +2185,13 @@ void __sched rt_mutex_unlock(struct rt_mutex *lock) { mutex_release(&lock->dep_map, 1, _RET_IP_); - rt_mutex_fastunlock(lock, rt_mutex_slowunlock); + __rt_mutex_unlock(lock); } EXPORT_SYMBOL_GPL(rt_mutex_unlock); -/** - * Futex variant, that since futex variants do not use the fast-path, can be - * simple and will not need to retry. - */ -bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, - struct wake_q_head *wake_q) +static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, + struct wake_q_head *wake_q, + struct wake_q_head *wq_sleeper) { lockdep_assert_held(&lock->wait_lock); @@ -1628,23 +2208,35 @@ * avoid inversion prior to the wakeup. preempt_disable() * therein pairs with rt_mutex_postunlock(). */ - mark_wakeup_next_waiter(wake_q, lock); + mark_wakeup_next_waiter(wake_q, wq_sleeper, lock); return true; /* call postunlock() */ +} + +/** + * Futex variant, that since futex variants do not use the fast-path, can be + * simple and will not need to retry. + */ +bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, + struct wake_q_head *wake_q, + struct wake_q_head *wq_sleeper) +{ + return __rt_mutex_unlock_common(lock, wake_q, wq_sleeper); } void __sched rt_mutex_futex_unlock(struct rt_mutex *lock) { DEFINE_WAKE_Q(wake_q); + DEFINE_WAKE_Q(wake_sleeper_q); unsigned long flags; bool postunlock; raw_spin_lock_irqsave(&lock->wait_lock, flags); - postunlock = __rt_mutex_futex_unlock(lock, &wake_q); + postunlock = __rt_mutex_futex_unlock(lock, &wake_q, &wake_sleeper_q); raw_spin_unlock_irqrestore(&lock->wait_lock, flags); if (postunlock) - rt_mutex_postunlock(&wake_q); + rt_mutex_postunlock(&wake_q, &wake_sleeper_q); } /** @@ -1683,7 +2275,7 @@ if (name && key) debug_rt_mutex_init(lock, name, key); } -EXPORT_SYMBOL_GPL(__rt_mutex_init); +EXPORT_SYMBOL(__rt_mutex_init); /** * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a @@ -1703,6 +2295,14 @@ struct task_struct *proxy_owner) { __rt_mutex_init(lock, NULL, NULL); +#ifdef CONFIG_DEBUG_SPINLOCK + /* + * get another key class for the wait_lock. LOCK_PI and UNLOCK_PI is + * holding the ->wait_lock of the proxy_lock while unlocking a sleeping + * lock. + */ + raw_spin_lock_init(&lock->wait_lock); +#endif debug_rt_mutex_proxy_lock(lock, proxy_owner); rt_mutex_set_owner(lock, proxy_owner); } @@ -1723,6 +2323,26 @@ { debug_rt_mutex_proxy_unlock(lock); rt_mutex_set_owner(lock, NULL); +} + +static void fixup_rt_mutex_blocked(struct rt_mutex *lock) +{ + struct task_struct *tsk = current; + /* + * RT has a problem here when the wait got interrupted by a timeout + * or a signal. task->pi_blocked_on is still set. The task must + * acquire the hash bucket lock when returning from this function. + * + * If the hash bucket lock is contended then the + * BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in + * task_blocks_on_rt_mutex() will trigger. This can be avoided by + * clearing task->pi_blocked_on which removes the task from the + * boosting chain of the rtmutex. That's correct because the task + * is not longer blocked on it. + */ + raw_spin_lock(&tsk->pi_lock); + tsk->pi_blocked_on = NULL; + raw_spin_unlock(&tsk->pi_lock); } /** @@ -1755,6 +2375,34 @@ if (try_to_take_rt_mutex(lock, task, NULL)) return 1; +#ifdef CONFIG_PREEMPT_RT_FULL + /* + * In PREEMPT_RT there's an added race. + * If the task, that we are about to requeue, times out, + * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue + * to skip this task. But right after the task sets + * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then + * block on the spin_lock(&hb->lock), which in RT is an rtmutex. + * This will replace the PI_WAKEUP_INPROGRESS with the actual + * lock that it blocks on. We *must not* place this task + * on this proxy lock in that case. + * + * To prevent this race, we first take the task's pi_lock + * and check if it has updated its pi_blocked_on. If it has, + * we assume that it woke up and we return -EAGAIN. + * Otherwise, we set the task's pi_blocked_on to + * PI_REQUEUE_INPROGRESS, so that if the task is waking up + * it will know that we are in the process of requeuing it. + */ + raw_spin_lock(&task->pi_lock); + if (task->pi_blocked_on) { + raw_spin_unlock(&task->pi_lock); + return -EAGAIN; + } + task->pi_blocked_on = PI_REQUEUE_INPROGRESS; + raw_spin_unlock(&task->pi_lock); +#endif + /* We enforce deadlock detection for futexes */ ret = task_blocks_on_rt_mutex(lock, waiter, task, RT_MUTEX_FULL_CHAINWALK); @@ -1768,6 +2416,9 @@ */ ret = 0; } + + if (ret) + fixup_rt_mutex_blocked(lock); debug_rt_mutex_print_deadlock(waiter); @@ -1854,12 +2505,15 @@ raw_spin_lock_irq(&lock->wait_lock); /* sleep on the mutex */ set_current_state(TASK_INTERRUPTIBLE); - ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter); + ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter, NULL); /* * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might * have to fix that up. */ fixup_rt_mutex_waiters(lock); + if (ret) + fixup_rt_mutex_blocked(lock); + raw_spin_unlock_irq(&lock->wait_lock); return ret; @@ -1921,3 +2575,99 @@ return cleanup; } + +static inline int +ww_mutex_deadlock_injection(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) +{ +#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH + unsigned tmp; + + if (ctx->deadlock_inject_countdown-- == 0) { + tmp = ctx->deadlock_inject_interval; + if (tmp > UINT_MAX/4) + tmp = UINT_MAX; + else + tmp = tmp*2 + tmp + tmp/2; + + ctx->deadlock_inject_interval = tmp; + ctx->deadlock_inject_countdown = tmp; + ctx->contending_lock = lock; + + ww_mutex_unlock(lock); + + return -EDEADLK; + } +#endif + + return 0; +} + +#ifdef CONFIG_PREEMPT_RT_FULL +int __sched +ww_mutex_lock_interruptible(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) +{ + int ret; + + might_sleep(); + + mutex_acquire_nest(&lock->base.dep_map, 0, 0, + ctx ? &ctx->dep_map : NULL, _RET_IP_); + ret = rt_mutex_slowlock(&lock->base.lock, TASK_INTERRUPTIBLE, NULL, 0, + ctx); + if (ret) + mutex_release(&lock->base.dep_map, 1, _RET_IP_); + else if (!ret && ctx && ctx->acquired > 1) + return ww_mutex_deadlock_injection(lock, ctx); + + return ret; +} +EXPORT_SYMBOL_GPL(ww_mutex_lock_interruptible); + +int __sched +ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) +{ + int ret; + + might_sleep(); + + mutex_acquire_nest(&lock->base.dep_map, 0, 0, + ctx ? &ctx->dep_map : NULL, _RET_IP_); + ret = rt_mutex_slowlock(&lock->base.lock, TASK_UNINTERRUPTIBLE, NULL, 0, + ctx); + if (ret) + mutex_release(&lock->base.dep_map, 1, _RET_IP_); + else if (!ret && ctx && ctx->acquired > 1) + return ww_mutex_deadlock_injection(lock, ctx); + + return ret; +} +EXPORT_SYMBOL_GPL(ww_mutex_lock); + +void __sched ww_mutex_unlock(struct ww_mutex *lock) +{ + int nest = !!lock->ctx; + + /* + * The unlocking fastpath is the 0->1 transition from 'locked' + * into 'unlocked' state: + */ + if (nest) { +#ifdef CONFIG_DEBUG_MUTEXES + DEBUG_LOCKS_WARN_ON(!lock->ctx->acquired); +#endif + if (lock->ctx->acquired > 0) + lock->ctx->acquired--; + lock->ctx = NULL; + } + + mutex_release(&lock->base.dep_map, nest, _RET_IP_); + __rt_mutex_unlock(&lock->base.lock); +} +EXPORT_SYMBOL(ww_mutex_unlock); + +int __rt_mutex_owner_current(struct rt_mutex *lock) +{ + return rt_mutex_owner(lock) == current; +} +EXPORT_SYMBOL(__rt_mutex_owner_current); +#endif diff --git a/kernel/kernel/locking/rtmutex_common.h b/kernel/kernel/locking/rtmutex_common.h index ca6fb48..8e0c592 100644 --- a/kernel/kernel/locking/rtmutex_common.h +++ b/kernel/kernel/locking/rtmutex_common.h @@ -15,6 +15,7 @@ #include <linux/rtmutex.h> #include <linux/sched/wake_q.h> +#include <linux/sched/debug.h> /* * This is the control structure for tasks blocked on a rt_mutex, @@ -29,6 +30,7 @@ struct rb_node pi_tree_entry; struct task_struct *task; struct rt_mutex *lock; + bool savestate; #ifdef CONFIG_DEBUG_RT_MUTEXES unsigned long ip; struct pid *deadlock_task_pid; @@ -130,11 +132,14 @@ /* * PI-futex support (proxy locking functions, etc.): */ +#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) +#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) + extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, struct task_struct *proxy_owner); extern void rt_mutex_proxy_unlock(struct rt_mutex *lock); -extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter); +extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savetate); extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, struct rt_mutex_waiter *waiter, struct task_struct *task); @@ -152,9 +157,27 @@ extern void rt_mutex_futex_unlock(struct rt_mutex *lock); extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, - struct wake_q_head *wqh); + struct wake_q_head *wqh, + struct wake_q_head *wq_sleeper); -extern void rt_mutex_postunlock(struct wake_q_head *wake_q); +extern void rt_mutex_postunlock(struct wake_q_head *wake_q, + struct wake_q_head *wake_sleeper_q); + +/* RW semaphore special interface */ +struct ww_acquire_ctx; + +extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); +extern int __rt_mutex_trylock(struct rt_mutex *lock); +extern void __rt_mutex_unlock(struct rt_mutex *lock); +int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, + enum rtmutex_chainwalk chwalk, + struct ww_acquire_ctx *ww_ctx, + struct rt_mutex_waiter *waiter); +void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, + struct rt_mutex_waiter *waiter, + unsigned long flags); +void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock); #ifdef CONFIG_DEBUG_RT_MUTEXES # include "rtmutex-debug.h" diff --git a/kernel/kernel/locking/rwlock-rt.c b/kernel/kernel/locking/rwlock-rt.c new file mode 100644 index 0000000..0ae8c62 --- /dev/null +++ b/kernel/kernel/locking/rwlock-rt.c @@ -0,0 +1,384 @@ +/* + */ +#include <linux/sched/debug.h> +#include <linux/export.h> + +#include "rtmutex_common.h" +#include <linux/rwlock_types_rt.h> + +/* + * RT-specific reader/writer locks + * + * write_lock() + * 1) Lock lock->rtmutex + * 2) Remove the reader BIAS to force readers into the slow path + * 3) Wait until all readers have left the critical region + * 4) Mark it write locked + * + * write_unlock() + * 1) Remove the write locked marker + * 2) Set the reader BIAS so readers can use the fast path again + * 3) Unlock lock->rtmutex to release blocked readers + * + * read_lock() + * 1) Try fast path acquisition (reader BIAS is set) + * 2) Take lock->rtmutex.wait_lock which protects the writelocked flag + * 3) If !writelocked, acquire it for read + * 4) If writelocked, block on lock->rtmutex + * 5) unlock lock->rtmutex, goto 1) + * + * read_unlock() + * 1) Try fast path release (reader count != 1) + * 2) Wake the writer waiting in write_lock()#3 + * + * read_lock()#3 has the consequence, that rw locks on RT are not writer + * fair, but writers, which should be avoided in RT tasks (think tasklist + * lock), are subject to the rtmutex priority/DL inheritance mechanism. + * + * It's possible to make the rw locks writer fair by keeping a list of + * active readers. A blocked writer would force all newly incoming readers + * to block on the rtmutex, but the rtmutex would have to be proxy locked + * for one reader after the other. We can't use multi-reader inheritance + * because there is no way to support that with + * SCHED_DEADLINE. Implementing the one by one reader boosting/handover + * mechanism is a major surgery for a very dubious value. + * + * The risk of writer starvation is there, but the pathological use cases + * which trigger it are not necessarily the typical RT workloads. + */ + +void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, + struct lock_class_key *key) +{ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + /* + * Make sure we are not reinitializing a held semaphore: + */ + debug_check_no_locks_freed((void *)lock, sizeof(*lock)); + lockdep_init_map(&lock->dep_map, name, key, 0); +#endif + atomic_set(&lock->readers, READER_BIAS); + rt_mutex_init(&lock->rtmutex); + lock->rtmutex.save_state = 1; +} + +int __read_rt_trylock(struct rt_rw_lock *lock) +{ + int r, old; + + /* + * Increment reader count, if lock->readers < 0, i.e. READER_BIAS is + * set. + */ + for (r = atomic_read(&lock->readers); r < 0;) { + old = atomic_cmpxchg(&lock->readers, r, r + 1); + if (likely(old == r)) + return 1; + r = old; + } + return 0; +} + +void __sched __read_rt_lock(struct rt_rw_lock *lock) +{ + struct rt_mutex *m = &lock->rtmutex; + struct rt_mutex_waiter waiter; + unsigned long flags; + + if (__read_rt_trylock(lock)) + return; + + raw_spin_lock_irqsave(&m->wait_lock, flags); + /* + * Allow readers as long as the writer has not completely + * acquired the semaphore for write. + */ + if (atomic_read(&lock->readers) != WRITER_BIAS) { + atomic_inc(&lock->readers); + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + return; + } + + /* + * Call into the slow lock path with the rtmutex->wait_lock + * held, so this can't result in the following race: + * + * Reader1 Reader2 Writer + * read_lock() + * write_lock() + * rtmutex_lock(m) + * swait() + * read_lock() + * unlock(m->wait_lock) + * read_unlock() + * swake() + * lock(m->wait_lock) + * lock->writelocked=true + * unlock(m->wait_lock) + * + * write_unlock() + * lock->writelocked=false + * rtmutex_unlock(m) + * read_lock() + * write_lock() + * rtmutex_lock(m) + * swait() + * rtmutex_lock(m) + * + * That would put Reader1 behind the writer waiting on + * Reader2 to call read_unlock() which might be unbound. + */ + rt_mutex_init_waiter(&waiter, true); + rt_spin_lock_slowlock_locked(m, &waiter, flags); + /* + * The slowlock() above is guaranteed to return with the rtmutex is + * now held, so there can't be a writer active. Increment the reader + * count and immediately drop the rtmutex again. + */ + atomic_inc(&lock->readers); + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + rt_spin_lock_slowunlock(m); + + debug_rt_mutex_free_waiter(&waiter); +} + +void __read_rt_unlock(struct rt_rw_lock *lock) +{ + struct rt_mutex *m = &lock->rtmutex; + struct task_struct *tsk; + + /* + * sem->readers can only hit 0 when a writer is waiting for the + * active readers to leave the critical region. + */ + if (!atomic_dec_and_test(&lock->readers)) + return; + + raw_spin_lock_irq(&m->wait_lock); + /* + * Wake the writer, i.e. the rtmutex owner. It might release the + * rtmutex concurrently in the fast path, but to clean up the rw + * lock it needs to acquire m->wait_lock. The worst case which can + * happen is a spurious wakeup. + */ + tsk = rt_mutex_owner(m); + if (tsk) + wake_up_process(tsk); + + raw_spin_unlock_irq(&m->wait_lock); +} + +static void __write_unlock_common(struct rt_rw_lock *lock, int bias, + unsigned long flags) +{ + struct rt_mutex *m = &lock->rtmutex; + + atomic_add(READER_BIAS - bias, &lock->readers); + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + rt_spin_lock_slowunlock(m); +} + +void __sched __write_rt_lock(struct rt_rw_lock *lock) +{ + struct rt_mutex *m = &lock->rtmutex; + struct task_struct *self = current; + unsigned long flags; + + /* Take the rtmutex as a first step */ + __rt_spin_lock(m); + + /* Force readers into slow path */ + atomic_sub(READER_BIAS, &lock->readers); + + raw_spin_lock_irqsave(&m->wait_lock, flags); + + raw_spin_lock(&self->pi_lock); + self->saved_state = self->state; + __set_current_state_no_track(TASK_UNINTERRUPTIBLE); + raw_spin_unlock(&self->pi_lock); + + for (;;) { + /* Have all readers left the critical region? */ + if (!atomic_read(&lock->readers)) { + atomic_set(&lock->readers, WRITER_BIAS); + raw_spin_lock(&self->pi_lock); + __set_current_state_no_track(self->saved_state); + self->saved_state = TASK_RUNNING; + raw_spin_unlock(&self->pi_lock); + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + return; + } + + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + + if (atomic_read(&lock->readers) != 0) + schedule(); + + raw_spin_lock_irqsave(&m->wait_lock, flags); + + raw_spin_lock(&self->pi_lock); + __set_current_state_no_track(TASK_UNINTERRUPTIBLE); + raw_spin_unlock(&self->pi_lock); + } +} + +int __write_rt_trylock(struct rt_rw_lock *lock) +{ + struct rt_mutex *m = &lock->rtmutex; + unsigned long flags; + + if (!__rt_mutex_trylock(m)) + return 0; + + atomic_sub(READER_BIAS, &lock->readers); + + raw_spin_lock_irqsave(&m->wait_lock, flags); + if (!atomic_read(&lock->readers)) { + atomic_set(&lock->readers, WRITER_BIAS); + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + return 1; + } + __write_unlock_common(lock, 0, flags); + return 0; +} + +void __write_rt_unlock(struct rt_rw_lock *lock) +{ + struct rt_mutex *m = &lock->rtmutex; + unsigned long flags; + + raw_spin_lock_irqsave(&m->wait_lock, flags); + __write_unlock_common(lock, WRITER_BIAS, flags); +} + +/* Map the reader biased implementation */ +static inline int do_read_rt_trylock(rwlock_t *rwlock) +{ + return __read_rt_trylock(rwlock); +} + +static inline int do_write_rt_trylock(rwlock_t *rwlock) +{ + return __write_rt_trylock(rwlock); +} + +static inline void do_read_rt_lock(rwlock_t *rwlock) +{ + __read_rt_lock(rwlock); +} + +static inline void do_write_rt_lock(rwlock_t *rwlock) +{ + __write_rt_lock(rwlock); +} + +static inline void do_read_rt_unlock(rwlock_t *rwlock) +{ + __read_rt_unlock(rwlock); +} + +static inline void do_write_rt_unlock(rwlock_t *rwlock) +{ + __write_rt_unlock(rwlock); +} + +static inline void do_rwlock_rt_init(rwlock_t *rwlock, const char *name, + struct lock_class_key *key) +{ + __rwlock_biased_rt_init(rwlock, name, key); +} + +int __lockfunc rt_read_can_lock(rwlock_t *rwlock) +{ + return atomic_read(&rwlock->readers) < 0; +} + +int __lockfunc rt_write_can_lock(rwlock_t *rwlock) +{ + return atomic_read(&rwlock->readers) == READER_BIAS; +} + +/* + * The common functions which get wrapped into the rwlock API. + */ +int __lockfunc rt_read_trylock(rwlock_t *rwlock) +{ + int ret; + + sleeping_lock_inc(); + migrate_disable(); + ret = do_read_rt_trylock(rwlock); + if (ret) { + rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); + rcu_read_lock(); + } else { + migrate_enable(); + sleeping_lock_dec(); + } + return ret; +} +EXPORT_SYMBOL(rt_read_trylock); + +int __lockfunc rt_write_trylock(rwlock_t *rwlock) +{ + int ret; + + sleeping_lock_inc(); + migrate_disable(); + ret = do_write_rt_trylock(rwlock); + if (ret) { + rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); + rcu_read_lock(); + } else { + migrate_enable(); + sleeping_lock_dec(); + } + return ret; +} +EXPORT_SYMBOL(rt_write_trylock); + +void __lockfunc rt_read_lock(rwlock_t *rwlock) +{ + sleeping_lock_inc(); + rcu_read_lock(); + migrate_disable(); + rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); + do_read_rt_lock(rwlock); +} +EXPORT_SYMBOL(rt_read_lock); + +void __lockfunc rt_write_lock(rwlock_t *rwlock) +{ + sleeping_lock_inc(); + rcu_read_lock(); + migrate_disable(); + rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); + do_write_rt_lock(rwlock); +} +EXPORT_SYMBOL(rt_write_lock); + +void __lockfunc rt_read_unlock(rwlock_t *rwlock) +{ + rwlock_release(&rwlock->dep_map, 1, _RET_IP_); + do_read_rt_unlock(rwlock); + migrate_enable(); + rcu_read_unlock(); + sleeping_lock_dec(); +} +EXPORT_SYMBOL(rt_read_unlock); + +void __lockfunc rt_write_unlock(rwlock_t *rwlock) +{ + rwlock_release(&rwlock->dep_map, 1, _RET_IP_); + do_write_rt_unlock(rwlock); + migrate_enable(); + rcu_read_unlock(); + sleeping_lock_dec(); +} +EXPORT_SYMBOL(rt_write_unlock); + +void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key) +{ + do_rwlock_rt_init(rwlock, name, key); +} +EXPORT_SYMBOL(__rt_rwlock_init); diff --git a/kernel/kernel/locking/rwsem-rt.c b/kernel/kernel/locking/rwsem-rt.c new file mode 100644 index 0000000..9669464 --- /dev/null +++ b/kernel/kernel/locking/rwsem-rt.c @@ -0,0 +1,312 @@ +/* + */ +#include <linux/blkdev.h> +#include <linux/rwsem.h> +#include <linux/sched/debug.h> +#include <linux/sched/signal.h> +#include <linux/export.h> + +#include "rtmutex_common.h" + +/* + * RT-specific reader/writer semaphores + * + * down_write() + * 1) Lock sem->rtmutex + * 2) Remove the reader BIAS to force readers into the slow path + * 3) Wait until all readers have left the critical region + * 4) Mark it write locked + * + * up_write() + * 1) Remove the write locked marker + * 2) Set the reader BIAS so readers can use the fast path again + * 3) Unlock sem->rtmutex to release blocked readers + * + * down_read() + * 1) Try fast path acquisition (reader BIAS is set) + * 2) Take sem->rtmutex.wait_lock which protects the writelocked flag + * 3) If !writelocked, acquire it for read + * 4) If writelocked, block on sem->rtmutex + * 5) unlock sem->rtmutex, goto 1) + * + * up_read() + * 1) Try fast path release (reader count != 1) + * 2) Wake the writer waiting in down_write()#3 + * + * down_read()#3 has the consequence, that rw semaphores on RT are not writer + * fair, but writers, which should be avoided in RT tasks (think mmap_sem), + * are subject to the rtmutex priority/DL inheritance mechanism. + * + * It's possible to make the rw semaphores writer fair by keeping a list of + * active readers. A blocked writer would force all newly incoming readers to + * block on the rtmutex, but the rtmutex would have to be proxy locked for one + * reader after the other. We can't use multi-reader inheritance because there + * is no way to support that with SCHED_DEADLINE. Implementing the one by one + * reader boosting/handover mechanism is a major surgery for a very dubious + * value. + * + * The risk of writer starvation is there, but the pathological use cases + * which trigger it are not necessarily the typical RT workloads. + */ + +void __rwsem_init(struct rw_semaphore *sem, const char *name, + struct lock_class_key *key) +{ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + /* + * Make sure we are not reinitializing a held semaphore: + */ + debug_check_no_locks_freed((void *)sem, sizeof(*sem)); + lockdep_init_map(&sem->dep_map, name, key, 0); +#endif + atomic_set(&sem->readers, READER_BIAS); +} +EXPORT_SYMBOL(__rwsem_init); + +int __down_read_trylock(struct rw_semaphore *sem) +{ + int r, old; + + /* + * Increment reader count, if sem->readers < 0, i.e. READER_BIAS is + * set. + */ + for (r = atomic_read(&sem->readers); r < 0;) { + old = atomic_cmpxchg(&sem->readers, r, r + 1); + if (likely(old == r)) + return 1; + r = old; + } + return 0; +} + +static int __sched __down_read_common(struct rw_semaphore *sem, int state) +{ + struct rt_mutex *m = &sem->rtmutex; + struct rt_mutex_waiter waiter; + int ret; + + if (__down_read_trylock(sem)) + return 0; + /* + * If rt_mutex blocks, the function sched_submit_work will not call + * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true). + * We must call blk_schedule_flush_plug here, if we don't call it, + * a deadlock in I/O may happen. + */ + if (unlikely(blk_needs_flush_plug(current))) + blk_schedule_flush_plug(current); + + might_sleep(); + raw_spin_lock_irq(&m->wait_lock); + /* + * Allow readers as long as the writer has not completely + * acquired the semaphore for write. + */ + if (atomic_read(&sem->readers) != WRITER_BIAS) { + atomic_inc(&sem->readers); + raw_spin_unlock_irq(&m->wait_lock); + return 0; + } + + /* + * Call into the slow lock path with the rtmutex->wait_lock + * held, so this can't result in the following race: + * + * Reader1 Reader2 Writer + * down_read() + * down_write() + * rtmutex_lock(m) + * swait() + * down_read() + * unlock(m->wait_lock) + * up_read() + * swake() + * lock(m->wait_lock) + * sem->writelocked=true + * unlock(m->wait_lock) + * + * up_write() + * sem->writelocked=false + * rtmutex_unlock(m) + * down_read() + * down_write() + * rtmutex_lock(m) + * swait() + * rtmutex_lock(m) + * + * That would put Reader1 behind the writer waiting on + * Reader2 to call up_read() which might be unbound. + */ + rt_mutex_init_waiter(&waiter, false); + ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK, + NULL, &waiter); + /* + * The slowlock() above is guaranteed to return with the rtmutex (for + * ret = 0) is now held, so there can't be a writer active. Increment + * the reader count and immediately drop the rtmutex again. + * For ret != 0 we don't hold the rtmutex and need unlock the wait_lock. + * We don't own the lock then. + */ + if (!ret) + atomic_inc(&sem->readers); + raw_spin_unlock_irq(&m->wait_lock); + if (!ret) + __rt_mutex_unlock(m); + + debug_rt_mutex_free_waiter(&waiter); + return ret; +} + +void __down_read(struct rw_semaphore *sem) +{ + int ret; + + ret = __down_read_common(sem, TASK_UNINTERRUPTIBLE); + WARN_ON_ONCE(ret); +} + +int __down_read_interruptible(struct rw_semaphore *sem) +{ + int ret; + + ret = __down_read_common(sem, TASK_INTERRUPTIBLE); + if (likely(!ret)) + return ret; + WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret); + return -EINTR; +} + +int __down_read_killable(struct rw_semaphore *sem) +{ + int ret; + + ret = __down_read_common(sem, TASK_KILLABLE); + if (likely(!ret)) + return ret; + WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret); + return -EINTR; +} + +void __up_read(struct rw_semaphore *sem) +{ + struct rt_mutex *m = &sem->rtmutex; + struct task_struct *tsk; + + /* + * sem->readers can only hit 0 when a writer is waiting for the + * active readers to leave the critical region. + */ + if (!atomic_dec_and_test(&sem->readers)) + return; + + raw_spin_lock_irq(&m->wait_lock); + /* + * Wake the writer, i.e. the rtmutex owner. It might release the + * rtmutex concurrently in the fast path (due to a signal), but to + * clean up the rwsem it needs to acquire m->wait_lock. The worst + * case which can happen is a spurious wakeup. + */ + tsk = rt_mutex_owner(m); + if (tsk) + wake_up_process(tsk); + + raw_spin_unlock_irq(&m->wait_lock); +} + +static void __up_write_unlock(struct rw_semaphore *sem, int bias, + unsigned long flags) +{ + struct rt_mutex *m = &sem->rtmutex; + + atomic_add(READER_BIAS - bias, &sem->readers); + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + __rt_mutex_unlock(m); +} + +static int __sched __down_write_common(struct rw_semaphore *sem, int state) +{ + struct rt_mutex *m = &sem->rtmutex; + unsigned long flags; + + /* Take the rtmutex as a first step */ + if (__rt_mutex_lock_state(m, state)) + return -EINTR; + + /* Force readers into slow path */ + atomic_sub(READER_BIAS, &sem->readers); + might_sleep(); + + set_current_state(state); + for (;;) { + raw_spin_lock_irqsave(&m->wait_lock, flags); + /* Have all readers left the critical region? */ + if (!atomic_read(&sem->readers)) { + atomic_set(&sem->readers, WRITER_BIAS); + __set_current_state(TASK_RUNNING); + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + return 0; + } + + if (signal_pending_state(state, current)) { + __set_current_state(TASK_RUNNING); + __up_write_unlock(sem, 0, flags); + return -EINTR; + } + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + + if (atomic_read(&sem->readers) != 0) { + schedule(); + set_current_state(state); + } + } +} + +void __sched __down_write(struct rw_semaphore *sem) +{ + __down_write_common(sem, TASK_UNINTERRUPTIBLE); +} + +int __sched __down_write_killable(struct rw_semaphore *sem) +{ + return __down_write_common(sem, TASK_KILLABLE); +} + +int __down_write_trylock(struct rw_semaphore *sem) +{ + struct rt_mutex *m = &sem->rtmutex; + unsigned long flags; + + if (!__rt_mutex_trylock(m)) + return 0; + + atomic_sub(READER_BIAS, &sem->readers); + + raw_spin_lock_irqsave(&m->wait_lock, flags); + if (!atomic_read(&sem->readers)) { + atomic_set(&sem->readers, WRITER_BIAS); + raw_spin_unlock_irqrestore(&m->wait_lock, flags); + return 1; + } + __up_write_unlock(sem, 0, flags); + return 0; +} + +void __up_write(struct rw_semaphore *sem) +{ + struct rt_mutex *m = &sem->rtmutex; + unsigned long flags; + + raw_spin_lock_irqsave(&m->wait_lock, flags); + __up_write_unlock(sem, WRITER_BIAS, flags); +} + +void __downgrade_write(struct rw_semaphore *sem) +{ + struct rt_mutex *m = &sem->rtmutex; + unsigned long flags; + + raw_spin_lock_irqsave(&m->wait_lock, flags); + /* Release it and account current as reader */ + __up_write_unlock(sem, WRITER_BIAS - 1, flags); +} diff --git a/kernel/kernel/locking/spinlock.c b/kernel/kernel/locking/spinlock.c index 936f3d1..e89b70f 100644 --- a/kernel/kernel/locking/spinlock.c +++ b/kernel/kernel/locking/spinlock.c @@ -117,8 +117,11 @@ * __[spin|read|write]_lock_bh() */ BUILD_LOCK_OPS(spin, raw_spinlock); + +#ifndef CONFIG_PREEMPT_RT_FULL BUILD_LOCK_OPS(read, rwlock); BUILD_LOCK_OPS(write, rwlock); +#endif #endif @@ -201,6 +204,8 @@ } EXPORT_SYMBOL(_raw_spin_unlock_bh); #endif + +#ifndef CONFIG_PREEMPT_RT_FULL #ifndef CONFIG_INLINE_READ_TRYLOCK int __lockfunc _raw_read_trylock(rwlock_t *lock) @@ -346,6 +351,8 @@ EXPORT_SYMBOL(_raw_write_unlock_bh); #endif +#endif /* !PREEMPT_RT_FULL */ + #ifdef CONFIG_DEBUG_LOCK_ALLOC void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) diff --git a/kernel/kernel/locking/spinlock_debug.c b/kernel/kernel/locking/spinlock_debug.c index 03595c2..d63df28 100644 --- a/kernel/kernel/locking/spinlock_debug.c +++ b/kernel/kernel/locking/spinlock_debug.c @@ -31,6 +31,7 @@ EXPORT_SYMBOL(__raw_spin_lock_init); +#ifndef CONFIG_PREEMPT_RT_FULL void __rwlock_init(rwlock_t *lock, const char *name, struct lock_class_key *key) { @@ -48,6 +49,7 @@ } EXPORT_SYMBOL(__rwlock_init); +#endif static void spin_dump(raw_spinlock_t *lock, const char *msg) { @@ -135,6 +137,7 @@ arch_spin_unlock(&lock->raw_lock); } +#ifndef CONFIG_PREEMPT_RT_FULL static void rwlock_bug(rwlock_t *lock, const char *msg) { if (!debug_locks_off()) @@ -224,3 +227,5 @@ debug_write_unlock(lock); arch_write_unlock(&lock->raw_lock); } + +#endif diff --git a/kernel/kernel/panic.c b/kernel/kernel/panic.c index 6b33469..fcfc827 100644 --- a/kernel/kernel/panic.c +++ b/kernel/kernel/panic.c @@ -486,9 +486,11 @@ static int init_oops_id(void) { +#ifndef CONFIG_PREEMPT_RT_FULL if (!oops_id) get_random_bytes(&oops_id, sizeof(oops_id)); else +#endif oops_id++; return 0; diff --git a/kernel/kernel/power/hibernate.c b/kernel/kernel/power/hibernate.c index 6670a44..25cd36d 100644 --- a/kernel/kernel/power/hibernate.c +++ b/kernel/kernel/power/hibernate.c @@ -690,6 +690,10 @@ return error; } +#ifndef CONFIG_SUSPEND +bool pm_in_action; +#endif + /** * hibernate - Carry out system hibernation, including saving the image. */ @@ -702,6 +706,8 @@ pm_pr_dbg("Hibernation not available.\n"); return -EPERM; } + + pm_in_action = true; lock_system_sleep(); /* The snapshot device should not be opened while we're running */ @@ -781,6 +787,7 @@ atomic_inc(&snapshot_device_available); Unlock: unlock_system_sleep(); + pm_in_action = false; pr_info("hibernation exit\n"); return error; diff --git a/kernel/kernel/power/suspend.c b/kernel/kernel/power/suspend.c index 5be1469..e6aad73 100644 --- a/kernel/kernel/power/suspend.c +++ b/kernel/kernel/power/suspend.c @@ -620,6 +620,8 @@ return error; } +bool pm_in_action; + /** * pm_suspend - Externally visible function for suspending the system. * @state: System sleep state to enter. @@ -634,6 +636,7 @@ if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX) return -EINVAL; + pm_in_action = true; pr_info("suspend entry (%s)\n", mem_sleep_labels[state]); if (state == PM_SUSPEND_MEM_LITE || state == PM_SUSPEND_MEM_ULTRA) @@ -647,6 +650,7 @@ suspend_stats.success++; } pr_info("suspend exit\n"); + pm_in_action = false; return error; } EXPORT_SYMBOL(pm_suspend); diff --git a/kernel/kernel/power/wakeup_reason.c b/kernel/kernel/power/wakeup_reason.c index 0a5f97a..e8f68d3 100644 --- a/kernel/kernel/power/wakeup_reason.c +++ b/kernel/kernel/power/wakeup_reason.c @@ -44,7 +44,7 @@ const char *irq_name; }; -static DEFINE_SPINLOCK(wakeup_reason_lock); +static DEFINE_RAW_SPINLOCK(wakeup_reason_lock); static LIST_HEAD(leaf_irqs); /* kept in ascending IRQ sorted order */ static LIST_HEAD(parent_irqs); /* unordered */ @@ -149,17 +149,17 @@ { unsigned long flags; - spin_lock_irqsave(&wakeup_reason_lock, flags); + raw_spin_lock_irqsave(&wakeup_reason_lock, flags); if (!capture_reasons) { - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); return; } if (find_node_in_list(&parent_irqs, irq) == NULL) add_sibling_node_sorted(&leaf_irqs, irq); - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); } void log_threaded_irq_wakeup_reason(int irq, int parent_irq) @@ -177,10 +177,10 @@ if (!capture_reasons) return; - spin_lock_irqsave(&wakeup_reason_lock, flags); + raw_spin_lock_irqsave(&wakeup_reason_lock, flags); if (!capture_reasons || (find_node_in_list(&leaf_irqs, irq) != NULL)) { - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); return; } @@ -196,7 +196,7 @@ } } - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); } static void __log_abort_or_abnormal_wake(bool abort, const char *fmt, @@ -204,11 +204,11 @@ { unsigned long flags; - spin_lock_irqsave(&wakeup_reason_lock, flags); + raw_spin_lock_irqsave(&wakeup_reason_lock, flags); /* Suspend abort or abnormal wake reason has already been logged. */ if (suspend_abort || abnormal_wake) { - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); return; } @@ -216,7 +216,7 @@ abnormal_wake = !abort; vsnprintf(non_irq_wake_reason, MAX_SUSPEND_ABORT_LEN, fmt, args); - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); } void log_suspend_abort_reason(const char *fmt, ...) @@ -241,7 +241,7 @@ { unsigned long flags; - spin_lock_irqsave(&wakeup_reason_lock, flags); + raw_spin_lock_irqsave(&wakeup_reason_lock, flags); delete_list(&leaf_irqs); delete_list(&parent_irqs); @@ -249,7 +249,7 @@ abnormal_wake = false; capture_reasons = true; - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); } static void print_wakeup_sources(void) @@ -257,13 +257,13 @@ struct wakeup_irq_node *n; unsigned long flags; - spin_lock_irqsave(&wakeup_reason_lock, flags); + raw_spin_lock_irqsave(&wakeup_reason_lock, flags); capture_reasons = false; if (suspend_abort) { pr_info("Abort: %s\n", non_irq_wake_reason); - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); return; } @@ -276,7 +276,7 @@ else pr_info("Resume cause unknown\n"); - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); } static ssize_t last_resume_reason_show(struct kobject *kobj, @@ -286,12 +286,12 @@ struct wakeup_irq_node *n; unsigned long flags; - spin_lock_irqsave(&wakeup_reason_lock, flags); + raw_spin_lock_irqsave(&wakeup_reason_lock, flags); if (suspend_abort) { buf_offset = scnprintf(buf, PAGE_SIZE, "Abort: %s", non_irq_wake_reason); - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); return buf_offset; } @@ -304,7 +304,7 @@ buf_offset = scnprintf(buf, PAGE_SIZE, "-1 %s", non_irq_wake_reason); - spin_unlock_irqrestore(&wakeup_reason_lock, flags); + raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags); return buf_offset; } diff --git a/kernel/kernel/printk/printk.c b/kernel/kernel/printk/printk.c index a1f5484..611c7c9 100644 --- a/kernel/kernel/printk/printk.c +++ b/kernel/kernel/printk/printk.c @@ -429,6 +429,65 @@ printk_safe_exit_irqrestore(flags); \ } while (0) +#ifdef CONFIG_EARLY_PRINTK +struct console *early_console; + +static void early_vprintk(const char *fmt, va_list ap) +{ + if (early_console) { + char buf[512]; + int n = vscnprintf(buf, sizeof(buf), fmt, ap); + + early_console->write(early_console, buf, n); + } +} + +asmlinkage void early_printk(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + early_vprintk(fmt, ap); + va_end(ap); +} + +/* + * This is independent of any log levels - a global + * kill switch that turns off all of printk. + * + * Used by the NMI watchdog if early-printk is enabled. + */ +static bool __read_mostly printk_killswitch; + +static int __init force_early_printk_setup(char *str) +{ + printk_killswitch = true; + return 0; +} +early_param("force_early_printk", force_early_printk_setup); + +void printk_kill(void) +{ + printk_killswitch = true; +} + +#ifdef CONFIG_PRINTK +static int forced_early_printk(const char *fmt, va_list ap) +{ + if (!printk_killswitch) + return 0; + early_vprintk(fmt, ap); + return 1; +} +#endif + +#else +static inline int forced_early_printk(const char *fmt, va_list ap) +{ + return 0; +} +#endif + #ifdef CONFIG_PRINTK DECLARE_WAIT_QUEUE_HEAD(log_wait); /* the next printk record to read by syslog(READ) or /proc/kmsg */ @@ -1517,12 +1576,23 @@ u64 next_seq; u64 seq; u32 idx; + int attempts = 0; + int num_msg; text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); if (!text) return -ENOMEM; logbuf_lock_irq(); + +try_again: + attempts++; + if (attempts > 10) { + len = -EBUSY; + goto out; + } + num_msg = 0; + /* * Find first record that fits, including all following records, * into the user-provided buffer for this dump. @@ -1535,6 +1605,14 @@ len += msg_print_text(msg, true, NULL, 0); idx = log_next(idx); seq++; + num_msg++; + if (num_msg > 5) { + num_msg = 0; + logbuf_unlock_irq(); + logbuf_lock_irq(); + if (clear_seq < log_first_seq) + goto try_again; + } } /* move first record forward until length fits into the buffer */ @@ -1546,6 +1624,14 @@ len -= msg_print_text(msg, true, NULL, 0); idx = log_next(idx); seq++; + num_msg++; + if (num_msg > 5) { + num_msg = 0; + logbuf_unlock_irq(); + logbuf_lock_irq(); + if (clear_seq < log_first_seq) + goto try_again; + } } /* last message fitting into this dump */ @@ -1583,6 +1669,7 @@ clear_seq = log_next_seq; clear_idx = log_next_idx; } +out: logbuf_unlock_irq(); kfree(text); @@ -1714,6 +1801,7 @@ return do_syslog(type, buf, len, SYSLOG_FROM_READER); } +#ifndef CONFIG_PREEMPT_RT_FULL /* * Special console_lock variants that help to reduce the risk of soft-lockups. * They allow to pass console_lock to another printk() call using a busy wait. @@ -1854,6 +1942,15 @@ return 1; } +#else + +static int console_trylock_spinning(void) +{ + return console_trylock(); +} + +#endif + /* * Call the console drivers, asking them to write out * log_buf[start] to log_buf[end - 1]. @@ -1872,6 +1969,12 @@ if (!console_drivers) return; + if (IS_ENABLED(CONFIG_PREEMPT_RT_BASE)) { + if (in_irq() || in_nmi()) + return; + } + + migrate_disable(); for_each_console(con) { if (exclusive_console && con != exclusive_console) continue; @@ -1887,6 +1990,7 @@ else con->write(con, text, len); } + migrate_enable(); } int printk_delay_msec __read_mostly; @@ -2057,6 +2161,13 @@ unsigned long flags; u64 curr_log_seq; + /* + * Fall back to early_printk if a debugging subsystem has + * killed printk output + */ + if (unlikely(forced_early_printk(fmt, args))) + return 1; + if (level == LOGLEVEL_SCHED) { level = LOGLEVEL_DEFAULT; in_sched = true; @@ -2074,20 +2185,30 @@ /* If called from the scheduler, we can not call up(). */ if (!in_sched && pending_output) { + int may_trylock = 1; + +#ifdef CONFIG_PREEMPT_RT_FULL + /* + * we can't take a sleeping lock with IRQs or preeption disabled + * so we can't print in these contexts + */ + if (!(preempt_count() == 0 && !irqs_disabled())) + may_trylock = 0; +#endif /* * Disable preemption to avoid being preempted while holding * console_sem which would prevent anyone from printing to * console */ - preempt_disable(); + migrate_disable(); /* * Try to acquire and then immediately release the console * semaphore. The release will print out buffers and wake up * /dev/kmsg and syslog() users. */ - if (console_trylock_spinning()) + if (may_trylock && console_trylock_spinning()) console_unlock(); - preempt_enable(); + migrate_enable(); } if (pending_output) @@ -2200,26 +2321,6 @@ static bool suppress_message_printing(int level) { return false; } #endif /* CONFIG_PRINTK */ - -#ifdef CONFIG_EARLY_PRINTK -struct console *early_console; - -asmlinkage __visible void early_printk(const char *fmt, ...) -{ - va_list ap; - char buf[512]; - int n; - - if (!early_console) - return; - - va_start(ap, fmt); - n = vscnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - - early_console->write(early_console, buf, n); -} -#endif static int __add_preferred_console(char *name, int idx, char *options, char *brl_options) @@ -2579,6 +2680,10 @@ console_seq++; raw_spin_unlock(&logbuf_lock); +#ifdef CONFIG_PREEMPT_RT_FULL + printk_safe_exit_irqrestore(flags); + call_console_drivers(ext_text, ext_len, text, len); +#else /* * While actively printing out messages, if another printk() * were to occur on another CPU, it may wait for this one to @@ -2601,6 +2706,7 @@ } printk_safe_exit_irqrestore(flags); +#endif if (do_cond_resched) cond_resched(); @@ -2648,6 +2754,11 @@ { struct console *c; + if (IS_ENABLED(CONFIG_PREEMPT_RT_BASE)) { + if (in_irq() || in_nmi()) + return; + } + /* * console_unblank can no longer be called in interrupt context unless * oops_in_progress is set to 1.. diff --git a/kernel/kernel/ptrace.c b/kernel/kernel/ptrace.c index af74e84..6a4eefa 100644 --- a/kernel/kernel/ptrace.c +++ b/kernel/kernel/ptrace.c @@ -190,7 +190,14 @@ spin_lock_irq(&task->sighand->siglock); if (task_is_traced(task) && !looks_like_a_spurious_pid(task) && !__fatal_signal_pending(task)) { - task->state = __TASK_TRACED; + unsigned long flags; + + raw_spin_lock_irqsave(&task->pi_lock, flags); + if (task->state & __TASK_TRACED) + task->state = __TASK_TRACED; + else + task->saved_state = __TASK_TRACED; + raw_spin_unlock_irqrestore(&task->pi_lock, flags); ret = true; } spin_unlock_irq(&task->sighand->siglock); @@ -200,8 +207,8 @@ static void ptrace_unfreeze_traced(struct task_struct *task) { - if (task->state != __TASK_TRACED) - return; + unsigned long flags; + bool frozen = true; WARN_ON(!task->ptrace || task->parent != current); @@ -210,12 +217,19 @@ * Recheck state under the lock to close this race. */ spin_lock_irq(&task->sighand->siglock); - if (task->state == __TASK_TRACED) { - if (__fatal_signal_pending(task)) - wake_up_state(task, __TASK_TRACED); - else - task->state = TASK_TRACED; - } + + raw_spin_lock_irqsave(&task->pi_lock, flags); + if (task->state == __TASK_TRACED) + task->state = TASK_TRACED; + else if (task->saved_state == __TASK_TRACED) + task->saved_state = TASK_TRACED; + else + frozen = false; + raw_spin_unlock_irqrestore(&task->pi_lock, flags); + + if (frozen && __fatal_signal_pending(task)) + wake_up_state(task, __TASK_TRACED); + spin_unlock_irq(&task->sighand->siglock); } diff --git a/kernel/kernel/rcu/Kconfig b/kernel/kernel/rcu/Kconfig index 9210379..a243a78 100644 --- a/kernel/kernel/rcu/Kconfig +++ b/kernel/kernel/rcu/Kconfig @@ -172,7 +172,7 @@ config RCU_FAST_NO_HZ bool "Accelerate last non-dyntick-idle CPU's grace periods" - depends on NO_HZ_COMMON && SMP && RCU_EXPERT + depends on NO_HZ_COMMON && SMP && RCU_EXPERT && !PREEMPT_RT_FULL default n help This option permits CPUs to enter dynticks-idle state even if @@ -190,8 +190,8 @@ config RCU_BOOST bool "Enable RCU priority boosting" - depends on RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT - default n + depends on (RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT) || PREEMPT_RT_FULL + default y if PREEMPT_RT_FULL help This option boosts the priority of preempted RCU readers that block the current preemptible RCU grace period for too long. diff --git a/kernel/kernel/rcu/rcu.h b/kernel/kernel/rcu/rcu.h index 4d04683..808cce9 100644 --- a/kernel/kernel/rcu/rcu.h +++ b/kernel/kernel/rcu/rcu.h @@ -528,7 +528,6 @@ static inline int rcu_get_gp_kthreads_prio(void) { return 0; } #else /* #ifdef CONFIG_TINY_RCU */ unsigned long rcu_get_gp_seq(void); -unsigned long rcu_bh_get_gp_seq(void); unsigned long rcu_sched_get_gp_seq(void); unsigned long rcu_exp_batches_completed(void); unsigned long rcu_exp_batches_completed_sched(void); @@ -536,10 +535,18 @@ void show_rcu_gp_kthreads(void); int rcu_get_gp_kthreads_prio(void); void rcu_force_quiescent_state(void); -void rcu_bh_force_quiescent_state(void); void rcu_sched_force_quiescent_state(void); extern struct workqueue_struct *rcu_gp_wq; extern struct workqueue_struct *rcu_par_gp_wq; + +#ifdef CONFIG_PREEMPT_RT_FULL +#define rcu_bh_get_gp_seq rcu_get_gp_seq +#define rcu_bh_force_quiescent_state rcu_force_quiescent_state +#else +unsigned long rcu_bh_get_gp_seq(void); +void rcu_bh_force_quiescent_state(void); +#endif + #endif /* #else #ifdef CONFIG_TINY_RCU */ #ifdef CONFIG_RCU_NOCB_CPU diff --git a/kernel/kernel/rcu/rcutorture.c b/kernel/kernel/rcu/rcutorture.c index 0b7af7e..e95d121 100644 --- a/kernel/kernel/rcu/rcutorture.c +++ b/kernel/kernel/rcu/rcutorture.c @@ -434,6 +434,7 @@ .name = "rcu" }; +#ifndef CONFIG_PREEMPT_RT_FULL /* * Definitions for rcu_bh torture testing. */ @@ -475,6 +476,12 @@ .name = "rcu_bh" }; +#else +static struct rcu_torture_ops rcu_bh_ops = { + .ttype = INVALID_RCU_FLAVOR, +}; +#endif + /* * Don't even think about trying any of these in real life!!! * The names includes "busted", and they really means it! diff --git a/kernel/kernel/rcu/srcutree.c b/kernel/kernel/rcu/srcutree.c index 1ff17e2..0f09a1a 100644 --- a/kernel/kernel/rcu/srcutree.c +++ b/kernel/kernel/rcu/srcutree.c @@ -38,6 +38,8 @@ #include <linux/delay.h> #include <linux/module.h> #include <linux/srcu.h> +#include <linux/cpu.h> +#include <linux/locallock.h> #include "rcu.h" #include "rcu_segcblist.h" @@ -461,21 +463,6 @@ } /* - * Track online CPUs to guide callback workqueue placement. - */ -DEFINE_PER_CPU(bool, srcu_online); - -void srcu_online_cpu(unsigned int cpu) -{ - WRITE_ONCE(per_cpu(srcu_online, cpu), true); -} - -void srcu_offline_cpu(unsigned int cpu) -{ - WRITE_ONCE(per_cpu(srcu_online, cpu), false); -} - -/* * Place the workqueue handler on the specified CPU if online, otherwise * just run it whereever. This is useful for placing workqueue handlers * that are to invoke the specified CPU's callbacks. @@ -486,12 +473,12 @@ { bool ret; - preempt_disable(); - if (READ_ONCE(per_cpu(srcu_online, cpu))) + cpus_read_lock(); + if (cpu_online(cpu)) ret = queue_delayed_work_on(cpu, wq, dwork, delay); else ret = queue_delayed_work(wq, dwork, delay); - preempt_enable(); + cpus_read_unlock(); return ret; } @@ -774,6 +761,8 @@ * negligible when amoritized over that time period, and the extra latency * of a needlessly non-expedited grace period is similarly negligible. */ +static DEFINE_LOCAL_IRQ_LOCK(sp_llock); + static bool srcu_might_be_idle(struct srcu_struct *sp) { unsigned long curseq; @@ -782,13 +771,13 @@ unsigned long t; /* If the local srcu_data structure has callbacks, not idle. */ - local_irq_save(flags); + local_lock_irqsave(sp_llock, flags); sdp = this_cpu_ptr(sp->sda); if (rcu_segcblist_pend_cbs(&sdp->srcu_cblist)) { - local_irq_restore(flags); + local_unlock_irqrestore(sp_llock, flags); return false; /* Callbacks already present, so not idle. */ } - local_irq_restore(flags); + local_unlock_irqrestore(sp_llock, flags); /* * No local callbacks, so probabalistically probe global state. @@ -866,7 +855,7 @@ return; } rhp->func = func; - local_irq_save(flags); + local_lock_irqsave(sp_llock, flags); sdp = this_cpu_ptr(sp->sda); spin_lock_rcu_node(sdp); rcu_segcblist_enqueue(&sdp->srcu_cblist, rhp, false); @@ -882,7 +871,8 @@ sdp->srcu_gp_seq_needed_exp = s; needexp = true; } - spin_unlock_irqrestore_rcu_node(sdp, flags); + spin_unlock_rcu_node(sdp); + local_unlock_irqrestore(sp_llock, flags); if (needgp) srcu_funnel_gp_start(sp, sdp, s, do_norm); else if (needexp) diff --git a/kernel/kernel/rcu/tree.c b/kernel/kernel/rcu/tree.c index 1c5a4ee..1cebf94 100644 --- a/kernel/kernel/rcu/tree.c +++ b/kernel/kernel/rcu/tree.c @@ -61,6 +61,13 @@ #include <linux/trace_events.h> #include <linux/suspend.h> #include <linux/ftrace.h> +#include <linux/delay.h> +#include <linux/gfp.h> +#include <linux/oom.h> +#include <linux/smpboot.h> +#include <linux/jiffies.h> +#include <linux/sched/isolation.h> +#include "../time/tick-internal.h" #include "tree.h" #include "rcu.h" @@ -245,6 +252,19 @@ this_cpu_ptr(&rcu_sched_data), true); } +#ifdef CONFIG_PREEMPT_RT_FULL +static void rcu_preempt_qs(void); + +void rcu_bh_qs(void) +{ + unsigned long flags; + + /* Callers to this function, rcu_preempt_qs(), must disable irqs. */ + local_irq_save(flags); + rcu_preempt_qs(); + local_irq_restore(flags); +} +#else void rcu_bh_qs(void) { RCU_LOCKDEP_WARN(preemptible(), "rcu_bh_qs() invoked with preemption enabled!!!"); @@ -255,6 +275,7 @@ __this_cpu_write(rcu_bh_data.cpu_no_qs.b.norm, false); } } +#endif /* * Steal a bit from the bottom of ->dynticks for idle entry/exit @@ -569,6 +590,7 @@ } EXPORT_SYMBOL_GPL(rcu_sched_get_gp_seq); +#ifndef CONFIG_PREEMPT_RT_FULL /* * Return the number of RCU-bh GPs completed thus far for debug & stats. */ @@ -577,6 +599,7 @@ return READ_ONCE(rcu_bh_state.gp_seq); } EXPORT_SYMBOL_GPL(rcu_bh_get_gp_seq); +#endif /* * Return the number of RCU expedited batches completed thus far for @@ -600,6 +623,7 @@ } EXPORT_SYMBOL_GPL(rcu_exp_batches_completed_sched); +#ifndef CONFIG_PREEMPT_RT_FULL /* * Force a quiescent state. */ @@ -617,6 +641,13 @@ force_quiescent_state(&rcu_bh_state); } EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state); + +#else +void rcu_force_quiescent_state(void) +{ +} +EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); +#endif /* * Force a quiescent state for RCU-sched. @@ -675,9 +706,11 @@ case RCU_FLAVOR: rsp = rcu_state_p; break; +#ifndef CONFIG_PREEMPT_RT_FULL case RCU_BH_FLAVOR: rsp = &rcu_bh_state; break; +#endif case RCU_SCHED_FLAVOR: rsp = &rcu_sched_state; break; @@ -1264,6 +1297,7 @@ !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq && (rnp->ffmask & rdp->grpmask)) { init_irq_work(&rdp->rcu_iw, rcu_iw_handler); + rdp->rcu_iw.flags = IRQ_WORK_HARD_IRQ; rdp->rcu_iw_pending = true; rdp->rcu_iw_gp_seq = rnp->gp_seq; irq_work_queue_on(&rdp->rcu_iw, rdp->cpu); @@ -2873,18 +2907,17 @@ /* * Do RCU core processing for the current CPU. */ -static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused) +static __latent_entropy void rcu_process_callbacks(void) { struct rcu_state *rsp; if (cpu_is_offline(smp_processor_id())) return; - trace_rcu_utilization(TPS("Start RCU core")); for_each_rcu_flavor(rsp) __rcu_process_callbacks(rsp); - trace_rcu_utilization(TPS("End RCU core")); } +static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task); /* * Schedule RCU callback invocation. If the specified type of RCU * does not support RCU priority boosting, just do a direct call, @@ -2896,18 +2929,105 @@ { if (unlikely(!READ_ONCE(rcu_scheduler_fully_active))) return; - if (likely(!rsp->boost)) { - rcu_do_batch(rsp, rdp); - return; - } - invoke_rcu_callbacks_kthread(); + rcu_do_batch(rsp, rdp); } +static void rcu_wake_cond(struct task_struct *t, int status) +{ + /* + * If the thread is yielding, only wake it when this + * is invoked from idle + */ + if (t && (status != RCU_KTHREAD_YIELDING || is_idle_task(current))) + wake_up_process(t); +} + +/* + * Wake up this CPU's rcuc kthread to do RCU core processing. + */ static void invoke_rcu_core(void) { - if (cpu_online(smp_processor_id())) - raise_softirq(RCU_SOFTIRQ); + unsigned long flags; + struct task_struct *t; + + if (!cpu_online(smp_processor_id())) + return; + local_irq_save(flags); + __this_cpu_write(rcu_cpu_has_work, 1); + t = __this_cpu_read(rcu_cpu_kthread_task); + if (t != NULL && current != t) + rcu_wake_cond(t, __this_cpu_read(rcu_cpu_kthread_status)); + local_irq_restore(flags); } + +static void rcu_cpu_kthread_park(unsigned int cpu) +{ + per_cpu(rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU; +} + +static int rcu_cpu_kthread_should_run(unsigned int cpu) +{ + return __this_cpu_read(rcu_cpu_has_work); +} + +/* + * Per-CPU kernel thread that invokes RCU callbacks. This replaces the + * RCU softirq used in flavors and configurations of RCU that do not + * support RCU priority boosting. + */ +static void rcu_cpu_kthread(unsigned int cpu) +{ + unsigned int *statusp = this_cpu_ptr(&rcu_cpu_kthread_status); + char work, *workp = this_cpu_ptr(&rcu_cpu_has_work); + int spincnt; + + for (spincnt = 0; spincnt < 10; spincnt++) { + trace_rcu_utilization(TPS("Start CPU kthread@rcu_wait")); + local_bh_disable(); + *statusp = RCU_KTHREAD_RUNNING; + this_cpu_inc(rcu_cpu_kthread_loops); + local_irq_disable(); + work = *workp; + *workp = 0; + local_irq_enable(); + if (work) + rcu_process_callbacks(); + local_bh_enable(); + if (*workp == 0) { + trace_rcu_utilization(TPS("End CPU kthread@rcu_wait")); + *statusp = RCU_KTHREAD_WAITING; + return; + } + } + *statusp = RCU_KTHREAD_YIELDING; + trace_rcu_utilization(TPS("Start CPU kthread@rcu_yield")); + schedule_timeout_interruptible(2); + trace_rcu_utilization(TPS("End CPU kthread@rcu_yield")); + *statusp = RCU_KTHREAD_WAITING; +} + +static struct smp_hotplug_thread rcu_cpu_thread_spec = { + .store = &rcu_cpu_kthread_task, + .thread_should_run = rcu_cpu_kthread_should_run, + .thread_fn = rcu_cpu_kthread, + .thread_comm = "rcuc/%u", + .setup = rcu_cpu_kthread_setup, + .park = rcu_cpu_kthread_park, +}; + +/* + * Spawn per-CPU RCU core processing kthreads. + */ +static int __init rcu_spawn_core_kthreads(void) +{ + int cpu; + + for_each_possible_cpu(cpu) + per_cpu(rcu_cpu_has_work, cpu) = 0; + BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec)); + return 0; +} +early_initcall(rcu_spawn_core_kthreads); /* * Handle any core-RCU processing required by a call_rcu() invocation. @@ -3060,6 +3180,7 @@ } EXPORT_SYMBOL_GPL(call_rcu_sched); +#ifndef CONFIG_PREEMPT_RT_FULL /** * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period. * @head: structure to be used for queueing the RCU updates. @@ -3087,6 +3208,7 @@ __call_rcu(head, func, &rcu_bh_state, -1, 0); } EXPORT_SYMBOL_GPL(call_rcu_bh); +#endif /* * Queue an RCU callback for lazy invocation after a grace period. @@ -3172,6 +3294,7 @@ } EXPORT_SYMBOL_GPL(synchronize_sched); +#ifndef CONFIG_PREEMPT_RT_FULL /** * synchronize_rcu_bh - wait until an rcu_bh grace period has elapsed. * @@ -3198,6 +3321,7 @@ wait_rcu_gp(call_rcu_bh); } EXPORT_SYMBOL_GPL(synchronize_rcu_bh); +#endif /** * get_state_synchronize_rcu - Snapshot current RCU state @@ -3505,6 +3629,7 @@ mutex_unlock(&rsp->barrier_mutex); } +#ifndef CONFIG_PREEMPT_RT_FULL /** * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete. */ @@ -3513,6 +3638,7 @@ _rcu_barrier(&rcu_bh_state); } EXPORT_SYMBOL_GPL(rcu_barrier_bh); +#endif /** * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks. @@ -3662,8 +3788,6 @@ rnp->ffmask |= rdp->grpmask; raw_spin_unlock_irqrestore_rcu_node(rnp, flags); } - if (IS_ENABLED(CONFIG_TREE_SRCU)) - srcu_online_cpu(cpu); if (rcu_scheduler_active == RCU_SCHEDULER_INACTIVE) return 0; /* Too early in boot for scheduler work. */ sync_sched_exp_online_cleanup(cpu); @@ -3691,8 +3815,6 @@ } rcutree_affinity_setting(cpu, cpu); - if (IS_ENABLED(CONFIG_TREE_SRCU)) - srcu_offline_cpu(cpu); return 0; } @@ -4160,12 +4282,13 @@ rcu_bootup_announce(); rcu_init_geometry(); +#ifndef CONFIG_PREEMPT_RT_FULL rcu_init_one(&rcu_bh_state); +#endif rcu_init_one(&rcu_sched_state); if (dump_tree) rcu_dump_rcu_node_tree(&rcu_sched_state); __rcu_init_preempt(); - open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); /* * We don't need protection against CPU-hotplug here because diff --git a/kernel/kernel/rcu/tree.h b/kernel/kernel/rcu/tree.h index 4e74df7..98257d2 100644 --- a/kernel/kernel/rcu/tree.h +++ b/kernel/kernel/rcu/tree.h @@ -413,7 +413,9 @@ */ extern struct rcu_state rcu_sched_state; +#ifndef CONFIG_PREEMPT_RT_FULL extern struct rcu_state rcu_bh_state; +#endif #ifdef CONFIG_PREEMPT_RCU extern struct rcu_state rcu_preempt_state; @@ -421,12 +423,10 @@ int rcu_dynticks_snap(struct rcu_dynticks *rdtp); -#ifdef CONFIG_RCU_BOOST DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_status); DECLARE_PER_CPU(int, rcu_cpu_kthread_cpu); DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_loops); DECLARE_PER_CPU(char, rcu_cpu_has_work); -#endif /* #ifdef CONFIG_RCU_BOOST */ #ifndef RCU_TREE_NONCORE @@ -449,8 +449,8 @@ int ncheck); static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags); static void rcu_preempt_boost_start_gp(struct rcu_node *rnp); -static void invoke_rcu_callbacks_kthread(void); static bool rcu_is_callbacks_kthread(void); +static void rcu_cpu_kthread_setup(unsigned int cpu); #ifdef CONFIG_RCU_BOOST static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp, struct rcu_node *rnp); diff --git a/kernel/kernel/rcu/tree_exp.h b/kernel/kernel/rcu/tree_exp.h index 72770a5..ac6d6fd 100644 --- a/kernel/kernel/rcu/tree_exp.h +++ b/kernel/kernel/rcu/tree_exp.h @@ -472,7 +472,6 @@ static void sync_rcu_exp_select_cpus(struct rcu_state *rsp, smp_call_func_t func) { - int cpu; struct rcu_node *rnp; trace_rcu_exp_grace_period(rsp->name, rcu_exp_gp_seq_endval(rsp), TPS("reset")); @@ -494,13 +493,7 @@ continue; } INIT_WORK(&rnp->rew.rew_work, sync_rcu_exp_select_node_cpus); - preempt_disable(); - cpu = cpumask_next(rnp->grplo - 1, cpu_online_mask); - /* If all offline, queue the work on an unbound CPU. */ - if (unlikely(cpu > rnp->grphi)) - cpu = WORK_CPU_UNBOUND; - queue_work_on(cpu, rcu_par_gp_wq, &rnp->rew.rew_work); - preempt_enable(); + queue_work_on(rnp->grplo, rcu_par_gp_wq, &rnp->rew.rew_work); rnp->exp_need_flush = true; } diff --git a/kernel/kernel/rcu/tree_plugin.h b/kernel/kernel/rcu/tree_plugin.h index 5f6de49..56639c8 100644 --- a/kernel/kernel/rcu/tree_plugin.h +++ b/kernel/kernel/rcu/tree_plugin.h @@ -24,40 +24,15 @@ * Paul E. McKenney <paulmck@linux.vnet.ibm.com> */ -#include <linux/delay.h> -#include <linux/gfp.h> -#include <linux/oom.h> -#include <linux/sched/debug.h> -#include <linux/smpboot.h> -#include <linux/sched/isolation.h> -#include <uapi/linux/sched/types.h> -#include "../time/tick-internal.h" - -#ifdef CONFIG_RCU_BOOST - #include "../locking/rtmutex_common.h" /* * Control variables for per-CPU and per-rcu_node kthreads. These * handle all flavors of RCU. */ -static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task); DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status); DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops); DEFINE_PER_CPU(char, rcu_cpu_has_work); - -#else /* #ifdef CONFIG_RCU_BOOST */ - -/* - * Some architectures do not define rt_mutexes, but if !CONFIG_RCU_BOOST, - * all uses are in dead code. Provide a definition to keep the compiler - * happy, but add WARN_ON_ONCE() to complain if used in the wrong place. - * This probably needs to be excluded from -rt builds. - */ -#define rt_mutex_owner(a) ({ WARN_ON_ONCE(1); NULL; }) -#define rt_mutex_futex_unlock(x) WARN_ON_ONCE(1) - -#endif /* #else #ifdef CONFIG_RCU_BOOST */ #ifdef CONFIG_RCU_NOCB_CPU static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */ @@ -337,9 +312,13 @@ struct task_struct *t = current; struct rcu_data *rdp; struct rcu_node *rnp; + int sleeping_l = 0; lockdep_assert_irqs_disabled(); - WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0); +#if defined(CONFIG_PREEMPT_RT_FULL) + sleeping_l = t->sleeping_lock; +#endif + WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0 && !sleeping_l); if (t->rcu_read_lock_nesting > 0 && !t->rcu_read_unlock_special.b.blocked) { @@ -520,7 +499,7 @@ } /* Hardware IRQ handlers cannot block, complain if they get here. */ - if (in_irq() || in_serving_softirq()) { + if (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_OFFSET)) { lockdep_rcu_suspicious(__FILE__, __LINE__, "rcu_read_unlock() from irq or softirq with blocking in critical section!!!\n"); pr_alert("->rcu_read_unlock_special: %#x (b: %d, enq: %d nq: %d)\n", @@ -1023,17 +1002,20 @@ #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ -#ifdef CONFIG_RCU_BOOST - -static void rcu_wake_cond(struct task_struct *t, int status) +/* + * If boosting, set rcuc kthreads to realtime priority. + */ +static void rcu_cpu_kthread_setup(unsigned int cpu) { - /* - * If the thread is yielding, only wake it when this - * is invoked from idle - */ - if (status != RCU_KTHREAD_YIELDING || is_idle_task(current)) - wake_up_process(t); +#ifdef CONFIG_RCU_BOOST + struct sched_param sp; + + sp.sched_priority = kthread_prio; + sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); +#endif /* #ifdef CONFIG_RCU_BOOST */ } + +#ifdef CONFIG_RCU_BOOST /* * Carry out RCU priority boosting on the task indicated by ->exp_tasks @@ -1173,23 +1155,6 @@ } /* - * Wake up the per-CPU kthread to invoke RCU callbacks. - */ -static void invoke_rcu_callbacks_kthread(void) -{ - unsigned long flags; - - local_irq_save(flags); - __this_cpu_write(rcu_cpu_has_work, 1); - if (__this_cpu_read(rcu_cpu_kthread_task) != NULL && - current != __this_cpu_read(rcu_cpu_kthread_task)) { - rcu_wake_cond(__this_cpu_read(rcu_cpu_kthread_task), - __this_cpu_read(rcu_cpu_kthread_status)); - } - local_irq_restore(flags); -} - -/* * Is the current CPU running the RCU-callbacks kthread? * Caller must have preemption disabled. */ @@ -1243,67 +1208,6 @@ return 0; } -static void rcu_kthread_do_work(void) -{ - rcu_do_batch(&rcu_sched_state, this_cpu_ptr(&rcu_sched_data)); - rcu_do_batch(&rcu_bh_state, this_cpu_ptr(&rcu_bh_data)); - rcu_do_batch(&rcu_preempt_state, this_cpu_ptr(&rcu_preempt_data)); -} - -static void rcu_cpu_kthread_setup(unsigned int cpu) -{ - struct sched_param sp; - - sp.sched_priority = kthread_prio; - sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); -} - -static void rcu_cpu_kthread_park(unsigned int cpu) -{ - per_cpu(rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU; -} - -static int rcu_cpu_kthread_should_run(unsigned int cpu) -{ - return __this_cpu_read(rcu_cpu_has_work); -} - -/* - * Per-CPU kernel thread that invokes RCU callbacks. This replaces the - * RCU softirq used in flavors and configurations of RCU that do not - * support RCU priority boosting. - */ -static void rcu_cpu_kthread(unsigned int cpu) -{ - unsigned int *statusp = this_cpu_ptr(&rcu_cpu_kthread_status); - char work, *workp = this_cpu_ptr(&rcu_cpu_has_work); - int spincnt; - - for (spincnt = 0; spincnt < 10; spincnt++) { - trace_rcu_utilization(TPS("Start CPU kthread@rcu_wait")); - local_bh_disable(); - *statusp = RCU_KTHREAD_RUNNING; - this_cpu_inc(rcu_cpu_kthread_loops); - local_irq_disable(); - work = *workp; - *workp = 0; - local_irq_enable(); - if (work) - rcu_kthread_do_work(); - local_bh_enable(); - if (*workp == 0) { - trace_rcu_utilization(TPS("End CPU kthread@rcu_wait")); - *statusp = RCU_KTHREAD_WAITING; - return; - } - } - *statusp = RCU_KTHREAD_YIELDING; - trace_rcu_utilization(TPS("Start CPU kthread@rcu_yield")); - schedule_timeout_interruptible(2); - trace_rcu_utilization(TPS("End CPU kthread@rcu_yield")); - *statusp = RCU_KTHREAD_WAITING; -} - /* * Set the per-rcu_node kthread's affinity to cover all CPUs that are * served by the rcu_node in question. The CPU hotplug lock is still @@ -1334,26 +1238,12 @@ free_cpumask_var(cm); } -static struct smp_hotplug_thread rcu_cpu_thread_spec = { - .store = &rcu_cpu_kthread_task, - .thread_should_run = rcu_cpu_kthread_should_run, - .thread_fn = rcu_cpu_kthread, - .thread_comm = "rcuc/%u", - .setup = rcu_cpu_kthread_setup, - .park = rcu_cpu_kthread_park, -}; - /* * Spawn boost kthreads -- called as soon as the scheduler is running. */ static void __init rcu_spawn_boost_kthreads(void) { struct rcu_node *rnp; - int cpu; - - for_each_possible_cpu(cpu) - per_cpu(rcu_cpu_has_work, cpu) = 0; - BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec)); rcu_for_each_leaf_node(rcu_state_p, rnp) (void)rcu_spawn_one_boost_kthread(rcu_state_p, rnp); } @@ -1374,11 +1264,6 @@ __releases(rnp->lock) { raw_spin_unlock_irqrestore_rcu_node(rnp, flags); -} - -static void invoke_rcu_callbacks_kthread(void) -{ - WARN_ON_ONCE(1); } static bool rcu_is_callbacks_kthread(void) @@ -1404,7 +1289,7 @@ #endif /* #else #ifdef CONFIG_RCU_BOOST */ -#if !defined(CONFIG_RCU_FAST_NO_HZ) +#if !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL) /* * Check to see if any future RCU-related work will need to be done @@ -1420,7 +1305,9 @@ *nextevt = KTIME_MAX; return rcu_cpu_has_callbacks(NULL); } +#endif /* !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL) */ +#if !defined(CONFIG_RCU_FAST_NO_HZ) /* * Because we do not have RCU_FAST_NO_HZ, don't bother cleaning up * after it. @@ -1517,6 +1404,8 @@ return cbs_ready; } +#ifndef CONFIG_PREEMPT_RT_FULL + /* * Allow the CPU to enter dyntick-idle mode unless it has callbacks ready * to invoke. If the CPU has callbacks, try to advance them. Tell the @@ -1559,6 +1448,7 @@ *nextevt = basemono + dj * TICK_NSEC; return 0; } +#endif /* #ifndef CONFIG_PREEMPT_RT_FULL */ /* * Prepare a CPU for idle from an RCU perspective. The first major task diff --git a/kernel/kernel/rcu/update.c b/kernel/kernel/rcu/update.c index 81688a1..ed75add 100644 --- a/kernel/kernel/rcu/update.c +++ b/kernel/kernel/rcu/update.c @@ -68,8 +68,10 @@ module_param(rcu_expedited, int, 0); extern int rcu_normal; /* from sysctl */ module_param(rcu_normal, int, 0); -static int rcu_normal_after_boot; +static int rcu_normal_after_boot = IS_ENABLED(CONFIG_PREEMPT_RT_FULL); +#ifndef CONFIG_PREEMPT_RT_FULL module_param(rcu_normal_after_boot, int, 0); +#endif #endif /* #ifndef CONFIG_TINY_RCU */ #ifdef CONFIG_DEBUG_LOCK_ALLOC @@ -288,6 +290,7 @@ } EXPORT_SYMBOL_GPL(rcu_read_lock_held); +#ifndef CONFIG_PREEMPT_RT_FULL /** * rcu_read_lock_bh_held() - might we be in RCU-bh read-side critical section? * @@ -314,6 +317,7 @@ return in_softirq() || irqs_disabled(); } EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held); +#endif #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ diff --git a/kernel/kernel/sched/Makefile b/kernel/kernel/sched/Makefile index f6d19e3..260cea0 100644 --- a/kernel/kernel/sched/Makefile +++ b/kernel/kernel/sched/Makefile @@ -18,7 +18,7 @@ obj-y += core.o loadavg.o clock.o cputime.o obj-y += idle.o fair.o rt.o deadline.o -obj-y += wait.o wait_bit.o swait.o completion.o +obj-y += wait.o wait_bit.o swait.o swork.o completion.o obj-y += stubs.o obj-$(CONFIG_SMP) += cpupri.o cpudeadline.o topology.o stop_task.o pelt.o diff --git a/kernel/kernel/sched/completion.c b/kernel/kernel/sched/completion.c index a1ad5b7..49c1413 100644 --- a/kernel/kernel/sched/completion.c +++ b/kernel/kernel/sched/completion.c @@ -29,12 +29,12 @@ { unsigned long flags; - spin_lock_irqsave(&x->wait.lock, flags); + raw_spin_lock_irqsave(&x->wait.lock, flags); if (x->done != UINT_MAX) x->done++; - __wake_up_locked(&x->wait, TASK_NORMAL, 1); - spin_unlock_irqrestore(&x->wait.lock, flags); + swake_up_locked(&x->wait); + raw_spin_unlock_irqrestore(&x->wait.lock, flags); } EXPORT_SYMBOL(complete); @@ -58,10 +58,10 @@ { unsigned long flags; - spin_lock_irqsave(&x->wait.lock, flags); + raw_spin_lock_irqsave(&x->wait.lock, flags); x->done = UINT_MAX; - __wake_up_locked(&x->wait, TASK_NORMAL, 0); - spin_unlock_irqrestore(&x->wait.lock, flags); + swake_up_all_locked(&x->wait); + raw_spin_unlock_irqrestore(&x->wait.lock, flags); } EXPORT_SYMBOL(complete_all); @@ -70,20 +70,20 @@ long (*action)(long), long timeout, int state) { if (!x->done) { - DECLARE_WAITQUEUE(wait, current); + DECLARE_SWAITQUEUE(wait); - __add_wait_queue_entry_tail_exclusive(&x->wait, &wait); do { if (signal_pending_state(state, current)) { timeout = -ERESTARTSYS; break; } + __prepare_to_swait(&x->wait, &wait); __set_current_state(state); - spin_unlock_irq(&x->wait.lock); + raw_spin_unlock_irq(&x->wait.lock); timeout = action(timeout); - spin_lock_irq(&x->wait.lock); + raw_spin_lock_irq(&x->wait.lock); } while (!x->done && timeout); - __remove_wait_queue(&x->wait, &wait); + __finish_swait(&x->wait, &wait); if (!x->done) return timeout; } @@ -100,9 +100,9 @@ complete_acquire(x); - spin_lock_irq(&x->wait.lock); + raw_spin_lock_irq(&x->wait.lock); timeout = do_wait_for_common(x, action, timeout, state); - spin_unlock_irq(&x->wait.lock); + raw_spin_unlock_irq(&x->wait.lock); complete_release(x); @@ -291,12 +291,12 @@ if (!READ_ONCE(x->done)) return false; - spin_lock_irqsave(&x->wait.lock, flags); + raw_spin_lock_irqsave(&x->wait.lock, flags); if (!x->done) ret = false; else if (x->done != UINT_MAX) x->done--; - spin_unlock_irqrestore(&x->wait.lock, flags); + raw_spin_unlock_irqrestore(&x->wait.lock, flags); return ret; } EXPORT_SYMBOL(try_wait_for_completion); @@ -322,8 +322,8 @@ * otherwise we can end up freeing the completion before complete() * is done referencing it. */ - spin_lock_irqsave(&x->wait.lock, flags); - spin_unlock_irqrestore(&x->wait.lock, flags); + raw_spin_lock_irqsave(&x->wait.lock, flags); + raw_spin_unlock_irqrestore(&x->wait.lock, flags); return true; } EXPORT_SYMBOL(completion_done); diff --git a/kernel/kernel/sched/core.c b/kernel/kernel/sched/core.c index 3908b0e..0ed5c23 100644 --- a/kernel/kernel/sched/core.c +++ b/kernel/kernel/sched/core.c @@ -45,7 +45,11 @@ * Number of tasks to iterate in a single balance run. * Limited because this is done with IRQs disabled. */ +#ifdef CONFIG_PREEMPT_RT_FULL +const_debug unsigned int sysctl_sched_nr_migrate = 8; +#else const_debug unsigned int sysctl_sched_nr_migrate = 32; +#endif /* * period over which we measure -rt task CPU usage in us. @@ -317,7 +321,7 @@ rq->hrtick_csd.info = rq; #endif - hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); rq->hrtick_timer.function = hrtick; } #else /* CONFIG_SCHED_HRTICK */ @@ -399,9 +403,15 @@ #endif #endif -void wake_q_add(struct wake_q_head *head, struct task_struct *task) +void __wake_q_add(struct wake_q_head *head, struct task_struct *task, + bool sleeper) { - struct wake_q_node *node = &task->wake_q; + struct wake_q_node *node; + + if (sleeper) + node = &task->wake_q_sleeper; + else + node = &task->wake_q; /* * Atomically grab the task, if ->wake_q is !nil already it means @@ -429,25 +439,33 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags, int sibling_count_hint); - -void wake_up_q(struct wake_q_head *head) +void __wake_up_q(struct wake_q_head *head, bool sleeper) { struct wake_q_node *node = head->first; while (node != WAKE_Q_TAIL) { struct task_struct *task; - task = container_of(node, struct task_struct, wake_q); + if (sleeper) + task = container_of(node, struct task_struct, wake_q_sleeper); + else + task = container_of(node, struct task_struct, wake_q); BUG_ON(!task); /* Task can safely be re-inserted now: */ node = node->next; - task->wake_q.next = NULL; - + if (sleeper) + task->wake_q_sleeper.next = NULL; + else + task->wake_q.next = NULL; /* - * try_to_wake_up() executes a full barrier, which pairs with + * wake_up_process() executes a full barrier, which pairs with * the queueing in wake_q_add() so as not to miss wakeups. */ - try_to_wake_up(task, TASK_NORMAL, 0, head->count); + if (sleeper) + wake_up_lock_sleeper(task); + else + wake_up_process(task); + put_task_struct(task); } } @@ -486,6 +504,48 @@ else trace_sched_wake_idle_without_ipi(cpu); } + +#ifdef CONFIG_PREEMPT_LAZY + +static int tsk_is_polling(struct task_struct *p) +{ +#ifdef TIF_POLLING_NRFLAG + return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); +#else + return 0; +#endif +} + +void resched_curr_lazy(struct rq *rq) +{ + struct task_struct *curr = rq->curr; + int cpu; + + if (!sched_feat(PREEMPT_LAZY)) { + resched_curr(rq); + return; + } + + lockdep_assert_held(&rq->lock); + + if (test_tsk_need_resched(curr)) + return; + + if (test_tsk_need_resched_lazy(curr)) + return; + + set_tsk_need_resched_lazy(curr); + + cpu = cpu_of(rq); + if (cpu == smp_processor_id()) + return; + + /* NEED_RESCHED_LAZY must be visible before we test polling */ + smp_mb(); + if (!tsk_is_polling(curr)) + smp_send_reschedule(cpu); +} +#endif void resched_cpu(int cpu) { @@ -1481,10 +1541,10 @@ */ static inline bool is_cpu_allowed(struct task_struct *p, int cpu) { - if (!cpumask_test_cpu(cpu, &p->cpus_allowed)) + if (!cpumask_test_cpu(cpu, p->cpus_ptr)) return false; - if (is_per_cpu_kthread(p)) + if (is_per_cpu_kthread(p) || __migrate_disabled(p)) return cpu_online(cpu); return cpu_active(cpu); @@ -1533,6 +1593,7 @@ struct migration_arg { struct task_struct *task; int dest_cpu; + bool done; }; /* @@ -1568,6 +1629,11 @@ struct task_struct *p = arg->task; struct rq *rq = this_rq(); struct rq_flags rf; + int dest_cpu = arg->dest_cpu; + + /* We don't look at arg after this point. */ + smp_mb(); + arg->done = true; /* * The original target CPU might have gone down and we might @@ -1576,7 +1642,7 @@ local_irq_disable(); /* * We need to explicitly wake pending tasks before running - * __migrate_task() such that we will not miss enforcing cpus_allowed + * __migrate_task() such that we will not miss enforcing cpus_ptr * during wakeups, see set_cpus_allowed_ptr()'s TASK_WAKING test. */ sched_ttwu_pending(); @@ -1590,9 +1656,9 @@ */ if (task_rq(p) == rq) { if (task_on_rq_queued(p)) - rq = __migrate_task(rq, &rf, p, arg->dest_cpu); + rq = __migrate_task(rq, &rf, p, dest_cpu); else - p->wake_cpu = arg->dest_cpu; + p->wake_cpu = dest_cpu; } rq_unlock(rq, &rf); raw_spin_unlock(&p->pi_lock); @@ -1607,9 +1673,18 @@ */ void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask) { - cpumask_copy(&p->cpus_allowed, new_mask); - p->nr_cpus_allowed = cpumask_weight(new_mask); + cpumask_copy(&p->cpus_mask, new_mask); + if (p->cpus_ptr == &p->cpus_mask) + p->nr_cpus_allowed = cpumask_weight(new_mask); } + +#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) +int __migrate_disabled(struct task_struct *p) +{ + return p->migrate_disable; +} +EXPORT_SYMBOL_GPL(__migrate_disabled); +#endif void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) { @@ -1677,7 +1752,7 @@ goto out; } - if (cpumask_equal(&p->cpus_allowed, new_mask)) + if (cpumask_equal(&p->cpus_mask, new_mask)) goto out; dest_cpu = cpumask_any_and(cpu_valid_mask, new_mask); @@ -1699,7 +1774,8 @@ } /* Can the task run on the task's current CPU? If so, we're done */ - if (cpumask_test_cpu(task_cpu(p), new_mask)) + if (cpumask_test_cpu(task_cpu(p), new_mask) || + p->cpus_ptr != &p->cpus_mask) goto out; if (task_running(rq, p) || p->state == TASK_WAKING) { @@ -1840,10 +1916,10 @@ if (task_cpu(arg->src_task) != arg->src_cpu) goto unlock; - if (!cpumask_test_cpu(arg->dst_cpu, &arg->src_task->cpus_allowed)) + if (!cpumask_test_cpu(arg->dst_cpu, arg->src_task->cpus_ptr)) goto unlock; - if (!cpumask_test_cpu(arg->src_cpu, &arg->dst_task->cpus_allowed)) + if (!cpumask_test_cpu(arg->src_cpu, arg->dst_task->cpus_ptr)) goto unlock; __migrate_swap_task(arg->src_task, arg->dst_cpu); @@ -1885,10 +1961,10 @@ if (!cpu_active(arg.src_cpu) || !cpu_active(arg.dst_cpu)) goto out; - if (!cpumask_test_cpu(arg.dst_cpu, &arg.src_task->cpus_allowed)) + if (!cpumask_test_cpu(arg.dst_cpu, arg.src_task->cpus_ptr)) goto out; - if (!cpumask_test_cpu(arg.src_cpu, &arg.dst_task->cpus_allowed)) + if (!cpumask_test_cpu(arg.src_cpu, arg.dst_task->cpus_ptr)) goto out; trace_sched_swap_numa(cur, arg.src_cpu, p, arg.dst_cpu); @@ -1898,6 +1974,18 @@ return ret; } #endif /* CONFIG_NUMA_BALANCING */ + +static bool check_task_state(struct task_struct *p, long match_state) +{ + bool match = false; + + raw_spin_lock_irq(&p->pi_lock); + if (p->state == match_state || p->saved_state == match_state) + match = true; + raw_spin_unlock_irq(&p->pi_lock); + + return match; +} /* * wait_task_inactive - wait for a thread to unschedule. @@ -1943,7 +2031,7 @@ * is actually now running somewhere else! */ while (task_running(rq, p)) { - if (match_state && unlikely(p->state != match_state)) + if (match_state && !check_task_state(p, match_state)) return 0; cpu_relax(); } @@ -1958,7 +2046,8 @@ running = task_running(rq, p); queued = task_on_rq_queued(p); ncsw = 0; - if (!match_state || p->state == match_state) + if (!match_state || p->state == match_state || + p->saved_state == match_state) ncsw = p->nvcsw | LONG_MIN; /* sets MSB */ task_rq_unlock(rq, p, &rf); @@ -2033,7 +2122,7 @@ EXPORT_SYMBOL_GPL(kick_process); /* - * ->cpus_allowed is protected by both rq->lock and p->pi_lock + * ->cpus_ptr is protected by both rq->lock and p->pi_lock * * A few notes on cpu_active vs cpu_online: * @@ -2073,14 +2162,14 @@ for_each_cpu(dest_cpu, nodemask) { if (!cpu_active(dest_cpu)) continue; - if (cpumask_test_cpu(dest_cpu, &p->cpus_allowed)) + if (cpumask_test_cpu(dest_cpu, p->cpus_ptr)) return dest_cpu; } } for (;;) { /* Any allowed, online CPU? */ - for_each_cpu(dest_cpu, &p->cpus_allowed) { + for_each_cpu(dest_cpu, p->cpus_ptr) { if (!is_cpu_allowed(p, dest_cpu)) continue; @@ -2124,7 +2213,7 @@ } /* - * The caller (fork, wakeup) owns p->pi_lock, ->cpus_allowed is stable. + * The caller (fork, wakeup) owns p->pi_lock, ->cpus_ptr is stable. */ static inline int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags, @@ -2136,11 +2225,11 @@ cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags, sibling_count_hint); else - cpu = cpumask_any(&p->cpus_allowed); + cpu = cpumask_any(p->cpus_ptr); /* * In order not to call set_task_cpu() on a blocking task we need - * to rely on ttwu() to place the task on a valid ->cpus_allowed + * to rely on ttwu() to place the task on a valid ->cpus_ptr * CPU. * * Since this is common to all placement strategies, this lives here. @@ -2243,10 +2332,6 @@ { activate_task(rq, p, en_flags); p->on_rq = TASK_ON_RQ_QUEUED; - - /* If a worker is waking up, notify the workqueue: */ - if (p->flags & PF_WQ_WORKER) - wq_worker_waking_up(p, cpu_of(rq)); } /* @@ -2571,8 +2656,27 @@ */ raw_spin_lock_irqsave(&p->pi_lock, flags); smp_mb__after_spinlock(); - if (!(p->state & state)) + if (!(p->state & state)) { + /* + * The task might be running due to a spinlock sleeper + * wakeup. Check the saved state and set it to running + * if the wakeup condition is true. + */ + if (!(wake_flags & WF_LOCK_SLEEPER)) { + if (p->saved_state & state) { + p->saved_state = TASK_RUNNING; + success = 1; + } + } goto out; + } + + /* + * If this is a regular wakeup, then we can unconditionally + * clear the saved state of a "lock sleeper". + */ + if (!(wake_flags & WF_LOCK_SLEEPER)) + p->saved_state = TASK_RUNNING; trace_sched_waking(p); @@ -2672,56 +2776,6 @@ } /** - * try_to_wake_up_local - try to wake up a local task with rq lock held - * @p: the thread to be awakened - * @rf: request-queue flags for pinning - * - * Put @p on the run-queue if it's not already there. The caller must - * ensure that this_rq() is locked, @p is bound to this_rq() and not - * the current task. - */ -static void try_to_wake_up_local(struct task_struct *p, struct rq_flags *rf) -{ - struct rq *rq = task_rq(p); - - if (WARN_ON_ONCE(rq != this_rq()) || - WARN_ON_ONCE(p == current)) - return; - - lockdep_assert_held(&rq->lock); - - if (!raw_spin_trylock(&p->pi_lock)) { - /* - * This is OK, because current is on_cpu, which avoids it being - * picked for load-balance and preemption/IRQs are still - * disabled avoiding further scheduler activity on it and we've - * not yet picked a replacement task. - */ - rq_unlock(rq, rf); - raw_spin_lock(&p->pi_lock); - rq_relock(rq, rf); - } - - if (!(p->state & TASK_NORMAL)) - goto out; - - trace_sched_waking(p); - - if (!task_on_rq_queued(p)) { - if (p->in_iowait) { - delayacct_blkio_end(p); - atomic_dec(&rq->nr_iowait); - } - ttwu_activate(rq, p, ENQUEUE_WAKEUP | ENQUEUE_NOCLOCK); - } - - ttwu_do_wakeup(rq, p, 0, rf); - ttwu_stat(p, smp_processor_id(), 0); -out: - raw_spin_unlock(&p->pi_lock); -} - -/** * wake_up_process - Wake up a specific process * @p: The process to be woken up. * @@ -2737,6 +2791,18 @@ return try_to_wake_up(p, TASK_NORMAL, 0, 1); } EXPORT_SYMBOL(wake_up_process); + +/** + * wake_up_lock_sleeper - Wake up a specific process blocked on a "sleeping lock" + * @p: The process to be woken up. + * + * Same as wake_up_process() above, but wake_flags=WF_LOCK_SLEEPER to indicate + * the nature of the wakeup. + */ +int wake_up_lock_sleeper(struct task_struct *p) +{ + return try_to_wake_up(p, TASK_UNINTERRUPTIBLE, WF_LOCK_SLEEPER, 1); +} int wake_up_state(struct task_struct *p, unsigned int state) { @@ -2978,6 +3044,9 @@ p->on_cpu = 0; #endif init_task_preempt_count(p); +#ifdef CONFIG_HAVE_PREEMPT_LAZY + task_thread_info(p)->preempt_lazy_count = 0; +#endif #ifdef CONFIG_SMP plist_node_init(&p->pushable_tasks, MAX_PRIO); RB_CLEAR_NODE(&p->pushable_dl_tasks); @@ -3018,7 +3087,7 @@ #ifdef CONFIG_SMP /* * Fork balancing, do it here and not earlier because: - * - cpus_allowed can change in the fork path + * - cpus_ptr can change in the fork path * - any previously selected CPU might disappear through hotplug * * Use __set_task_cpu() to avoid calling sched_class::migrate_task_rq, @@ -3307,22 +3376,17 @@ * provided by mmdrop(), * - a sync_core for SYNC_CORE. */ + /* + * We use mmdrop_delayed() here so we don't have to do the + * full __mmdrop() when we are the last user. + */ if (mm) { membarrier_mm_sync_core_before_usermode(mm); - mmdrop(mm); + mmdrop_delayed(mm); } if (unlikely(prev_state == TASK_DEAD)) { if (prev->sched_class->task_dead) prev->sched_class->task_dead(prev); - - /* - * Remove function-return probe instances associated with this - * task and put them back on the free list. - */ - kprobe_flush_task(prev); - - /* Task is done with its stack. */ - put_task_stack(prev); put_task_struct(prev); } @@ -4001,6 +4065,8 @@ BUG(); } +static void migrate_disabled_sched(struct task_struct *p); + /* * __schedule() is the main scheduler function. * @@ -4071,6 +4137,9 @@ rq_lock(rq, &rf); smp_mb__after_spinlock(); + if (__migrate_disabled(prev)) + migrate_disabled_sched(prev); + /* Promote REQ to ACT */ rq->clock_update_flags <<= 1; update_rq_clock(rq); @@ -4087,25 +4156,13 @@ atomic_inc(&rq->nr_iowait); delayacct_blkio_start(); } - - /* - * If a worker went to sleep, notify and ask workqueue - * whether it wants to wake up a task to maintain - * concurrency. - */ - if (prev->flags & PF_WQ_WORKER) { - struct task_struct *to_wakeup; - - to_wakeup = wq_worker_sleeping(prev); - if (to_wakeup) - try_to_wake_up_local(to_wakeup, &rf); - } } switch_count = &prev->nvcsw; } next = pick_next_task(rq, prev, &rf); clear_tsk_need_resched(prev); + clear_tsk_need_resched_lazy(prev); clear_preempt_need_resched(); if (likely(prev != next)) { @@ -4157,14 +4214,37 @@ static inline void sched_submit_work(struct task_struct *tsk) { - if (!tsk->state || tsk_is_pi_blocked(tsk)) + if (!tsk->state) return; + + /* + * If a worker went to sleep, notify and ask workqueue whether + * it wants to wake up a task to maintain concurrency. + * As this function is called inside the schedule() context, + * we disable preemption to avoid it calling schedule() again + * in the possible wakeup of a kworker. + */ + if (tsk->flags & PF_WQ_WORKER) { + preempt_disable(); + wq_worker_sleeping(tsk); + preempt_enable_no_resched(); + } + + if (tsk_is_pi_blocked(tsk)) + return; + /* * If we are going to sleep and we have plugged IO queued, * make sure to submit it to avoid deadlocks. */ if (blk_needs_flush_plug(tsk)) blk_schedule_flush_plug(tsk); +} + +static void sched_update_worker(struct task_struct *tsk) +{ + if (tsk->flags & PF_WQ_WORKER) + wq_worker_running(tsk); } asmlinkage __visible void __sched schedule(void) @@ -4177,6 +4257,7 @@ __schedule(false); sched_preempt_enable_no_resched(); } while (need_resched()); + sched_update_worker(tsk); } EXPORT_SYMBOL(schedule); @@ -4265,6 +4346,30 @@ } while (need_resched()); } +#ifdef CONFIG_PREEMPT_LAZY +/* + * If TIF_NEED_RESCHED is then we allow to be scheduled away since this is + * set by a RT task. Oterwise we try to avoid beeing scheduled out as long as + * preempt_lazy_count counter >0. + */ +static __always_inline int preemptible_lazy(void) +{ + if (test_thread_flag(TIF_NEED_RESCHED)) + return 1; + if (current_thread_info()->preempt_lazy_count) + return 0; + return 1; +} + +#else + +static inline int preemptible_lazy(void) +{ + return 1; +} + +#endif + #ifdef CONFIG_PREEMPT /* * this is the entry point to schedule() from in-kernel preemption @@ -4279,7 +4384,8 @@ */ if (likely(!preemptible())) return; - + if (!preemptible_lazy()) + return; preempt_schedule_common(); } NOKPROBE_SYMBOL(preempt_schedule); @@ -4304,6 +4410,9 @@ enum ctx_state prev_ctx; if (likely(!preemptible())) + return; + + if (!preemptible_lazy()) return; do { @@ -4951,7 +5060,7 @@ * the entire root_domain to become SCHED_DEADLINE. We * will also fail if there's no bandwidth available. */ - if (!cpumask_subset(span, &p->cpus_allowed) || + if (!cpumask_subset(span, p->cpus_ptr) || rq->rd->dl_bw.bw == 0) { task_rq_unlock(rq, p, &rf); return -EPERM; @@ -5569,7 +5678,7 @@ goto out_unlock; raw_spin_lock_irqsave(&p->pi_lock, flags); - cpumask_and(mask, &p->cpus_allowed, cpu_active_mask); + cpumask_and(mask, &p->cpus_mask, cpu_active_mask); raw_spin_unlock_irqrestore(&p->pi_lock, flags); out_unlock: @@ -6106,7 +6215,9 @@ /* Set the preempt count _outside_ the spinlocks! */ init_idle_preempt_count(idle, cpu); - +#ifdef CONFIG_HAVE_PREEMPT_LAZY + task_thread_info(idle)->preempt_lazy_count = 0; +#endif /* * The idle tasks have their own, simple scheduling class: */ @@ -6145,7 +6256,7 @@ * allowed nodes is unnecessary. Thus, cpusets are not * applicable for such threads. This prevents checking for * success of set_cpus_allowed_ptr() on all attached tasks - * before cpus_allowed may be changed. + * before cpus_mask may be changed. */ if (p->flags & PF_NO_SETAFFINITY) { ret = -EINVAL; @@ -6172,7 +6283,7 @@ if (curr_cpu == target_cpu) return 0; - if (!cpumask_test_cpu(target_cpu, &p->cpus_allowed)) + if (!cpumask_test_cpu(target_cpu, p->cpus_ptr)) return -EINVAL; /* TODO: This is not properly updating schedstats */ @@ -6211,6 +6322,7 @@ #endif /* CONFIG_NUMA_BALANCING */ #ifdef CONFIG_HOTPLUG_CPU + /* * Ensure that the idle task is using init_mm right before its CPU goes * offline. @@ -6310,8 +6422,10 @@ BUG_ON(!next); put_prev_task(rq, next); + WARN_ON_ONCE(__migrate_disabled(next)); + /* - * Rules for changing task_struct::cpus_allowed are holding + * Rules for changing task_struct::cpus_mask are holding * both pi_lock and rq->lock, such that holding either * stabilizes the mask. * @@ -6777,7 +6891,7 @@ #ifdef CONFIG_DEBUG_ATOMIC_SLEEP static inline int preempt_count_equals(int preempt_offset) { - int nested = preempt_count() + rcu_preempt_depth(); + int nested = preempt_count() + sched_rcu_preempt_depth(); return (nested == preempt_offset); } @@ -8014,3 +8128,171 @@ }; #undef CREATE_TRACE_POINTS + +#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + +static inline void +update_nr_migratory(struct task_struct *p, long delta) +{ + if (unlikely((p->sched_class == &rt_sched_class || + p->sched_class == &dl_sched_class) && + p->nr_cpus_allowed > 1)) { + if (p->sched_class == &rt_sched_class) + task_rq(p)->rt.rt_nr_migratory += delta; + else + task_rq(p)->dl.dl_nr_migratory += delta; + } +} + +static inline void +migrate_disable_update_cpus_allowed(struct task_struct *p) +{ + p->cpus_ptr = cpumask_of(smp_processor_id()); + update_nr_migratory(p, -1); + p->nr_cpus_allowed = 1; +} + +static inline void +migrate_enable_update_cpus_allowed(struct task_struct *p) +{ + struct rq *rq; + struct rq_flags rf; + + rq = task_rq_lock(p, &rf); + p->cpus_ptr = &p->cpus_mask; + p->nr_cpus_allowed = cpumask_weight(&p->cpus_mask); + update_nr_migratory(p, 1); + task_rq_unlock(rq, p, &rf); +} + +void migrate_disable(void) +{ + preempt_disable(); + + if (++current->migrate_disable == 1) { + this_rq()->nr_pinned++; + preempt_lazy_disable(); +#ifdef CONFIG_SCHED_DEBUG + WARN_ON_ONCE(current->pinned_on_cpu >= 0); + current->pinned_on_cpu = smp_processor_id(); +#endif + } + + preempt_enable(); +} +EXPORT_SYMBOL(migrate_disable); + +static void migrate_disabled_sched(struct task_struct *p) +{ + if (p->migrate_disable_scheduled) + return; + + migrate_disable_update_cpus_allowed(p); + p->migrate_disable_scheduled = 1; +} + +static DEFINE_PER_CPU(struct cpu_stop_work, migrate_work); +static DEFINE_PER_CPU(struct migration_arg, migrate_arg); + +void migrate_enable(void) +{ + struct task_struct *p = current; + struct rq *rq = this_rq(); + int cpu = task_cpu(p); + + WARN_ON_ONCE(p->migrate_disable <= 0); + if (p->migrate_disable > 1) { + p->migrate_disable--; + return; + } + + preempt_disable(); + +#ifdef CONFIG_SCHED_DEBUG + WARN_ON_ONCE(current->pinned_on_cpu != cpu); + current->pinned_on_cpu = -1; +#endif + + WARN_ON_ONCE(rq->nr_pinned < 1); + + p->migrate_disable = 0; + rq->nr_pinned--; +#ifdef CONFIG_HOTPLUG_CPU + if (rq->nr_pinned == 0 && unlikely(!cpu_active(cpu)) && + takedown_cpu_task) + wake_up_process(takedown_cpu_task); +#endif + + if (!p->migrate_disable_scheduled) + goto out; + + p->migrate_disable_scheduled = 0; + + migrate_enable_update_cpus_allowed(p); + + WARN_ON(smp_processor_id() != cpu); + if (!is_cpu_allowed(p, cpu)) { + struct migration_arg __percpu *arg; + struct cpu_stop_work __percpu *work; + struct rq_flags rf; + + work = this_cpu_ptr(&migrate_work); + arg = this_cpu_ptr(&migrate_arg); + WARN_ON_ONCE(!arg->done && !work->disabled && work->arg); + + arg->task = p; + arg->done = false; + + rq = task_rq_lock(p, &rf); + update_rq_clock(rq); + arg->dest_cpu = select_fallback_rq(cpu, p); + task_rq_unlock(rq, p, &rf); + + stop_one_cpu_nowait(task_cpu(p), migration_cpu_stop, + arg, work); + tlb_migrate_finish(p->mm); + } + +out: + preempt_lazy_enable(); + preempt_enable(); +} +EXPORT_SYMBOL(migrate_enable); + +int cpu_nr_pinned(int cpu) +{ + struct rq *rq = cpu_rq(cpu); + + return rq->nr_pinned; +} + +#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) +static void migrate_disabled_sched(struct task_struct *p) +{ +} + +void migrate_disable(void) +{ +#ifdef CONFIG_SCHED_DEBUG + current->migrate_disable++; +#endif + barrier(); +} +EXPORT_SYMBOL(migrate_disable); + +void migrate_enable(void) +{ +#ifdef CONFIG_SCHED_DEBUG + struct task_struct *p = current; + + WARN_ON_ONCE(p->migrate_disable <= 0); + p->migrate_disable--; +#endif + barrier(); +} +EXPORT_SYMBOL(migrate_enable); +#else +static void migrate_disabled_sched(struct task_struct *p) +{ +} +#endif diff --git a/kernel/kernel/sched/cpudeadline.c b/kernel/kernel/sched/cpudeadline.c index 5031645..d57fb2f 100644 --- a/kernel/kernel/sched/cpudeadline.c +++ b/kernel/kernel/sched/cpudeadline.c @@ -124,14 +124,14 @@ const struct sched_dl_entity *dl_se = &p->dl; if (later_mask && - cpumask_and(later_mask, cp->free_cpus, &p->cpus_allowed)) { + cpumask_and(later_mask, cp->free_cpus, p->cpus_ptr)) { return 1; } else { int best_cpu = cpudl_maximum(cp); WARN_ON(best_cpu != -1 && !cpu_present(best_cpu)); - if (cpumask_test_cpu(best_cpu, &p->cpus_allowed) && + if (cpumask_test_cpu(best_cpu, p->cpus_ptr) && dl_time_before(dl_se->deadline, cp->elements[0].dl)) { if (later_mask) cpumask_set_cpu(best_cpu, later_mask); diff --git a/kernel/kernel/sched/cpupri.c b/kernel/kernel/sched/cpupri.c index 685ee13..3e0c8f9 100644 --- a/kernel/kernel/sched/cpupri.c +++ b/kernel/kernel/sched/cpupri.c @@ -77,11 +77,11 @@ if (skip) return 0; - if (cpumask_any_and(&p->cpus_allowed, vec->mask) >= nr_cpu_ids) + if (cpumask_any_and(p->cpus_ptr, vec->mask) >= nr_cpu_ids) return 0; if (lowest_mask) { - cpumask_and(lowest_mask, &p->cpus_allowed, vec->mask); + cpumask_and(lowest_mask, p->cpus_ptr, vec->mask); /* * We have to ensure that we have at least one bit diff --git a/kernel/kernel/sched/deadline.c b/kernel/kernel/sched/deadline.c index 2960c5f..459e7ed 100644 --- a/kernel/kernel/sched/deadline.c +++ b/kernel/kernel/sched/deadline.c @@ -287,7 +287,7 @@ dl_se->dl_non_contending = 1; get_task_struct(p); - hrtimer_start(timer, ns_to_ktime(zerolag_time), HRTIMER_MODE_REL); + hrtimer_start(timer, ns_to_ktime(zerolag_time), HRTIMER_MODE_REL_HARD); } static void task_contending(struct sched_dl_entity *dl_se, int flags) @@ -539,7 +539,7 @@ * If we cannot preempt any rq, fall back to pick any * online CPU: */ - cpu = cpumask_any_and(cpu_active_mask, &p->cpus_allowed); + cpu = cpumask_any_and(cpu_active_mask, p->cpus_ptr); if (cpu >= nr_cpu_ids) { /* * Failed to find any suitable CPU. @@ -1086,7 +1086,7 @@ { struct hrtimer *timer = &dl_se->dl_timer; - hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); timer->function = dl_task_timer; } @@ -1325,7 +1325,7 @@ { struct hrtimer *timer = &dl_se->inactive_timer; - hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); timer->function = inactive_task_timer; } @@ -1858,7 +1858,7 @@ static int pick_dl_task(struct rq *rq, struct task_struct *p, int cpu) { if (!task_running(rq, p) && - cpumask_test_cpu(cpu, &p->cpus_allowed)) + cpumask_test_cpu(cpu, p->cpus_ptr)) return 1; return 0; } @@ -2008,7 +2008,7 @@ /* Retry if something changed. */ if (double_lock_balance(rq, later_rq)) { if (unlikely(task_rq(task) != rq || - !cpumask_test_cpu(later_rq->cpu, &task->cpus_allowed) || + !cpumask_test_cpu(later_rq->cpu, task->cpus_ptr) || task_running(rq, task) || !dl_task(task) || !task_on_rq_queued(task))) { diff --git a/kernel/kernel/sched/debug.c b/kernel/kernel/sched/debug.c index 9518606..e97d4be 100644 --- a/kernel/kernel/sched/debug.c +++ b/kernel/kernel/sched/debug.c @@ -998,6 +998,10 @@ P(dl.runtime); P(dl.deadline); } +#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + P(migrate_disable); +#endif + P(nr_cpus_allowed); #undef PN_SCHEDSTAT #undef PN #undef __PN diff --git a/kernel/kernel/sched/fair.c b/kernel/kernel/sched/fair.c index 15cb544..29ccb7a 100644 --- a/kernel/kernel/sched/fair.c +++ b/kernel/kernel/sched/fair.c @@ -1705,7 +1705,7 @@ * be incurred if the tasks were swapped. */ /* Skip this swap candidate if cannot move to the source cpu */ - if (!cpumask_test_cpu(env->src_cpu, &cur->cpus_allowed)) + if (!cpumask_test_cpu(env->src_cpu, cur->cpus_ptr)) goto unlock; /* @@ -1803,7 +1803,7 @@ for_each_cpu(cpu, cpumask_of_node(env->dst_nid)) { /* Skip this CPU if the source task cannot migrate */ - if (!cpumask_test_cpu(cpu, &env->p->cpus_allowed)) + if (!cpumask_test_cpu(cpu, env->p->cpus_ptr)) continue; env->dst_cpu = cpu; @@ -4210,7 +4210,7 @@ ideal_runtime = sched_slice(cfs_rq, curr); delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; if (delta_exec > ideal_runtime) { - resched_curr(rq_of(cfs_rq)); + resched_curr_lazy(rq_of(cfs_rq)); /* * The current task ran long enough, ensure it doesn't get * re-elected due to buddy favours. @@ -4234,7 +4234,7 @@ return; if (delta > ideal_runtime) - resched_curr(rq_of(cfs_rq)); + resched_curr_lazy(rq_of(cfs_rq)); } static void @@ -4376,7 +4376,7 @@ * validating it and just reschedule. */ if (queued) { - resched_curr(rq_of(cfs_rq)); + resched_curr_lazy(rq_of(cfs_rq)); return; } /* @@ -4510,7 +4510,7 @@ * hierarchy can be throttled */ if (!assign_cfs_rq_runtime(cfs_rq) && likely(cfs_rq->curr)) - resched_curr(rq_of(cfs_rq)); + resched_curr_lazy(rq_of(cfs_rq)); } static __always_inline @@ -4703,7 +4703,7 @@ struct rq *rq = rq_of(cfs_rq); struct rq_flags rf; - rq_lock(rq, &rf); + rq_lock_irqsave(rq, &rf); if (!cfs_rq_throttled(cfs_rq)) goto next; @@ -4722,7 +4722,7 @@ unthrottle_cfs_rq(cfs_rq); next: - rq_unlock(rq, &rf); + rq_unlock_irqrestore(rq, &rf); if (!remaining) break; @@ -4738,7 +4738,7 @@ * period the timer is deactivated until scheduling resumes; cfs_b->idle is * used to track this state. */ -static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun) +static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun, unsigned long flags) { u64 runtime; int throttled; @@ -4778,10 +4778,10 @@ while (throttled && cfs_b->runtime > 0 && !cfs_b->distribute_running) { runtime = cfs_b->runtime; cfs_b->distribute_running = 1; - raw_spin_unlock(&cfs_b->lock); + raw_spin_unlock_irqrestore(&cfs_b->lock, flags); /* we can't nest cfs_b->lock while distributing bandwidth */ runtime = distribute_cfs_runtime(cfs_b, runtime); - raw_spin_lock(&cfs_b->lock); + raw_spin_lock_irqsave(&cfs_b->lock, flags); cfs_b->distribute_running = 0; throttled = !list_empty(&cfs_b->throttled_cfs_rq); @@ -4889,16 +4889,17 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b) { u64 runtime = 0, slice = sched_cfs_bandwidth_slice(); + unsigned long flags; /* confirm we're still not at a refresh boundary */ - raw_spin_lock(&cfs_b->lock); + raw_spin_lock_irqsave(&cfs_b->lock, flags); if (cfs_b->distribute_running) { - raw_spin_unlock(&cfs_b->lock); + raw_spin_unlock_irqrestore(&cfs_b->lock, flags); return; } if (runtime_refresh_within(cfs_b, min_bandwidth_expiration)) { - raw_spin_unlock(&cfs_b->lock); + raw_spin_unlock_irqrestore(&cfs_b->lock, flags); return; } @@ -4908,17 +4909,17 @@ if (runtime) cfs_b->distribute_running = 1; - raw_spin_unlock(&cfs_b->lock); + raw_spin_unlock_irqrestore(&cfs_b->lock, flags); if (!runtime) return; runtime = distribute_cfs_runtime(cfs_b, runtime); - raw_spin_lock(&cfs_b->lock); + raw_spin_lock_irqsave(&cfs_b->lock, flags); cfs_b->runtime -= min(runtime, cfs_b->runtime); cfs_b->distribute_running = 0; - raw_spin_unlock(&cfs_b->lock); + raw_spin_unlock_irqrestore(&cfs_b->lock, flags); } /* @@ -4998,11 +4999,12 @@ { struct cfs_bandwidth *cfs_b = container_of(timer, struct cfs_bandwidth, period_timer); + unsigned long flags; int overrun; int idle = 0; int count = 0; - raw_spin_lock(&cfs_b->lock); + raw_spin_lock_irqsave(&cfs_b->lock, flags); for (;;) { overrun = hrtimer_forward_now(timer, cfs_b->period); if (!overrun) @@ -5038,11 +5040,11 @@ count = 0; } - idle = do_sched_cfs_period_timer(cfs_b, overrun); + idle = do_sched_cfs_period_timer(cfs_b, overrun, flags); } if (idle) cfs_b->period_active = 0; - raw_spin_unlock(&cfs_b->lock); + raw_spin_unlock_irqrestore(&cfs_b->lock, flags); return idle ? HRTIMER_NORESTART : HRTIMER_RESTART; } @@ -5216,7 +5218,7 @@ if (delta < 0) { if (rq->curr == p) - resched_curr(rq); + resched_curr_lazy(rq); return; } hrtick_start(rq, delta); @@ -6045,7 +6047,7 @@ /* Skip over this group if it has no CPUs allowed */ if (!cpumask_intersects(sched_group_span(group), - &p->cpus_allowed)) + p->cpus_ptr)) continue; #ifdef CONFIG_ROCKCHIP_SCHED_PERFORMANCE_BIAS @@ -6191,7 +6193,7 @@ return cpumask_first(sched_group_span(group)); /* Traverse only the allowed CPUs */ - for_each_cpu_and(i, sched_group_span(group), &p->cpus_allowed) { + for_each_cpu_and(i, sched_group_span(group), p->cpus_ptr) { if (available_idle_cpu(i)) { struct rq *rq = cpu_rq(i); struct cpuidle_state *idle = idle_get_state(rq); @@ -6231,7 +6233,7 @@ { int new_cpu = cpu; - if (!cpumask_intersects(sched_domain_span(sd), &p->cpus_allowed)) + if (!cpumask_intersects(sched_domain_span(sd), p->cpus_ptr)) return prev_cpu; /* @@ -6348,7 +6350,7 @@ if (!test_idle_cores(target, false)) return -1; - cpumask_and(cpus, sched_domain_span(sd), &p->cpus_allowed); + cpumask_and(cpus, sched_domain_span(sd), p->cpus_ptr); for_each_cpu_wrap(core, cpus, target) { bool idle = true; @@ -6382,7 +6384,7 @@ return -1; for_each_cpu(cpu, cpu_smt_mask(target)) { - if (!cpumask_test_cpu(cpu, &p->cpus_allowed)) + if (!cpumask_test_cpu(cpu, p->cpus_ptr)) continue; if (available_idle_cpu(cpu)) return cpu; @@ -6443,7 +6445,7 @@ time = local_clock(); - cpumask_and(cpus, sched_domain_span(sd), &p->cpus_allowed); + cpumask_and(cpus, sched_domain_span(sd), p->cpus_ptr); for_each_cpu_wrap(cpu, cpus, target) { if (!--nr) @@ -6483,7 +6485,7 @@ recent_used_cpu != target && cpus_share_cache(recent_used_cpu, target) && available_idle_cpu(recent_used_cpu) && - cpumask_test_cpu(p->recent_used_cpu, &p->cpus_allowed)) { + cpumask_test_cpu(p->recent_used_cpu, p->cpus_ptr)) { /* * Replace recent_used_cpu with prev as it is a potential * candidate for the next wake: @@ -6701,7 +6703,7 @@ /* Scan CPUs in all SDs */ sg = sd->groups; do { - for_each_cpu_and(i, &p->cpus_allowed, sched_group_span(sg)) { + for_each_cpu_and(i, p->cpus_ptr, sched_group_span(sg)) { unsigned long capacity_curr = capacity_curr_of(i); unsigned long capacity_orig = capacity_orig_of(i); unsigned long wake_util, new_util; @@ -7119,7 +7121,7 @@ max_spare_cap = 0; for_each_cpu_and(cpu, perf_domain_span(pd), sched_domain_span(sd)) { - if (!cpumask_test_cpu(cpu, &p->cpus_allowed)) + if (!cpumask_test_cpu(cpu, p->cpus_ptr)) continue; util = cpu_util_next(cpu, p, cpu); @@ -7237,7 +7239,7 @@ if (sysctl_sched_sync_hint_enable && sync) { cpu = smp_processor_id(); - if (cpumask_test_cpu(cpu, &p->cpus_allowed)) + if (cpumask_test_cpu(cpu, p->cpus_ptr)) return cpu; } @@ -7282,7 +7284,7 @@ goto unlock; } - if (cpumask_test_cpu(prev_cpu, &p->cpus_allowed)) + if (cpumask_test_cpu(prev_cpu, p->cpus_ptr)) prev_energy = best_energy = compute_energy(p, prev_cpu, pd); else prev_energy = best_energy = ULONG_MAX; @@ -7355,7 +7357,7 @@ want_affine = !wake_wide(p, sibling_count_hint) && !wake_cap(p, cpu, prev_cpu) && - cpumask_test_cpu(cpu, &p->cpus_allowed); + cpumask_test_cpu(cpu, p->cpus_ptr); } sd_loop: @@ -7617,7 +7619,7 @@ return; preempt: - resched_curr(rq); + resched_curr_lazy(rq); /* * Only set the backward buddy when the current task is still * on the rq. This can happen when a wakeup gets interleaved @@ -8113,14 +8115,14 @@ /* * We do not migrate tasks that are: * 1) throttled_lb_pair, or - * 2) cannot be migrated to this CPU due to cpus_allowed, or + * 2) cannot be migrated to this CPU due to cpus_ptr, or * 3) running (obviously), or * 4) are cache-hot on their current CPU. */ if (throttled_lb_pair(task_group(p), env->src_cpu, env->dst_cpu)) return 0; - if (!cpumask_test_cpu(env->dst_cpu, &p->cpus_allowed)) { + if (!cpumask_test_cpu(env->dst_cpu, p->cpus_ptr)) { int cpu; schedstat_inc(p->se.statistics.nr_failed_migrations_affine); @@ -8140,7 +8142,7 @@ /* Prevent to re-select dst_cpu via env's CPUs: */ for_each_cpu_and(cpu, env->dst_grpmask, env->cpus) { - if (cpumask_test_cpu(cpu, &p->cpus_allowed)) { + if (cpumask_test_cpu(cpu, p->cpus_ptr)) { env->flags |= LBF_DST_PINNED; env->new_dst_cpu = cpu; break; @@ -8806,7 +8808,7 @@ /* * Group imbalance indicates (and tries to solve) the problem where balancing - * groups is inadequate due to ->cpus_allowed constraints. + * groups is inadequate due to ->cpus_ptr constraints. * * Imagine a situation of two groups of 4 CPUs each and 4 tasks each with a * cpumask covering 1 CPU of the first group and 3 CPUs of the second group. @@ -9507,7 +9509,7 @@ /* * If the busiest group is imbalanced the below checks don't * work because they assume all things are equal, which typically - * isn't true due to cpus_allowed constraints and the like. + * isn't true due to cpus_ptr constraints and the like. */ if (busiest->group_type == group_imbalanced) goto force_balance; @@ -9947,7 +9949,7 @@ * if the curr task on busiest CPU can't be * moved to this_cpu: */ - if (!cpumask_test_cpu(this_cpu, &busiest->curr->cpus_allowed)) { + if (!cpumask_test_cpu(this_cpu, busiest->curr->cpus_ptr)) { raw_spin_unlock_irqrestore(&busiest->lock, flags); env.flags |= LBF_ALL_PINNED; @@ -10943,7 +10945,7 @@ * 'current' within the tree based on its new key value. */ swap(curr->vruntime, se->vruntime); - resched_curr(rq); + resched_curr_lazy(rq); } se->vruntime -= cfs_rq->min_vruntime; @@ -10967,7 +10969,7 @@ */ if (rq->curr == p) { if (p->prio > oldprio) - resched_curr(rq); + resched_curr_lazy(rq); } else check_preempt_curr(rq, p, 0); } diff --git a/kernel/kernel/sched/features.h b/kernel/kernel/sched/features.h index bd395af..6c4089d 100644 --- a/kernel/kernel/sched/features.h +++ b/kernel/kernel/sched/features.h @@ -46,11 +46,19 @@ */ SCHED_FEAT(NONTASK_CAPACITY, true) +#ifdef CONFIG_PREEMPT_RT_FULL +SCHED_FEAT(TTWU_QUEUE, false) +# ifdef CONFIG_PREEMPT_LAZY +SCHED_FEAT(PREEMPT_LAZY, true) +# endif +#else + /* * Queue remote wakeups on the target CPU and process them * using the scheduler IPI. Reduces rq->lock contention/bounces. */ SCHED_FEAT(TTWU_QUEUE, true) +#endif /* * When doing wakeups, attempt to limit superfluous scans of the LLC domain. diff --git a/kernel/kernel/sched/rt.c b/kernel/kernel/sched/rt.c index 5e85960..03edfac 100644 --- a/kernel/kernel/sched/rt.c +++ b/kernel/kernel/sched/rt.c @@ -45,8 +45,8 @@ raw_spin_lock_init(&rt_b->rt_runtime_lock); - hrtimer_init(&rt_b->rt_period_timer, - CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init(&rt_b->rt_period_timer, CLOCK_MONOTONIC, + HRTIMER_MODE_REL_HARD); rt_b->rt_period_timer.function = sched_rt_period_timer; } @@ -1680,7 +1680,7 @@ static int pick_rt_task(struct rq *rq, struct task_struct *p, int cpu) { if (!task_running(rq, p) && - cpumask_test_cpu(cpu, &p->cpus_allowed)) + cpumask_test_cpu(cpu, p->cpus_ptr)) return 1; return 0; @@ -1833,7 +1833,7 @@ * Also make sure that it wasn't scheduled on its rq. */ if (unlikely(task_rq(task) != rq || - !cpumask_test_cpu(lowest_rq->cpu, &task->cpus_allowed) || + !cpumask_test_cpu(lowest_rq->cpu, task->cpus_ptr) || task_running(rq, task) || !rt_task(task) || !task_on_rq_queued(task))) { diff --git a/kernel/kernel/sched/sched.h b/kernel/kernel/sched/sched.h index e0c2353..b30489f 100644 --- a/kernel/kernel/sched/sched.h +++ b/kernel/kernel/sched/sched.h @@ -1024,6 +1024,10 @@ struct cpuidle_state *idle_state; int idle_state_idx; #endif + +#if defined(CONFIG_PREEMPT_RT_BASE) && defined(CONFIG_SMP) + int nr_pinned; +#endif }; #ifdef CONFIG_FAIR_GROUP_SCHED @@ -1670,6 +1674,7 @@ #define WF_SYNC 0x01 /* Waker goes to sleep after wakeup */ #define WF_FORK 0x02 /* Child wakeup after fork */ #define WF_MIGRATED 0x4 /* Internal use, task got migrated */ +#define WF_LOCK_SLEEPER 0x08 /* wakeup spinlock "sleeper" */ /* * To aid in avoiding the subversion of "niceness" due to uneven distribution @@ -1889,6 +1894,15 @@ extern void resched_curr(struct rq *rq); extern void resched_cpu(int cpu); +#ifdef CONFIG_PREEMPT_LAZY +extern void resched_curr_lazy(struct rq *rq); +#else +static inline void resched_curr_lazy(struct rq *rq) +{ + resched_curr(rq); +} +#endif + extern struct rt_bandwidth def_rt_bandwidth; extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime); diff --git a/kernel/kernel/sched/swait.c b/kernel/kernel/sched/swait.c index 66b59ac..119a56d 100644 --- a/kernel/kernel/sched/swait.c +++ b/kernel/kernel/sched/swait.c @@ -32,6 +32,25 @@ } EXPORT_SYMBOL(swake_up_locked); +void swake_up_all_locked(struct swait_queue_head *q) +{ + struct swait_queue *curr; + int wakes = 0; + + while (!list_empty(&q->task_list)) { + + curr = list_first_entry(&q->task_list, typeof(*curr), + task_list); + wake_up_process(curr->task); + list_del_init(&curr->task_list); + wakes++; + } + if (pm_in_action) + return; + WARN(wakes > 2, "complete_all() with %d waiters\n", wakes); +} +EXPORT_SYMBOL(swake_up_all_locked); + void swake_up_one(struct swait_queue_head *q) { unsigned long flags; @@ -51,6 +70,7 @@ struct swait_queue *curr; LIST_HEAD(tmp); + WARN_ON(irqs_disabled()); raw_spin_lock_irq(&q->lock); list_splice_init(&q->task_list, &tmp); while (!list_empty(&tmp)) { @@ -69,7 +89,7 @@ } EXPORT_SYMBOL(swake_up_all); -static void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait) +void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait) { wait->task = current; if (list_empty(&wait->task_list)) diff --git a/kernel/kernel/sched/swork.c b/kernel/kernel/sched/swork.c new file mode 100644 index 0000000..c90d14b --- /dev/null +++ b/kernel/kernel/sched/swork.c @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2014 BMW Car IT GmbH, Daniel Wagner daniel.wagner@bmw-carit.de + * + * Provides a framework for enqueuing callbacks from irq context + * PREEMPT_RT_FULL safe. The callbacks are executed in kthread context. + */ + +#include <linux/swait.h> +#include <linux/swork.h> +#include <linux/kthread.h> +#include <linux/slab.h> +#include <linux/spinlock.h> +#include <linux/export.h> + +#define SWORK_EVENT_PENDING 1 + +static DEFINE_MUTEX(worker_mutex); +static struct sworker *glob_worker; + +struct sworker { + struct list_head events; + struct swait_queue_head wq; + + raw_spinlock_t lock; + + struct task_struct *task; + int refs; +}; + +static bool swork_readable(struct sworker *worker) +{ + bool r; + + if (kthread_should_stop()) + return true; + + raw_spin_lock_irq(&worker->lock); + r = !list_empty(&worker->events); + raw_spin_unlock_irq(&worker->lock); + + return r; +} + +static int swork_kthread(void *arg) +{ + struct sworker *worker = arg; + + for (;;) { + swait_event_interruptible_exclusive(worker->wq, + swork_readable(worker)); + if (kthread_should_stop()) + break; + + raw_spin_lock_irq(&worker->lock); + while (!list_empty(&worker->events)) { + struct swork_event *sev; + + sev = list_first_entry(&worker->events, + struct swork_event, item); + list_del(&sev->item); + raw_spin_unlock_irq(&worker->lock); + + WARN_ON_ONCE(!test_and_clear_bit(SWORK_EVENT_PENDING, + &sev->flags)); + sev->func(sev); + raw_spin_lock_irq(&worker->lock); + } + raw_spin_unlock_irq(&worker->lock); + } + return 0; +} + +static struct sworker *swork_create(void) +{ + struct sworker *worker; + + worker = kzalloc(sizeof(*worker), GFP_KERNEL); + if (!worker) + return ERR_PTR(-ENOMEM); + + INIT_LIST_HEAD(&worker->events); + raw_spin_lock_init(&worker->lock); + init_swait_queue_head(&worker->wq); + + worker->task = kthread_run(swork_kthread, worker, "kswork"); + if (IS_ERR(worker->task)) { + kfree(worker); + return ERR_PTR(-ENOMEM); + } + + return worker; +} + +static void swork_destroy(struct sworker *worker) +{ + kthread_stop(worker->task); + + WARN_ON(!list_empty(&worker->events)); + kfree(worker); +} + +/** + * swork_queue - queue swork + * + * Returns %false if @work was already on a queue, %true otherwise. + * + * The work is queued and processed on a random CPU + */ +bool swork_queue(struct swork_event *sev) +{ + unsigned long flags; + + if (test_and_set_bit(SWORK_EVENT_PENDING, &sev->flags)) + return false; + + raw_spin_lock_irqsave(&glob_worker->lock, flags); + list_add_tail(&sev->item, &glob_worker->events); + raw_spin_unlock_irqrestore(&glob_worker->lock, flags); + + swake_up_one(&glob_worker->wq); + return true; +} +EXPORT_SYMBOL_GPL(swork_queue); + +/** + * swork_get - get an instance of the sworker + * + * Returns an negative error code if the initialization if the worker did not + * work, %0 otherwise. + * + */ +int swork_get(void) +{ + struct sworker *worker; + + mutex_lock(&worker_mutex); + if (!glob_worker) { + worker = swork_create(); + if (IS_ERR(worker)) { + mutex_unlock(&worker_mutex); + return -ENOMEM; + } + + glob_worker = worker; + } + + glob_worker->refs++; + mutex_unlock(&worker_mutex); + + return 0; +} +EXPORT_SYMBOL_GPL(swork_get); + +/** + * swork_put - puts an instance of the sworker + * + * Will destroy the sworker thread. This function must not be called until all + * queued events have been completed. + */ +void swork_put(void) +{ + mutex_lock(&worker_mutex); + + glob_worker->refs--; + if (glob_worker->refs > 0) + goto out; + + swork_destroy(glob_worker); + glob_worker = NULL; +out: + mutex_unlock(&worker_mutex); +} +EXPORT_SYMBOL_GPL(swork_put); diff --git a/kernel/kernel/sched/topology.c b/kernel/kernel/sched/topology.c index b88bde4..94262c0 100644 --- a/kernel/kernel/sched/topology.c +++ b/kernel/kernel/sched/topology.c @@ -490,6 +490,7 @@ rd->rto_cpu = -1; raw_spin_lock_init(&rd->rto_lock); init_irq_work(&rd->rto_push_work, rto_push_irq_work_func); + rd->rto_push_work.flags |= IRQ_WORK_HARD_IRQ; #endif init_dl_bw(&rd->dl_bw); diff --git a/kernel/kernel/signal.c b/kernel/kernel/signal.c index a28b39e..08d677a 100644 --- a/kernel/kernel/signal.c +++ b/kernel/kernel/signal.c @@ -20,6 +20,7 @@ #include <linux/sched/task_stack.h> #include <linux/sched/cputime.h> #include <linux/file.h> +#include <linux/sched/rt.h> #include <linux/fs.h> #include <linux/proc_fs.h> #include <linux/tty.h> @@ -402,13 +403,30 @@ task_set_jobctl_pending(task, mask | JOBCTL_STOP_PENDING); } +static inline struct sigqueue *get_task_cache(struct task_struct *t) +{ + struct sigqueue *q = t->sigqueue_cache; + + if (cmpxchg(&t->sigqueue_cache, q, NULL) != q) + return NULL; + return q; +} + +static inline int put_task_cache(struct task_struct *t, struct sigqueue *q) +{ + if (cmpxchg(&t->sigqueue_cache, NULL, q) == NULL) + return 0; + return 1; +} + /* * allocate a new signal queue record * - this may be called without locks if and only if t == current, otherwise an * appropriate lock must be held to stop the target task from exiting */ static struct sigqueue * -__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimit) +__sigqueue_do_alloc(int sig, struct task_struct *t, gfp_t flags, + int override_rlimit, int fromslab) { struct sigqueue *q = NULL; struct user_struct *user; @@ -430,7 +448,10 @@ rcu_read_unlock(); if (override_rlimit || likely(sigpending <= task_rlimit(t, RLIMIT_SIGPENDING))) { - q = kmem_cache_alloc(sigqueue_cachep, flags); + if (!fromslab) + q = get_task_cache(t); + if (!q) + q = kmem_cache_alloc(sigqueue_cachep, flags); } else { print_dropped_signal(sig); } @@ -447,6 +468,13 @@ return q; } +static struct sigqueue * +__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, + int override_rlimit) +{ + return __sigqueue_do_alloc(sig, t, flags, override_rlimit, 0); +} + static void __sigqueue_free(struct sigqueue *q) { if (q->flags & SIGQUEUE_PREALLOC) @@ -454,6 +482,21 @@ if (atomic_dec_and_test(&q->user->sigpending)) free_uid(q->user); kmem_cache_free(sigqueue_cachep, q); +} + +static void sigqueue_free_current(struct sigqueue *q) +{ + struct user_struct *up; + + if (q->flags & SIGQUEUE_PREALLOC) + return; + + up = q->user; + if (rt_prio(current->normal_prio) && !put_task_cache(current, q)) { + if (atomic_dec_and_test(&up->sigpending)) + free_uid(up); + } else + __sigqueue_free(q); } void flush_sigqueue(struct sigpending *queue) @@ -466,6 +509,21 @@ list_del_init(&q->list); __sigqueue_free(q); } +} + +/* + * Called from __exit_signal. Flush tsk->pending and + * tsk->sigqueue_cache + */ +void flush_task_sigqueue(struct task_struct *tsk) +{ + struct sigqueue *q; + + flush_sigqueue(&tsk->pending); + + q = get_task_cache(tsk); + if (q) + kmem_cache_free(sigqueue_cachep, q); } /* @@ -591,7 +649,7 @@ (info->si_code == SI_TIMER) && (info->si_sys_private); - __sigqueue_free(first); + sigqueue_free_current(first); } else { /* * Ok, it wasn't in the queue. This must be @@ -627,6 +685,8 @@ { bool resched_timer = false; int signr; + + WARN_ON_ONCE(tsk != current); /* We only dequeue private signals from ourselves, we don't let * signalfd steal them @@ -1287,8 +1347,8 @@ * We don't want to have recursive SIGSEGV's etc, for example, * that is why we also clear SIGNAL_UNKILLABLE. */ -int -force_sig_info(int sig, struct siginfo *info, struct task_struct *t) +static int +do_force_sig_info(int sig, struct siginfo *info, struct task_struct *t) { unsigned long int flags; int ret, blocked, ignored; @@ -1315,6 +1375,39 @@ spin_unlock_irqrestore(&t->sighand->siglock, flags); return ret; +} + +int force_sig_info(int sig, struct siginfo *info, struct task_struct *t) +{ +/* + * On some archs, PREEMPT_RT has to delay sending a signal from a trap + * since it can not enable preemption, and the signal code's spin_locks + * turn into mutexes. Instead, it must set TIF_NOTIFY_RESUME which will + * send the signal on exit of the trap. + */ +#ifdef ARCH_RT_DELAYS_SIGNAL_SEND + if (in_atomic()) { + if (WARN_ON_ONCE(t != current)) + return 0; + if (WARN_ON_ONCE(t->forced_info.si_signo)) + return 0; + + if (is_si_special(info)) { + WARN_ON_ONCE(info != SEND_SIG_PRIV); + t->forced_info.si_signo = sig; + t->forced_info.si_errno = 0; + t->forced_info.si_code = SI_KERNEL; + t->forced_info.si_pid = 0; + t->forced_info.si_uid = 0; + } else { + t->forced_info = *info; + } + + set_tsk_thread_flag(t, TIF_NOTIFY_RESUME); + return 0; + } +#endif + return do_force_sig_info(sig, info, t); } /* @@ -1733,7 +1826,8 @@ */ struct sigqueue *sigqueue_alloc(void) { - struct sigqueue *q = __sigqueue_alloc(-1, current, GFP_KERNEL, 0); + /* Preallocated sigqueue objects always from the slabcache ! */ + struct sigqueue *q = __sigqueue_do_alloc(-1, current, GFP_KERNEL, 0, 1); if (q) q->flags |= SIGQUEUE_PREALLOC; @@ -2114,18 +2208,8 @@ if (gstop_done && ptrace_reparented(current)) do_notify_parent_cldstop(current, false, why); - /* - * Don't want to allow preemption here, because - * sys_ptrace() needs this task to be inactive. - * - * XXX: implement read_unlock_no_resched(). - */ - preempt_disable(); read_unlock(&tasklist_lock); - cgroup_enter_frozen(); - preempt_enable_no_resched(); freezable_schedule(); - cgroup_leave_frozen(true); } else { /* * By the time we got the lock, our tracer went away. diff --git a/kernel/kernel/softirq.c b/kernel/kernel/softirq.c index 6f58486..9bad7a1 100644 --- a/kernel/kernel/softirq.c +++ b/kernel/kernel/softirq.c @@ -21,11 +21,14 @@ #include <linux/freezer.h> #include <linux/kthread.h> #include <linux/rcupdate.h> +#include <linux/delay.h> #include <linux/ftrace.h> #include <linux/smp.h> #include <linux/smpboot.h> #include <linux/tick.h> +#include <linux/locallock.h> #include <linux/irq.h> +#include <linux/sched/types.h> #define CREATE_TRACE_POINTS #include <trace/events/irq.h> @@ -56,11 +59,135 @@ static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; DEFINE_PER_CPU(struct task_struct *, ksoftirqd); +#ifdef CONFIG_PREEMPT_RT_FULL +#define TIMER_SOFTIRQS ((1 << TIMER_SOFTIRQ) | (1 << HRTIMER_SOFTIRQ)) +DEFINE_PER_CPU(struct task_struct *, ktimer_softirqd); +#endif const char * const softirq_to_name[NR_SOFTIRQS] = { "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "IRQ_POLL", "TASKLET", "SCHED", "HRTIMER", "RCU" }; + +#ifdef CONFIG_NO_HZ_COMMON +# ifdef CONFIG_PREEMPT_RT_FULL + +struct softirq_runner { + struct task_struct *runner[NR_SOFTIRQS]; +}; + +static DEFINE_PER_CPU(struct softirq_runner, softirq_runners); + +static inline void softirq_set_runner(unsigned int sirq) +{ + struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); + + sr->runner[sirq] = current; +} + +static inline void softirq_clr_runner(unsigned int sirq) +{ + struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); + + sr->runner[sirq] = NULL; +} + +static bool softirq_check_runner_tsk(struct task_struct *tsk, + unsigned int *pending) +{ + bool ret = false; + + if (!tsk) + return ret; + + /* + * The wakeup code in rtmutex.c wakes up the task + * _before_ it sets pi_blocked_on to NULL under + * tsk->pi_lock. So we need to check for both: state + * and pi_blocked_on. + * The test against UNINTERRUPTIBLE + ->sleeping_lock is in case the + * task does cpu_chill(). + */ + raw_spin_lock(&tsk->pi_lock); + if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING || + (tsk->state == TASK_UNINTERRUPTIBLE && tsk->sleeping_lock)) { + /* Clear all bits pending in that task */ + *pending &= ~(tsk->softirqs_raised); + ret = true; + } + raw_spin_unlock(&tsk->pi_lock); + + return ret; +} + +/* + * On preempt-rt a softirq running context might be blocked on a + * lock. There might be no other runnable task on this CPU because the + * lock owner runs on some other CPU. So we have to go into idle with + * the pending bit set. Therefor we need to check this otherwise we + * warn about false positives which confuses users and defeats the + * whole purpose of this test. + * + * This code is called with interrupts disabled. + */ +void softirq_check_pending_idle(void) +{ + struct task_struct *tsk; + static int rate_limit; + struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); + u32 warnpending; + int i; + + if (rate_limit >= 10) + return; + + warnpending = local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK; + if (!warnpending) + return; + for (i = 0; i < NR_SOFTIRQS; i++) { + tsk = sr->runner[i]; + + if (softirq_check_runner_tsk(tsk, &warnpending)) + warnpending &= ~(1 << i); + } + + if (warnpending) { + tsk = __this_cpu_read(ksoftirqd); + softirq_check_runner_tsk(tsk, &warnpending); + } + + if (warnpending) { + tsk = __this_cpu_read(ktimer_softirqd); + softirq_check_runner_tsk(tsk, &warnpending); + } + + if (warnpending) { + printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", + warnpending); + rate_limit++; + } +} +# else +/* + * On !PREEMPT_RT we just printk rate limited: + */ +void softirq_check_pending_idle(void) +{ + static int rate_limit; + + if (rate_limit < 10 && + (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { + printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", + local_softirq_pending()); + rate_limit++; + } +} +# endif + +#else /* !CONFIG_NO_HZ_COMMON */ +static inline void softirq_set_runner(unsigned int sirq) { } +static inline void softirq_clr_runner(unsigned int sirq) { } +#endif /* * we cannot loop indefinitely here to avoid userspace starvation, @@ -77,6 +204,38 @@ wake_up_process(tsk); } +#ifdef CONFIG_PREEMPT_RT_FULL +static void wakeup_timer_softirqd(void) +{ + /* Interrupts are disabled: no need to stop preemption */ + struct task_struct *tsk = __this_cpu_read(ktimer_softirqd); + + if (tsk && tsk->state != TASK_RUNNING) + wake_up_process(tsk); +} +#endif + +static void handle_softirq(unsigned int vec_nr) +{ + struct softirq_action *h = softirq_vec + vec_nr; + int prev_count; + + prev_count = preempt_count(); + + kstat_incr_softirqs_this_cpu(vec_nr); + + trace_softirq_entry(vec_nr); + h->action(h); + trace_softirq_exit(vec_nr); + if (unlikely(prev_count != preempt_count())) { + pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", + vec_nr, softirq_to_name[vec_nr], h->action, + prev_count, preempt_count()); + preempt_count_set(prev_count); + } +} + +#ifndef CONFIG_PREEMPT_RT_FULL /* * If ksoftirqd is scheduled, we do not want to process pending softirqs * right now. Let ksoftirqd handle this at its own rate, to get fairness, @@ -90,6 +249,47 @@ if (pending & SOFTIRQ_NOW_MASK) return false; return tsk && (tsk->state == TASK_RUNNING); +} + +static inline int ksoftirqd_softirq_pending(void) +{ + return local_softirq_pending(); +} + +static void handle_pending_softirqs(u32 pending) +{ + struct softirq_action *h = softirq_vec; + int softirq_bit; + + local_irq_enable(); + + h = softirq_vec; + + while ((softirq_bit = ffs(pending))) { + unsigned int vec_nr; + + h += softirq_bit - 1; + vec_nr = h - softirq_vec; + handle_softirq(vec_nr); + + h++; + pending >>= softirq_bit; + } + + rcu_bh_qs(); + local_irq_disable(); +} + +static void run_ksoftirqd(unsigned int cpu) +{ + local_irq_disable(); + if (ksoftirqd_softirq_pending()) { + __do_softirq(); + local_irq_enable(); + cond_resched(); + return; + } + local_irq_enable(); } /* @@ -251,10 +451,8 @@ unsigned long end = jiffies + MAX_SOFTIRQ_TIME; unsigned long old_flags = current->flags; int max_restart = MAX_SOFTIRQ_RESTART; - struct softirq_action *h; bool in_hardirq; __u32 pending; - int softirq_bit; /* * Mask out PF_MEMALLOC s current task context is borrowed for the @@ -273,36 +471,7 @@ /* Reset the pending bitmask before enabling irqs */ set_softirq_pending(0); - local_irq_enable(); - - h = softirq_vec; - - while ((softirq_bit = ffs(pending))) { - unsigned int vec_nr; - int prev_count; - - h += softirq_bit - 1; - - vec_nr = h - softirq_vec; - prev_count = preempt_count(); - - kstat_incr_softirqs_this_cpu(vec_nr); - - trace_softirq_entry(vec_nr); - h->action(h); - trace_softirq_exit(vec_nr); - if (unlikely(prev_count != preempt_count())) { - pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", - vec_nr, softirq_to_name[vec_nr], h->action, - prev_count, preempt_count()); - preempt_count_set(prev_count); - } - h++; - pending >>= softirq_bit; - } - - rcu_bh_qs(); - local_irq_disable(); + handle_pending_softirqs(pending); pending = local_softirq_pending(); if (pending) { @@ -339,6 +508,309 @@ } /* + * This function must run with irqs disabled! + */ +void raise_softirq_irqoff(unsigned int nr) +{ + __raise_softirq_irqoff(nr); + + /* + * If we're in an interrupt or softirq, we're done + * (this also catches softirq-disabled code). We will + * actually run the softirq once we return from + * the irq or softirq. + * + * Otherwise we wake up ksoftirqd to make sure we + * schedule the softirq soon. + */ + if (!in_interrupt()) + wakeup_softirqd(); +} + +void __raise_softirq_irqoff(unsigned int nr) +{ + trace_softirq_raise(nr); + or_softirq_pending(1UL << nr); +} + +static inline void local_bh_disable_nort(void) { local_bh_disable(); } +static inline void _local_bh_enable_nort(void) { _local_bh_enable(); } +static void ksoftirqd_set_sched_params(unsigned int cpu) { } + +#else /* !PREEMPT_RT_FULL */ + +/* + * On RT we serialize softirq execution with a cpu local lock per softirq + */ +static DEFINE_PER_CPU(struct local_irq_lock [NR_SOFTIRQS], local_softirq_locks); + +void __init softirq_early_init(void) +{ + int i; + + for (i = 0; i < NR_SOFTIRQS; i++) + local_irq_lock_init(local_softirq_locks[i]); +} + +static void lock_softirq(int which) +{ + local_lock(local_softirq_locks[which]); +} + +static void unlock_softirq(int which) +{ + local_unlock(local_softirq_locks[which]); +} + +static void do_single_softirq(int which) +{ + unsigned long old_flags = current->flags; + + current->flags &= ~PF_MEMALLOC; + vtime_account_irq_enter(current); + current->flags |= PF_IN_SOFTIRQ; + lockdep_softirq_enter(); + local_irq_enable(); + handle_softirq(which); + local_irq_disable(); + lockdep_softirq_exit(); + current->flags &= ~PF_IN_SOFTIRQ; + vtime_account_irq_enter(current); + current_restore_flags(old_flags, PF_MEMALLOC); +} + +/* + * Called with interrupts disabled. Process softirqs which were raised + * in current context (or on behalf of ksoftirqd). + */ +static void do_current_softirqs(void) +{ + while (current->softirqs_raised) { + int i = __ffs(current->softirqs_raised); + unsigned int pending, mask = (1U << i); + + current->softirqs_raised &= ~mask; + local_irq_enable(); + + /* + * If the lock is contended, we boost the owner to + * process the softirq or leave the critical section + * now. + */ + lock_softirq(i); + local_irq_disable(); + softirq_set_runner(i); + /* + * Check with the local_softirq_pending() bits, + * whether we need to process this still or if someone + * else took care of it. + */ + pending = local_softirq_pending(); + if (pending & mask) { + set_softirq_pending(pending & ~mask); + do_single_softirq(i); + } + softirq_clr_runner(i); + WARN_ON(current->softirq_nestcnt != 1); + local_irq_enable(); + unlock_softirq(i); + local_irq_disable(); + } +} + +void __local_bh_disable(void) +{ + if (++current->softirq_nestcnt == 1) + migrate_disable(); +} +EXPORT_SYMBOL(__local_bh_disable); + +void __local_bh_enable(void) +{ + if (WARN_ON(current->softirq_nestcnt == 0)) + return; + + local_irq_disable(); + if (current->softirq_nestcnt == 1 && current->softirqs_raised) + do_current_softirqs(); + local_irq_enable(); + + if (--current->softirq_nestcnt == 0) + migrate_enable(); +} +EXPORT_SYMBOL(__local_bh_enable); + +void _local_bh_enable(void) +{ + if (WARN_ON(current->softirq_nestcnt == 0)) + return; + if (--current->softirq_nestcnt == 0) + migrate_enable(); +} +EXPORT_SYMBOL(_local_bh_enable); + +int in_serving_softirq(void) +{ + return current->flags & PF_IN_SOFTIRQ; +} +EXPORT_SYMBOL(in_serving_softirq); + +/* Called with preemption disabled */ +static void run_ksoftirqd(unsigned int cpu) +{ + local_irq_disable(); + current->softirq_nestcnt++; + + do_current_softirqs(); + current->softirq_nestcnt--; + local_irq_enable(); + cond_resched(); +} + +/* + * Called from netif_rx_ni(). Preemption enabled, but migration + * disabled. So the cpu can't go away under us. + */ +void thread_do_softirq(void) +{ + if (!in_serving_softirq() && current->softirqs_raised) { + current->softirq_nestcnt++; + do_current_softirqs(); + current->softirq_nestcnt--; + } +} + +static void do_raise_softirq_irqoff(unsigned int nr) +{ + unsigned int mask; + + mask = 1UL << nr; + + trace_softirq_raise(nr); + or_softirq_pending(mask); + + /* + * If we are not in a hard interrupt and inside a bh disabled + * region, we simply raise the flag on current. local_bh_enable() + * will make sure that the softirq is executed. Otherwise we + * delegate it to ksoftirqd. + */ + if (!in_irq() && current->softirq_nestcnt) + current->softirqs_raised |= mask; + else if (!__this_cpu_read(ksoftirqd) || !__this_cpu_read(ktimer_softirqd)) + return; + + if (mask & TIMER_SOFTIRQS) + __this_cpu_read(ktimer_softirqd)->softirqs_raised |= mask; + else + __this_cpu_read(ksoftirqd)->softirqs_raised |= mask; +} + +static void wakeup_proper_softirq(unsigned int nr) +{ + if ((1UL << nr) & TIMER_SOFTIRQS) + wakeup_timer_softirqd(); + else + wakeup_softirqd(); +} + +void __raise_softirq_irqoff(unsigned int nr) +{ + do_raise_softirq_irqoff(nr); + if (!in_irq() && !current->softirq_nestcnt) + wakeup_proper_softirq(nr); +} + +/* + * Same as __raise_softirq_irqoff() but will process them in ksoftirqd + */ +void __raise_softirq_irqoff_ksoft(unsigned int nr) +{ + unsigned int mask; + + if (WARN_ON_ONCE(!__this_cpu_read(ksoftirqd) || + !__this_cpu_read(ktimer_softirqd))) + return; + mask = 1UL << nr; + + trace_softirq_raise(nr); + or_softirq_pending(mask); + if (mask & TIMER_SOFTIRQS) + __this_cpu_read(ktimer_softirqd)->softirqs_raised |= mask; + else + __this_cpu_read(ksoftirqd)->softirqs_raised |= mask; + wakeup_proper_softirq(nr); +} + +/* + * This function must run with irqs disabled! + */ +void raise_softirq_irqoff(unsigned int nr) +{ + do_raise_softirq_irqoff(nr); + + /* + * If we're in an hard interrupt we let irq return code deal + * with the wakeup of ksoftirqd. + */ + if (in_irq()) + return; + /* + * If we are in thread context but outside of a bh disabled + * region, we need to wake ksoftirqd as well. + * + * CHECKME: Some of the places which do that could be wrapped + * into local_bh_disable/enable pairs. Though it's unclear + * whether this is worth the effort. To find those places just + * raise a WARN() if the condition is met. + */ + if (!current->softirq_nestcnt) + wakeup_proper_softirq(nr); +} + +static inline int ksoftirqd_softirq_pending(void) +{ + return current->softirqs_raised; +} + +static inline void local_bh_disable_nort(void) { } +static inline void _local_bh_enable_nort(void) { } + +static inline void ksoftirqd_set_sched_params(unsigned int cpu) +{ + /* Take over all but timer pending softirqs when starting */ + local_irq_disable(); + current->softirqs_raised = local_softirq_pending() & ~TIMER_SOFTIRQS; + local_irq_enable(); +} + +static inline void ktimer_softirqd_set_sched_params(unsigned int cpu) +{ + struct sched_param param = { .sched_priority = 1 }; + + sched_setscheduler(current, SCHED_FIFO, ¶m); + + /* Take over timer pending softirqs when starting */ + local_irq_disable(); + current->softirqs_raised = local_softirq_pending() & TIMER_SOFTIRQS; + local_irq_enable(); +} + +static inline void ktimer_softirqd_clr_sched_params(unsigned int cpu, + bool online) +{ + struct sched_param param = { .sched_priority = 0 }; + + sched_setscheduler(current, SCHED_NORMAL, ¶m); +} + +static int ktimer_softirqd_should_run(unsigned int cpu) +{ + return current->softirqs_raised; +} + +#endif /* PREEMPT_RT_FULL */ +/* * Enter an interrupt context. */ void irq_enter(void) @@ -349,9 +821,9 @@ * Prevent raise_softirq from needlessly waking up ksoftirqd * here, as softirq will be serviced on return from interrupt. */ - local_bh_disable(); + local_bh_disable_nort(); tick_irq_enter(); - _local_bh_enable(); + _local_bh_enable_nort(); } __irq_enter(); @@ -359,6 +831,7 @@ static inline void invoke_softirq(void) { +#ifndef CONFIG_PREEMPT_RT_FULL if (ksoftirqd_running(local_softirq_pending())) return; @@ -381,6 +854,18 @@ } else { wakeup_softirqd(); } +#else /* PREEMPT_RT_FULL */ + unsigned long flags; + + local_irq_save(flags); + if (__this_cpu_read(ksoftirqd) && + __this_cpu_read(ksoftirqd)->softirqs_raised) + wakeup_softirqd(); + if (__this_cpu_read(ktimer_softirqd) && + __this_cpu_read(ktimer_softirqd)->softirqs_raised) + wakeup_timer_softirqd(); + local_irq_restore(flags); +#endif } static inline void tick_irq_exit(void) @@ -416,26 +901,6 @@ trace_hardirq_exit(); /* must be last! */ } -/* - * This function must run with irqs disabled! - */ -inline void raise_softirq_irqoff(unsigned int nr) -{ - __raise_softirq_irqoff(nr); - - /* - * If we're in an interrupt or softirq, we're done - * (this also catches softirq-disabled code). We will - * actually run the softirq once we return from - * the irq or softirq. - * - * Otherwise we wake up ksoftirqd to make sure we - * schedule the softirq soon. - */ - if (!in_interrupt()) - wakeup_softirqd(); -} - void raise_softirq(unsigned int nr) { unsigned long flags; @@ -443,12 +908,6 @@ local_irq_save(flags); raise_softirq_irqoff(nr); local_irq_restore(flags); -} - -void __raise_softirq_irqoff(unsigned int nr) -{ - trace_softirq_raise(nr); - or_softirq_pending(1UL << nr); } void open_softirq(int nr, void (*action)(struct softirq_action *)) @@ -475,11 +934,44 @@ unsigned long flags; local_irq_save(flags); + if (!tasklet_trylock(t)) { + local_irq_restore(flags); + return; + } + head = this_cpu_ptr(headp); - t->next = NULL; - *head->tail = t; - head->tail = &(t->next); - raise_softirq_irqoff(softirq_nr); +again: + /* We may have been preempted before tasklet_trylock + * and __tasklet_action may have already run. + * So double check the sched bit while the takslet + * is locked before adding it to the list. + */ + if (test_bit(TASKLET_STATE_SCHED, &t->state)) { +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) + if (test_and_set_bit(TASKLET_STATE_CHAINED, &t->state)) { + tasklet_unlock(t); + return; + } +#endif + t->next = NULL; + *head->tail = t; + head->tail = &(t->next); + raise_softirq_irqoff(softirq_nr); + tasklet_unlock(t); + } else { + /* This is subtle. If we hit the corner case above + * It is possible that we get preempted right here, + * and another task has successfully called + * tasklet_schedule(), then this function, and + * failed on the trylock. Thus we must be sure + * before releasing the tasklet lock, that the + * SCHED_BIT is clear. Otherwise the tasklet + * may get its SCHED_BIT set, but not added to the + * list + */ + if (!tasklet_tryunlock(t)) + goto again; + } local_irq_restore(flags); } @@ -497,11 +989,21 @@ } EXPORT_SYMBOL(__tasklet_hi_schedule); +void tasklet_enable(struct tasklet_struct *t) +{ + if (!atomic_dec_and_test(&t->count)) + return; + if (test_and_clear_bit(TASKLET_STATE_PENDING, &t->state)) + tasklet_schedule(t); +} +EXPORT_SYMBOL(tasklet_enable); + static void tasklet_action_common(struct softirq_action *a, struct tasklet_head *tl_head, unsigned int softirq_nr) { struct tasklet_struct *list; + int loops = 1000000; local_irq_disable(); list = tl_head->head; @@ -513,25 +1015,60 @@ struct tasklet_struct *t = list; list = list->next; - - if (tasklet_trylock(t)) { - if (!atomic_read(&t->count)) { - if (!test_and_clear_bit(TASKLET_STATE_SCHED, - &t->state)) - BUG(); - t->func(t->data); - tasklet_unlock(t); - continue; - } - tasklet_unlock(t); + /* + * Should always succeed - after a tasklist got on the + * list (after getting the SCHED bit set from 0 to 1), + * nothing but the tasklet softirq it got queued to can + * lock it: + */ + if (!tasklet_trylock(t)) { + WARN_ON(1); + continue; } - local_irq_disable(); t->next = NULL; - *tl_head->tail = t; - tl_head->tail = &t->next; - __raise_softirq_irqoff(softirq_nr); - local_irq_enable(); + + if (unlikely(atomic_read(&t->count))) { +out_disabled: + /* implicit unlock: */ + wmb(); + t->state = TASKLET_STATEF_PENDING; + continue; + } + /* + * After this point on the tasklet might be rescheduled + * on another CPU, but it can only be added to another + * CPU's tasklet list if we unlock the tasklet (which we + * dont do yet). + */ + if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) + WARN_ON(1); +again: + t->func(t->data); + +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) + while (cmpxchg(&t->state, TASKLET_STATEF_RC, 0) != TASKLET_STATEF_RC) { +#else + while (!tasklet_tryunlock(t)) { +#endif + /* + * If it got disabled meanwhile, bail out: + */ + if (atomic_read(&t->count)) + goto out_disabled; + /* + * If it got scheduled meanwhile, re-execute + * the tasklet function: + */ + if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) + goto again; + if (!--loops) { + printk("hm, tasklet state: %08lx\n", t->state); + WARN_ON(1); + tasklet_unlock(t); + break; + } + } } } @@ -563,7 +1100,7 @@ while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { do { - yield(); + msleep(1); } while (test_bit(TASKLET_STATE_SCHED, &t->state)); } tasklet_unlock_wait(t); @@ -637,25 +1174,26 @@ open_softirq(HI_SOFTIRQ, tasklet_hi_action); } +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) +void tasklet_unlock_wait(struct tasklet_struct *t) +{ + while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { + /* + * Hack for now to avoid this busy-loop: + */ +#ifdef CONFIG_PREEMPT_RT_FULL + msleep(1); +#else + barrier(); +#endif + } +} +EXPORT_SYMBOL(tasklet_unlock_wait); +#endif + static int ksoftirqd_should_run(unsigned int cpu) { - return local_softirq_pending(); -} - -static void run_ksoftirqd(unsigned int cpu) -{ - local_irq_disable(); - if (local_softirq_pending()) { - /* - * We can safely run softirq on inline stack, as we are not deep - * in the task stack here. - */ - __do_softirq(); - local_irq_enable(); - cond_resched(); - return; - } - local_irq_enable(); + return ksoftirqd_softirq_pending(); } #ifdef CONFIG_HOTPLUG_CPU @@ -722,17 +1260,31 @@ static struct smp_hotplug_thread softirq_threads = { .store = &ksoftirqd, + .setup = ksoftirqd_set_sched_params, .thread_should_run = ksoftirqd_should_run, .thread_fn = run_ksoftirqd, .thread_comm = "ksoftirqd/%u", }; + +#ifdef CONFIG_PREEMPT_RT_FULL +static struct smp_hotplug_thread softirq_timer_threads = { + .store = &ktimer_softirqd, + .setup = ktimer_softirqd_set_sched_params, + .cleanup = ktimer_softirqd_clr_sched_params, + .thread_should_run = ktimer_softirqd_should_run, + .thread_fn = run_ksoftirqd, + .thread_comm = "ktimersoftd/%u", +}; +#endif static __init int spawn_ksoftirqd(void) { cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL, takeover_tasklets); BUG_ON(smpboot_register_percpu_thread(&softirq_threads)); - +#ifdef CONFIG_PREEMPT_RT_FULL + BUG_ON(smpboot_register_percpu_thread(&softirq_timer_threads)); +#endif return 0; } early_initcall(spawn_ksoftirqd); diff --git a/kernel/kernel/stop_machine.c b/kernel/kernel/stop_machine.c index 067cb83..2d15c0d 100644 --- a/kernel/kernel/stop_machine.c +++ b/kernel/kernel/stop_machine.c @@ -86,8 +86,11 @@ enabled = stopper->enabled; if (enabled) __cpu_stop_queue_work(stopper, work, &wakeq); - else if (work->done) - cpu_stop_signal_done(work->done); + else { + work->disabled = true; + if (work->done) + cpu_stop_signal_done(work->done); + } raw_spin_unlock_irqrestore(&stopper->lock, flags); wake_up_q(&wakeq); diff --git a/kernel/kernel/time/alarmtimer.c b/kernel/kernel/time/alarmtimer.c index 730b834..9810862 100644 --- a/kernel/kernel/time/alarmtimer.c +++ b/kernel/kernel/time/alarmtimer.c @@ -438,7 +438,7 @@ int ret = alarm_try_to_cancel(alarm); if (ret >= 0) return ret; - cpu_relax(); + hrtimer_grab_expiry_lock(&alarm->timer); } } EXPORT_SYMBOL_GPL(alarm_cancel); diff --git a/kernel/kernel/time/hrtimer.c b/kernel/kernel/time/hrtimer.c index 32ee24f..a846731 100644 --- a/kernel/kernel/time/hrtimer.c +++ b/kernel/kernel/time/hrtimer.c @@ -150,6 +150,11 @@ #define migration_base migration_cpu_base.clock_base[0] +static inline bool is_migration_base(struct hrtimer_clock_base *base) +{ + return base == &migration_base; +} + /* * We are using hashed locking: holding per_cpu(hrtimer_bases)[n].lock * means that all timers which are tied to this base via timer->base are @@ -273,6 +278,11 @@ } #else /* CONFIG_SMP */ + +static inline bool is_migration_base(struct hrtimer_clock_base *base) +{ + return false; +} static inline struct hrtimer_clock_base * lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags) @@ -957,6 +967,16 @@ } EXPORT_SYMBOL_GPL(hrtimer_forward); +void hrtimer_grab_expiry_lock(const struct hrtimer *timer) +{ + struct hrtimer_clock_base *base = READ_ONCE(timer->base); + + if (timer->is_soft && !is_migration_base(base)) { + spin_lock(&base->cpu_base->softirq_expiry_lock); + spin_unlock(&base->cpu_base->softirq_expiry_lock); + } +} + /* * enqueue_hrtimer - internal function to (re)start a timer * @@ -1175,7 +1195,9 @@ * Check whether the HRTIMER_MODE_SOFT bit and hrtimer.is_soft * match. */ +#ifndef CONFIG_PREEMPT_RT_BASE WARN_ON_ONCE(!(mode & HRTIMER_MODE_SOFT) ^ !timer->is_soft); +#endif base = lock_hrtimer_base(timer, &flags); @@ -1238,7 +1260,7 @@ if (ret >= 0) return ret; - cpu_relax(); + hrtimer_grab_expiry_lock(timer); } } EXPORT_SYMBOL_GPL(hrtimer_cancel); @@ -1335,9 +1357,16 @@ static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, enum hrtimer_mode mode) { - bool softtimer = !!(mode & HRTIMER_MODE_SOFT); - int base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0; + bool softtimer; + int base; struct hrtimer_cpu_base *cpu_base; + + softtimer = !!(mode & HRTIMER_MODE_SOFT); +#ifdef CONFIG_PREEMPT_RT_FULL + if (!softtimer && !(mode & HRTIMER_MODE_HARD)) + softtimer = true; +#endif + base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0; memset(timer, 0, sizeof(struct hrtimer)); @@ -1535,6 +1564,7 @@ unsigned long flags; ktime_t now; + spin_lock(&cpu_base->softirq_expiry_lock); raw_spin_lock_irqsave(&cpu_base->lock, flags); now = hrtimer_update_base(cpu_base); @@ -1544,6 +1574,7 @@ hrtimer_update_softirq_timer(cpu_base, true); raw_spin_unlock_irqrestore(&cpu_base->lock, flags); + spin_unlock(&cpu_base->softirq_expiry_lock); } #ifdef CONFIG_HIGH_RES_TIMERS @@ -1715,12 +1746,51 @@ return HRTIMER_NORESTART; } -void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) +static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, + clockid_t clock_id, + enum hrtimer_mode mode, + struct task_struct *task) { +#ifdef CONFIG_PREEMPT_RT_FULL + if (!(mode & (HRTIMER_MODE_SOFT | HRTIMER_MODE_HARD))) { + if (task_is_realtime(current) || system_state != SYSTEM_RUNNING) + mode |= HRTIMER_MODE_HARD; + else + mode |= HRTIMER_MODE_SOFT; + } +#endif + __hrtimer_init(&sl->timer, clock_id, mode); sl->timer.function = hrtimer_wakeup; sl->task = task; } + +/** + * hrtimer_init_sleeper - initialize sleeper to the given clock + * @sl: sleeper to be initialized + * @clock_id: the clock to be used + * @mode: timer mode abs/rel + * @task: the task to wake up + */ +void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, + enum hrtimer_mode mode, struct task_struct *task) +{ + debug_init(&sl->timer, clock_id, mode); + __hrtimer_init_sleeper(sl, clock_id, mode, task); + +} EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); + +#ifdef CONFIG_DEBUG_OBJECTS_TIMERS +void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, + clockid_t clock_id, + enum hrtimer_mode mode, + struct task_struct *task) +{ + debug_object_init_on_stack(&sl->timer, &hrtimer_debug_descr); + __hrtimer_init_sleeper(sl, clock_id, mode, task); +} +EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_on_stack); +#endif int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts) { @@ -1745,8 +1815,6 @@ { struct restart_block *restart; - hrtimer_init_sleeper(t, current); - do { set_current_state(TASK_INTERRUPTIBLE); hrtimer_start_expires(&t->timer, mode); @@ -1754,12 +1822,12 @@ if (likely(t->task)) freezable_schedule(); + __set_current_state(TASK_RUNNING); hrtimer_cancel(&t->timer); mode = HRTIMER_MODE_ABS; } while (t->task && !signal_pending(current)); - __set_current_state(TASK_RUNNING); if (!t->task) return 0; @@ -1783,10 +1851,9 @@ struct hrtimer_sleeper t; int ret; - hrtimer_init_on_stack(&t.timer, restart->nanosleep.clockid, - HRTIMER_MODE_ABS); + hrtimer_init_sleeper_on_stack(&t, restart->nanosleep.clockid, + HRTIMER_MODE_ABS, current); hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires); - ret = do_nanosleep(&t, HRTIMER_MODE_ABS); destroy_hrtimer_on_stack(&t.timer); return ret; @@ -1804,7 +1871,7 @@ if (dl_task(current) || rt_task(current)) slack = 0; - hrtimer_init_on_stack(&t.timer, clockid, mode); + hrtimer_init_sleeper_on_stack(&t, clockid, mode, current); hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack); ret = do_nanosleep(&t, mode); if (ret != -ERESTART_RESTARTBLOCK) @@ -1864,6 +1931,38 @@ } #endif +#ifdef CONFIG_PREEMPT_RT_FULL +/* + * Sleep for 1 ms in hope whoever holds what we want will let it go. + */ +void cpu_chill(void) +{ + unsigned int freeze_flag = current->flags & PF_NOFREEZE; + struct task_struct *self = current; + ktime_t chill_time; + + raw_spin_lock_irq(&self->pi_lock); + self->saved_state = self->state; + __set_current_state_no_track(TASK_UNINTERRUPTIBLE); + raw_spin_unlock_irq(&self->pi_lock); + + chill_time = ktime_set(0, NSEC_PER_MSEC); + + current->flags |= PF_NOFREEZE; + sleeping_lock_inc(); + schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); + sleeping_lock_dec(); + if (!freeze_flag) + current->flags &= ~PF_NOFREEZE; + + raw_spin_lock_irq(&self->pi_lock); + __set_current_state_no_track(self->saved_state); + self->saved_state = TASK_RUNNING; + raw_spin_unlock_irq(&self->pi_lock); +} +EXPORT_SYMBOL(cpu_chill); +#endif + /* * Functions related to boot-time initialization: */ @@ -1885,6 +1984,7 @@ cpu_base->softirq_next_timer = NULL; cpu_base->expires_next = KTIME_MAX; cpu_base->softirq_expires_next = KTIME_MAX; + spin_lock_init(&cpu_base->softirq_expiry_lock); return 0; } @@ -2003,10 +2103,8 @@ return -EINTR; } - hrtimer_init_on_stack(&t.timer, clock_id, mode); + hrtimer_init_sleeper_on_stack(&t, clock_id, mode, current); hrtimer_set_expires_range_ns(&t.timer, *expires, delta); - - hrtimer_init_sleeper(&t, current); hrtimer_start_expires(&t.timer, mode); diff --git a/kernel/kernel/time/itimer.c b/kernel/kernel/time/itimer.c index 2e2b335..48d977f 100644 --- a/kernel/kernel/time/itimer.c +++ b/kernel/kernel/time/itimer.c @@ -211,6 +211,7 @@ /* We are sharing ->siglock with it_real_fn() */ if (hrtimer_try_to_cancel(timer) < 0) { spin_unlock_irq(&tsk->sighand->siglock); + hrtimer_grab_expiry_lock(timer); goto again; } expires = timeval_to_ktime(value->it_value); diff --git a/kernel/kernel/time/jiffies.c b/kernel/kernel/time/jiffies.c index 4977191..62acb89 100644 --- a/kernel/kernel/time/jiffies.c +++ b/kernel/kernel/time/jiffies.c @@ -74,7 +74,8 @@ .max_cycles = 10, }; -__cacheline_aligned_in_smp DEFINE_SEQLOCK(jiffies_lock); +__cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(jiffies_lock); +__cacheline_aligned_in_smp seqcount_t jiffies_seq; #if (BITS_PER_LONG < 64) u64 get_jiffies_64(void) @@ -83,9 +84,9 @@ u64 ret; do { - seq = read_seqbegin(&jiffies_lock); + seq = read_seqcount_begin(&jiffies_seq); ret = jiffies_64; - } while (read_seqretry(&jiffies_lock, seq)); + } while (read_seqcount_retry(&jiffies_seq, seq)); return ret; } EXPORT_SYMBOL(get_jiffies_64); diff --git a/kernel/kernel/time/posix-cpu-timers.c b/kernel/kernel/time/posix-cpu-timers.c index bfaa44a..b9e4ccb 100644 --- a/kernel/kernel/time/posix-cpu-timers.c +++ b/kernel/kernel/time/posix-cpu-timers.c @@ -3,8 +3,10 @@ * Implement CPU time clocks for the POSIX clock interface. */ +#include <uapi/linux/sched/types.h> #include <linux/sched/signal.h> #include <linux/sched/cputime.h> +#include <linux/sched/rt.h> #include <linux/posix-timers.h> #include <linux/errno.h> #include <linux/math64.h> @@ -15,6 +17,7 @@ #include <linux/workqueue.h> #include <linux/compat.h> #include <linux/sched/deadline.h> +#include <linux/smpboot.h> #include "posix-timers.h" @@ -789,6 +792,7 @@ return t->expires; t->firing = 1; + t->firing_cpu = smp_processor_id(); list_move_tail(&t->entry, firing); } @@ -1135,18 +1139,31 @@ return 0; } +static DEFINE_PER_CPU(spinlock_t, cpu_timer_expiry_lock) = __SPIN_LOCK_UNLOCKED(cpu_timer_expiry_lock); + +void cpu_timers_grab_expiry_lock(struct k_itimer *timer) +{ + int cpu = timer->it.cpu.firing_cpu; + + if (cpu >= 0) { + spinlock_t *expiry_lock = per_cpu_ptr(&cpu_timer_expiry_lock, cpu); + + spin_lock_irq(expiry_lock); + spin_unlock_irq(expiry_lock); + } +} + /* * This is called from the timer interrupt handler. The irq handler has * already updated our counts. We need to check if any timers fire now. * Interrupts are disabled. */ -void run_posix_cpu_timers(struct task_struct *tsk) +static void __run_posix_cpu_timers(struct task_struct *tsk) { LIST_HEAD(firing); struct k_itimer *timer, *next; unsigned long flags; - - lockdep_assert_irqs_disabled(); + spinlock_t *expiry_lock; /* * The fast path checks that there are no expired thread or thread @@ -1155,8 +1172,13 @@ if (!fastpath_timer_check(tsk)) return; - if (!lock_task_sighand(tsk, &flags)) + expiry_lock = this_cpu_ptr(&cpu_timer_expiry_lock); + spin_lock(expiry_lock); + + if (!lock_task_sighand(tsk, &flags)) { + spin_unlock(expiry_lock); return; + } /* * Here we take off tsk->signal->cpu_timers[N] and * tsk->cpu_timers[N] all the timers that are firing, and @@ -1189,6 +1211,7 @@ list_del_init(&timer->it.cpu.entry); cpu_firing = timer->it.cpu.firing; timer->it.cpu.firing = 0; + timer->it.cpu.firing_cpu = -1; /* * The firing flag is -1 if we collided with a reset * of the timer, which already reported this @@ -1198,7 +1221,155 @@ cpu_timer_fire(timer); spin_unlock(&timer->it_lock); } + spin_unlock(expiry_lock); } + +#ifdef CONFIG_PREEMPT_RT_BASE +#include <linux/kthread.h> +#include <linux/cpu.h> +DEFINE_PER_CPU(struct task_struct *, posix_timer_task); +DEFINE_PER_CPU(struct task_struct *, posix_timer_tasklist); +DEFINE_PER_CPU(bool, posix_timer_th_active); + +static void posix_cpu_kthread_fn(unsigned int cpu) +{ + struct task_struct *tsk = NULL; + struct task_struct *next = NULL; + + BUG_ON(per_cpu(posix_timer_task, cpu) != current); + + /* grab task list */ + raw_local_irq_disable(); + tsk = per_cpu(posix_timer_tasklist, cpu); + per_cpu(posix_timer_tasklist, cpu) = NULL; + raw_local_irq_enable(); + + /* its possible the list is empty, just return */ + if (!tsk) + return; + + /* Process task list */ + while (1) { + /* save next */ + next = tsk->posix_timer_list; + + /* run the task timers, clear its ptr and + * unreference it + */ + __run_posix_cpu_timers(tsk); + tsk->posix_timer_list = NULL; + put_task_struct(tsk); + + /* check if this is the last on the list */ + if (next == tsk) + break; + tsk = next; + } +} + +static inline int __fastpath_timer_check(struct task_struct *tsk) +{ + /* tsk == current, ensure it is safe to use ->signal/sighand */ + if (unlikely(tsk->exit_state)) + return 0; + + if (!task_cputime_zero(&tsk->cputime_expires)) + return 1; + + if (!task_cputime_zero(&tsk->signal->cputime_expires)) + return 1; + + return 0; +} + +void run_posix_cpu_timers(struct task_struct *tsk) +{ + unsigned int cpu = smp_processor_id(); + struct task_struct *tasklist; + + BUG_ON(!irqs_disabled()); + + if (per_cpu(posix_timer_th_active, cpu) != true) + return; + + /* get per-cpu references */ + tasklist = per_cpu(posix_timer_tasklist, cpu); + + /* check to see if we're already queued */ + if (!tsk->posix_timer_list && __fastpath_timer_check(tsk)) { + get_task_struct(tsk); + if (tasklist) { + tsk->posix_timer_list = tasklist; + } else { + /* + * The list is terminated by a self-pointing + * task_struct + */ + tsk->posix_timer_list = tsk; + } + per_cpu(posix_timer_tasklist, cpu) = tsk; + + wake_up_process(per_cpu(posix_timer_task, cpu)); + } +} + +static int posix_cpu_kthread_should_run(unsigned int cpu) +{ + return __this_cpu_read(posix_timer_tasklist) != NULL; +} + +static void posix_cpu_kthread_park(unsigned int cpu) +{ + this_cpu_write(posix_timer_th_active, false); +} + +static void posix_cpu_kthread_unpark(unsigned int cpu) +{ + this_cpu_write(posix_timer_th_active, true); +} + +static void posix_cpu_kthread_setup(unsigned int cpu) +{ + struct sched_param sp; + + sp.sched_priority = MAX_RT_PRIO - 1; + sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); + posix_cpu_kthread_unpark(cpu); +} + +static struct smp_hotplug_thread posix_cpu_thread = { + .store = &posix_timer_task, + .thread_should_run = posix_cpu_kthread_should_run, + .thread_fn = posix_cpu_kthread_fn, + .thread_comm = "posixcputmr/%u", + .setup = posix_cpu_kthread_setup, + .park = posix_cpu_kthread_park, + .unpark = posix_cpu_kthread_unpark, +}; + +static int __init posix_cpu_thread_init(void) +{ + /* Start one for boot CPU. */ + unsigned long cpu; + int ret; + + /* init the per-cpu posix_timer_tasklets */ + for_each_possible_cpu(cpu) + per_cpu(posix_timer_tasklist, cpu) = NULL; + + ret = smpboot_register_percpu_thread(&posix_cpu_thread); + WARN_ON(ret); + + return 0; +} +early_initcall(posix_cpu_thread_init); +#else /* CONFIG_PREEMPT_RT_BASE */ +void run_posix_cpu_timers(struct task_struct *tsk) +{ + lockdep_assert_irqs_disabled(); + __run_posix_cpu_timers(tsk); +} +#endif /* CONFIG_PREEMPT_RT_BASE */ /* * Set one of the process-wide special case CPU timers or RLIMIT_CPU. @@ -1318,6 +1489,8 @@ spin_unlock_irq(&timer.it_lock); while (error == TIMER_RETRY) { + + cpu_timers_grab_expiry_lock(&timer); /* * We need to handle case when timer was or is in the * middle of firing. In other cases we already freed diff --git a/kernel/kernel/time/posix-timers.c b/kernel/kernel/time/posix-timers.c index 4875810..3fd433d 100644 --- a/kernel/kernel/time/posix-timers.c +++ b/kernel/kernel/time/posix-timers.c @@ -463,7 +463,7 @@ static void k_itimer_rcu_free(struct rcu_head *head) { - struct k_itimer *tmr = container_of(head, struct k_itimer, it.rcu); + struct k_itimer *tmr = container_of(head, struct k_itimer, rcu); kmem_cache_free(posix_timers_cache, tmr); } @@ -480,7 +480,7 @@ } put_pid(tmr->it_pid); sigqueue_free(tmr->sigq); - call_rcu(&tmr->it.rcu, k_itimer_rcu_free); + call_rcu(&tmr->rcu, k_itimer_rcu_free); } static int common_timer_create(struct k_itimer *new_timer) @@ -826,6 +826,17 @@ return hrtimer_try_to_cancel(&timr->it.real.timer); } +static void timer_wait_for_callback(const struct k_clock *kc, struct k_itimer *timer) +{ + if (kc->timer_arm == common_hrtimer_arm) + hrtimer_grab_expiry_lock(&timer->it.real.timer); + else if (kc == &alarm_clock) + hrtimer_grab_expiry_lock(&timer->it.alarm.alarmtimer.timer); + else + /* posix-cpu-timers */ + cpu_timers_grab_expiry_lock(timer); +} + /* Set a POSIX.1b interval timer. */ int common_timer_set(struct k_itimer *timr, int flags, struct itimerspec64 *new_setting, @@ -891,11 +902,15 @@ else error = kc->timer_set(timr, flags, new_spec64, old_spec64); - unlock_timer(timr, flag); if (error == TIMER_RETRY) { + rcu_read_lock(); + unlock_timer(timr, flag); + timer_wait_for_callback(kc, timr); + rcu_read_unlock(); old_spec64 = NULL; // We already got the old time... goto retry; } + unlock_timer(timr, flag); return error; } @@ -957,13 +972,21 @@ return 0; } -static inline int timer_delete_hook(struct k_itimer *timer) +static int timer_delete_hook(struct k_itimer *timer) { const struct k_clock *kc = timer->kclock; + int ret; if (WARN_ON_ONCE(!kc || !kc->timer_del)) return -EINVAL; - return kc->timer_del(timer); + ret = kc->timer_del(timer); + if (ret == TIMER_RETRY) { + rcu_read_lock(); + spin_unlock_irq(&timer->it_lock); + timer_wait_for_callback(kc, timer); + rcu_read_unlock(); + } + return ret; } /* Delete a POSIX.1b interval timer. */ @@ -977,10 +1000,8 @@ if (!timer) return -EINVAL; - if (timer_delete_hook(timer) == TIMER_RETRY) { - unlock_timer(timer, flags); + if (timer_delete_hook(timer) == TIMER_RETRY) goto retry_delete; - } spin_lock(¤t->sighand->siglock); list_del(&timer->list); @@ -1006,10 +1027,9 @@ retry_delete: spin_lock_irqsave(&timer->it_lock, flags); - if (timer_delete_hook(timer) == TIMER_RETRY) { - unlock_timer(timer, flags); + if (timer_delete_hook(timer) == TIMER_RETRY) goto retry_delete; - } + list_del(&timer->list); /* * This keeps any tasks waiting on the spin lock from thinking diff --git a/kernel/kernel/time/posix-timers.h b/kernel/kernel/time/posix-timers.h index ddb2114..725bd23 100644 --- a/kernel/kernel/time/posix-timers.h +++ b/kernel/kernel/time/posix-timers.h @@ -32,6 +32,8 @@ extern const struct k_clock clock_thread; extern const struct k_clock alarm_clock; +extern void cpu_timers_grab_expiry_lock(struct k_itimer *timer); + int posix_timer_event(struct k_itimer *timr, int si_private); void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting); diff --git a/kernel/kernel/time/tick-broadcast-hrtimer.c b/kernel/kernel/time/tick-broadcast-hrtimer.c index a836efd..c50e8f3 100644 --- a/kernel/kernel/time/tick-broadcast-hrtimer.c +++ b/kernel/kernel/time/tick-broadcast-hrtimer.c @@ -107,7 +107,7 @@ void tick_setup_hrtimer_broadcast(void) { - hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); bctimer.function = bc_handler; clockevents_register_device(&ce_broadcast_hrtimer); } diff --git a/kernel/kernel/time/tick-common.c b/kernel/kernel/time/tick-common.c index 0a3cc37..7bd136b 100644 --- a/kernel/kernel/time/tick-common.c +++ b/kernel/kernel/time/tick-common.c @@ -80,13 +80,15 @@ static void tick_periodic(int cpu) { if (tick_do_timer_cpu == cpu) { - write_seqlock(&jiffies_lock); + raw_spin_lock(&jiffies_lock); + write_seqcount_begin(&jiffies_seq); /* Keep track of the next tick event */ tick_next_period = ktime_add(tick_next_period, tick_period); do_timer(1); - write_sequnlock(&jiffies_lock); + write_seqcount_end(&jiffies_seq); + raw_spin_unlock(&jiffies_lock); update_wall_time(); } @@ -158,9 +160,9 @@ ktime_t next; do { - seq = read_seqbegin(&jiffies_lock); + seq = read_seqcount_begin(&jiffies_seq); next = tick_next_period; - } while (read_seqretry(&jiffies_lock, seq)); + } while (read_seqcount_retry(&jiffies_seq, seq)); clockevents_switch_state(dev, CLOCK_EVT_STATE_ONESHOT); diff --git a/kernel/kernel/time/tick-sched.c b/kernel/kernel/time/tick-sched.c index 77c359d..28e4f21 100644 --- a/kernel/kernel/time/tick-sched.c +++ b/kernel/kernel/time/tick-sched.c @@ -69,7 +69,8 @@ return; /* Reevaluate with jiffies_lock held */ - write_seqlock(&jiffies_lock); + raw_spin_lock(&jiffies_lock); + write_seqcount_begin(&jiffies_seq); delta = ktime_sub(now, last_jiffies_update); if (delta >= tick_period) { @@ -95,10 +96,12 @@ /* Keep the tick_next_period variable up to date */ tick_next_period = ktime_add(last_jiffies_update, tick_period); } else { - write_sequnlock(&jiffies_lock); + write_seqcount_end(&jiffies_seq); + raw_spin_unlock(&jiffies_lock); return; } - write_sequnlock(&jiffies_lock); + write_seqcount_end(&jiffies_seq); + raw_spin_unlock(&jiffies_lock); update_wall_time(); } @@ -109,12 +112,14 @@ { ktime_t period; - write_seqlock(&jiffies_lock); + raw_spin_lock(&jiffies_lock); + write_seqcount_begin(&jiffies_seq); /* Did we start the jiffies update yet ? */ if (last_jiffies_update == 0) last_jiffies_update = tick_next_period; period = last_jiffies_update; - write_sequnlock(&jiffies_lock); + write_seqcount_end(&jiffies_seq); + raw_spin_unlock(&jiffies_lock); return period; } @@ -232,6 +237,7 @@ static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = { .func = nohz_full_kick_func, + .flags = IRQ_WORK_HARD_IRQ, }; /* @@ -657,10 +663,10 @@ /* Read jiffies and the time when jiffies were updated last */ do { - seq = read_seqbegin(&jiffies_lock); + seq = read_seqcount_begin(&jiffies_seq); basemono = last_jiffies_update; basejiff = jiffies; - } while (read_seqretry(&jiffies_lock, seq)); + } while (read_seqcount_retry(&jiffies_seq, seq)); ts->last_jiffies = basejiff; ts->timer_expires_base = basemono; @@ -891,14 +897,7 @@ return false; if (unlikely(local_softirq_pending() && cpu_online(cpu))) { - static int ratelimit; - - if (ratelimit < 10 && - (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { - pr_warn("NOHZ: local_softirq_pending %02x\n", - (unsigned int) local_softirq_pending()); - ratelimit++; - } + softirq_check_pending_idle(); return false; } @@ -1330,7 +1329,7 @@ /* * Emulate tick processing via per-CPU hrtimers: */ - hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); ts->sched_timer.function = tick_sched_timer; /* Get the next period (per-CPU) */ diff --git a/kernel/kernel/time/timekeeping.c b/kernel/kernel/time/timekeeping.c index a1e14ef..0343c5d 100644 --- a/kernel/kernel/time/timekeeping.c +++ b/kernel/kernel/time/timekeeping.c @@ -2397,8 +2397,10 @@ */ void xtime_update(unsigned long ticks) { - write_seqlock(&jiffies_lock); + raw_spin_lock(&jiffies_lock); + write_seqcount_begin(&jiffies_seq); do_timer(ticks); - write_sequnlock(&jiffies_lock); + write_seqcount_end(&jiffies_seq); + raw_spin_unlock(&jiffies_lock); update_wall_time(); } diff --git a/kernel/kernel/time/timekeeping.h b/kernel/kernel/time/timekeeping.h index 141ab3a..099737f 100644 --- a/kernel/kernel/time/timekeeping.h +++ b/kernel/kernel/time/timekeeping.h @@ -25,7 +25,8 @@ extern void do_timer(unsigned long ticks); extern void update_wall_time(void); -extern seqlock_t jiffies_lock; +extern raw_spinlock_t jiffies_lock; +extern seqcount_t jiffies_seq; #define CS_NAME_LEN 32 diff --git a/kernel/kernel/time/timer.c b/kernel/kernel/time/timer.c index a6e88d9..3e2c0bd 100644 --- a/kernel/kernel/time/timer.c +++ b/kernel/kernel/time/timer.c @@ -198,6 +198,7 @@ struct timer_base { raw_spinlock_t lock; struct timer_list *running_timer; + spinlock_t expiry_lock; unsigned long clk; unsigned long next_expiry; unsigned int cpu; @@ -214,8 +215,7 @@ static DEFINE_STATIC_KEY_FALSE(timers_nohz_active); static DEFINE_MUTEX(timer_keys_mutex); -static void timer_update_keys(struct work_struct *work); -static DECLARE_WORK(timer_update_work, timer_update_keys); +static struct swork_event timer_update_swork; #ifdef CONFIG_SMP unsigned int sysctl_timer_migration = 1; @@ -233,7 +233,7 @@ static inline void timers_update_migration(void) { } #endif /* !CONFIG_SMP */ -static void timer_update_keys(struct work_struct *work) +static void timer_update_keys(struct swork_event *event) { mutex_lock(&timer_keys_mutex); timers_update_migration(); @@ -243,8 +243,16 @@ void timers_update_nohz(void) { - schedule_work(&timer_update_work); + swork_queue(&timer_update_swork); } + +static __init int hrtimer_init_thread(void) +{ + WARN_ON(swork_get()); + INIT_SWORK(&timer_update_swork, timer_update_keys); + return 0; +} +early_initcall(hrtimer_init_thread); int timer_migration_handler(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, @@ -1219,6 +1227,25 @@ } EXPORT_SYMBOL(del_timer); +static int __try_to_del_timer_sync(struct timer_list *timer, + struct timer_base **basep) +{ + struct timer_base *base; + unsigned long flags; + int ret = -1; + + debug_assert_init(timer); + + *basep = base = lock_timer_base(timer, &flags); + + if (base->running_timer != timer) + ret = detach_if_pending(timer, base, true); + + raw_spin_unlock_irqrestore(&base->lock, flags); + + return ret; +} + /** * try_to_del_timer_sync - Try to deactivate a timer * @timer: timer to delete @@ -1229,23 +1256,31 @@ int try_to_del_timer_sync(struct timer_list *timer) { struct timer_base *base; - unsigned long flags; - int ret = -1; - debug_assert_init(timer); - - base = lock_timer_base(timer, &flags); - - if (base->running_timer != timer) - ret = detach_if_pending(timer, base, true); - - raw_spin_unlock_irqrestore(&base->lock, flags); - - return ret; + return __try_to_del_timer_sync(timer, &base); } EXPORT_SYMBOL(try_to_del_timer_sync); -#ifdef CONFIG_SMP +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) +static int __del_timer_sync(struct timer_list *timer) +{ + struct timer_base *base; + int ret; + + for (;;) { + ret = __try_to_del_timer_sync(timer, &base); + if (ret >= 0) + return ret; + + /* + * When accessing the lock, timers of base are no longer expired + * and so timer is no longer running. + */ + spin_lock(&base->expiry_lock); + spin_unlock(&base->expiry_lock); + } +} + /** * del_timer_sync - deactivate a timer and wait for the handler to finish. * @timer: the timer to be deactivated @@ -1301,12 +1336,8 @@ * could lead to deadlock. */ WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE)); - for (;;) { - int ret = try_to_del_timer_sync(timer); - if (ret >= 0) - return ret; - cpu_relax(); - } + + return __del_timer_sync(timer); } EXPORT_SYMBOL(del_timer_sync); #endif @@ -1369,10 +1400,16 @@ if (timer->flags & TIMER_IRQSAFE) { raw_spin_unlock(&base->lock); call_timer_fn(timer, fn); + base->running_timer = NULL; + spin_unlock(&base->expiry_lock); + spin_lock(&base->expiry_lock); raw_spin_lock(&base->lock); } else { raw_spin_unlock_irq(&base->lock); call_timer_fn(timer, fn); + base->running_timer = NULL; + spin_unlock(&base->expiry_lock); + spin_lock(&base->expiry_lock); raw_spin_lock_irq(&base->lock); } } @@ -1669,6 +1706,7 @@ if (!time_after_eq(jiffies, base->clk)) return; + spin_lock(&base->expiry_lock); raw_spin_lock_irq(&base->lock); /* @@ -1695,8 +1733,8 @@ while (levels--) expire_timers(base, heads + levels); } - base->running_timer = NULL; raw_spin_unlock_irq(&base->lock); + spin_unlock(&base->expiry_lock); } /* @@ -1705,6 +1743,8 @@ static __latent_entropy void run_timer_softirq(struct softirq_action *h) { struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); + + irq_work_tick_soft(); __run_timers(base); if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) @@ -1941,6 +1981,7 @@ base->cpu = cpu; raw_spin_lock_init(&base->lock); base->clk = jiffies; + spin_lock_init(&base->expiry_lock); } } diff --git a/kernel/kernel/trace/trace.c b/kernel/kernel/trace/trace.c index 19a6b08..ead2e09 100644 --- a/kernel/kernel/trace/trace.c +++ b/kernel/kernel/trace/trace.c @@ -2151,6 +2151,7 @@ struct task_struct *tsk = current; entry->preempt_count = pc & 0xff; + entry->preempt_lazy_count = preempt_lazy_count(); entry->pid = (tsk) ? tsk->pid : 0; entry->flags = #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT @@ -2161,8 +2162,11 @@ ((pc & NMI_MASK ) ? TRACE_FLAG_NMI : 0) | ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) | ((pc & SOFTIRQ_OFFSET) ? TRACE_FLAG_SOFTIRQ : 0) | - (tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) | + (tif_need_resched_now() ? TRACE_FLAG_NEED_RESCHED : 0) | + (need_resched_lazy() ? TRACE_FLAG_NEED_RESCHED_LAZY : 0) | (test_preempt_need_resched() ? TRACE_FLAG_PREEMPT_RESCHED : 0); + + entry->migrate_disable = (tsk) ? __migrate_disabled(tsk) & 0xFF : 0; } EXPORT_SYMBOL_GPL(tracing_generic_entry_update); @@ -3360,14 +3364,17 @@ static void print_lat_help_header(struct seq_file *m) { - seq_puts(m, "# _------=> CPU# \n" - "# / _-----=> irqs-off \n" - "# | / _----=> need-resched \n" - "# || / _---=> hardirq/softirq \n" - "# ||| / _--=> preempt-depth \n" - "# |||| / delay \n" - "# cmd pid ||||| time | caller \n" - "# \\ / ||||| \\ | / \n"); + seq_puts(m, "# _--------=> CPU# \n" + "# / _-------=> irqs-off \n" + "# | / _------=> need-resched \n" + "# || / _-----=> need-resched_lazy \n" + "# ||| / _----=> hardirq/softirq \n" + "# |||| / _---=> preempt-depth \n" + "# ||||| / _--=> preempt-lazy-depth\n" + "# |||||| / _-=> migrate-disable \n" + "# ||||||| / delay \n" + "# cmd pid |||||||| time | caller \n" + "# \\ / |||||||| \\ | / \n"); } static void print_event_info(struct trace_buffer *buf, struct seq_file *m) @@ -3405,15 +3412,17 @@ tgid ? tgid_space : space); seq_printf(m, "# %s / _----=> need-resched\n", tgid ? tgid_space : space); - seq_printf(m, "# %s| / _---=> hardirq/softirq\n", + seq_printf(m, "# %s| / _---=> need-resched_lazy\n", tgid ? tgid_space : space); - seq_printf(m, "# %s|| / _--=> preempt-depth\n", + seq_printf(m, "# %s|| / _--=> hardirq/softirq\n", tgid ? tgid_space : space); - seq_printf(m, "# %s||| / delay\n", + seq_printf(m, "# %s||| / preempt-depth\n", tgid ? tgid_space : space); - seq_printf(m, "# TASK-PID %sCPU# |||| TIMESTAMP FUNCTION\n", + seq_printf(m, "# %s|||| / delay\n", + tgid ? tgid_space : space); + seq_printf(m, "# TASK-PID %sCPU# ||||| TIMESTAMP FUNCTION\n", tgid ? " TGID " : space); - seq_printf(m, "# | | %s | |||| | |\n", + seq_printf(m, "# | | %s | ||||| | |\n", tgid ? " | " : space); } diff --git a/kernel/kernel/trace/trace.h b/kernel/kernel/trace/trace.h index 74185fb..7740bcd 100644 --- a/kernel/kernel/trace/trace.h +++ b/kernel/kernel/trace/trace.h @@ -127,6 +127,7 @@ * NEED_RESCHED - reschedule is requested * HARDIRQ - inside an interrupt handler * SOFTIRQ - inside a softirq handler + * NEED_RESCHED_LAZY - lazy reschedule is requested */ enum trace_flag_type { TRACE_FLAG_IRQS_OFF = 0x01, @@ -136,6 +137,7 @@ TRACE_FLAG_SOFTIRQ = 0x10, TRACE_FLAG_PREEMPT_RESCHED = 0x20, TRACE_FLAG_NMI = 0x40, + TRACE_FLAG_NEED_RESCHED_LAZY = 0x80, }; #define TRACE_BUF_SIZE 1024 diff --git a/kernel/kernel/trace/trace_events.c b/kernel/kernel/trace/trace_events.c index 1ca64a9..9b1b1c6 100644 --- a/kernel/kernel/trace/trace_events.c +++ b/kernel/kernel/trace/trace_events.c @@ -188,6 +188,8 @@ __common_field(unsigned char, flags); __common_field(unsigned char, preempt_count); __common_field(int, pid); + __common_field(unsigned char, migrate_disable); + __common_field(unsigned char, preempt_lazy_count); return ret; } diff --git a/kernel/kernel/trace/trace_hwlat.c b/kernel/kernel/trace/trace_hwlat.c index ade6c30..164e5c6 100644 --- a/kernel/kernel/trace/trace_hwlat.c +++ b/kernel/kernel/trace/trace_hwlat.c @@ -280,7 +280,7 @@ * of this thread, than stop migrating for the duration * of the current test. */ - if (!cpumask_equal(current_mask, ¤t->cpus_allowed)) + if (!cpumask_equal(current_mask, current->cpus_ptr)) goto disable; get_online_cpus(); diff --git a/kernel/kernel/trace/trace_output.c b/kernel/kernel/trace/trace_output.c index 6e6cc64..3f78b0a 100644 --- a/kernel/kernel/trace/trace_output.c +++ b/kernel/kernel/trace/trace_output.c @@ -448,6 +448,7 @@ { char hardsoft_irq; char need_resched; + char need_resched_lazy; char irqs_off; int hardirq; int softirq; @@ -478,6 +479,9 @@ break; } + need_resched_lazy = + (entry->flags & TRACE_FLAG_NEED_RESCHED_LAZY) ? 'L' : '.'; + hardsoft_irq = (nmi && hardirq) ? 'Z' : nmi ? 'z' : @@ -486,14 +490,25 @@ softirq ? 's' : '.' ; - trace_seq_printf(s, "%c%c%c", - irqs_off, need_resched, hardsoft_irq); + trace_seq_printf(s, "%c%c%c%c", + irqs_off, need_resched, need_resched_lazy, + hardsoft_irq); if (entry->preempt_count) trace_seq_printf(s, "%x", entry->preempt_count); else trace_seq_putc(s, '.'); + if (entry->preempt_lazy_count) + trace_seq_printf(s, "%x", entry->preempt_lazy_count); + else + trace_seq_putc(s, '.'); + + if (entry->migrate_disable) + trace_seq_printf(s, "%x", entry->migrate_disable); + else + trace_seq_putc(s, '.'); + return !trace_seq_has_overflowed(s); } diff --git a/kernel/kernel/watchdog.c b/kernel/kernel/watchdog.c index c9b759e..a81b183 100644 --- a/kernel/kernel/watchdog.c +++ b/kernel/kernel/watchdog.c @@ -604,7 +604,7 @@ * Start the timer first to prevent the NMI watchdog triggering * before the timer has a chance to fire. */ - hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); hrtimer->function = watchdog_timer_fn; hrtimer_start(hrtimer, ns_to_ktime(sample_period), HRTIMER_MODE_REL_PINNED); diff --git a/kernel/kernel/watchdog_hld.c b/kernel/kernel/watchdog_hld.c index 7138116..6854433 100644 --- a/kernel/kernel/watchdog_hld.c +++ b/kernel/kernel/watchdog_hld.c @@ -24,6 +24,8 @@ static DEFINE_PER_CPU(bool, watchdog_nmi_touch); static DEFINE_PER_CPU(struct perf_event *, watchdog_ev); static DEFINE_PER_CPU(struct perf_event *, dead_event); +static DEFINE_RAW_SPINLOCK(watchdog_output_lock); + static struct cpumask dead_events_mask; static unsigned long hardlockup_allcpu_dumped; @@ -134,6 +136,13 @@ /* only print hardlockups once */ if (__this_cpu_read(hard_watchdog_warn) == true) return; + /* + * If early-printk is enabled then make sure we do not + * lock up in printk() and kill console logging: + */ + printk_kill(); + + raw_spin_lock(&watchdog_output_lock); pr_emerg("Watchdog detected hard LOCKUP on cpu %d", this_cpu); print_modules(); @@ -151,6 +160,7 @@ !test_and_set_bit(0, &hardlockup_allcpu_dumped)) trigger_allbutself_cpu_backtrace(); + raw_spin_unlock(&watchdog_output_lock); if (hardlockup_panic) nmi_panic(regs, "Hard LOCKUP"); diff --git a/kernel/kernel/workqueue.c b/kernel/kernel/workqueue.c index 4722041..ad290b4 100644 --- a/kernel/kernel/workqueue.c +++ b/kernel/kernel/workqueue.c @@ -128,7 +128,7 @@ * * PL: wq_pool_mutex protected. * - * PR: wq_pool_mutex protected for writes. Sched-RCU protected for reads. + * PR: wq_pool_mutex protected for writes. RCU protected for reads. * * PW: wq_pool_mutex and wq->mutex protected for writes. Either for reads. * @@ -137,7 +137,7 @@ * * WQ: wq->mutex protected. * - * WR: wq->mutex protected for writes. Sched-RCU protected for reads. + * WR: wq->mutex protected for writes. RCU protected for reads. * * MD: wq_mayday_lock protected. */ @@ -145,7 +145,7 @@ /* struct worker is defined in workqueue_internal.h */ struct worker_pool { - spinlock_t lock; /* the pool lock */ + raw_spinlock_t lock; /* the pool lock */ int cpu; /* I: the associated cpu */ int node; /* I: the associated node ID */ int id; /* I: pool ID */ @@ -184,7 +184,7 @@ atomic_t nr_running ____cacheline_aligned_in_smp; /* - * Destruction of pool is sched-RCU protected to allow dereferences + * Destruction of pool is RCU protected to allow dereferences * from get_work_pool(). */ struct rcu_head rcu; @@ -213,7 +213,7 @@ /* * Release of unbound pwq is punted to system_wq. See put_pwq() * and pwq_unbound_release_workfn() for details. pool_workqueue - * itself is also sched-RCU protected so that the first pwq can be + * itself is also RCU protected so that the first pwq can be * determined without grabbing wq->mutex. */ struct work_struct unbound_release_work; @@ -298,8 +298,8 @@ static DEFINE_MUTEX(wq_pool_mutex); /* protects pools and workqueues list */ static DEFINE_MUTEX(wq_pool_attach_mutex); /* protects worker attach/detach */ -static DEFINE_SPINLOCK(wq_mayday_lock); /* protects wq->maydays list */ -static DECLARE_WAIT_QUEUE_HEAD(wq_manager_wait); /* wait for manager to go away */ +static DEFINE_RAW_SPINLOCK(wq_mayday_lock); /* protects wq->maydays list */ +static DECLARE_SWAIT_QUEUE_HEAD(wq_manager_wait); /* wait for manager to go away */ static LIST_HEAD(workqueues); /* PR: list of all workqueues */ static bool workqueue_freezing; /* PL: have wqs started freezing? */ @@ -358,20 +358,20 @@ #include <trace/events/workqueue.h> #define assert_rcu_or_pool_mutex() \ - RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ + RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ !lockdep_is_held(&wq_pool_mutex), \ - "sched RCU or wq_pool_mutex should be held") + "RCU or wq_pool_mutex should be held") #define assert_rcu_or_wq_mutex(wq) \ - RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ + RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ !lockdep_is_held(&wq->mutex), \ - "sched RCU or wq->mutex should be held") + "RCU or wq->mutex should be held") #define assert_rcu_or_wq_mutex_or_pool_mutex(wq) \ - RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ + RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ !lockdep_is_held(&wq->mutex) && \ !lockdep_is_held(&wq_pool_mutex), \ - "sched RCU, wq->mutex or wq_pool_mutex should be held") + "RCU, wq->mutex or wq_pool_mutex should be held") #define for_each_cpu_worker_pool(pool, cpu) \ for ((pool) = &per_cpu(cpu_worker_pools, cpu)[0]; \ @@ -383,7 +383,7 @@ * @pool: iteration cursor * @pi: integer used for iteration * - * This must be called either with wq_pool_mutex held or sched RCU read + * This must be called either with wq_pool_mutex held or RCU read * locked. If the pool needs to be used beyond the locking in effect, the * caller is responsible for guaranteeing that the pool stays online. * @@ -415,7 +415,7 @@ * @pwq: iteration cursor * @wq: the target workqueue * - * This must be called either with wq->mutex held or sched RCU read locked. + * This must be called either with wq->mutex held or RCU read locked. * If the pwq needs to be used beyond the locking in effect, the caller is * responsible for guaranteeing that the pwq stays online. * @@ -551,7 +551,7 @@ * @wq: the target workqueue * @node: the node ID * - * This must be called with any of wq_pool_mutex, wq->mutex or sched RCU + * This must be called with any of wq_pool_mutex, wq->mutex or RCU * read locked. * If the pwq needs to be used beyond the locking in effect, the caller is * responsible for guaranteeing that the pwq stays online. @@ -695,8 +695,8 @@ * @work: the work item of interest * * Pools are created and destroyed under wq_pool_mutex, and allows read - * access under sched-RCU read lock. As such, this function should be - * called under wq_pool_mutex or with preemption disabled. + * access under RCU read lock. As such, this function should be + * called under wq_pool_mutex or inside of a rcu_read_lock() region. * * All fields of the returned pool are accessible as long as the above * mentioned locking is in effect. If the returned pool needs to be used @@ -829,7 +829,7 @@ * Wake up the first idle worker of @pool. * * CONTEXT: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). */ static void wake_up_worker(struct worker_pool *pool) { @@ -840,43 +840,32 @@ } /** - * wq_worker_waking_up - a worker is waking up + * wq_worker_running - a worker is running again * @task: task waking up - * @cpu: CPU @task is waking up to * - * This function is called during try_to_wake_up() when a worker is - * being awoken. - * - * CONTEXT: - * spin_lock_irq(rq->lock) + * This function is called when a worker returns from schedule() */ -void wq_worker_waking_up(struct task_struct *task, int cpu) +void wq_worker_running(struct task_struct *task) { struct worker *worker = kthread_data(task); - if (!(worker->flags & WORKER_NOT_RUNNING)) { - WARN_ON_ONCE(worker->pool->cpu != cpu); + if (!worker->sleeping) + return; + if (!(worker->flags & WORKER_NOT_RUNNING)) atomic_inc(&worker->pool->nr_running); - } + worker->sleeping = 0; } /** * wq_worker_sleeping - a worker is going to sleep * @task: task going to sleep * - * This function is called during schedule() when a busy worker is - * going to sleep. Worker on the same cpu can be woken up by - * returning pointer to its task. - * - * CONTEXT: - * spin_lock_irq(rq->lock) - * - * Return: - * Worker task on @cpu to wake up, %NULL if none. + * This function is called from schedule() when a busy worker is + * going to sleep. */ -struct task_struct *wq_worker_sleeping(struct task_struct *task) +void wq_worker_sleeping(struct task_struct *task) { - struct worker *worker = kthread_data(task), *to_wakeup = NULL; + struct worker *next, *worker = kthread_data(task); struct worker_pool *pool; /* @@ -885,13 +874,15 @@ * checking NOT_RUNNING. */ if (worker->flags & WORKER_NOT_RUNNING) - return NULL; + return; pool = worker->pool; - /* this can only happen on the local cpu */ - if (WARN_ON_ONCE(pool->cpu != raw_smp_processor_id())) - return NULL; + if (WARN_ON_ONCE(worker->sleeping)) + return; + + worker->sleeping = 1; + raw_spin_lock_irq(&pool->lock); /* * The counterpart of the following dec_and_test, implied mb, @@ -905,9 +896,12 @@ * lock is safe. */ if (atomic_dec_and_test(&pool->nr_running) && - !list_empty(&pool->worklist)) - to_wakeup = first_idle_worker(pool); - return to_wakeup ? to_wakeup->task : NULL; + !list_empty(&pool->worklist)) { + next = first_idle_worker(pool); + if (next) + wake_up_process(next->task); + } + raw_spin_unlock_irq(&pool->lock); } /** @@ -938,7 +932,7 @@ * Set @flags in @worker->flags and adjust nr_running accordingly. * * CONTEXT: - * spin_lock_irq(pool->lock) + * raw_spin_lock_irq(pool->lock) */ static inline void worker_set_flags(struct worker *worker, unsigned int flags) { @@ -963,7 +957,7 @@ * Clear @flags in @worker->flags and adjust nr_running accordingly. * * CONTEXT: - * spin_lock_irq(pool->lock) + * raw_spin_lock_irq(pool->lock) */ static inline void worker_clr_flags(struct worker *worker, unsigned int flags) { @@ -1011,7 +1005,7 @@ * actually occurs, it should be easy to locate the culprit work function. * * CONTEXT: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). * * Return: * Pointer to worker which is executing @work if found, %NULL @@ -1046,7 +1040,7 @@ * nested inside outer list_for_each_entry_safe(). * * CONTEXT: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). */ static void move_linked_works(struct work_struct *work, struct list_head *head, struct work_struct **nextp) @@ -1121,12 +1115,12 @@ { if (pwq) { /* - * As both pwqs and pools are sched-RCU protected, the + * As both pwqs and pools are RCU protected, the * following lock operations are safe. */ - spin_lock_irq(&pwq->pool->lock); + raw_spin_lock_irq(&pwq->pool->lock); put_pwq(pwq); - spin_unlock_irq(&pwq->pool->lock); + raw_spin_unlock_irq(&pwq->pool->lock); } } @@ -1159,7 +1153,7 @@ * decrement nr_in_flight of its pwq and handle workqueue flushing. * * CONTEXT: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). */ static void pwq_dec_nr_in_flight(struct pool_workqueue *pwq, int color) { @@ -1249,6 +1243,7 @@ if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) return 0; + rcu_read_lock(); /* * The queueing is in progress, or it is already queued. Try to * steal it from ->worklist without clearing WORK_STRUCT_PENDING. @@ -1257,7 +1252,7 @@ if (!pool) goto fail; - spin_lock(&pool->lock); + raw_spin_lock(&pool->lock); /* * work->data is guaranteed to point to pwq only while the work * item is queued on pwq->wq, and both updating work->data to point @@ -1286,11 +1281,13 @@ /* work->data points to pwq iff queued, point to pool */ set_work_pool_and_keep_pending(work, pool->id); - spin_unlock(&pool->lock); + raw_spin_unlock(&pool->lock); + rcu_read_unlock(); return 1; } - spin_unlock(&pool->lock); + raw_spin_unlock(&pool->lock); fail: + rcu_read_unlock(); local_irq_restore(*flags); if (work_is_canceling(work)) return -ENOENT; @@ -1309,7 +1306,7 @@ * work_struct flags. * * CONTEXT: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). */ static void insert_work(struct pool_workqueue *pwq, struct work_struct *work, struct list_head *head, unsigned int extra_flags) @@ -1403,6 +1400,7 @@ if (unlikely(wq->flags & __WQ_DRAINING) && WARN_ON_ONCE(!is_chained_work(wq))) return; + rcu_read_lock(); retry: /* pwq which will be used unless @work is executing elsewhere */ if (wq->flags & WQ_UNBOUND) { @@ -1424,7 +1422,7 @@ if (last_pool && last_pool != pwq->pool) { struct worker *worker; - spin_lock(&last_pool->lock); + raw_spin_lock(&last_pool->lock); worker = find_worker_executing_work(last_pool, work); @@ -1432,11 +1430,11 @@ pwq = worker->current_pwq; } else { /* meh... not running there, queue here */ - spin_unlock(&last_pool->lock); - spin_lock(&pwq->pool->lock); + raw_spin_unlock(&last_pool->lock); + raw_spin_lock(&pwq->pool->lock); } } else { - spin_lock(&pwq->pool->lock); + raw_spin_lock(&pwq->pool->lock); } /* @@ -1449,7 +1447,7 @@ */ if (unlikely(!pwq->refcnt)) { if (wq->flags & WQ_UNBOUND) { - spin_unlock(&pwq->pool->lock); + raw_spin_unlock(&pwq->pool->lock); cpu_relax(); goto retry; } @@ -1461,10 +1459,8 @@ /* pwq determined, queue */ trace_workqueue_queue_work(req_cpu, pwq, work); - if (WARN_ON(!list_empty(&work->entry))) { - spin_unlock(&pwq->pool->lock); - return; - } + if (WARN_ON(!list_empty(&work->entry))) + goto out; pwq->nr_in_flight[pwq->work_color]++; work_flags = work_color_to_flags(pwq->work_color); @@ -1483,7 +1479,9 @@ debug_work_activate(work); insert_work(pwq, work, worklist, work_flags); - spin_unlock(&pwq->pool->lock); +out: + raw_spin_unlock(&pwq->pool->lock); + rcu_read_unlock(); } /** @@ -1518,9 +1516,11 @@ void delayed_work_timer_fn(struct timer_list *t) { struct delayed_work *dwork = from_timer(dwork, t, timer); + unsigned long flags; - /* should have been called from irqsafe timer with irq already off */ + local_irq_save(flags); __queue_work(dwork->cpu, dwork->wq, &dwork->work); + local_irq_restore(flags); } EXPORT_SYMBOL(delayed_work_timer_fn); @@ -1669,7 +1669,7 @@ * necessary. * * LOCKING: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). */ static void worker_enter_idle(struct worker *worker) { @@ -1709,7 +1709,7 @@ * @worker is leaving idle state. Update stats. * * LOCKING: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). */ static void worker_leave_idle(struct worker *worker) { @@ -1844,11 +1844,11 @@ worker_attach_to_pool(worker, pool); /* start the newly created worker */ - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); worker->pool->nr_workers++; worker_enter_idle(worker); wake_up_process(worker->task); - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); return worker; @@ -1867,7 +1867,7 @@ * be idle. * * CONTEXT: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). */ static void destroy_worker(struct worker *worker) { @@ -1893,7 +1893,7 @@ { struct worker_pool *pool = from_timer(pool, t, idle_timer); - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); while (too_many_workers(pool)) { struct worker *worker; @@ -1911,7 +1911,7 @@ destroy_worker(worker); } - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); } static void send_mayday(struct work_struct *work) @@ -1942,8 +1942,8 @@ struct worker_pool *pool = from_timer(pool, t, mayday_timer); struct work_struct *work; - spin_lock_irq(&pool->lock); - spin_lock(&wq_mayday_lock); /* for wq->maydays */ + raw_spin_lock_irq(&pool->lock); + raw_spin_lock(&wq_mayday_lock); /* for wq->maydays */ if (need_to_create_worker(pool)) { /* @@ -1956,8 +1956,8 @@ send_mayday(work); } - spin_unlock(&wq_mayday_lock); - spin_unlock_irq(&pool->lock); + raw_spin_unlock(&wq_mayday_lock); + raw_spin_unlock_irq(&pool->lock); mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INTERVAL); } @@ -1976,7 +1976,7 @@ * may_start_working() %true. * * LOCKING: - * spin_lock_irq(pool->lock) which may be released and regrabbed + * raw_spin_lock_irq(pool->lock) which may be released and regrabbed * multiple times. Does GFP_KERNEL allocations. Called only from * manager. */ @@ -1985,7 +1985,7 @@ __acquires(&pool->lock) { restart: - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); /* if we don't make progress in MAYDAY_INITIAL_TIMEOUT, call for help */ mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INITIAL_TIMEOUT); @@ -2001,7 +2001,7 @@ } del_timer_sync(&pool->mayday_timer); - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); /* * This is necessary even after a new worker was just successfully * created as @pool->lock was dropped and the new worker might have @@ -2024,7 +2024,7 @@ * and may_start_working() is true. * * CONTEXT: - * spin_lock_irq(pool->lock) which may be released and regrabbed + * raw_spin_lock_irq(pool->lock) which may be released and regrabbed * multiple times. Does GFP_KERNEL allocations. * * Return: @@ -2047,7 +2047,7 @@ pool->manager = NULL; pool->flags &= ~POOL_MANAGER_ACTIVE; - wake_up(&wq_manager_wait); + swake_up_one(&wq_manager_wait); return true; } @@ -2063,7 +2063,7 @@ * call this function to process a work. * * CONTEXT: - * spin_lock_irq(pool->lock) which is released and regrabbed. + * raw_spin_lock_irq(pool->lock) which is released and regrabbed. */ static void process_one_work(struct worker *worker, struct work_struct *work) __releases(&pool->lock) @@ -2145,7 +2145,7 @@ */ set_work_pool_and_clear_pending(work, pool->id); - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); lock_map_acquire(&pwq->wq->lockdep_map); lock_map_acquire(&lockdep_map); @@ -2200,7 +2200,7 @@ */ cond_resched(); - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); /* clear cpu intensive status */ if (unlikely(cpu_intensive)) @@ -2226,7 +2226,7 @@ * fetches a work from the top and executes it. * * CONTEXT: - * spin_lock_irq(pool->lock) which may be released and regrabbed + * raw_spin_lock_irq(pool->lock) which may be released and regrabbed * multiple times. */ static void process_scheduled_works(struct worker *worker) @@ -2268,11 +2268,11 @@ /* tell the scheduler that this is a workqueue worker */ set_pf_worker(true); woke_up: - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); /* am I supposed to die? */ if (unlikely(worker->flags & WORKER_DIE)) { - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); WARN_ON_ONCE(!list_empty(&worker->entry)); set_pf_worker(false); @@ -2338,7 +2338,7 @@ */ worker_enter_idle(worker); __set_current_state(TASK_IDLE); - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); schedule(); goto woke_up; } @@ -2392,7 +2392,7 @@ should_stop = kthread_should_stop(); /* see whether any pwq is asking for help */ - spin_lock_irq(&wq_mayday_lock); + raw_spin_lock_irq(&wq_mayday_lock); while (!list_empty(&wq->maydays)) { struct pool_workqueue *pwq = list_first_entry(&wq->maydays, @@ -2404,11 +2404,11 @@ __set_current_state(TASK_RUNNING); list_del_init(&pwq->mayday_node); - spin_unlock_irq(&wq_mayday_lock); + raw_spin_unlock_irq(&wq_mayday_lock); worker_attach_to_pool(rescuer, pool); - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); /* * Slurp in all works issued via this workqueue and @@ -2437,7 +2437,7 @@ * incur MAYDAY_INTERVAL delay inbetween. */ if (need_to_create_worker(pool)) { - spin_lock(&wq_mayday_lock); + raw_spin_lock(&wq_mayday_lock); /* * Queue iff we aren't racing destruction * and somebody else hasn't queued it already. @@ -2446,7 +2446,7 @@ get_pwq(pwq); list_add_tail(&pwq->mayday_node, &wq->maydays); } - spin_unlock(&wq_mayday_lock); + raw_spin_unlock(&wq_mayday_lock); } } @@ -2464,14 +2464,14 @@ if (need_more_worker(pool)) wake_up_worker(pool); - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); worker_detach_from_pool(rescuer); - spin_lock_irq(&wq_mayday_lock); + raw_spin_lock_irq(&wq_mayday_lock); } - spin_unlock_irq(&wq_mayday_lock); + raw_spin_unlock_irq(&wq_mayday_lock); if (should_stop) { __set_current_state(TASK_RUNNING); @@ -2551,7 +2551,7 @@ * underneath us, so we can't reliably determine pwq from @target. * * CONTEXT: - * spin_lock_irq(pool->lock). + * raw_spin_lock_irq(pool->lock). */ static void insert_wq_barrier(struct pool_workqueue *pwq, struct wq_barrier *barr, @@ -2638,7 +2638,7 @@ for_each_pwq(pwq, wq) { struct worker_pool *pool = pwq->pool; - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); if (flush_color >= 0) { WARN_ON_ONCE(pwq->flush_color != -1); @@ -2655,7 +2655,7 @@ pwq->work_color = work_color; } - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); } if (flush_color >= 0 && atomic_dec_and_test(&wq->nr_pwqs_to_flush)) @@ -2855,9 +2855,9 @@ for_each_pwq(pwq, wq) { bool drained; - spin_lock_irq(&pwq->pool->lock); + raw_spin_lock_irq(&pwq->pool->lock); drained = !pwq->nr_active && list_empty(&pwq->delayed_works); - spin_unlock_irq(&pwq->pool->lock); + raw_spin_unlock_irq(&pwq->pool->lock); if (drained) continue; @@ -2886,14 +2886,14 @@ might_sleep(); - local_irq_disable(); + rcu_read_lock(); pool = get_work_pool(work); if (!pool) { - local_irq_enable(); + rcu_read_unlock(); return false; } - spin_lock(&pool->lock); + raw_spin_lock_irq(&pool->lock); /* see the comment in try_to_grab_pending() with the same code */ pwq = get_work_pwq(work); if (pwq) { @@ -2909,7 +2909,7 @@ check_flush_dependency(pwq->wq, work); insert_wq_barrier(pwq, barr, work, worker); - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); /* * Force a lock recursion deadlock when using flush_work() inside a @@ -2925,10 +2925,11 @@ lock_map_acquire(&pwq->wq->lockdep_map); lock_map_release(&pwq->wq->lockdep_map); } - + rcu_read_unlock(); return true; already_gone: - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); + rcu_read_unlock(); return false; } @@ -3240,7 +3241,7 @@ * * Undo alloc_workqueue_attrs(). */ -void free_workqueue_attrs(struct workqueue_attrs *attrs) +static void free_workqueue_attrs(struct workqueue_attrs *attrs) { if (attrs) { free_cpumask_var(attrs->cpumask); @@ -3250,21 +3251,20 @@ /** * alloc_workqueue_attrs - allocate a workqueue_attrs - * @gfp_mask: allocation mask to use * * Allocate a new workqueue_attrs, initialize with default settings and * return it. * * Return: The allocated new workqueue_attr on success. %NULL on failure. */ -struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask) +static struct workqueue_attrs *alloc_workqueue_attrs(void) { struct workqueue_attrs *attrs; - attrs = kzalloc(sizeof(*attrs), gfp_mask); + attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); if (!attrs) goto fail; - if (!alloc_cpumask_var(&attrs->cpumask, gfp_mask)) + if (!alloc_cpumask_var(&attrs->cpumask, GFP_KERNEL)) goto fail; cpumask_copy(attrs->cpumask, cpu_possible_mask); @@ -3321,7 +3321,7 @@ */ static int init_worker_pool(struct worker_pool *pool) { - spin_lock_init(&pool->lock); + raw_spin_lock_init(&pool->lock); pool->id = -1; pool->cpu = -1; pool->node = NUMA_NO_NODE; @@ -3342,7 +3342,7 @@ pool->refcnt = 1; /* shouldn't fail above this point */ - pool->attrs = alloc_workqueue_attrs(GFP_KERNEL); + pool->attrs = alloc_workqueue_attrs(); if (!pool->attrs) return -ENOMEM; return 0; @@ -3375,7 +3375,7 @@ * put_unbound_pool - put a worker_pool * @pool: worker_pool to put * - * Put @pool. If its refcnt reaches zero, it gets destroyed in sched-RCU + * Put @pool. If its refcnt reaches zero, it gets destroyed in RCU * safe manner. get_unbound_pool() calls this function on its failure path * and this function should be able to release pools which went through, * successfully or not, init_worker_pool(). @@ -3407,15 +3407,15 @@ * @pool's workers from blocking on attach_mutex. We're the last * manager and @pool gets freed with the flag set. */ - spin_lock_irq(&pool->lock); - wait_event_lock_irq(wq_manager_wait, + raw_spin_lock_irq(&pool->lock); + swait_event_lock_irq(wq_manager_wait, !(pool->flags & POOL_MANAGER_ACTIVE), pool->lock); pool->flags |= POOL_MANAGER_ACTIVE; while ((worker = first_idle_worker(pool))) destroy_worker(worker); WARN_ON(pool->nr_workers || pool->nr_idle); - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); mutex_lock(&wq_pool_attach_mutex); if (!list_empty(&pool->workers)) @@ -3429,8 +3429,8 @@ del_timer_sync(&pool->idle_timer); del_timer_sync(&pool->mayday_timer); - /* sched-RCU protected to allow dereferences from get_work_pool() */ - call_rcu_sched(&pool->rcu, rcu_free_pool); + /* RCU protected to allow dereferences from get_work_pool() */ + call_rcu(&pool->rcu, rcu_free_pool); } /** @@ -3543,14 +3543,14 @@ put_unbound_pool(pool); mutex_unlock(&wq_pool_mutex); - call_rcu_sched(&pwq->rcu, rcu_free_pwq); + call_rcu(&pwq->rcu, rcu_free_pwq); /* * If we're the last pwq going away, @wq is already dead and no one * is gonna access it anymore. Schedule RCU free. */ if (is_last) - call_rcu_sched(&wq->rcu, rcu_free_wq); + call_rcu(&wq->rcu, rcu_free_wq); } /** @@ -3575,7 +3575,7 @@ return; /* this function can be called during early boot w/ irq disabled */ - spin_lock_irqsave(&pwq->pool->lock, flags); + raw_spin_lock_irqsave(&pwq->pool->lock, flags); /* * During [un]freezing, the caller is responsible for ensuring that @@ -3605,7 +3605,7 @@ pwq->max_active = 0; } - spin_unlock_irqrestore(&pwq->pool->lock, flags); + raw_spin_unlock_irqrestore(&pwq->pool->lock, flags); } /* initialize newly alloced @pwq which is associated with @wq and @pool */ @@ -3778,8 +3778,8 @@ ctx = kzalloc(struct_size(ctx, pwq_tbl, nr_node_ids), GFP_KERNEL); - new_attrs = alloc_workqueue_attrs(GFP_KERNEL); - tmp_attrs = alloc_workqueue_attrs(GFP_KERNEL); + new_attrs = alloc_workqueue_attrs(); + tmp_attrs = alloc_workqueue_attrs(); if (!ctx || !new_attrs || !tmp_attrs) goto out_free; @@ -3915,7 +3915,7 @@ * * Return: 0 on success and -errno on failure. */ -int apply_workqueue_attrs(struct workqueue_struct *wq, +static int apply_workqueue_attrs(struct workqueue_struct *wq, const struct workqueue_attrs *attrs) { int ret; @@ -3926,7 +3926,6 @@ return ret; } -EXPORT_SYMBOL_GPL(apply_workqueue_attrs); /** * wq_update_unbound_numa - update NUMA affinity of a wq for CPU hot[un]plug @@ -4004,9 +4003,9 @@ use_dfl_pwq: mutex_lock(&wq->mutex); - spin_lock_irq(&wq->dfl_pwq->pool->lock); + raw_spin_lock_irq(&wq->dfl_pwq->pool->lock); get_pwq(wq->dfl_pwq); - spin_unlock_irq(&wq->dfl_pwq->pool->lock); + raw_spin_unlock_irq(&wq->dfl_pwq->pool->lock); old_pwq = numa_pwq_tbl_install(wq, node, wq->dfl_pwq); out_unlock: mutex_unlock(&wq->mutex); @@ -4125,7 +4124,7 @@ return NULL; if (flags & WQ_UNBOUND) { - wq->unbound_attrs = alloc_workqueue_attrs(GFP_KERNEL); + wq->unbound_attrs = alloc_workqueue_attrs(); if (!wq->unbound_attrs) goto err_free_wq; } @@ -4212,9 +4211,9 @@ struct worker *rescuer = wq->rescuer; /* this prevents new queueing */ - spin_lock_irq(&wq_mayday_lock); + raw_spin_lock_irq(&wq_mayday_lock); wq->rescuer = NULL; - spin_unlock_irq(&wq_mayday_lock); + raw_spin_unlock_irq(&wq_mayday_lock); /* rescuer will empty maydays list before exiting */ kthread_stop(rescuer->task); @@ -4257,7 +4256,7 @@ * The base ref is never dropped on per-cpu pwqs. Directly * schedule RCU free. */ - call_rcu_sched(&wq->rcu, rcu_free_wq); + call_rcu(&wq->rcu, rcu_free_wq); } else { /* * We're the sole accessor of @wq at this point. Directly @@ -4367,7 +4366,8 @@ struct pool_workqueue *pwq; bool ret; - rcu_read_lock_sched(); + rcu_read_lock(); + preempt_disable(); if (cpu == WORK_CPU_UNBOUND) cpu = smp_processor_id(); @@ -4378,7 +4378,8 @@ pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu)); ret = !list_empty(&pwq->delayed_works); - rcu_read_unlock_sched(); + preempt_enable(); + rcu_read_unlock(); return ret; } @@ -4404,15 +4405,15 @@ if (work_pending(work)) ret |= WORK_BUSY_PENDING; - local_irq_save(flags); + rcu_read_lock(); pool = get_work_pool(work); if (pool) { - spin_lock(&pool->lock); + raw_spin_lock_irqsave(&pool->lock, flags); if (find_worker_executing_work(pool, work)) ret |= WORK_BUSY_RUNNING; - spin_unlock(&pool->lock); + raw_spin_unlock_irqrestore(&pool->lock, flags); } - local_irq_restore(flags); + rcu_read_unlock(); return ret; } @@ -4597,7 +4598,7 @@ unsigned long flags; int pi; - rcu_read_lock_sched(); + rcu_read_lock(); pr_info("Showing busy workqueues and worker pools:\n"); @@ -4617,10 +4618,10 @@ pr_info("workqueue %s: flags=0x%x\n", wq->name, wq->flags); for_each_pwq(pwq, wq) { - spin_lock_irqsave(&pwq->pool->lock, flags); + raw_spin_lock_irqsave(&pwq->pool->lock, flags); if (pwq->nr_active || !list_empty(&pwq->delayed_works)) show_pwq(pwq); - spin_unlock_irqrestore(&pwq->pool->lock, flags); + raw_spin_unlock_irqrestore(&pwq->pool->lock, flags); /* * We could be printing a lot from atomic context, e.g. * sysrq-t -> show_workqueue_state(). Avoid triggering @@ -4634,7 +4635,7 @@ struct worker *worker; bool first = true; - spin_lock_irqsave(&pool->lock, flags); + raw_spin_lock_irqsave(&pool->lock, flags); if (pool->nr_workers == pool->nr_idle) goto next_pool; @@ -4653,7 +4654,7 @@ } pr_cont("\n"); next_pool: - spin_unlock_irqrestore(&pool->lock, flags); + raw_spin_unlock_irqrestore(&pool->lock, flags); /* * We could be printing a lot from atomic context, e.g. * sysrq-t -> show_workqueue_state(). Avoid triggering @@ -4662,7 +4663,7 @@ touch_nmi_watchdog(); } - rcu_read_unlock_sched(); + rcu_read_unlock(); } /* used to show worker information through /proc/PID/{comm,stat,status} */ @@ -4683,7 +4684,7 @@ struct worker_pool *pool = worker->pool; if (pool) { - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); /* * ->desc tracks information (wq name or * set_worker_desc()) for the latest execution. If @@ -4697,7 +4698,7 @@ scnprintf(buf + off, size - off, "-%s", worker->desc); } - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); } } @@ -4728,7 +4729,7 @@ for_each_cpu_worker_pool(pool, cpu) { mutex_lock(&wq_pool_attach_mutex); - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); /* * We've blocked all attach/detach operations. Make all workers @@ -4742,7 +4743,7 @@ pool->flags |= POOL_DISASSOCIATED; - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); mutex_unlock(&wq_pool_attach_mutex); /* @@ -4768,9 +4769,9 @@ * worker blocking could lead to lengthy stalls. Kick off * unbound chain execution of currently pending work items. */ - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); wake_up_worker(pool); - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); } } @@ -4797,7 +4798,7 @@ WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, pool->attrs->cpumask) < 0); - spin_lock_irq(&pool->lock); + raw_spin_lock_irq(&pool->lock); pool->flags &= ~POOL_DISASSOCIATED; @@ -4836,7 +4837,7 @@ WRITE_ONCE(worker->flags, worker_flags); } - spin_unlock_irq(&pool->lock); + raw_spin_unlock_irq(&pool->lock); } /** @@ -5049,16 +5050,16 @@ * nr_active is monotonically decreasing. It's safe * to peek without lock. */ - rcu_read_lock_sched(); + rcu_read_lock(); for_each_pwq(pwq, wq) { WARN_ON_ONCE(pwq->nr_active < 0); if (pwq->nr_active) { busy = true; - rcu_read_unlock_sched(); + rcu_read_unlock(); goto out_unlock; } } - rcu_read_unlock_sched(); + rcu_read_unlock(); } out_unlock: mutex_unlock(&wq_pool_mutex); @@ -5260,7 +5261,8 @@ const char *delim = ""; int node, written = 0; - rcu_read_lock_sched(); + get_online_cpus(); + rcu_read_lock(); for_each_node(node) { written += scnprintf(buf + written, PAGE_SIZE - written, "%s%d:%d", delim, node, @@ -5268,7 +5270,8 @@ delim = " "; } written += scnprintf(buf + written, PAGE_SIZE - written, "\n"); - rcu_read_unlock_sched(); + rcu_read_unlock(); + put_online_cpus(); return written; } @@ -5293,7 +5296,7 @@ lockdep_assert_held(&wq_pool_mutex); - attrs = alloc_workqueue_attrs(GFP_KERNEL); + attrs = alloc_workqueue_attrs(); if (!attrs) return NULL; @@ -5722,7 +5725,7 @@ return; } - wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs(GFP_KERNEL); + wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs(); BUG_ON(!wq_update_unbound_numa_attrs_buf); /* @@ -5797,7 +5800,7 @@ for (i = 0; i < NR_STD_WORKER_POOLS; i++) { struct workqueue_attrs *attrs; - BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL))); + BUG_ON(!(attrs = alloc_workqueue_attrs())); attrs->nice = std_nice[i]; unbound_std_wq_attrs[i] = attrs; @@ -5806,7 +5809,7 @@ * guaranteed by max_active which is enforced by pwqs. * Turn off NUMA so that dfl_pwq is used for all nodes. */ - BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL))); + BUG_ON(!(attrs = alloc_workqueue_attrs())); attrs->nice = std_nice[i]; attrs->no_numa = true; ordered_wq_attrs[i] = attrs; diff --git a/kernel/kernel/workqueue_internal.h b/kernel/kernel/workqueue_internal.h index cb68b03..0c0599c 100644 --- a/kernel/kernel/workqueue_internal.h +++ b/kernel/kernel/workqueue_internal.h @@ -44,6 +44,7 @@ unsigned long last_active; /* L: last active timestamp */ unsigned int flags; /* X: flags */ int id; /* I: worker id */ + int sleeping; /* None */ /* * Opaque string set with work_set_desc(). Printed out with task @@ -72,8 +73,8 @@ * Scheduler hooks for concurrency managed workqueue. Only to be used from * sched/ and workqueue.c. */ -void wq_worker_waking_up(struct task_struct *task, int cpu); -struct task_struct *wq_worker_sleeping(struct task_struct *task); work_func_t wq_worker_last_func(struct task_struct *task); +void wq_worker_running(struct task_struct *task); +void wq_worker_sleeping(struct task_struct *task); #endif /* _KERNEL_WORKQUEUE_INTERNAL_H */ diff --git a/kernel/lib/Kconfig b/kernel/lib/Kconfig index 10a4031..ae9833f 100644 --- a/kernel/lib/Kconfig +++ b/kernel/lib/Kconfig @@ -441,6 +441,7 @@ config CPUMASK_OFFSTACK bool "Force CPU masks off stack" if DEBUG_PER_CPU_MAPS + depends on !PREEMPT_RT_FULL help Use dynamic allocation for cpumask_var_t, instead of putting them on the stack. This is a bit more expensive, but avoids diff --git a/kernel/lib/Kconfig.debug b/kernel/lib/Kconfig.debug index 607c8a6..ccd0b5f 100644 --- a/kernel/lib/Kconfig.debug +++ b/kernel/lib/Kconfig.debug @@ -1227,7 +1227,7 @@ config DEBUG_LOCKING_API_SELFTESTS bool "Locking API boot-time self-tests" - depends on DEBUG_KERNEL + depends on DEBUG_KERNEL && !PREEMPT_RT_FULL help Say Y here if you want the kernel to run a short self-test during bootup. The self-test checks whether common types of locking bugs diff --git a/kernel/lib/debugobjects.c b/kernel/lib/debugobjects.c index 14afeeb..e28481c 100644 --- a/kernel/lib/debugobjects.c +++ b/kernel/lib/debugobjects.c @@ -376,7 +376,10 @@ struct debug_obj *obj; unsigned long flags; - fill_pool(); +#ifdef CONFIG_PREEMPT_RT_FULL + if (preempt_count() == 0 && !irqs_disabled()) +#endif + fill_pool(); db = get_bucket((unsigned long) addr); diff --git a/kernel/lib/irq_poll.c b/kernel/lib/irq_poll.c index 86a7099..9c069ef 100644 --- a/kernel/lib/irq_poll.c +++ b/kernel/lib/irq_poll.c @@ -37,6 +37,7 @@ list_add_tail(&iop->list, this_cpu_ptr(&blk_cpu_iopoll)); __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); local_irq_restore(flags); + preempt_check_resched_rt(); } EXPORT_SYMBOL(irq_poll_sched); @@ -72,6 +73,7 @@ local_irq_save(flags); __irq_poll_complete(iop); local_irq_restore(flags); + preempt_check_resched_rt(); } EXPORT_SYMBOL(irq_poll_complete); @@ -96,6 +98,7 @@ } local_irq_enable(); + preempt_check_resched_rt(); /* Even though interrupts have been re-enabled, this * access is safe because interrupts can only add new @@ -133,6 +136,7 @@ __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); local_irq_enable(); + preempt_check_resched_rt(); } /** @@ -196,6 +200,7 @@ this_cpu_ptr(&blk_cpu_iopoll)); __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); local_irq_enable(); + preempt_check_resched_rt(); return 0; } diff --git a/kernel/lib/locking-selftest.c b/kernel/lib/locking-selftest.c index 1e1bbf1..32db953 100644 --- a/kernel/lib/locking-selftest.c +++ b/kernel/lib/locking-selftest.c @@ -742,6 +742,8 @@ #include "locking-selftest-spin-hardirq.h" GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin) +#ifndef CONFIG_PREEMPT_RT_FULL + #include "locking-selftest-rlock-hardirq.h" GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock) @@ -757,9 +759,12 @@ #include "locking-selftest-wlock-softirq.h" GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_wlock) +#endif + #undef E1 #undef E2 +#ifndef CONFIG_PREEMPT_RT_FULL /* * Enabling hardirqs with a softirq-safe lock held: */ @@ -792,6 +797,8 @@ #undef E1 #undef E2 +#endif + /* * Enabling irqs with an irq-safe lock held: */ @@ -815,6 +822,8 @@ #include "locking-selftest-spin-hardirq.h" GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin) +#ifndef CONFIG_PREEMPT_RT_FULL + #include "locking-selftest-rlock-hardirq.h" GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock) @@ -829,6 +838,8 @@ #include "locking-selftest-wlock-softirq.h" GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock) + +#endif #undef E1 #undef E2 @@ -861,6 +872,8 @@ #include "locking-selftest-spin-hardirq.h" GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin) +#ifndef CONFIG_PREEMPT_RT_FULL + #include "locking-selftest-rlock-hardirq.h" GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock) @@ -875,6 +888,8 @@ #include "locking-selftest-wlock-softirq.h" GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock) + +#endif #undef E1 #undef E2 @@ -909,6 +924,8 @@ #include "locking-selftest-spin-hardirq.h" GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin) +#ifndef CONFIG_PREEMPT_RT_FULL + #include "locking-selftest-rlock-hardirq.h" GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock) @@ -924,9 +941,13 @@ #include "locking-selftest-wlock-softirq.h" GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_wlock) +#endif + #undef E1 #undef E2 #undef E3 + +#ifndef CONFIG_PREEMPT_RT_FULL /* * read-lock / write-lock irq inversion. @@ -990,6 +1011,10 @@ #undef E2 #undef E3 +#endif + +#ifndef CONFIG_PREEMPT_RT_FULL + /* * read-lock / write-lock recursion that is actually safe. */ @@ -1027,6 +1052,8 @@ #undef E1 #undef E2 #undef E3 + +#endif /* * read-lock / write-lock recursion that is unsafe. @@ -2057,6 +2084,7 @@ printk(" --------------------------------------------------------------------------\n"); +#ifndef CONFIG_PREEMPT_RT_FULL /* * irq-context testcases: */ @@ -2069,6 +2097,28 @@ DO_TESTCASE_6x2("irq read-recursion", irq_read_recursion); // DO_TESTCASE_6x2B("irq read-recursion #2", irq_read_recursion2); +#else + /* On -rt, we only do hardirq context test for raw spinlock */ + DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 12); + DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 21); + + DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 12); + DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 21); + + DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 123); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 132); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 213); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 231); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 312); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 321); + + DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 123); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 132); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 213); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 231); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 312); + DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 321); +#endif ww_tests(); diff --git a/kernel/lib/radix-tree.c b/kernel/lib/radix-tree.c index e5cab5c..9309e81 100644 --- a/kernel/lib/radix-tree.c +++ b/kernel/lib/radix-tree.c @@ -38,7 +38,7 @@ #include <linux/rcupdate.h> #include <linux/slab.h> #include <linux/string.h> - +#include <linux/locallock.h> /* Number of nodes in fully populated tree of given height */ static unsigned long height_to_maxnodes[RADIX_TREE_MAX_PATH + 1] __read_mostly; @@ -87,6 +87,7 @@ struct radix_tree_node *nodes; }; static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, }; +static DEFINE_LOCAL_IRQ_LOCK(radix_tree_preloads_lock); static inline struct radix_tree_node *entry_to_node(void *ptr) { @@ -405,12 +406,13 @@ * succeed in getting a node here (and never reach * kmem_cache_alloc) */ - rtp = this_cpu_ptr(&radix_tree_preloads); + rtp = &get_locked_var(radix_tree_preloads_lock, radix_tree_preloads); if (rtp->nr) { ret = rtp->nodes; rtp->nodes = ret->parent; rtp->nr--; } + put_locked_var(radix_tree_preloads_lock, radix_tree_preloads); /* * Update the allocation stack trace as this is more useful * for debugging. @@ -476,14 +478,14 @@ */ gfp_mask &= ~__GFP_ACCOUNT; - preempt_disable(); + local_lock(radix_tree_preloads_lock); rtp = this_cpu_ptr(&radix_tree_preloads); while (rtp->nr < nr) { - preempt_enable(); + local_unlock(radix_tree_preloads_lock); node = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask); if (node == NULL) goto out; - preempt_disable(); + local_lock(radix_tree_preloads_lock); rtp = this_cpu_ptr(&radix_tree_preloads); if (rtp->nr < nr) { node->parent = rtp->nodes; @@ -525,7 +527,7 @@ if (gfpflags_allow_blocking(gfp_mask)) return __radix_tree_preload(gfp_mask, RADIX_TREE_PRELOAD_SIZE); /* Preloading doesn't help anything with this gfp mask, skip it */ - preempt_disable(); + local_lock(radix_tree_preloads_lock); return 0; } EXPORT_SYMBOL(radix_tree_maybe_preload); @@ -563,7 +565,7 @@ /* Preloading doesn't help anything with this gfp mask, skip it */ if (!gfpflags_allow_blocking(gfp_mask)) { - preempt_disable(); + local_lock(radix_tree_preloads_lock); return 0; } @@ -596,6 +598,12 @@ return __radix_tree_preload(gfp_mask, nr_nodes); } + +void radix_tree_preload_end(void) +{ + local_unlock(radix_tree_preloads_lock); +} +EXPORT_SYMBOL(radix_tree_preload_end); static unsigned radix_tree_load_root(const struct radix_tree_root *root, struct radix_tree_node **nodep, unsigned long *maxindex) @@ -2102,9 +2110,15 @@ void idr_preload(gfp_t gfp_mask) { if (__radix_tree_preload(gfp_mask, IDR_PRELOAD_SIZE)) - preempt_disable(); + local_lock(radix_tree_preloads_lock); } EXPORT_SYMBOL(idr_preload); + +void idr_preload_end(void) +{ + local_unlock(radix_tree_preloads_lock); +} +EXPORT_SYMBOL(idr_preload_end); int ida_pre_get(struct ida *ida, gfp_t gfp) { @@ -2114,7 +2128,7 @@ * to return to the ida_pre_get() step. */ if (!__radix_tree_preload(gfp, IDA_PRELOAD_SIZE)) - preempt_enable(); + local_unlock(radix_tree_preloads_lock); if (!this_cpu_read(ida_bitmap)) { struct ida_bitmap *bitmap = kzalloc(sizeof(*bitmap), gfp); diff --git a/kernel/lib/scatterlist.c b/kernel/lib/scatterlist.c index 3b85920..093c3aa 100644 --- a/kernel/lib/scatterlist.c +++ b/kernel/lib/scatterlist.c @@ -777,7 +777,7 @@ flush_kernel_dcache_page(miter->page); if (miter->__flags & SG_MITER_ATOMIC) { - WARN_ON_ONCE(preemptible()); + WARN_ON_ONCE(!pagefault_disabled()); kunmap_atomic(miter->addr); } else kunmap(miter->page); diff --git a/kernel/lib/smp_processor_id.c b/kernel/lib/smp_processor_id.c index 85925aa..2e73985 100644 --- a/kernel/lib/smp_processor_id.c +++ b/kernel/lib/smp_processor_id.c @@ -22,7 +22,12 @@ * Kernel threads bound to a single CPU can safely use * smp_processor_id(): */ - if (cpumask_equal(¤t->cpus_allowed, cpumask_of(this_cpu))) +#if defined(CONFIG_PREEMPT_RT_BASE) && (defined(CONFIG_SMP) || defined(CONFIG_SCHED_DEBUG)) + if (current->migrate_disable) + goto out; +#endif + + if (current->nr_cpus_allowed == 1) goto out; /* diff --git a/kernel/lib/ubsan.c b/kernel/lib/ubsan.c index 1e9e2ab..199c75e 100644 --- a/kernel/lib/ubsan.c +++ b/kernel/lib/ubsan.c @@ -143,25 +143,21 @@ } } -static DEFINE_SPINLOCK(report_lock); - -static void ubsan_prologue(struct source_location *location, - unsigned long *flags) +static void ubsan_prologue(struct source_location *location) { current->in_ubsan++; - spin_lock_irqsave(&report_lock, *flags); pr_err("========================================" "========================================\n"); print_source_location("UBSAN: Undefined behaviour in", location); } -static void ubsan_epilogue(unsigned long *flags) +static void ubsan_epilogue(void) { dump_stack(); pr_err("========================================" "========================================\n"); - spin_unlock_irqrestore(&report_lock, *flags); + current->in_ubsan--; } @@ -170,14 +166,13 @@ { struct type_descriptor *type = data->type; - unsigned long flags; char lhs_val_str[VALUE_LENGTH]; char rhs_val_str[VALUE_LENGTH]; if (suppress_report(&data->location)) return; - ubsan_prologue(&data->location, &flags); + ubsan_prologue(&data->location); val_to_string(lhs_val_str, sizeof(lhs_val_str), type, lhs); val_to_string(rhs_val_str, sizeof(rhs_val_str), type, rhs); @@ -189,7 +184,7 @@ rhs_val_str, type->type_name); - ubsan_epilogue(&flags); + ubsan_epilogue(); } void __ubsan_handle_add_overflow(struct overflow_data *data, @@ -217,20 +212,19 @@ void __ubsan_handle_negate_overflow(struct overflow_data *data, void *old_val) { - unsigned long flags; char old_val_str[VALUE_LENGTH]; if (suppress_report(&data->location)) return; - ubsan_prologue(&data->location, &flags); + ubsan_prologue(&data->location); val_to_string(old_val_str, sizeof(old_val_str), data->type, old_val); pr_err("negation of %s cannot be represented in type %s:\n", old_val_str, data->type->type_name); - ubsan_epilogue(&flags); + ubsan_epilogue(); } EXPORT_SYMBOL(__ubsan_handle_negate_overflow); @@ -238,13 +232,12 @@ void __ubsan_handle_divrem_overflow(struct overflow_data *data, void *lhs, void *rhs) { - unsigned long flags; char rhs_val_str[VALUE_LENGTH]; if (suppress_report(&data->location)) return; - ubsan_prologue(&data->location, &flags); + ubsan_prologue(&data->location); val_to_string(rhs_val_str, sizeof(rhs_val_str), data->type, rhs); @@ -254,58 +247,52 @@ else pr_err("division by zero\n"); - ubsan_epilogue(&flags); + ubsan_epilogue(); } EXPORT_SYMBOL(__ubsan_handle_divrem_overflow); static void handle_null_ptr_deref(struct type_mismatch_data_common *data) { - unsigned long flags; - if (suppress_report(data->location)) return; - ubsan_prologue(data->location, &flags); + ubsan_prologue(data->location); pr_err("%s null pointer of type %s\n", type_check_kinds[data->type_check_kind], data->type->type_name); - ubsan_epilogue(&flags); + ubsan_epilogue(); } static void handle_misaligned_access(struct type_mismatch_data_common *data, unsigned long ptr) { - unsigned long flags; - if (suppress_report(data->location)) return; - ubsan_prologue(data->location, &flags); + ubsan_prologue(data->location); pr_err("%s misaligned address %p for type %s\n", type_check_kinds[data->type_check_kind], (void *)ptr, data->type->type_name); pr_err("which requires %ld byte alignment\n", data->alignment); - ubsan_epilogue(&flags); + ubsan_epilogue(); } static void handle_object_size_mismatch(struct type_mismatch_data_common *data, unsigned long ptr) { - unsigned long flags; - if (suppress_report(data->location)) return; - ubsan_prologue(data->location, &flags); + ubsan_prologue(data->location); pr_err("%s address %p with insufficient space\n", type_check_kinds[data->type_check_kind], (void *) ptr); pr_err("for an object of type %s\n", data->type->type_name); - ubsan_epilogue(&flags); + ubsan_epilogue(); } static void ubsan_type_mismatch_common(struct type_mismatch_data_common *data, @@ -352,42 +339,39 @@ void __ubsan_handle_vla_bound_not_positive(struct vla_bound_data *data, void *bound) { - unsigned long flags; char bound_str[VALUE_LENGTH]; if (suppress_report(&data->location)) return; - ubsan_prologue(&data->location, &flags); + ubsan_prologue(&data->location); val_to_string(bound_str, sizeof(bound_str), data->type, bound); pr_err("variable length array bound value %s <= 0\n", bound_str); - ubsan_epilogue(&flags); + ubsan_epilogue(); } EXPORT_SYMBOL(__ubsan_handle_vla_bound_not_positive); void __ubsan_handle_out_of_bounds(struct out_of_bounds_data *data, void *index) { - unsigned long flags; char index_str[VALUE_LENGTH]; if (suppress_report(&data->location)) return; - ubsan_prologue(&data->location, &flags); + ubsan_prologue(&data->location); val_to_string(index_str, sizeof(index_str), data->index_type, index); pr_err("index %s is out of range for type %s\n", index_str, data->array_type->type_name); - ubsan_epilogue(&flags); + ubsan_epilogue(); } EXPORT_SYMBOL(__ubsan_handle_out_of_bounds); void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data, void *lhs, void *rhs) { - unsigned long flags; struct type_descriptor *rhs_type = data->rhs_type; struct type_descriptor *lhs_type = data->lhs_type; char rhs_str[VALUE_LENGTH]; @@ -396,7 +380,7 @@ if (suppress_report(&data->location)) return; - ubsan_prologue(&data->location, &flags); + ubsan_prologue(&data->location); val_to_string(rhs_str, sizeof(rhs_str), rhs_type, rhs); val_to_string(lhs_str, sizeof(lhs_str), lhs_type, lhs); @@ -419,18 +403,16 @@ lhs_str, rhs_str, lhs_type->type_name); - ubsan_epilogue(&flags); + ubsan_epilogue(); } EXPORT_SYMBOL(__ubsan_handle_shift_out_of_bounds); void __ubsan_handle_builtin_unreachable(struct unreachable_data *data) { - unsigned long flags; - - ubsan_prologue(&data->location, &flags); + ubsan_prologue(&data->location); pr_err("calling __builtin_unreachable()\n"); - ubsan_epilogue(&flags); + ubsan_epilogue(); panic("can't return from __builtin_unreachable()"); } EXPORT_SYMBOL(__ubsan_handle_builtin_unreachable); @@ -438,19 +420,18 @@ void __ubsan_handle_load_invalid_value(struct invalid_value_data *data, void *val) { - unsigned long flags; char val_str[VALUE_LENGTH]; if (suppress_report(&data->location)) return; - ubsan_prologue(&data->location, &flags); + ubsan_prologue(&data->location); val_to_string(val_str, sizeof(val_str), data->type, val); pr_err("load of value %s is not a valid value for type %s\n", val_str, data->type->type_name); - ubsan_epilogue(&flags); + ubsan_epilogue(); } EXPORT_SYMBOL(__ubsan_handle_load_invalid_value); diff --git a/kernel/localversion-rt b/kernel/localversion-rt new file mode 100644 index 0000000..d068aed --- /dev/null +++ b/kernel/localversion-rt @@ -0,0 +1 @@ +-rt104 diff --git a/kernel/mm/Kconfig b/kernel/mm/Kconfig index 036466b..20c2a1d 100644 --- a/kernel/mm/Kconfig +++ b/kernel/mm/Kconfig @@ -377,7 +377,7 @@ config TRANSPARENT_HUGEPAGE bool "Transparent Hugepage Support" - depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE + depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE && !PREEMPT_RT_FULL select COMPACTION select RADIX_TREE_MULTIORDER help diff --git a/kernel/mm/compaction.c b/kernel/mm/compaction.c index 120e555..4853ed5 100644 --- a/kernel/mm/compaction.c +++ b/kernel/mm/compaction.c @@ -1669,10 +1669,12 @@ block_start_pfn(cc->migrate_pfn, cc->order); if (cc->last_migrated_pfn < current_block_start) { - cpu = get_cpu(); + cpu = get_cpu_light(); + local_lock_irq(swapvec_lock); lru_add_drain_cpu(cpu); + local_unlock_irq(swapvec_lock); drain_local_pages(zone); - put_cpu(); + put_cpu_light(); /* No more flushing until we migrate again */ cc->last_migrated_pfn = 0; } diff --git a/kernel/mm/highmem.c b/kernel/mm/highmem.c index 59db322..22aa3dd 100644 --- a/kernel/mm/highmem.c +++ b/kernel/mm/highmem.c @@ -30,9 +30,10 @@ #include <linux/kgdb.h> #include <asm/tlbflush.h> - +#ifndef CONFIG_PREEMPT_RT_FULL #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) DEFINE_PER_CPU(int, __kmap_atomic_idx); +#endif #endif /* @@ -108,8 +109,9 @@ unsigned long totalhigh_pages __read_mostly; EXPORT_SYMBOL(totalhigh_pages); - +#ifndef CONFIG_PREEMPT_RT_FULL EXPORT_PER_CPU_SYMBOL(__kmap_atomic_idx); +#endif unsigned int nr_free_highpages (void) { diff --git a/kernel/mm/kmemleak.c b/kernel/mm/kmemleak.c index f54734a..e8a7eeb 100644 --- a/kernel/mm/kmemleak.c +++ b/kernel/mm/kmemleak.c @@ -26,7 +26,7 @@ * * The following locks and mutexes are used by kmemleak: * - * - kmemleak_lock (rwlock): protects the object_list modifications and + * - kmemleak_lock (raw spinlock): protects the object_list modifications and * accesses to the object_tree_root. The object_list is the main list * holding the metadata (struct kmemleak_object) for the allocated memory * blocks. The object_tree_root is a red black tree used to look-up @@ -147,7 +147,7 @@ * (use_count) and freed using the RCU mechanism. */ struct kmemleak_object { - spinlock_t lock; + raw_spinlock_t lock; unsigned int flags; /* object status flags */ struct list_head object_list; struct list_head gray_list; @@ -197,7 +197,7 @@ /* search tree for object boundaries */ static struct rb_root object_tree_root = RB_ROOT; /* rw_lock protecting the access to object_list and object_tree_root */ -static DEFINE_RWLOCK(kmemleak_lock); +static DEFINE_RAW_SPINLOCK(kmemleak_lock); /* allocation caches for kmemleak internal data */ static struct kmem_cache *object_cache; @@ -491,9 +491,9 @@ struct kmemleak_object *object; rcu_read_lock(); - read_lock_irqsave(&kmemleak_lock, flags); + raw_spin_lock_irqsave(&kmemleak_lock, flags); object = lookup_object(ptr, alias); - read_unlock_irqrestore(&kmemleak_lock, flags); + raw_spin_unlock_irqrestore(&kmemleak_lock, flags); /* check whether the object is still available */ if (object && !get_object(object)) @@ -513,13 +513,13 @@ unsigned long flags; struct kmemleak_object *object; - write_lock_irqsave(&kmemleak_lock, flags); + raw_spin_lock_irqsave(&kmemleak_lock, flags); object = lookup_object(ptr, alias); if (object) { rb_erase(&object->rb_node, &object_tree_root); list_del_rcu(&object->object_list); } - write_unlock_irqrestore(&kmemleak_lock, flags); + raw_spin_unlock_irqrestore(&kmemleak_lock, flags); return object; } @@ -561,7 +561,7 @@ INIT_LIST_HEAD(&object->object_list); INIT_LIST_HEAD(&object->gray_list); INIT_HLIST_HEAD(&object->area_list); - spin_lock_init(&object->lock); + raw_spin_lock_init(&object->lock); atomic_set(&object->use_count, 1); object->flags = OBJECT_ALLOCATED; object->pointer = ptr; @@ -593,7 +593,7 @@ /* kernel backtrace */ object->trace_len = __save_stack_trace(object->trace); - write_lock_irqsave(&kmemleak_lock, flags); + raw_spin_lock_irqsave(&kmemleak_lock, flags); min_addr = min(min_addr, ptr); max_addr = max(max_addr, ptr + size); @@ -624,7 +624,7 @@ list_add_tail_rcu(&object->object_list, &object_list); out: - write_unlock_irqrestore(&kmemleak_lock, flags); + raw_spin_unlock_irqrestore(&kmemleak_lock, flags); return object; } @@ -642,9 +642,9 @@ * Locking here also ensures that the corresponding memory block * cannot be freed when it is being scanned. */ - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); object->flags &= ~OBJECT_ALLOCATED; - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); put_object(object); } @@ -716,9 +716,9 @@ { unsigned long flags; - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); __paint_it(object, color); - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); } static void paint_ptr(unsigned long ptr, int color) @@ -778,7 +778,7 @@ goto out; } - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); if (size == SIZE_MAX) { size = object->pointer + object->size - ptr; } else if (ptr + size > object->pointer + object->size) { @@ -794,7 +794,7 @@ hlist_add_head(&area->node, &object->area_list); out_unlock: - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); out: put_object(object); } @@ -817,9 +817,9 @@ return; } - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); object->excess_ref = excess_ref; - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); put_object(object); } @@ -839,9 +839,9 @@ return; } - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); object->flags |= OBJECT_NO_SCAN; - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); put_object(object); } @@ -902,11 +902,11 @@ log->min_count, GFP_ATOMIC); if (!object) goto out; - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); for (i = 0; i < log->trace_len; i++) object->trace[i] = log->trace[i]; object->trace_len = log->trace_len; - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); out: rcu_read_unlock(); } @@ -1096,9 +1096,9 @@ return; } - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); object->trace_len = __save_stack_trace(object->trace); - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); put_object(object); } @@ -1310,7 +1310,7 @@ unsigned long *end = _end - (BYTES_PER_POINTER - 1); unsigned long flags; - read_lock_irqsave(&kmemleak_lock, flags); + raw_spin_lock_irqsave(&kmemleak_lock, flags); for (ptr = start; ptr < end; ptr++) { struct kmemleak_object *object; unsigned long pointer; @@ -1344,7 +1344,7 @@ * previously acquired in scan_object(). These locks are * enclosed by scan_mutex. */ - spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING); + raw_spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING); /* only pass surplus references (object already gray) */ if (color_gray(object)) { excess_ref = object->excess_ref; @@ -1353,7 +1353,7 @@ excess_ref = 0; update_refs(object); } - spin_unlock(&object->lock); + raw_spin_unlock(&object->lock); if (excess_ref) { object = lookup_object(excess_ref, 0); @@ -1362,12 +1362,12 @@ if (object == scanned) /* circular reference, ignore */ continue; - spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING); + raw_spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING); update_refs(object); - spin_unlock(&object->lock); + raw_spin_unlock(&object->lock); } } - read_unlock_irqrestore(&kmemleak_lock, flags); + raw_spin_unlock_irqrestore(&kmemleak_lock, flags); } /* @@ -1400,7 +1400,7 @@ * Once the object->lock is acquired, the corresponding memory block * cannot be freed (the same lock is acquired in delete_object). */ - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); if (object->flags & OBJECT_NO_SCAN) goto out; if (!(object->flags & OBJECT_ALLOCATED)) @@ -1419,9 +1419,9 @@ if (start >= end) break; - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); cond_resched(); - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); } while (object->flags & OBJECT_ALLOCATED); } else hlist_for_each_entry(area, &object->area_list, node) @@ -1429,7 +1429,7 @@ (void *)(area->start + area->size), object); out: - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); } /* @@ -1482,7 +1482,7 @@ /* prepare the kmemleak_object's */ rcu_read_lock(); list_for_each_entry_rcu(object, &object_list, object_list) { - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); #ifdef DEBUG /* * With a few exceptions there should be a maximum of @@ -1499,7 +1499,7 @@ if (color_gray(object) && get_object(object)) list_add_tail(&object->gray_list, &gray_list); - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); } rcu_read_unlock(); @@ -1564,14 +1564,14 @@ */ rcu_read_lock(); list_for_each_entry_rcu(object, &object_list, object_list) { - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); if (color_white(object) && (object->flags & OBJECT_ALLOCATED) && update_checksum(object) && get_object(object)) { /* color it gray temporarily */ object->count = object->min_count; list_add_tail(&object->gray_list, &gray_list); } - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); } rcu_read_unlock(); @@ -1591,13 +1591,13 @@ */ rcu_read_lock(); list_for_each_entry_rcu(object, &object_list, object_list) { - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); if (unreferenced_object(object) && !(object->flags & OBJECT_REPORTED)) { object->flags |= OBJECT_REPORTED; new_leaks++; } - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); } rcu_read_unlock(); @@ -1749,10 +1749,10 @@ struct kmemleak_object *object = v; unsigned long flags; - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); if ((object->flags & OBJECT_REPORTED) && unreferenced_object(object)) print_unreferenced(seq, object); - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); return 0; } @@ -1782,9 +1782,9 @@ return -EINVAL; } - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); dump_object_info(object); - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); put_object(object); return 0; @@ -1803,11 +1803,11 @@ rcu_read_lock(); list_for_each_entry_rcu(object, &object_list, object_list) { - spin_lock_irqsave(&object->lock, flags); + raw_spin_lock_irqsave(&object->lock, flags); if ((object->flags & OBJECT_REPORTED) && unreferenced_object(object)) __paint_it(object, KMEMLEAK_GREY); - spin_unlock_irqrestore(&object->lock, flags); + raw_spin_unlock_irqrestore(&object->lock, flags); } rcu_read_unlock(); diff --git a/kernel/mm/memcontrol.c b/kernel/mm/memcontrol.c index 87cd5bf..921e450 100644 --- a/kernel/mm/memcontrol.c +++ b/kernel/mm/memcontrol.c @@ -69,6 +69,7 @@ #include <net/sock.h> #include <net/ip.h> #include "slab.h" +#include <linux/locallock.h> #include <linux/uaccess.h> @@ -93,6 +94,8 @@ #else #define do_swap_account 0 #endif + +static DEFINE_LOCAL_IRQ_LOCK(event_lock); /* Whether legacy memory+swap accounting is active */ static bool do_memsw_account(void) @@ -2084,7 +2087,7 @@ * as well as workers from this path always operate on the local * per-cpu data. CPU up doesn't touch memcg_stock at all. */ - curcpu = get_cpu(); + curcpu = get_cpu_light(); for_each_online_cpu(cpu) { struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); struct mem_cgroup *memcg; @@ -2104,7 +2107,7 @@ } css_put(&memcg->css); } - put_cpu(); + put_cpu_light(); mutex_unlock(&percpu_charge_mutex); } @@ -4933,12 +4936,12 @@ ret = 0; - local_irq_disable(); + local_lock_irq(event_lock); mem_cgroup_charge_statistics(to, page, compound, nr_pages); memcg_check_events(to, page); mem_cgroup_charge_statistics(from, page, compound, -nr_pages); memcg_check_events(from, page); - local_irq_enable(); + local_unlock_irq(event_lock); out_unlock: unlock_page(page); out: @@ -6057,10 +6060,10 @@ commit_charge(page, memcg, lrucare); - local_irq_disable(); + local_lock_irq(event_lock); mem_cgroup_charge_statistics(memcg, page, compound, nr_pages); memcg_check_events(memcg, page); - local_irq_enable(); + local_unlock_irq(event_lock); if (do_memsw_account() && PageSwapCache(page)) { swp_entry_t entry = { .val = page_private(page) }; @@ -6129,7 +6132,7 @@ memcg_oom_recover(ug->memcg); } - local_irq_save(flags); + local_lock_irqsave(event_lock, flags); __mod_memcg_state(ug->memcg, MEMCG_RSS, -ug->nr_anon); __mod_memcg_state(ug->memcg, MEMCG_CACHE, -ug->nr_file); __mod_memcg_state(ug->memcg, MEMCG_RSS_HUGE, -ug->nr_huge); @@ -6137,7 +6140,7 @@ __count_memcg_events(ug->memcg, PGPGOUT, ug->pgpgout); __this_cpu_add(ug->memcg->stat_cpu->nr_page_events, nr_pages); memcg_check_events(ug->memcg, ug->dummy_page); - local_irq_restore(flags); + local_unlock_irqrestore(event_lock, flags); if (!mem_cgroup_is_root(ug->memcg)) css_put_many(&ug->memcg->css, nr_pages); @@ -6300,10 +6303,10 @@ commit_charge(newpage, memcg, false); - local_irq_save(flags); + local_lock_irqsave(event_lock, flags); mem_cgroup_charge_statistics(memcg, newpage, compound, nr_pages); memcg_check_events(memcg, newpage); - local_irq_restore(flags); + local_unlock_irqrestore(event_lock, flags); } DEFINE_STATIC_KEY_FALSE(memcg_sockets_enabled_key); @@ -6485,6 +6488,7 @@ struct mem_cgroup *memcg, *swap_memcg; unsigned int nr_entries; unsigned short oldid; + unsigned long flags; VM_BUG_ON_PAGE(PageLRU(page), page); VM_BUG_ON_PAGE(page_count(page), page); @@ -6530,10 +6534,14 @@ * important here to have the interrupts disabled because it is the * only synchronisation we have for updating the per-CPU variables. */ + local_lock_irqsave(event_lock, flags); +#ifndef CONFIG_PREEMPT_RT_BASE VM_BUG_ON(!irqs_disabled()); +#endif mem_cgroup_charge_statistics(memcg, page, PageTransHuge(page), -nr_entries); memcg_check_events(memcg, page); + local_unlock_irqrestore(event_lock, flags); if (!mem_cgroup_is_root(memcg)) css_put_many(&memcg->css, nr_entries); diff --git a/kernel/mm/mmu_context.c b/kernel/mm/mmu_context.c index 3e612ae..d0ccc07 100644 --- a/kernel/mm/mmu_context.c +++ b/kernel/mm/mmu_context.c @@ -25,6 +25,7 @@ struct task_struct *tsk = current; task_lock(tsk); + preempt_disable_rt(); active_mm = tsk->active_mm; if (active_mm != mm) { mmgrab(mm); @@ -32,6 +33,7 @@ } tsk->mm = mm; switch_mm(active_mm, mm, tsk); + preempt_enable_rt(); task_unlock(tsk); #ifdef finish_arch_post_lock_switch finish_arch_post_lock_switch(); diff --git a/kernel/mm/page_alloc.c b/kernel/mm/page_alloc.c index f5d8cf7..3b5be03 100644 --- a/kernel/mm/page_alloc.c +++ b/kernel/mm/page_alloc.c @@ -60,6 +60,7 @@ #include <linux/hugetlb.h> #include <linux/sched/rt.h> #include <linux/sched/mm.h> +#include <linux/locallock.h> #include <linux/page_owner.h> #include <linux/kthread.h> #include <linux/memcontrol.h> @@ -352,6 +353,18 @@ int nr_online_nodes __read_mostly = 1; EXPORT_SYMBOL(nr_node_ids); EXPORT_SYMBOL(nr_online_nodes); +#endif + +static DEFINE_LOCAL_IRQ_LOCK(pa_lock); + +#ifdef CONFIG_PREEMPT_RT_BASE +# define cpu_lock_irqsave(cpu, flags) \ + local_lock_irqsave_on(pa_lock, flags, cpu) +# define cpu_unlock_irqrestore(cpu, flags) \ + local_unlock_irqrestore_on(pa_lock, flags, cpu) +#else +# define cpu_lock_irqsave(cpu, flags) local_irq_save(flags) +# define cpu_unlock_irqrestore(cpu, flags) local_irq_restore(flags) #endif int page_group_by_mobility_disabled __read_mostly; @@ -1172,7 +1185,7 @@ } /* - * Frees a number of pages from the PCP lists + * Frees a number of pages which have been collected from the pcp lists. * Assumes all pages on list are in same zone, and of same order. * count is the number of pages to free. * @@ -1182,15 +1195,57 @@ * And clear the zone's pages_scanned counter, to hold off the "all pages are * pinned" detection logic. */ -static void free_pcppages_bulk(struct zone *zone, int count, - struct per_cpu_pages *pcp) +static void free_pcppages_bulk(struct zone *zone, struct list_head *head, + bool zone_retry) +{ + bool isolated_pageblocks; + struct page *page, *tmp; + unsigned long flags; + + spin_lock_irqsave(&zone->lock, flags); + isolated_pageblocks = has_isolate_pageblock(zone); + + /* + * Use safe version since after __free_one_page(), + * page->lru.next will not point to original list. + */ + list_for_each_entry_safe(page, tmp, head, lru) { + int mt = get_pcppage_migratetype(page); + + if (page_zone(page) != zone) { + /* + * free_unref_page_list() sorts pages by zone. If we end + * up with pages from a different NUMA nodes belonging + * to the same ZONE index then we need to redo with the + * correct ZONE pointer. Skip the page for now, redo it + * on the next iteration. + */ + WARN_ON_ONCE(zone_retry == false); + if (zone_retry) + continue; + } + + /* MIGRATE_ISOLATE page should not go to pcplists */ + VM_BUG_ON_PAGE(is_migrate_isolate(mt), page); + /* Pageblock could have been isolated meanwhile */ + if (unlikely(isolated_pageblocks)) + mt = get_pageblock_migratetype(page); + + list_del(&page->lru); + __free_one_page(page, page_to_pfn(page), zone, 0, mt); + trace_mm_page_pcpu_drain(page, 0, mt); + } + spin_unlock_irqrestore(&zone->lock, flags); +} + +static void isolate_pcp_pages(int count, struct per_cpu_pages *pcp, + struct list_head *dst) + { int migratetype = 0; int batch_free = 0; int prefetch_nr = 0; - bool isolated_pageblocks; - struct page *page, *tmp; - LIST_HEAD(head); + struct page *page; /* * Ensure proper count is passed which otherwise would stuck in the @@ -1227,7 +1282,7 @@ if (bulkfree_pcp_prepare(page)) continue; - list_add_tail(&page->lru, &head); + list_add_tail(&page->lru, dst); /* * We are going to put the page back to the global @@ -1242,26 +1297,6 @@ prefetch_buddy(page); } while (--count && --batch_free && !list_empty(list)); } - - spin_lock(&zone->lock); - isolated_pageblocks = has_isolate_pageblock(zone); - - /* - * Use safe version since after __free_one_page(), - * page->lru.next will not point to original list. - */ - list_for_each_entry_safe(page, tmp, &head, lru) { - int mt = get_pcppage_migratetype(page); - /* MIGRATE_ISOLATE page should not go to pcplists */ - VM_BUG_ON_PAGE(is_migrate_isolate(mt), page); - /* Pageblock could have been isolated meanwhile */ - if (unlikely(isolated_pageblocks)) - mt = get_pageblock_migratetype(page); - - __free_one_page(page, page_to_pfn(page), zone, 0, mt); - trace_mm_page_pcpu_drain(page, 0, mt); - } - spin_unlock(&zone->lock); } static void free_one_page(struct zone *zone, @@ -1363,10 +1398,10 @@ return; migratetype = get_pfnblock_migratetype(page, pfn); - local_irq_save(flags); + local_lock_irqsave(pa_lock, flags); __count_vm_events(PGFREE, 1 << order); free_one_page(page_zone(page), page, pfn, order, migratetype); - local_irq_restore(flags); + local_unlock_irqrestore(pa_lock, flags); } static void __init __free_pages_boot_core(struct page *page, unsigned int order) @@ -2673,13 +2708,18 @@ { unsigned long flags; int to_drain, batch; + LIST_HEAD(dst); - local_irq_save(flags); + local_lock_irqsave(pa_lock, flags); batch = READ_ONCE(pcp->batch); to_drain = min(pcp->count, batch); if (to_drain > 0) - free_pcppages_bulk(zone, to_drain, pcp); - local_irq_restore(flags); + isolate_pcp_pages(to_drain, pcp, &dst); + + local_unlock_irqrestore(pa_lock, flags); + + if (to_drain > 0) + free_pcppages_bulk(zone, &dst, false); } #endif @@ -2695,14 +2735,21 @@ unsigned long flags; struct per_cpu_pageset *pset; struct per_cpu_pages *pcp; + LIST_HEAD(dst); + int count; - local_irq_save(flags); + cpu_lock_irqsave(cpu, flags); pset = per_cpu_ptr(zone->pageset, cpu); pcp = &pset->pcp; - if (pcp->count) - free_pcppages_bulk(zone, pcp->count, pcp); - local_irq_restore(flags); + count = pcp->count; + if (count) + isolate_pcp_pages(count, pcp, &dst); + + cpu_unlock_irqrestore(cpu, flags); + + if (count) + free_pcppages_bulk(zone, &dst, false); } /* @@ -2737,6 +2784,7 @@ drain_pages(cpu); } +#ifndef CONFIG_PREEMPT_RT_BASE static void drain_local_pages_wq(struct work_struct *work) { /* @@ -2750,6 +2798,7 @@ drain_local_pages(NULL); preempt_enable(); } +#endif /* * Spill all the per-cpu pages from all CPUs back into the buddy allocator. @@ -2816,7 +2865,14 @@ else cpumask_clear_cpu(cpu, &cpus_with_pcps); } - +#ifdef CONFIG_PREEMPT_RT_BASE + for_each_cpu(cpu, &cpus_with_pcps) { + if (zone) + drain_pages_zone(cpu, zone); + else + drain_pages(cpu); + } +#else for_each_cpu(cpu, &cpus_with_pcps) { struct work_struct *work = per_cpu_ptr(&pcpu_drain, cpu); INIT_WORK(work, drain_local_pages_wq); @@ -2824,6 +2880,7 @@ } for_each_cpu(cpu, &cpus_with_pcps) flush_work(per_cpu_ptr(&pcpu_drain, cpu)); +#endif mutex_unlock(&pcpu_drain_mutex); } @@ -2895,7 +2952,8 @@ return true; } -static void free_unref_page_commit(struct page *page, unsigned long pfn) +static void free_unref_page_commit(struct page *page, unsigned long pfn, + struct list_head *dst) { struct zone *zone = page_zone(page); struct per_cpu_pages *pcp; @@ -2924,7 +2982,8 @@ pcp->count++; if (pcp->count >= pcp->high) { unsigned long batch = READ_ONCE(pcp->batch); - free_pcppages_bulk(zone, batch, pcp); + + isolate_pcp_pages(batch, pcp, dst); } } @@ -2935,13 +2994,17 @@ { unsigned long flags; unsigned long pfn = page_to_pfn(page); + struct zone *zone = page_zone(page); + LIST_HEAD(dst); if (!free_unref_page_prepare(page, pfn)) return; - local_irq_save(flags); - free_unref_page_commit(page, pfn); - local_irq_restore(flags); + local_lock_irqsave(pa_lock, flags); + free_unref_page_commit(page, pfn, &dst); + local_unlock_irqrestore(pa_lock, flags); + if (!list_empty(&dst)) + free_pcppages_bulk(zone, &dst, false); } /* @@ -2952,6 +3015,11 @@ struct page *page, *next; unsigned long flags, pfn; int batch_count = 0; + struct list_head dsts[__MAX_NR_ZONES]; + int i; + + for (i = 0; i < __MAX_NR_ZONES; i++) + INIT_LIST_HEAD(&dsts[i]); /* Prepare pages for freeing */ list_for_each_entry_safe(page, next, list, lru) { @@ -2961,25 +3029,42 @@ set_page_private(page, pfn); } - local_irq_save(flags); + local_lock_irqsave(pa_lock, flags); list_for_each_entry_safe(page, next, list, lru) { unsigned long pfn = page_private(page); + enum zone_type type; set_page_private(page, 0); trace_mm_page_free_batched(page); - free_unref_page_commit(page, pfn); + type = page_zonenum(page); + free_unref_page_commit(page, pfn, &dsts[type]); /* * Guard against excessive IRQ disabled times when we get * a large list of pages to free. */ if (++batch_count == SWAP_CLUSTER_MAX) { - local_irq_restore(flags); + local_unlock_irqrestore(pa_lock, flags); batch_count = 0; - local_irq_save(flags); + local_lock_irqsave(pa_lock, flags); } } - local_irq_restore(flags); + local_unlock_irqrestore(pa_lock, flags); + + for (i = 0; i < __MAX_NR_ZONES; ) { + struct page *page; + struct zone *zone; + + if (list_empty(&dsts[i])) { + i++; + continue; + } + + page = list_first_entry(&dsts[i], struct page, lru); + zone = page_zone(page); + + free_pcppages_bulk(zone, &dsts[i], true); + } } /* @@ -3124,7 +3209,7 @@ struct page *page; unsigned long flags; - local_irq_save(flags); + local_lock_irqsave(pa_lock, flags); pcp = &this_cpu_ptr(zone->pageset)->pcp; page = __rmqueue_pcplist(zone, migratetype, pcp, gfp_flags); @@ -3132,7 +3217,7 @@ __count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order); zone_statistics(preferred_zone, zone); } - local_irq_restore(flags); + local_unlock_irqrestore(pa_lock, flags); return page; } @@ -3159,7 +3244,7 @@ * allocate greater than order-1 page units with __GFP_NOFAIL. */ WARN_ON_ONCE((gfp_flags & __GFP_NOFAIL) && (order > 1)); - spin_lock_irqsave(&zone->lock, flags); + local_spin_lock_irqsave(pa_lock, &zone->lock, flags); do { page = NULL; @@ -3186,14 +3271,14 @@ __count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order); zone_statistics(preferred_zone, zone); - local_irq_restore(flags); + local_unlock_irqrestore(pa_lock, flags); out: VM_BUG_ON_PAGE(page && bad_range(zone, page), page); return page; failed: - local_irq_restore(flags); + local_unlock_irqrestore(pa_lock, flags); return NULL; } @@ -7333,8 +7418,9 @@ static int page_alloc_cpu_dead(unsigned int cpu) { - + local_lock_irq_on(swapvec_lock, cpu); lru_add_drain_cpu(cpu); + local_unlock_irq_on(swapvec_lock, cpu); drain_pages(cpu); /* @@ -8257,7 +8343,7 @@ struct per_cpu_pageset *pset; /* avoid races with drain_pages() */ - local_irq_save(flags); + local_lock_irqsave(pa_lock, flags); if (zone->pageset != &boot_pageset) { for_each_online_cpu(cpu) { pset = per_cpu_ptr(zone->pageset, cpu); @@ -8266,7 +8352,7 @@ free_percpu(zone->pageset); zone->pageset = &boot_pageset; } - local_irq_restore(flags); + local_unlock_irqrestore(pa_lock, flags); } #ifdef CONFIG_MEMORY_HOTREMOVE diff --git a/kernel/mm/slab.c b/kernel/mm/slab.c index 4e2be12..0081294 100644 --- a/kernel/mm/slab.c +++ b/kernel/mm/slab.c @@ -233,7 +233,7 @@ parent->shared = NULL; parent->alien = NULL; parent->colour_next = 0; - spin_lock_init(&parent->list_lock); + raw_spin_lock_init(&parent->list_lock); parent->free_objects = 0; parent->free_touched = 0; } @@ -587,9 +587,9 @@ page_node = page_to_nid(page); n = get_node(cachep, page_node); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); free_block(cachep, &objp, 1, page_node, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); slabs_destroy(cachep, &list); } @@ -718,7 +718,7 @@ struct kmem_cache_node *n = get_node(cachep, node); if (ac->avail) { - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); /* * Stuff objects into the remote nodes shared array first. * That way we could avoid the overhead of putting the objects @@ -729,7 +729,7 @@ free_block(cachep, ac->entry, ac->avail, node, list); ac->avail = 0; - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); } } @@ -802,9 +802,9 @@ slabs_destroy(cachep, &list); } else { n = get_node(cachep, page_node); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); free_block(cachep, &objp, 1, page_node, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); slabs_destroy(cachep, &list); } return 1; @@ -845,10 +845,10 @@ */ n = get_node(cachep, node); if (n) { - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); n->free_limit = (1 + nr_cpus_node(node)) * cachep->batchcount + cachep->num; - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); return 0; } @@ -927,7 +927,7 @@ goto fail; n = get_node(cachep, node); - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); if (n->shared && force_change) { free_block(cachep, n->shared->entry, n->shared->avail, node, &list); @@ -945,7 +945,7 @@ new_alien = NULL; } - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slabs_destroy(cachep, &list); /* @@ -984,7 +984,7 @@ if (!n) continue; - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); /* Free limit for this kmem_cache_node */ n->free_limit -= cachep->batchcount; @@ -997,7 +997,7 @@ } if (!cpumask_empty(mask)) { - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); goto free_slab; } @@ -1011,7 +1011,7 @@ alien = n->alien; n->alien = NULL; - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); kfree(shared); if (alien) { @@ -1195,7 +1195,7 @@ /* * Do not assume that spinlocks can be initialized via memcpy: */ - spin_lock_init(&ptr->list_lock); + raw_spin_lock_init(&ptr->list_lock); MAKE_ALL_LISTS(cachep, ptr, nodeid); cachep->node[nodeid] = ptr; @@ -1366,11 +1366,11 @@ for_each_kmem_cache_node(cachep, node, n) { unsigned long total_slabs, free_slabs, free_objs; - spin_lock_irqsave(&n->list_lock, flags); + raw_spin_lock_irqsave(&n->list_lock, flags); total_slabs = n->total_slabs; free_slabs = n->free_slabs; free_objs = n->free_objects; - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); pr_warn(" node %d: slabs: %ld/%ld, objs: %ld/%ld\n", node, total_slabs - free_slabs, total_slabs, @@ -2173,7 +2173,7 @@ { #ifdef CONFIG_SMP check_irq_off(); - assert_spin_locked(&get_node(cachep, numa_mem_id())->list_lock); + assert_raw_spin_locked(&get_node(cachep, numa_mem_id())->list_lock); #endif } @@ -2181,7 +2181,7 @@ { #ifdef CONFIG_SMP check_irq_off(); - assert_spin_locked(&get_node(cachep, node)->list_lock); + assert_raw_spin_locked(&get_node(cachep, node)->list_lock); #endif } @@ -2221,9 +2221,9 @@ check_irq_off(); ac = cpu_cache_get(cachep); n = get_node(cachep, node); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); free_block(cachep, ac->entry, ac->avail, node, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); slabs_destroy(cachep, &list); ac->avail = 0; } @@ -2241,9 +2241,9 @@ drain_alien_cache(cachep, n->alien); for_each_kmem_cache_node(cachep, node, n) { - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); drain_array_locked(cachep, n->shared, node, true, &list); - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slabs_destroy(cachep, &list); } @@ -2265,10 +2265,10 @@ nr_freed = 0; while (nr_freed < tofree && !list_empty(&n->slabs_free)) { - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); p = n->slabs_free.prev; if (p == &n->slabs_free) { - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); goto out; } @@ -2281,7 +2281,7 @@ * to the cache. */ n->free_objects -= cache->num; - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slab_destroy(cache, page); nr_freed++; } @@ -2735,7 +2735,7 @@ INIT_LIST_HEAD(&page->lru); n = get_node(cachep, page_to_nid(page)); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); n->total_slabs++; if (!page->active) { list_add_tail(&page->lru, &(n->slabs_free)); @@ -2745,7 +2745,7 @@ STATS_INC_GROWN(cachep); n->free_objects += cachep->num - page->active; - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); fixup_objfreelist_debug(cachep, &list); } @@ -2913,7 +2913,7 @@ { struct page *page; - assert_spin_locked(&n->list_lock); + assert_raw_spin_locked(&n->list_lock); page = list_first_entry_or_null(&n->slabs_partial, struct page, lru); if (!page) { n->free_touched = 1; @@ -2939,10 +2939,10 @@ if (!gfp_pfmemalloc_allowed(flags)) return NULL; - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); page = get_first_slab(n, true); if (!page) { - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); return NULL; } @@ -2951,7 +2951,7 @@ fixup_slab_list(cachep, n, page, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); fixup_objfreelist_debug(cachep, &list); return obj; @@ -3010,7 +3010,7 @@ if (!n->free_objects && (!shared || !shared->avail)) goto direct_grow; - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); shared = READ_ONCE(n->shared); /* See if we can refill from the shared array */ @@ -3034,7 +3034,7 @@ must_grow: n->free_objects -= ac->avail; alloc_done: - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); fixup_objfreelist_debug(cachep, &list); direct_grow: @@ -3259,7 +3259,7 @@ BUG_ON(!n); check_irq_off(); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); page = get_first_slab(n, false); if (!page) goto must_grow; @@ -3277,12 +3277,12 @@ fixup_slab_list(cachep, n, page, &list); - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); fixup_objfreelist_debug(cachep, &list); return obj; must_grow: - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); page = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid); if (page) { /* This slab isn't counted yet so don't update free_objects */ @@ -3458,7 +3458,7 @@ check_irq_off(); n = get_node(cachep, node); - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); if (n->shared) { struct array_cache *shared_array = n->shared; int max = shared_array->limit - shared_array->avail; @@ -3487,7 +3487,7 @@ STATS_SET_FREEABLE(cachep, i); } #endif - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); slabs_destroy(cachep, &list); ac->avail -= batchcount; memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail); @@ -3897,9 +3897,9 @@ node = cpu_to_mem(cpu); n = get_node(cachep, node); - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); free_block(cachep, ac->entry, ac->avail, node, &list); - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slabs_destroy(cachep, &list); } free_percpu(prev); @@ -4024,9 +4024,9 @@ return; } - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); drain_array_locked(cachep, ac, node, false, &list); - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); slabs_destroy(cachep, &list); } @@ -4110,7 +4110,7 @@ for_each_kmem_cache_node(cachep, node, n) { check_irq_on(); - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); total_slabs += n->total_slabs; free_slabs += n->free_slabs; @@ -4119,7 +4119,7 @@ if (n->shared) shared_avail += n->shared->avail; - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); } num_objs = total_slabs * cachep->num; active_slabs = total_slabs - free_slabs; @@ -4339,13 +4339,13 @@ for_each_kmem_cache_node(cachep, node, n) { check_irq_on(); - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); list_for_each_entry(page, &n->slabs_full, lru) handle_slab(x, cachep, page); list_for_each_entry(page, &n->slabs_partial, lru) handle_slab(x, cachep, page); - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); } } while (!is_store_user_clean(cachep)); diff --git a/kernel/mm/slab.h b/kernel/mm/slab.h index 77a1a26..5b17c02 100644 --- a/kernel/mm/slab.h +++ b/kernel/mm/slab.h @@ -452,7 +452,7 @@ * The slab lists for all objects. */ struct kmem_cache_node { - spinlock_t list_lock; + raw_spinlock_t list_lock; #ifdef CONFIG_SLAB struct list_head slabs_partial; /* partial list first, better asm code */ diff --git a/kernel/mm/slub.c b/kernel/mm/slub.c index 6b58391..f35fa1a 100644 --- a/kernel/mm/slub.c +++ b/kernel/mm/slub.c @@ -1199,7 +1199,7 @@ unsigned long uninitialized_var(flags); int ret = 0; - spin_lock_irqsave(&n->list_lock, flags); + raw_spin_lock_irqsave(&n->list_lock, flags); slab_lock(page); if (s->flags & SLAB_CONSISTENCY_CHECKS) { @@ -1234,7 +1234,7 @@ bulk_cnt, cnt); slab_unlock(page); - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); if (!ret) slab_fix(s, "Object at 0x%p not freed", object); return ret; @@ -1372,6 +1372,12 @@ return false; } #endif /* CONFIG_SLUB_DEBUG */ + +struct slub_free_list { + raw_spinlock_t lock; + struct list_head list; +}; +static DEFINE_PER_CPU(struct slub_free_list, slub_free_list); /* * Hooks for other subsystems that check memory allocations. In a typical @@ -1619,10 +1625,17 @@ void *start, *p, *next; int idx, order; bool shuffle; + bool enableirqs = false; flags &= gfp_allowed_mask; if (gfpflags_allow_blocking(flags)) + enableirqs = true; +#ifdef CONFIG_PREEMPT_RT_FULL + if (system_state > SYSTEM_BOOTING) + enableirqs = true; +#endif + if (enableirqs) local_irq_enable(); flags |= s->allocflags; @@ -1682,7 +1695,7 @@ page->frozen = 1; out: - if (gfpflags_allow_blocking(flags)) + if (enableirqs) local_irq_disable(); if (!page) return NULL; @@ -1740,6 +1753,16 @@ __free_pages(page, order); } +static void free_delayed(struct list_head *h) +{ + while (!list_empty(h)) { + struct page *page = list_first_entry(h, struct page, lru); + + list_del(&page->lru); + __free_slab(page->slab_cache, page); + } +} + static void rcu_free_slab(struct rcu_head *h) { struct page *page = container_of(h, struct page, rcu_head); @@ -1751,6 +1774,12 @@ { if (unlikely(s->flags & SLAB_TYPESAFE_BY_RCU)) { call_rcu(&page->rcu_head, rcu_free_slab); + } else if (irqs_disabled()) { + struct slub_free_list *f = this_cpu_ptr(&slub_free_list); + + raw_spin_lock(&f->lock); + list_add(&page->lru, &f->list); + raw_spin_unlock(&f->lock); } else __free_slab(s, page); } @@ -1858,7 +1887,7 @@ if (!n || !n->nr_partial) return NULL; - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); list_for_each_entry_safe(page, page2, &n->partial, lru) { void *t; @@ -1883,7 +1912,7 @@ break; } - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); return object; } @@ -2135,7 +2164,7 @@ * that acquire_slab() will see a slab page that * is frozen */ - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); } } else { m = M_FULL; @@ -2146,7 +2175,7 @@ * slabs from diagnostic functions will not see * any frozen slabs. */ - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); } } @@ -2181,7 +2210,7 @@ goto redo; if (lock) - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); if (m == M_FREE) { stat(s, DEACTIVATE_EMPTY); @@ -2216,10 +2245,10 @@ n2 = get_node(s, page_to_nid(page)); if (n != n2) { if (n) - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); n = n2; - spin_lock(&n->list_lock); + raw_spin_lock(&n->list_lock); } do { @@ -2248,7 +2277,7 @@ } if (n) - spin_unlock(&n->list_lock); + raw_spin_unlock(&n->list_lock); while (discard_page) { page = discard_page; @@ -2285,14 +2314,21 @@ pobjects = oldpage->pobjects; pages = oldpage->pages; if (drain && pobjects > s->cpu_partial) { + struct slub_free_list *f; unsigned long flags; + LIST_HEAD(tofree); /* * partial array is full. Move the existing * set to the per node partial list. */ local_irq_save(flags); unfreeze_partials(s, this_cpu_ptr(s->cpu_slab)); + f = this_cpu_ptr(&slub_free_list); + raw_spin_lock(&f->lock); + list_splice_init(&f->list, &tofree); + raw_spin_unlock(&f->lock); local_irq_restore(flags); + free_delayed(&tofree); oldpage = NULL; pobjects = 0; pages = 0; @@ -2362,7 +2398,19 @@ static void flush_all(struct kmem_cache *s) { + LIST_HEAD(tofree); + int cpu; + on_each_cpu_cond(has_cpu_slab, flush_cpu_slab, s, 1, GFP_ATOMIC); + for_each_online_cpu(cpu) { + struct slub_free_list *f; + + f = &per_cpu(slub_free_list, cpu); + raw_spin_lock_irq(&f->lock); + list_splice_init(&f->list, &tofree); + raw_spin_unlock_irq(&f->lock); + free_delayed(&tofree); + } } /* @@ -2417,10 +2465,10 @@ unsigned long x = 0; struct page *page; - spin_lock_irqsave(&n->list_lock, flags); + raw_spin_lock_irqsave(&n->list_lock, flags); list_for_each_entry(page, &n->partial, lru) x += get_count(page); - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); return x; } #endif /* CONFIG_SLUB_DEBUG || CONFIG_SLUB_SYSFS */ @@ -2560,8 +2608,10 @@ * already disabled (which is the case for bulk allocation). */ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, - unsigned long addr, struct kmem_cache_cpu *c) + unsigned long addr, struct kmem_cache_cpu *c, + struct list_head *to_free) { + struct slub_free_list *f; void *freelist; struct page *page; @@ -2627,6 +2677,13 @@ VM_BUG_ON(!c->page->frozen); c->freelist = get_freepointer(s, freelist); c->tid = next_tid(c->tid); + +out: + f = this_cpu_ptr(&slub_free_list); + raw_spin_lock(&f->lock); + list_splice_init(&f->list, to_free); + raw_spin_unlock(&f->lock); + return freelist; new_slab: @@ -2642,7 +2699,7 @@ if (unlikely(!freelist)) { slab_out_of_memory(s, gfpflags, node); - return NULL; + goto out; } page = c->page; @@ -2655,7 +2712,7 @@ goto new_slab; /* Slab failed checks. Next slab needed */ deactivate_slab(s, page, get_freepointer(s, freelist), c); - return freelist; + goto out; } /* @@ -2667,6 +2724,7 @@ { void *p; unsigned long flags; + LIST_HEAD(tofree); local_irq_save(flags); #ifdef CONFIG_PREEMPT @@ -2678,8 +2736,9 @@ c = this_cpu_ptr(s->cpu_slab); #endif - p = ___slab_alloc(s, gfpflags, node, addr, c); + p = ___slab_alloc(s, gfpflags, node, addr, c, &tofree); local_irq_restore(flags); + free_delayed(&tofree); return p; } @@ -2878,7 +2937,7 @@ do { if (unlikely(n)) { - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); n = NULL; } prior = page->freelist; @@ -2910,7 +2969,7 @@ * Otherwise the list_lock will synchronize with * other processors updating the list of slabs. */ - spin_lock_irqsave(&n->list_lock, flags); + raw_spin_lock_irqsave(&n->list_lock, flags); } } @@ -2952,7 +3011,7 @@ add_partial(n, page, DEACTIVATE_TO_TAIL); stat(s, FREE_ADD_PARTIAL); } - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); return; slab_empty: @@ -2967,7 +3026,7 @@ remove_full(s, n, page); } - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); stat(s, FREE_SLAB); discard_slab(s, page); } @@ -3172,6 +3231,7 @@ void **p) { struct kmem_cache_cpu *c; + LIST_HEAD(to_free); int i; /* memcg and kmem_cache debug support */ @@ -3204,7 +3264,7 @@ * of re-populating per CPU c->freelist */ p[i] = ___slab_alloc(s, flags, NUMA_NO_NODE, - _RET_IP_, c); + _RET_IP_, c, &to_free); if (unlikely(!p[i])) goto error; @@ -3219,6 +3279,7 @@ } c->tid = next_tid(c->tid); local_irq_enable(); + free_delayed(&to_free); /* Clear memory outside IRQ disabled fastpath loop */ if (unlikely(slab_want_init_on_alloc(flags, s))) { @@ -3233,6 +3294,7 @@ return i; error: local_irq_enable(); + free_delayed(&to_free); slab_post_alloc_hook(s, flags, i, p); __kmem_cache_free_bulk(s, i, p); return 0; @@ -3368,7 +3430,7 @@ init_kmem_cache_node(struct kmem_cache_node *n) { n->nr_partial = 0; - spin_lock_init(&n->list_lock); + raw_spin_lock_init(&n->list_lock); INIT_LIST_HEAD(&n->partial); #ifdef CONFIG_SLUB_DEBUG atomic_long_set(&n->nr_slabs, 0); @@ -3721,6 +3783,11 @@ const char *text) { #ifdef CONFIG_SLUB_DEBUG +#ifdef CONFIG_PREEMPT_RT_BASE + /* XXX move out of irq-off section */ + slab_err(s, page, text, s->name); +#else + void *addr = page_address(page); void *p; unsigned long *map = kcalloc(BITS_TO_LONGS(page->objects), @@ -3742,6 +3809,7 @@ slab_unlock(page); kfree(map); #endif +#endif } /* @@ -3755,7 +3823,7 @@ struct page *page, *h; BUG_ON(irqs_disabled()); - spin_lock_irq(&n->list_lock); + raw_spin_lock_irq(&n->list_lock); list_for_each_entry_safe(page, h, &n->partial, lru) { if (!page->inuse) { remove_partial(n, page); @@ -3765,7 +3833,7 @@ "Objects remaining in %s on __kmem_cache_shutdown()"); } } - spin_unlock_irq(&n->list_lock); + raw_spin_unlock_irq(&n->list_lock); list_for_each_entry_safe(page, h, &discard, lru) discard_slab(s, page); @@ -4039,7 +4107,7 @@ for (i = 0; i < SHRINK_PROMOTE_MAX; i++) INIT_LIST_HEAD(promote + i); - spin_lock_irqsave(&n->list_lock, flags); + raw_spin_lock_irqsave(&n->list_lock, flags); /* * Build lists of slabs to discard or promote. @@ -4070,7 +4138,7 @@ for (i = SHRINK_PROMOTE_MAX - 1; i >= 0; i--) list_splice(promote + i, &n->partial); - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); /* Release empty slabs */ list_for_each_entry_safe(page, t, &discard, lru) @@ -4283,6 +4351,12 @@ { static __initdata struct kmem_cache boot_kmem_cache, boot_kmem_cache_node; + int cpu; + + for_each_possible_cpu(cpu) { + raw_spin_lock_init(&per_cpu(slub_free_list, cpu).lock); + INIT_LIST_HEAD(&per_cpu(slub_free_list, cpu).list); + } if (debug_guardpage_minorder()) slub_max_order = 0; @@ -4486,7 +4560,7 @@ struct page *page; unsigned long flags; - spin_lock_irqsave(&n->list_lock, flags); + raw_spin_lock_irqsave(&n->list_lock, flags); list_for_each_entry(page, &n->partial, lru) { validate_slab_slab(s, page, map); @@ -4508,7 +4582,7 @@ s->name, count, atomic_long_read(&n->nr_slabs)); out: - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); return count; } @@ -4564,6 +4638,9 @@ { struct location *l; int order; + + if (IS_ENABLED(CONFIG_PREEMPT_RT) && flags == GFP_ATOMIC) + return 0; order = get_order(sizeof(struct location) * max); @@ -4698,12 +4775,12 @@ if (!atomic_long_read(&n->nr_slabs)) continue; - spin_lock_irqsave(&n->list_lock, flags); + raw_spin_lock_irqsave(&n->list_lock, flags); list_for_each_entry(page, &n->partial, lru) process_slab(&t, s, page, alloc, map); list_for_each_entry(page, &n->full, lru) process_slab(&t, s, page, alloc, map); - spin_unlock_irqrestore(&n->list_lock, flags); + raw_spin_unlock_irqrestore(&n->list_lock, flags); } for (i = 0; i < t.count; i++) { diff --git a/kernel/mm/swap.c b/kernel/mm/swap.c index 45fdbfb..3885645 100644 --- a/kernel/mm/swap.c +++ b/kernel/mm/swap.c @@ -33,6 +33,7 @@ #include <linux/memcontrol.h> #include <linux/gfp.h> #include <linux/uio.h> +#include <linux/locallock.h> #include <linux/hugetlb.h> #include <linux/page_idle.h> @@ -51,6 +52,8 @@ #ifdef CONFIG_SMP static DEFINE_PER_CPU(struct pagevec, activate_page_pvecs); #endif +static DEFINE_LOCAL_IRQ_LOCK(rotate_lock); +DEFINE_LOCAL_IRQ_LOCK(swapvec_lock); /* * This path almost never happens for VM activity - pages are normally @@ -253,11 +256,11 @@ unsigned long flags; get_page(page); - local_irq_save(flags); + local_lock_irqsave(rotate_lock, flags); pvec = this_cpu_ptr(&lru_rotate_pvecs); if (!pagevec_add(pvec, page) || PageCompound(page)) pagevec_move_tail(pvec); - local_irq_restore(flags); + local_unlock_irqrestore(rotate_lock, flags); } } @@ -307,12 +310,13 @@ { page = compound_head(page); if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) { - struct pagevec *pvec = &get_cpu_var(activate_page_pvecs); + struct pagevec *pvec = &get_locked_var(swapvec_lock, + activate_page_pvecs); get_page(page); if (!pagevec_add(pvec, page) || PageCompound(page)) pagevec_lru_move_fn(pvec, __activate_page, NULL); - put_cpu_var(activate_page_pvecs); + put_locked_var(swapvec_lock, activate_page_pvecs); } } @@ -334,7 +338,7 @@ static void __lru_cache_activate_page(struct page *page) { - struct pagevec *pvec = &get_cpu_var(lru_add_pvec); + struct pagevec *pvec = &get_locked_var(swapvec_lock, lru_add_pvec); int i; /* @@ -356,7 +360,7 @@ } } - put_cpu_var(lru_add_pvec); + put_locked_var(swapvec_lock, lru_add_pvec); } /* @@ -398,12 +402,12 @@ static void __lru_cache_add(struct page *page) { - struct pagevec *pvec = &get_cpu_var(lru_add_pvec); + struct pagevec *pvec = &get_locked_var(swapvec_lock, lru_add_pvec); get_page(page); if (!pagevec_add(pvec, page) || PageCompound(page)) __pagevec_lru_add(pvec); - put_cpu_var(lru_add_pvec); + put_locked_var(swapvec_lock, lru_add_pvec); } /** @@ -581,9 +585,15 @@ unsigned long flags; /* No harm done if a racing interrupt already did this */ - local_irq_save(flags); +#ifdef CONFIG_PREEMPT_RT_BASE + local_lock_irqsave_on(rotate_lock, flags, cpu); pagevec_move_tail(pvec); - local_irq_restore(flags); + local_unlock_irqrestore_on(rotate_lock, flags, cpu); +#else + local_lock_irqsave(rotate_lock, flags); + pagevec_move_tail(pvec); + local_unlock_irqrestore(rotate_lock, flags); +#endif } pvec = &per_cpu(lru_deactivate_file_pvecs, cpu); @@ -615,11 +625,12 @@ return; if (likely(get_page_unless_zero(page))) { - struct pagevec *pvec = &get_cpu_var(lru_deactivate_file_pvecs); + struct pagevec *pvec = &get_locked_var(swapvec_lock, + lru_deactivate_file_pvecs); if (!pagevec_add(pvec, page) || PageCompound(page)) pagevec_lru_move_fn(pvec, lru_deactivate_file_fn, NULL); - put_cpu_var(lru_deactivate_file_pvecs); + put_locked_var(swapvec_lock, lru_deactivate_file_pvecs); } } @@ -634,22 +645,33 @@ { if (PageLRU(page) && PageAnon(page) && PageSwapBacked(page) && !PageSwapCache(page) && !PageUnevictable(page)) { - struct pagevec *pvec = &get_cpu_var(lru_lazyfree_pvecs); + struct pagevec *pvec = &get_locked_var(swapvec_lock, + lru_lazyfree_pvecs); get_page(page); if (!pagevec_add(pvec, page) || PageCompound(page)) pagevec_lru_move_fn(pvec, lru_lazyfree_fn, NULL); - put_cpu_var(lru_lazyfree_pvecs); + put_locked_var(swapvec_lock, lru_lazyfree_pvecs); } } void lru_add_drain(void) { - lru_add_drain_cpu(get_cpu()); - put_cpu(); + lru_add_drain_cpu(local_lock_cpu(swapvec_lock)); + local_unlock_cpu(swapvec_lock); } #ifdef CONFIG_SMP + +#ifdef CONFIG_PREEMPT_RT_BASE +static inline void remote_lru_add_drain(int cpu, struct cpumask *has_work) +{ + local_lock_on(swapvec_lock, cpu); + lru_add_drain_cpu(cpu); + local_unlock_on(swapvec_lock, cpu); +} + +#else static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work); @@ -657,6 +679,16 @@ { lru_add_drain(); } + +static inline void remote_lru_add_drain(int cpu, struct cpumask *has_work) +{ + struct work_struct *work = &per_cpu(lru_add_drain_work, cpu); + + INIT_WORK(work, lru_add_drain_per_cpu); + queue_work_on(cpu, mm_percpu_wq, work); + cpumask_set_cpu(cpu, has_work); +} +#endif /* * Doesn't need any cpu hotplug locking because we do rely on per-cpu @@ -682,21 +714,19 @@ cpumask_clear(&has_work); for_each_online_cpu(cpu) { - struct work_struct *work = &per_cpu(lru_add_drain_work, cpu); if (pagevec_count(&per_cpu(lru_add_pvec, cpu)) || pagevec_count(&per_cpu(lru_rotate_pvecs, cpu)) || pagevec_count(&per_cpu(lru_deactivate_file_pvecs, cpu)) || pagevec_count(&per_cpu(lru_lazyfree_pvecs, cpu)) || - need_activate_page_drain(cpu)) { - INIT_WORK(work, lru_add_drain_per_cpu); - queue_work_on(cpu, mm_percpu_wq, work); - cpumask_set_cpu(cpu, &has_work); - } + need_activate_page_drain(cpu)) + remote_lru_add_drain(cpu, &has_work); } +#ifndef CONFIG_PREEMPT_RT_BASE for_each_cpu(cpu, &has_work) flush_work(&per_cpu(lru_add_drain_work, cpu)); +#endif mutex_unlock(&lock); } diff --git a/kernel/mm/vmalloc.c b/kernel/mm/vmalloc.c index 3a57f92..3eb3f16 100644 --- a/kernel/mm/vmalloc.c +++ b/kernel/mm/vmalloc.c @@ -860,7 +860,7 @@ struct vmap_block *vb; struct vmap_area *va; unsigned long vb_idx; - int node, err; + int node, err, cpu; void *vaddr; node = numa_node_id(); @@ -903,11 +903,12 @@ BUG_ON(err); radix_tree_preload_end(); - vbq = &get_cpu_var(vmap_block_queue); + cpu = get_cpu_light(); + vbq = this_cpu_ptr(&vmap_block_queue); spin_lock(&vbq->lock); list_add_tail_rcu(&vb->free_list, &vbq->free); spin_unlock(&vbq->lock); - put_cpu_var(vmap_block_queue); + put_cpu_light(); return vaddr; } @@ -976,6 +977,7 @@ struct vmap_block *vb; void *vaddr = NULL; unsigned int order; + int cpu; BUG_ON(offset_in_page(size)); BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); @@ -990,7 +992,8 @@ order = get_order(size); rcu_read_lock(); - vbq = &get_cpu_var(vmap_block_queue); + cpu = get_cpu_light(); + vbq = this_cpu_ptr(&vmap_block_queue); list_for_each_entry_rcu(vb, &vbq->free, free_list) { unsigned long pages_off; @@ -1013,7 +1016,7 @@ break; } - put_cpu_var(vmap_block_queue); + put_cpu_light(); rcu_read_unlock(); /* Allocate new block if nothing was found */ diff --git a/kernel/mm/vmstat.c b/kernel/mm/vmstat.c index d139fd9..444915b 100644 --- a/kernel/mm/vmstat.c +++ b/kernel/mm/vmstat.c @@ -320,6 +320,7 @@ long x; long t; + preempt_disable_rt(); x = delta + __this_cpu_read(*p); t = __this_cpu_read(pcp->stat_threshold); @@ -329,6 +330,7 @@ x = 0; } __this_cpu_write(*p, x); + preempt_enable_rt(); } EXPORT_SYMBOL(__mod_zone_page_state); @@ -340,6 +342,7 @@ long x; long t; + preempt_disable_rt(); x = delta + __this_cpu_read(*p); t = __this_cpu_read(pcp->stat_threshold); @@ -349,6 +352,7 @@ x = 0; } __this_cpu_write(*p, x); + preempt_enable_rt(); } EXPORT_SYMBOL(__mod_node_page_state); @@ -381,6 +385,7 @@ s8 __percpu *p = pcp->vm_stat_diff + item; s8 v, t; + preempt_disable_rt(); v = __this_cpu_inc_return(*p); t = __this_cpu_read(pcp->stat_threshold); if (unlikely(v > t)) { @@ -389,6 +394,7 @@ zone_page_state_add(v + overstep, zone, item); __this_cpu_write(*p, -overstep); } + preempt_enable_rt(); } void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item) @@ -397,6 +403,7 @@ s8 __percpu *p = pcp->vm_node_stat_diff + item; s8 v, t; + preempt_disable_rt(); v = __this_cpu_inc_return(*p); t = __this_cpu_read(pcp->stat_threshold); if (unlikely(v > t)) { @@ -405,6 +412,7 @@ node_page_state_add(v + overstep, pgdat, item); __this_cpu_write(*p, -overstep); } + preempt_enable_rt(); } void __inc_zone_page_state(struct page *page, enum zone_stat_item item) @@ -425,6 +433,7 @@ s8 __percpu *p = pcp->vm_stat_diff + item; s8 v, t; + preempt_disable_rt(); v = __this_cpu_dec_return(*p); t = __this_cpu_read(pcp->stat_threshold); if (unlikely(v < - t)) { @@ -433,6 +442,7 @@ zone_page_state_add(v - overstep, zone, item); __this_cpu_write(*p, overstep); } + preempt_enable_rt(); } void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item) @@ -441,6 +451,7 @@ s8 __percpu *p = pcp->vm_node_stat_diff + item; s8 v, t; + preempt_disable_rt(); v = __this_cpu_dec_return(*p); t = __this_cpu_read(pcp->stat_threshold); if (unlikely(v < - t)) { @@ -449,6 +460,7 @@ node_page_state_add(v - overstep, pgdat, item); __this_cpu_write(*p, overstep); } + preempt_enable_rt(); } void __dec_zone_page_state(struct page *page, enum zone_stat_item item) diff --git a/kernel/mm/zsmalloc.c b/kernel/mm/zsmalloc.c index 11e81b3..59d97e3 100644 --- a/kernel/mm/zsmalloc.c +++ b/kernel/mm/zsmalloc.c @@ -56,6 +56,7 @@ #include <linux/wait.h> #include <linux/pagemap.h> #include <linux/fs.h> +#include <linux/locallock.h> #define ZSPAGE_MAGIC 0x58 @@ -73,8 +74,21 @@ */ #define ZS_MAX_ZSPAGE_ORDER 2 #define ZS_MAX_PAGES_PER_ZSPAGE (_AC(1, UL) << ZS_MAX_ZSPAGE_ORDER) - #define ZS_HANDLE_SIZE (sizeof(unsigned long)) + +#ifdef CONFIG_PREEMPT_RT_FULL + +struct zsmalloc_handle { + unsigned long addr; + struct mutex lock; +}; + +#define ZS_HANDLE_ALLOC_SIZE (sizeof(struct zsmalloc_handle)) + +#else + +#define ZS_HANDLE_ALLOC_SIZE (sizeof(unsigned long)) +#endif /* * Object location (<PFN>, <obj_idx>) is encoded as @@ -325,7 +339,7 @@ static int create_cache(struct zs_pool *pool) { - pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_SIZE, + pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_ALLOC_SIZE, 0, 0, NULL); if (!pool->handle_cachep) return 1; @@ -349,9 +363,26 @@ static unsigned long cache_alloc_handle(struct zs_pool *pool, gfp_t gfp) { - return (unsigned long)kmem_cache_alloc(pool->handle_cachep, - gfp & ~(__GFP_HIGHMEM|__GFP_MOVABLE)); + void *p; + + p = kmem_cache_alloc(pool->handle_cachep, + gfp & ~(__GFP_HIGHMEM|__GFP_MOVABLE)); +#ifdef CONFIG_PREEMPT_RT_FULL + if (p) { + struct zsmalloc_handle *zh = p; + + mutex_init(&zh->lock); + } +#endif + return (unsigned long)p; } + +#ifdef CONFIG_PREEMPT_RT_FULL +static struct zsmalloc_handle *zs_get_pure_handle(unsigned long handle) +{ + return (void *)(handle &~((1 << OBJ_TAG_BITS) - 1)); +} +#endif static void cache_free_handle(struct zs_pool *pool, unsigned long handle) { @@ -371,12 +402,18 @@ static void record_obj(unsigned long handle, unsigned long obj) { +#ifdef CONFIG_PREEMPT_RT_FULL + struct zsmalloc_handle *zh = zs_get_pure_handle(handle); + + WRITE_ONCE(zh->addr, obj); +#else /* * lsb of @obj represents handle lock while other bits * represent object value the handle is pointing so * updating shouldn't do store tearing. */ WRITE_ONCE(*(unsigned long *)handle, obj); +#endif } /* zpool driver */ @@ -458,6 +495,7 @@ /* per-cpu VM mapping areas for zspage accesses that cross page boundaries */ static DEFINE_PER_CPU(struct mapping_area, zs_map_area); +static DEFINE_LOCAL_IRQ_LOCK(zs_map_area_lock); static bool is_zspage_isolated(struct zspage *zspage) { @@ -887,7 +925,13 @@ static unsigned long handle_to_obj(unsigned long handle) { +#ifdef CONFIG_PREEMPT_RT_FULL + struct zsmalloc_handle *zh = zs_get_pure_handle(handle); + + return zh->addr; +#else return *(unsigned long *)handle; +#endif } static unsigned long obj_to_head(struct page *page, void *obj) @@ -901,22 +945,46 @@ static inline int testpin_tag(unsigned long handle) { +#ifdef CONFIG_PREEMPT_RT_FULL + struct zsmalloc_handle *zh = zs_get_pure_handle(handle); + + return mutex_is_locked(&zh->lock); +#else return bit_spin_is_locked(HANDLE_PIN_BIT, (unsigned long *)handle); +#endif } static inline int trypin_tag(unsigned long handle) { +#ifdef CONFIG_PREEMPT_RT_FULL + struct zsmalloc_handle *zh = zs_get_pure_handle(handle); + + return mutex_trylock(&zh->lock); +#else return bit_spin_trylock(HANDLE_PIN_BIT, (unsigned long *)handle); +#endif } static void pin_tag(unsigned long handle) { +#ifdef CONFIG_PREEMPT_RT_FULL + struct zsmalloc_handle *zh = zs_get_pure_handle(handle); + + return mutex_lock(&zh->lock); +#else bit_spin_lock(HANDLE_PIN_BIT, (unsigned long *)handle); +#endif } static void unpin_tag(unsigned long handle) { +#ifdef CONFIG_PREEMPT_RT_FULL + struct zsmalloc_handle *zh = zs_get_pure_handle(handle); + + return mutex_unlock(&zh->lock); +#else bit_spin_unlock(HANDLE_PIN_BIT, (unsigned long *)handle); +#endif } static void reset_page(struct page *page) @@ -1342,7 +1410,7 @@ class = pool->size_class[class_idx]; off = (class->size * obj_idx) & ~PAGE_MASK; - area = &get_cpu_var(zs_map_area); + area = &get_locked_var(zs_map_area_lock, zs_map_area); area->vm_mm = mm; if (off + class->size <= PAGE_SIZE) { /* this object is contained entirely within a page */ @@ -1396,7 +1464,7 @@ __zs_unmap_object(area, pages, off, class->size); } - put_cpu_var(zs_map_area); + put_locked_var(zs_map_area_lock, zs_map_area); migrate_read_unlock(zspage); unpin_tag(handle); diff --git a/kernel/mm/zswap.c b/kernel/mm/zswap.c index cd91fd9..420225d 100644 --- a/kernel/mm/zswap.c +++ b/kernel/mm/zswap.c @@ -27,6 +27,7 @@ #include <linux/highmem.h> #include <linux/slab.h> #include <linux/spinlock.h> +#include <linux/locallock.h> #include <linux/types.h> #include <linux/atomic.h> #include <linux/frontswap.h> @@ -990,6 +991,8 @@ memset_l(page, value, PAGE_SIZE / sizeof(unsigned long)); } +/* protect zswap_dstmem from concurrency */ +static DEFINE_LOCAL_IRQ_LOCK(zswap_dstmem_lock); /********************************* * frontswap hooks **********************************/ @@ -1066,12 +1069,11 @@ } /* compress */ - dst = get_cpu_var(zswap_dstmem); - tfm = *get_cpu_ptr(entry->pool->tfm); + dst = get_locked_var(zswap_dstmem_lock, zswap_dstmem); + tfm = *this_cpu_ptr(entry->pool->tfm); src = kmap_atomic(page); ret = crypto_comp_compress(tfm, src, PAGE_SIZE, dst, &dlen); kunmap_atomic(src); - put_cpu_ptr(entry->pool->tfm); if (ret) { ret = -EINVAL; goto put_dstmem; @@ -1094,7 +1096,7 @@ memcpy(buf, &zhdr, hlen); memcpy(buf + hlen, dst, dlen); zpool_unmap_handle(entry->pool->zpool, handle); - put_cpu_var(zswap_dstmem); + put_locked_var(zswap_dstmem_lock, zswap_dstmem); /* populate entry */ entry->offset = offset; @@ -1122,7 +1124,7 @@ return 0; put_dstmem: - put_cpu_var(zswap_dstmem); + put_locked_var(zswap_dstmem_lock, zswap_dstmem); zswap_pool_put(entry->pool); freepage: zswap_entry_cache_free(entry); diff --git a/kernel/net/Kconfig b/kernel/net/Kconfig index ae8e7da..c7eb375 100644 --- a/kernel/net/Kconfig +++ b/kernel/net/Kconfig @@ -274,7 +274,7 @@ config NET_RX_BUSY_POLL bool - default y + default y if !PREEMPT_RT_FULL config BQL bool diff --git a/kernel/net/bluetooth/rfcomm/sock.c b/kernel/net/bluetooth/rfcomm/sock.c index c044ff2..75bc810 100644 --- a/kernel/net/bluetooth/rfcomm/sock.c +++ b/kernel/net/bluetooth/rfcomm/sock.c @@ -64,15 +64,13 @@ static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err) { struct sock *sk = d->owner, *parent; - unsigned long flags; if (!sk) return; BT_DBG("dlc %p state %ld err %d", d, d->state, err); - local_irq_save(flags); - bh_lock_sock(sk); + spin_lock_bh(&sk->sk_lock.slock); if (err) sk->sk_err = err; @@ -93,8 +91,7 @@ sk->sk_state_change(sk); } - bh_unlock_sock(sk); - local_irq_restore(flags); + spin_unlock_bh(&sk->sk_lock.slock); if (parent && sock_flag(sk, SOCK_ZAPPED)) { /* We have to drop DLC lock here, otherwise diff --git a/kernel/net/core/dev.c b/kernel/net/core/dev.c index 27d414d..4c582f2 100644 --- a/kernel/net/core/dev.c +++ b/kernel/net/core/dev.c @@ -219,14 +219,14 @@ static inline void rps_lock(struct softnet_data *sd) { #ifdef CONFIG_RPS - spin_lock(&sd->input_pkt_queue.lock); + raw_spin_lock(&sd->input_pkt_queue.raw_lock); #endif } static inline void rps_unlock(struct softnet_data *sd) { #ifdef CONFIG_RPS - spin_unlock(&sd->input_pkt_queue.lock); + raw_spin_unlock(&sd->input_pkt_queue.raw_lock); #endif } @@ -2723,6 +2723,7 @@ sd->output_queue_tailp = &q->next_sched; raise_softirq_irqoff(NET_TX_SOFTIRQ); local_irq_restore(flags); + preempt_check_resched_rt(); } void __netif_schedule(struct Qdisc *q) @@ -2785,6 +2786,7 @@ __this_cpu_write(softnet_data.completion_queue, skb); raise_softirq_irqoff(NET_TX_SOFTIRQ); local_irq_restore(flags); + preempt_check_resched_rt(); } EXPORT_SYMBOL(__dev_kfree_skb_irq); @@ -3468,7 +3470,11 @@ * This permits qdisc->running owner to get the lock more * often and dequeue packets faster. */ +#ifdef CONFIG_PREEMPT_RT_FULL + contended = true; +#else contended = qdisc_is_running(q); +#endif if (unlikely(contended)) spin_lock(&q->busylock); @@ -3829,10 +3835,14 @@ if (dev->flags & IFF_UP) { int cpu = smp_processor_id(); /* ok because BHs are off */ +#ifdef CONFIG_PREEMPT_RT_FULL + if (READ_ONCE(txq->xmit_lock_owner) != current) { +#else /* Other cpus might concurrently change txq->xmit_lock_owner * to -1 or to their cpu id, but not to our id. */ if (READ_ONCE(txq->xmit_lock_owner) != cpu) { +#endif if (dev_xmit_recursion()) goto recursion_alert; @@ -4267,6 +4277,7 @@ rps_unlock(sd); local_irq_restore(flags); + preempt_check_resched_rt(); atomic_long_inc(&skb->dev->rx_dropped); kfree_skb(skb); @@ -4481,7 +4492,7 @@ struct rps_dev_flow voidflow, *rflow = &voidflow; int cpu; - preempt_disable(); + migrate_disable(); rcu_read_lock(); cpu = get_rps_cpu(skb->dev, skb, &rflow); @@ -4491,14 +4502,14 @@ ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); rcu_read_unlock(); - preempt_enable(); + migrate_enable(); } else #endif { unsigned int qtail; - ret = enqueue_to_backlog(skb, get_cpu(), &qtail); - put_cpu(); + ret = enqueue_to_backlog(skb, get_cpu_light(), &qtail); + put_cpu_light(); } return ret; } @@ -4532,11 +4543,9 @@ trace_netif_rx_ni_entry(skb); - preempt_disable(); + local_bh_disable(); err = netif_rx_internal(skb); - if (local_softirq_pending()) - do_softirq(); - preempt_enable(); + local_bh_enable(); return err; } @@ -5818,12 +5827,14 @@ sd->rps_ipi_list = NULL; local_irq_enable(); + preempt_check_resched_rt(); /* Send pending IPI's to kick RPS processing on remote cpus. */ net_rps_send_ipi(remsd); } else #endif local_irq_enable(); + preempt_check_resched_rt(); } static bool sd_has_rps_ipi_waiting(struct softnet_data *sd) @@ -5853,16 +5864,18 @@ while (again) { struct sk_buff *skb; + local_irq_disable(); while ((skb = __skb_dequeue(&sd->process_queue))) { + local_irq_enable(); rcu_read_lock(); __netif_receive_skb(skb); rcu_read_unlock(); input_queue_head_incr(sd); if (++work >= quota) goto state_changed; + local_irq_disable(); } - local_irq_disable(); rps_lock(sd); if (skb_queue_empty(&sd->input_pkt_queue)) { /* @@ -5904,6 +5917,7 @@ local_irq_save(flags); ____napi_schedule(this_cpu_ptr(&softnet_data), n); local_irq_restore(flags); + preempt_check_resched_rt(); } EXPORT_SYMBOL(__napi_schedule); @@ -5940,6 +5954,7 @@ } EXPORT_SYMBOL(napi_schedule_prep); +#ifndef CONFIG_PREEMPT_RT_FULL /** * __napi_schedule_irqoff - schedule for receive * @n: entry to schedule @@ -5958,6 +5973,7 @@ __napi_schedule(n); } EXPORT_SYMBOL(__napi_schedule_irqoff); +#endif bool napi_complete_done(struct napi_struct *n, int work_done) { @@ -6352,12 +6368,20 @@ unsigned long time_limit = jiffies + usecs_to_jiffies(netdev_budget_usecs); int budget = netdev_budget; + struct sk_buff_head tofree_q; + struct sk_buff *skb; LIST_HEAD(list); LIST_HEAD(repoll); + __skb_queue_head_init(&tofree_q); + local_irq_disable(); + skb_queue_splice_init(&sd->tofree_queue, &tofree_q); list_splice_init(&sd->poll_list, &list); local_irq_enable(); + + while ((skb = __skb_dequeue(&tofree_q))) + kfree_skb(skb); for (;;) { struct napi_struct *n; @@ -6388,7 +6412,7 @@ list_splice_tail(&repoll, &list); list_splice(&list, &sd->poll_list); if (!list_empty(&sd->poll_list)) - __raise_softirq_irqoff(NET_RX_SOFTIRQ); + __raise_softirq_irqoff_ksoft(NET_RX_SOFTIRQ); net_rps_action_and_irq_enable(sd); out: @@ -8595,7 +8619,7 @@ /* Initialize queue lock */ spin_lock_init(&queue->_xmit_lock); netdev_set_xmit_lockdep_class(&queue->_xmit_lock, dev->type); - queue->xmit_lock_owner = -1; + netdev_queue_clear_owner(queue); netdev_queue_numa_node_write(queue, NUMA_NO_NODE); queue->dev = dev; #ifdef CONFIG_BQL @@ -9542,6 +9566,7 @@ raise_softirq_irqoff(NET_TX_SOFTIRQ); local_irq_enable(); + preempt_check_resched_rt(); #ifdef CONFIG_RPS remsd = oldsd->rps_ipi_list; @@ -9555,9 +9580,12 @@ netif_rx_ni(skb); input_queue_head_incr(oldsd); } - while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) { + while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { netif_rx_ni(skb); input_queue_head_incr(oldsd); + } + while ((skb = __skb_dequeue(&oldsd->tofree_queue))) { + kfree_skb(skb); } return 0; @@ -9869,8 +9897,9 @@ INIT_WORK(flush, flush_backlog); - skb_queue_head_init(&sd->input_pkt_queue); - skb_queue_head_init(&sd->process_queue); + skb_queue_head_init_raw(&sd->input_pkt_queue); + skb_queue_head_init_raw(&sd->process_queue); + skb_queue_head_init_raw(&sd->tofree_queue); #ifdef CONFIG_XFRM_OFFLOAD skb_queue_head_init(&sd->xfrm_backlog); #endif diff --git a/kernel/net/core/gen_estimator.c b/kernel/net/core/gen_estimator.c index 752744d..7112e28 100644 --- a/kernel/net/core/gen_estimator.c +++ b/kernel/net/core/gen_estimator.c @@ -46,7 +46,7 @@ struct net_rate_estimator { struct gnet_stats_basic_packed *bstats; spinlock_t *stats_lock; - seqcount_t *running; + net_seqlock_t *running; struct gnet_stats_basic_cpu __percpu *cpu_bstats; u8 ewma_log; u8 intvl_log; /* period : (250ms << intvl_log) */ @@ -129,7 +129,7 @@ struct gnet_stats_basic_cpu __percpu *cpu_bstats, struct net_rate_estimator __rcu **rate_est, spinlock_t *lock, - seqcount_t *running, + net_seqlock_t *running, struct nlattr *opt) { struct gnet_estimator *parm = nla_data(opt); @@ -230,7 +230,7 @@ struct gnet_stats_basic_cpu __percpu *cpu_bstats, struct net_rate_estimator __rcu **rate_est, spinlock_t *lock, - seqcount_t *running, struct nlattr *opt) + net_seqlock_t *running, struct nlattr *opt) { return gen_new_estimator(bstats, cpu_bstats, rate_est, lock, running, opt); diff --git a/kernel/net/core/gen_stats.c b/kernel/net/core/gen_stats.c index e2fd8ba..8bab887 100644 --- a/kernel/net/core/gen_stats.c +++ b/kernel/net/core/gen_stats.c @@ -142,7 +142,7 @@ } void -__gnet_stats_copy_basic(const seqcount_t *running, +__gnet_stats_copy_basic(net_seqlock_t *running, struct gnet_stats_basic_packed *bstats, struct gnet_stats_basic_cpu __percpu *cpu, struct gnet_stats_basic_packed *b) @@ -155,10 +155,10 @@ } do { if (running) - seq = read_seqcount_begin(running); + seq = net_seq_begin(running); bstats->bytes = b->bytes; bstats->packets = b->packets; - } while (running && read_seqcount_retry(running, seq)); + } while (running && net_seq_retry(running, seq)); } EXPORT_SYMBOL(__gnet_stats_copy_basic); @@ -176,7 +176,7 @@ * if the room in the socket buffer was not sufficient. */ int -gnet_stats_copy_basic(const seqcount_t *running, +gnet_stats_copy_basic(net_seqlock_t *running, struct gnet_dump *d, struct gnet_stats_basic_cpu __percpu *cpu, struct gnet_stats_basic_packed *b) diff --git a/kernel/net/core/pktgen.c b/kernel/net/core/pktgen.c index 3714cd9..2cea192 100644 --- a/kernel/net/core/pktgen.c +++ b/kernel/net/core/pktgen.c @@ -2160,7 +2160,8 @@ s64 remaining; struct hrtimer_sleeper t; - hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS, + current); hrtimer_set_expires(&t.timer, spin_until); remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer)); @@ -2175,7 +2176,6 @@ } while (ktime_compare(end_time, spin_until) < 0); } else { /* see do_nanosleep */ - hrtimer_init_sleeper(&t, current); do { set_current_state(TASK_INTERRUPTIBLE); hrtimer_start_expires(&t.timer, HRTIMER_MODE_ABS); diff --git a/kernel/net/core/skbuff.c b/kernel/net/core/skbuff.c index 6cca6a0..d895bac 100644 --- a/kernel/net/core/skbuff.c +++ b/kernel/net/core/skbuff.c @@ -63,6 +63,7 @@ #include <linux/errqueue.h> #include <linux/prefetch.h> #include <linux/if_vlan.h> +#include <linux/locallock.h> #include <net/protocol.h> #include <net/dst.h> @@ -330,6 +331,8 @@ static DEFINE_PER_CPU(struct page_frag_cache, netdev_alloc_cache); static DEFINE_PER_CPU(struct napi_alloc_cache, napi_alloc_cache); +static DEFINE_LOCAL_IRQ_LOCK(netdev_alloc_lock); +static DEFINE_LOCAL_IRQ_LOCK(napi_alloc_cache_lock); static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) { @@ -337,10 +340,10 @@ unsigned long flags; void *data; - local_irq_save(flags); + local_lock_irqsave(netdev_alloc_lock, flags); nc = this_cpu_ptr(&netdev_alloc_cache); data = page_frag_alloc(nc, fragsz, gfp_mask); - local_irq_restore(flags); + local_unlock_irqrestore(netdev_alloc_lock, flags); return data; } @@ -361,9 +364,13 @@ static void *__napi_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) { - struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); + struct napi_alloc_cache *nc; + void *data; - return page_frag_alloc(&nc->page, fragsz, gfp_mask); + nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); + data = page_frag_alloc(&nc->page, fragsz, gfp_mask); + put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); + return data; } void *napi_alloc_frag(unsigned int fragsz) @@ -416,13 +423,13 @@ if (sk_memalloc_socks()) gfp_mask |= __GFP_MEMALLOC; - local_irq_save(flags); + local_lock_irqsave(netdev_alloc_lock, flags); nc = this_cpu_ptr(&netdev_alloc_cache); data = page_frag_alloc(nc, len, gfp_mask); pfmemalloc = nc->pfmemalloc; - local_irq_restore(flags); + local_unlock_irqrestore(netdev_alloc_lock, flags); if (unlikely(!data)) return NULL; @@ -466,6 +473,7 @@ struct napi_alloc_cache *nc; struct sk_buff *skb; void *data; + bool pfmemalloc; len += NET_SKB_PAD + NET_IP_ALIGN; @@ -488,7 +496,10 @@ if (sk_memalloc_socks()) gfp_mask |= __GFP_MEMALLOC; + nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); data = page_frag_alloc(&nc->page, len, gfp_mask); + pfmemalloc = nc->page.pfmemalloc; + put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); if (unlikely(!data)) return NULL; @@ -499,7 +510,7 @@ } /* use OR instead of assignment to avoid clearing of bits in mask */ - if (nc->page.pfmemalloc) + if (pfmemalloc) skb->pfmemalloc = 1; skb->head_frag = 1; @@ -731,23 +742,26 @@ void __kfree_skb_flush(void) { - struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); + struct napi_alloc_cache *nc; + nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); /* flush skb_cache if containing objects */ if (nc->skb_count) { kmem_cache_free_bulk(skbuff_head_cache, nc->skb_count, nc->skb_cache); nc->skb_count = 0; } + put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); } static inline void _kfree_skb_defer(struct sk_buff *skb) { - struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); + struct napi_alloc_cache *nc; /* drop skb->head and call any destructors for packet */ skb_release_all(skb); + nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); /* record skb to CPU local list */ nc->skb_cache[nc->skb_count++] = skb; @@ -762,6 +776,7 @@ nc->skb_cache); nc->skb_count = 0; } + put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); } void __kfree_skb_defer(struct sk_buff *skb) { diff --git a/kernel/net/ipv4/icmp.c b/kernel/net/ipv4/icmp.c index fe10a56..d35719e 100644 --- a/kernel/net/ipv4/icmp.c +++ b/kernel/net/ipv4/icmp.c @@ -77,6 +77,7 @@ #include <linux/string.h> #include <linux/netfilter_ipv4.h> #include <linux/slab.h> +#include <linux/locallock.h> #include <net/snmp.h> #include <net/ip.h> #include <net/route.h> @@ -204,6 +205,8 @@ * * On SMP we have one ICMP socket per-cpu. */ +static DEFINE_LOCAL_IRQ_LOCK(icmp_sk_lock); + static struct sock *icmp_sk(struct net *net) { return *this_cpu_ptr(net->ipv4.icmp_sk); @@ -214,12 +217,16 @@ { struct sock *sk; + if (!local_trylock(icmp_sk_lock)) + return NULL; + sk = icmp_sk(net); if (unlikely(!spin_trylock(&sk->sk_lock.slock))) { /* This can happen if the output path signals a * dst_link_failure() for an outgoing ICMP packet. */ + local_unlock(icmp_sk_lock); return NULL; } return sk; @@ -228,6 +235,7 @@ static inline void icmp_xmit_unlock(struct sock *sk) { spin_unlock(&sk->sk_lock.slock); + local_unlock(icmp_sk_lock); } int sysctl_icmp_msgs_per_sec __read_mostly = 1000; diff --git a/kernel/net/ipv4/tcp_ipv4.c b/kernel/net/ipv4/tcp_ipv4.c index de4edfb..6a530a0 100644 --- a/kernel/net/ipv4/tcp_ipv4.c +++ b/kernel/net/ipv4/tcp_ipv4.c @@ -62,6 +62,7 @@ #include <linux/init.h> #include <linux/times.h> #include <linux/slab.h> +#include <linux/locallock.h> #include <net/net_namespace.h> #include <net/icmp.h> @@ -637,6 +638,7 @@ } EXPORT_SYMBOL(tcp_v4_send_check); +static DEFINE_LOCAL_IRQ_LOCK(tcp_sk_lock); /* * This routine will send an RST to the other tcp. * @@ -771,6 +773,7 @@ arg.tos = ip_hdr(skb)->tos; arg.uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL); local_bh_disable(); + local_lock(tcp_sk_lock); ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk); if (sk) ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? @@ -783,6 +786,7 @@ ctl_sk->sk_mark = 0; __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); __TCP_INC_STATS(net, TCP_MIB_OUTRSTS); + local_unlock(tcp_sk_lock); local_bh_enable(); #ifdef CONFIG_TCP_MD5SIG @@ -863,6 +867,7 @@ arg.tos = tos; arg.uid = sock_net_uid(net, sk_fullsock(sk) ? sk : NULL); local_bh_disable(); + local_lock(tcp_sk_lock); ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk); if (sk) ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? @@ -874,6 +879,7 @@ ctl_sk->sk_mark = 0; __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); + local_unlock(tcp_sk_lock); local_bh_enable(); } diff --git a/kernel/net/netfilter/core.c b/kernel/net/netfilter/core.c index 93aaec3..b364cf8 100644 --- a/kernel/net/netfilter/core.c +++ b/kernel/net/netfilter/core.c @@ -20,6 +20,7 @@ #include <linux/inetdevice.h> #include <linux/proc_fs.h> #include <linux/mutex.h> +#include <linux/locallock.h> #include <linux/mm.h> #include <linux/rcupdate.h> #include <net/net_namespace.h> @@ -27,6 +28,11 @@ #include "nf_internals.h" +#ifdef CONFIG_PREEMPT_RT_BASE +DEFINE_LOCAL_IRQ_LOCK(xt_write_lock); +EXPORT_PER_CPU_SYMBOL(xt_write_lock); +#endif + const struct nf_ipv6_ops __rcu *nf_ipv6_ops __read_mostly; EXPORT_SYMBOL_GPL(nf_ipv6_ops); diff --git a/kernel/net/packet/af_packet.c b/kernel/net/packet/af_packet.c index bd7e8d4..51bca56 100644 --- a/kernel/net/packet/af_packet.c +++ b/kernel/net/packet/af_packet.c @@ -63,6 +63,7 @@ #include <linux/if_packet.h> #include <linux/wireless.h> #include <linux/kernel.h> +#include <linux/delay.h> #include <linux/kmod.h> #include <linux/slab.h> #include <linux/vmalloc.h> @@ -668,7 +669,7 @@ if (BLOCK_NUM_PKTS(pbd)) { while (atomic_read(&pkc->blk_fill_in_prog)) { /* Waiting for skb_copy_bits to finish... */ - cpu_relax(); + cpu_chill(); } } @@ -930,7 +931,7 @@ if (!(status & TP_STATUS_BLK_TMO)) { while (atomic_read(&pkc->blk_fill_in_prog)) { /* Waiting for skb_copy_bits to finish... */ - cpu_relax(); + cpu_chill(); } } prb_close_block(pkc, pbd, po, status); diff --git a/kernel/net/rds/ib_rdma.c b/kernel/net/rds/ib_rdma.c index 0b347f4..f395f06 100644 --- a/kernel/net/rds/ib_rdma.c +++ b/kernel/net/rds/ib_rdma.c @@ -34,6 +34,7 @@ #include <linux/slab.h> #include <linux/rculist.h> #include <linux/llist.h> +#include <linux/delay.h> #include "rds_single_path.h" #include "ib_mr.h" @@ -222,7 +223,7 @@ for_each_online_cpu(cpu) { flag = &per_cpu(clean_list_grace, cpu); while (test_bit(CLEAN_LIST_BUSY_BIT, flag)) - cpu_relax(); + cpu_chill(); } } diff --git a/kernel/net/rfkill/rfkill-bt.c b/kernel/net/rfkill/rfkill-bt.c index 378fdc9..a2d31bc 100644 --- a/kernel/net/rfkill/rfkill-bt.c +++ b/kernel/net/rfkill/rfkill-bt.c @@ -25,6 +25,7 @@ #include <linux/rfkill-bt.h> #include <linux/rfkill-wlan.h> #include <linux/wakelock.h> +#include <linux/input.h> #include <linux/interrupt.h> #include <asm/irq.h> #include <linux/suspend.h> @@ -69,9 +70,11 @@ struct wake_lock bt_irq_wl; struct delayed_work bt_sleep_delay_work; int irq_req; + bool enable_power_key; }; static struct rfkill_rk_data *g_rfkill = NULL; +static struct input_dev *power_key_dev; static const char bt_name[] = #if defined(CONFIG_BCM4330) @@ -113,6 +116,20 @@ #endif ; +static int rfkill_rk_power_key_up(void) +{ + if (!power_key_dev) + return -ENODEV; + + input_report_key(power_key_dev, KEY_POWER, 1); + input_sync(power_key_dev); + msleep(20); + input_report_key(power_key_dev, KEY_POWER, 0); + input_sync(power_key_dev); + + return 0; +} + static irqreturn_t rfkill_rk_wake_host_irq(int irq, void *dev) { struct rfkill_rk_data *rfkill = dev; @@ -123,6 +140,16 @@ wake_lock_timeout(&rfkill->bt_irq_wl, msecs_to_jiffies(BT_IRQ_WAKELOCK_TIMEOUT)); + + if (rfkill->enable_power_key) + return IRQ_WAKE_THREAD; + + return IRQ_HANDLED; +} + +static irqreturn_t rfkill_rk_wake_host_irq_thread(int irq, void *dev) +{ + rfkill_rk_power_key_up(); return IRQ_HANDLED; } @@ -165,11 +192,12 @@ LOG("Request irq for bt wakeup host\n"); irq->irq = gpio_to_irq(irq->gpio.io); sprintf(irq->name, "%s_irq", irq->gpio.name); - ret = request_irq(irq->irq, rfkill_rk_wake_host_irq, - (irq->gpio.enable == GPIO_ACTIVE_LOW) ? - IRQF_TRIGGER_FALLING : - IRQF_TRIGGER_RISING, - irq->name, rfkill); + ret = request_threaded_irq(irq->irq, rfkill_rk_wake_host_irq, + rfkill_rk_wake_host_irq_thread, + IRQF_ONESHOT | ((irq->gpio.enable == GPIO_ACTIVE_LOW) ? + IRQF_TRIGGER_FALLING : + IRQF_TRIGGER_RISING), + irq->name, rfkill); if (ret) goto fail2; rfkill->irq_req = 1; @@ -271,7 +299,8 @@ return 0; } -static int proc_rk_set_power(void *data, bool blocked) + +static int rfkill_rk_set_power(void *data, bool blocked) { struct rfkill_rk_data *rfkill = data; struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio; @@ -363,113 +392,6 @@ LOG("%s: cannot get wifi power state!\n", __func__); return -EPERM; } - if (!wifi_power) { - LOG("%s: bt will set vbat to low\n", __func__); - rfkill_set_wifi_bt_power(0); - } else { - LOG("%s: bt shouldn't control the vbat\n", __func__); - } - } - } - - return 0; -} - - -static int rfkill_rk_set_power(void *data, bool blocked) -{ - struct rfkill_rk_data *rfkill = data; - struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio; - struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio; - struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio; - struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio; - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; - int wifi_power = 0; - bool toggle = false; - - DBG("Enter %s\n", __func__); - - DBG("Set blocked:%d\n", blocked); - - toggle = rfkill->pdata->power_toggle; - - if (toggle) { - if (rfkill_get_wifi_power_state(&wifi_power)) { - LOG("%s: cannot get wifi power state!\n", __func__); - return -1; - } - } - - DBG("%s: toggle = %s\n", __func__, toggle ? "true" : "false"); - - if (!blocked) { - if (toggle) { - rfkill_set_wifi_bt_power(1); - msleep(100); - } - - rfkill_rk_sleep_bt(BT_WAKEUP); // ensure bt is wakeup - - if (gpio_is_valid(wake_host->io)) { - LOG("%s: set bt wake_host high!\n", __func__); - gpio_direction_output(wake_host->io, 1); - msleep(20); - } - - if (gpio_is_valid(poweron->io)) { - if (gpio_get_value(poweron->io) == !poweron->enable) { - gpio_direction_output(poweron->io, - !poweron->enable); - msleep(20); - gpio_direction_output(poweron->io, - poweron->enable); - msleep(20); - if (gpio_is_valid(wake_host->io)) - gpio_direction_input(wake_host->io); - } - } - - if (gpio_is_valid(reset->io)) { - if (gpio_get_value(reset->io) == !reset->enable) { - gpio_direction_output(reset->io, - !reset->enable); - msleep(20); - gpio_direction_output(reset->io, reset->enable); - } - } - - if (pinctrl && gpio_is_valid(rts->io)) { - pinctrl_select_state(pinctrl, rts->gpio_state); - LOG("ENABLE UART_RTS\n"); - gpio_direction_output(rts->io, rts->enable); - msleep(100); - LOG("DISABLE UART_RTS\n"); - gpio_direction_output(rts->io, !rts->enable); - pinctrl_select_state(pinctrl, rts->default_state); - } - - bt_power_state = 1; - LOG("bt turn on power\n"); - rfkill_rk_setup_wake_irq(rfkill, 1); - } else { - if (gpio_is_valid(poweron->io)) { - if (gpio_get_value(poweron->io) == poweron->enable) { - gpio_direction_output(poweron->io, - poweron->enable); - msleep(20); - } - } - - bt_power_state = 0; - LOG("bt shut off power\n"); - if (gpio_is_valid(reset->io)) { - if (gpio_get_value(reset->io) == reset->enable) { - gpio_direction_output(reset->io, - reset->enable); - msleep(20); - } - } - if (toggle) { if (!wifi_power) { LOG("%s: bt will set vbat to low\n", __func__); rfkill_set_wifi_bt_power(0); @@ -592,11 +514,56 @@ return -EFAULT; DBG("btwrite %c\n", b); - /* HCI_DEV_WRITE */ if (b != '0') - proc_rk_set_power(g_rfkill, 0); + rfkill_rk_sleep_bt(BT_WAKEUP); else - proc_rk_set_power(g_rfkill, 1); + rfkill_rk_sleep_bt(BT_SLEEP); + + return count; +} + +static ssize_t bluesleep_read_proc_powerupkey(struct file *file, + char __user *buffer, size_t count, + loff_t *data) +{ + struct rfkill_rk_data *rfkill = g_rfkill; + char src[2]; + + if (*data >= 1) + return 0; + + if (!rfkill) + return -EFAULT; + + src[0] = rfkill->enable_power_key ? '1' : '0'; + src[1] = '\n'; + if (copy_to_user(buffer, src, 2)) + return -EFAULT; + *data = 1; + + return 2; +} + +static ssize_t bluesleep_write_proc_powerupkey(struct file *file, + const char __user *buffer, + size_t count, loff_t *data) +{ + char b; + struct rfkill_rk_data *rfkill = g_rfkill; + + if (!rfkill) + return -EFAULT; + + if (count < 1) + return -EINVAL; + + if (copy_from_user(&b, buffer, 1)) + return -EFAULT; + + if (b != '0') + rfkill->enable_power_key = true; + else + rfkill->enable_power_key = false; return count; } @@ -700,6 +667,39 @@ .write = bluesleep_write_proc_btwrite, }; +static const struct file_operations bluesleep_powerupkey = { + .owner = THIS_MODULE, + .read = bluesleep_read_proc_powerupkey, + .write = bluesleep_write_proc_powerupkey, +}; + +static int rfkill_rk_register_power_key(void) +{ + int ret = 0; + + /* register input device */ + power_key_dev = input_allocate_device(); + if (!power_key_dev) { + LOG("ir_dev: not enough memory for input device\n"); + return -ENOMEM; + } + + power_key_dev->name = "bt-powerkey"; + power_key_dev->id.bustype = BUS_HOST; + + power_key_dev->evbit[0] = BIT_MASK(EV_KEY); + set_bit(KEY_POWER, power_key_dev->keybit); + + ret = input_register_device(power_key_dev); + if (ret) { + input_free_device(power_key_dev); + LOG("ir_rx_init: register input device exception, exit\n"); + return -EBUSY; + } + + return ret; +} + static int rfkill_rk_probe(struct platform_device *pdev) { struct rfkill_rk_data *rfkill; @@ -766,6 +766,14 @@ goto fail_alloc; } + /* read/write proc entries */ + ent = proc_create("powerupkey", 0, sleep_dir, &bluesleep_powerupkey); + if (!ent) { + LOG("Unable to create /proc/%s/powerupkey entry", PROC_DIR); + ret = -ENOMEM; + goto fail_alloc; + } + DBG("init gpio\n"); ret = rfkill_rk_setup_gpio(pdev, &pdata->poweron_gpio, pdata->name, @@ -824,12 +832,16 @@ LOG("%s device registered.\n", pdata->name); + if (rfkill_rk_register_power_key() != 0) + goto fail_rfkill; + return 0; fail_rfkill: rfkill_destroy(rfkill->rfkill_dev); fail_alloc: + remove_proc_entry("powerupkey", sleep_dir); remove_proc_entry("btwrite", sleep_dir); remove_proc_entry("lpm", sleep_dir); fail_setup_wake_irq: @@ -848,7 +860,11 @@ rfkill_unregister(rfkill->rfkill_dev); rfkill_destroy(rfkill->rfkill_dev); + remove_proc_entry("powerupkey", sleep_dir); + remove_proc_entry("btwrite", sleep_dir); + remove_proc_entry("lpm", sleep_dir); + input_unregister_device(power_key_dev); cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); // free gpio diff --git a/kernel/net/sched/sch_api.c b/kernel/net/sched/sch_api.c index 424e709..6b4ee7c 100644 --- a/kernel/net/sched/sch_api.c +++ b/kernel/net/sched/sch_api.c @@ -1191,7 +1191,7 @@ rcu_assign_pointer(sch->stab, stab); } if (tca[TCA_RATE]) { - seqcount_t *running; + net_seqlock_t *running; err = -EOPNOTSUPP; if (sch->flags & TCQ_F_MQROOT) { diff --git a/kernel/net/sched/sch_generic.c b/kernel/net/sched/sch_generic.c index e987be5..43ca345 100644 --- a/kernel/net/sched/sch_generic.c +++ b/kernel/net/sched/sch_generic.c @@ -576,7 +576,11 @@ .ops = &noop_qdisc_ops, .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), .dev_queue = &noop_netdev_queue, +#ifdef CONFIG_PREEMPT_RT_BASE + .running = __SEQLOCK_UNLOCKED(noop_qdisc.running), +#else .running = SEQCNT_ZERO(noop_qdisc.running), +#endif .busylock = __SPIN_LOCK_UNLOCKED(noop_qdisc.busylock), .gso_skb = { .next = (struct sk_buff *)&noop_qdisc.gso_skb, @@ -877,9 +881,17 @@ lockdep_set_class(&sch->busylock, dev->qdisc_tx_busylock ?: &qdisc_tx_busylock); +#ifdef CONFIG_PREEMPT_RT_BASE + seqlock_init(&sch->running); + lockdep_set_class(&sch->running.seqcount, + dev->qdisc_running_key ?: &qdisc_running_key); + lockdep_set_class(&sch->running.lock, + dev->qdisc_running_key ?: &qdisc_running_key); +#else seqcount_init(&sch->running); lockdep_set_class(&sch->running, dev->qdisc_running_key ?: &qdisc_running_key); +#endif sch->ops = ops; sch->flags = ops->static_flags; @@ -1253,7 +1265,7 @@ /* Wait for outstanding qdisc_run calls. */ list_for_each_entry(dev, head, close_list) { while (some_qdisc_is_busy(dev)) - yield(); + msleep(1); /* The new qdisc is assigned at this point so we can safely * unwind stale skb lists and qdisc statistics */ diff --git a/kernel/net/sunrpc/svc_xprt.c b/kernel/net/sunrpc/svc_xprt.c index 4b56b94..83a4a0a 100644 --- a/kernel/net/sunrpc/svc_xprt.c +++ b/kernel/net/sunrpc/svc_xprt.c @@ -402,7 +402,7 @@ if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) return; - cpu = get_cpu(); + cpu = get_cpu_light(); pool = svc_pool_for_cpu(xprt->xpt_server, cpu); atomic_long_inc(&pool->sp_stats.packets); @@ -426,7 +426,7 @@ rqstp = NULL; out_unlock: rcu_read_unlock(); - put_cpu(); + put_cpu_light(); trace_svc_xprt_do_enqueue(xprt, rqstp); } EXPORT_SYMBOL_GPL(svc_xprt_do_enqueue); diff --git a/kernel/net/wireless/core.h b/kernel/net/wireless/core.h index b91363a..2d554e7 100644 --- a/kernel/net/wireless/core.h +++ b/kernel/net/wireless/core.h @@ -519,6 +519,10 @@ void cfg80211_stop_nan(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev); +struct cfg80211_internal_bss * +cfg80211_bss_update(struct cfg80211_registered_device *rdev, + struct cfg80211_internal_bss *tmp, + bool signal_valid, unsigned long ts); #ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS #define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond) #else diff --git a/kernel/net/wireless/scan.c b/kernel/net/wireless/scan.c index fe4c054..32d775e 100644 --- a/kernel/net/wireless/scan.c +++ b/kernel/net/wireless/scan.c @@ -1034,17 +1034,17 @@ }; /* Returned bss is reference counted and must be cleaned up appropriately. */ -static struct cfg80211_internal_bss * +struct cfg80211_internal_bss * cfg80211_bss_update(struct cfg80211_registered_device *rdev, struct cfg80211_internal_bss *tmp, - bool signal_valid) + bool signal_valid, unsigned long ts) { struct cfg80211_internal_bss *found = NULL; if (WARN_ON(!tmp->pub.channel)) return NULL; - tmp->ts = jiffies; + tmp->ts = ts; spin_lock_bh(&rdev->bss_lock); @@ -1367,7 +1367,8 @@ signal_valid = abs(data->chan->center_freq - channel->center_freq) <= wiphy->max_adj_channel_rssi_comp; - res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid); + res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid, + jiffies); if (!res) return NULL; @@ -1691,7 +1692,8 @@ signal_valid = abs(data->chan->center_freq - channel->center_freq) <= wiphy->max_adj_channel_rssi_comp; - res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid); + res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid, + jiffies); if (!res) return NULL; diff --git a/kernel/net/wireless/sme.c b/kernel/net/wireless/sme.c index d5d9d76..4b40d1f 100644 --- a/kernel/net/wireless/sme.c +++ b/kernel/net/wireless/sme.c @@ -796,12 +796,36 @@ u8 *next; if (params->bss) { - /* Make sure the bss entry provided by the driver is valid. */ struct cfg80211_internal_bss *ibss = bss_from_pub(params->bss); - if (WARN_ON(list_empty(&ibss->list))) { - cfg80211_put_bss(wdev->wiphy, params->bss); - return; + if (list_empty(&ibss->list)) { + struct cfg80211_bss *found = NULL, *tmp = params->bss; + + found = cfg80211_get_bss(wdev->wiphy, NULL, + params->bss->bssid, + wdev->ssid, wdev->ssid_len, + wdev->conn_bss_type, + IEEE80211_PRIVACY_ANY); + if (found) { + /* The same BSS is already updated so use it + * instead, as it has latest info. + */ + params->bss = found; + } else { + /* Update with BSS provided by driver, it will + * be freshly added and ref cnted, we can free + * the old one. + * + * signal_valid can be false, as we are not + * expecting the BSS to be found. + * + * keep the old timestamp to avoid confusion + */ + cfg80211_bss_update(rdev, ibss, false, + ibss->ts); + } + + cfg80211_put_bss(wdev->wiphy, tmp); } } diff --git a/kernel/net/xfrm/xfrm_ipcomp.c b/kernel/net/xfrm/xfrm_ipcomp.c index a00ec71..a979973 100644 --- a/kernel/net/xfrm/xfrm_ipcomp.c +++ b/kernel/net/xfrm/xfrm_ipcomp.c @@ -20,6 +20,7 @@ #include <linux/list.h> #include <linux/module.h> #include <linux/mutex.h> +#include <linux/locallock.h> #include <linux/percpu.h> #include <linux/slab.h> #include <linux/smp.h> @@ -36,6 +37,7 @@ static DEFINE_MUTEX(ipcomp_resource_mutex); static void * __percpu *ipcomp_scratches; +static DEFINE_LOCAL_IRQ_LOCK(ipcomp_scratches_lock); static int ipcomp_scratch_users; static LIST_HEAD(ipcomp_tfms_list); @@ -45,12 +47,15 @@ const int plen = skb->len; int dlen = IPCOMP_SCRATCH_SIZE; const u8 *start = skb->data; - const int cpu = get_cpu(); - u8 *scratch = *per_cpu_ptr(ipcomp_scratches, cpu); - struct crypto_comp *tfm = *per_cpu_ptr(ipcd->tfms, cpu); - int err = crypto_comp_decompress(tfm, start, plen, scratch, &dlen); - int len; + u8 *scratch; + struct crypto_comp *tfm; + int err, len; + local_lock(ipcomp_scratches_lock); + + scratch = *this_cpu_ptr(ipcomp_scratches); + tfm = *this_cpu_ptr(ipcd->tfms); + err = crypto_comp_decompress(tfm, start, plen, scratch, &dlen); if (err) goto out; @@ -103,7 +108,7 @@ err = 0; out: - put_cpu(); + local_unlock(ipcomp_scratches_lock); return err; } @@ -146,6 +151,8 @@ int err; local_bh_disable(); + local_lock(ipcomp_scratches_lock); + scratch = *this_cpu_ptr(ipcomp_scratches); tfm = *this_cpu_ptr(ipcd->tfms); err = crypto_comp_compress(tfm, start, plen, scratch, &dlen); @@ -158,12 +165,14 @@ } memcpy(start + sizeof(struct ip_comp_hdr), scratch, dlen); + local_unlock(ipcomp_scratches_lock); local_bh_enable(); pskb_trim(skb, dlen + sizeof(struct ip_comp_hdr)); return 0; out: + local_unlock(ipcomp_scratches_lock); local_bh_enable(); return err; } diff --git a/kernel/samples/trace_events/trace-events-sample.c b/kernel/samples/trace_events/trace-events-sample.c index 5522692..8b4be8e 100644 --- a/kernel/samples/trace_events/trace-events-sample.c +++ b/kernel/samples/trace_events/trace-events-sample.c @@ -33,7 +33,7 @@ /* Silly tracepoints */ trace_foo_bar("hello", cnt, array, random_strings[len], - ¤t->cpus_allowed); + current->cpus_ptr); trace_foo_with_template_simple("HELLO", cnt); diff --git a/kernel/scripts/io-domain.sh b/kernel/scripts/io-domain.sh index c1647b1..7867547 100755 --- a/kernel/scripts/io-domain.sh +++ b/kernel/scripts/io-domain.sh @@ -27,8 +27,9 @@ ShowChecklist() { PMUIO2=$(whiptail --title "IO Domain Checklist" --menu --nocancel\ - "Get the corresponding value from the hardware schematic diagram" 15 60 2 \ + "Get the corresponding value from the hardware schematic diagram" 15 60 3 \ "1800000" "PMUIO2 Supply Power Voltage(uV)" \ + "3000000" "PMUIO2 Supply Power Voltage(uV)" \ "3300000" "PMUIO2 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus != 0 ]; then @@ -37,8 +38,9 @@ fi VCCIO1=$(whiptail --title "IO Domain Checklist" --menu --nocancel\ - "Get the corresponding value from the hardware schematic diagram" 15 60 2 \ + "Get the corresponding value from the hardware schematic diagram" 15 60 3 \ "1800000" "VCCIO1 Supply Power Voltage(uV)" \ + "3000000" "VCCIO1 Supply Power Voltage(uV)" \ "3300000" "VCCIO1 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus != 0 ]; then @@ -47,8 +49,9 @@ fi VCCIO3=$(whiptail --title "IO Domain Checklist" --menu --nocancel\ - "Get the corresponding value from the hardware schematic diagram" 15 60 2 \ + "Get the corresponding value from the hardware schematic diagram" 15 60 3 \ "1800000" "VCCIO3 Supply Power Voltage(uV)" \ + "3000000" "VCCIO3 Supply Power Voltage(uV)" \ "3300000" "VCCIO3 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus != 0 ]; then @@ -57,8 +60,9 @@ fi VCCIO4=$(whiptail --title "IO Domain Checklist" --menu --nocancel\ - "Get the corresponding value from the hardware schematic diagram" 15 60 2 \ + "Get the corresponding value from the hardware schematic diagram" 15 60 3 \ "1800000" "VCCIO4 Supply Power Voltage(uV)" \ + "3000000" "VCCIO4 Supply Power Voltage(uV)" \ "3300000" "VCCIO4 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus != 0 ]; then @@ -67,8 +71,9 @@ fi VCCIO5=$(whiptail --title "IO Domain Checklist" --menu --nocancel\ - "Get the corresponding value from the hardware schematic diagram" 15 60 2 \ + "Get the corresponding value from the hardware schematic diagram" 15 60 3 \ "1800000" "VCCIO5 Supply Power Voltage(uV)" \ + "3000000" "VCCIO5 Supply Power Voltage(uV)" \ "3300000" "VCCIO5 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus != 0 ]; then @@ -77,8 +82,9 @@ fi VCCIO6=$(whiptail --title "IO Domain Checklist" --menu --nocancel\ - "Get the corresponding value from the hardware schematic diagram" 15 60 2 \ + "Get the corresponding value from the hardware schematic diagram" 15 60 3 \ "1800000" "VCCIO6 Supply Power Voltage(uV)" \ + "3000000" "VCCIO6 Supply Power Voltage(uV)" \ "3300000" "VCCIO6 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus != 0 ]; then @@ -87,8 +93,9 @@ fi VCCIO7=$(whiptail --title "IO Domain Checklist" --menu --nocancel\ - "Get the corresponding value from the hardware schematic diagram" 15 60 2 \ + "Get the corresponding value from the hardware schematic diagram" 15 60 3 \ "1800000" "VCCIO7 Supply Power Voltage(uV)" \ + "3000000" "VCCIO7 Supply Power Voltage(uV)" \ "3300000" "VCCIO7 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus != 0 ]; then diff --git a/kernel/scripts/mkcompile_h b/kernel/scripts/mkcompile_h index 19de4cd..a4bde25 100755 --- a/kernel/scripts/mkcompile_h +++ b/kernel/scripts/mkcompile_h @@ -5,8 +5,9 @@ ARCH=$2 SMP=$3 PREEMPT=$4 -CC=$5 -LD=$6 +RT=$5 +CC=$6 +LD=$7 vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } @@ -54,6 +55,7 @@ CONFIG_FLAGS="" if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi +if [ -n "$RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS RT"; fi UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP" # Truncate to maximum length diff --git a/kernel/scripts/mkimg b/kernel/scripts/mkimg index 01b4b3c..0d3157d 100755 --- a/kernel/scripts/mkimg +++ b/kernel/scripts/mkimg @@ -245,9 +245,9 @@ fi scripts/resource_tool ${DTB_PATH} ${LOGO} ${LOGO_KERNEL} >/dev/null -if [ "${ARCH}" == "arm64" ]; then - ${srctree}/scripts/io-domain.sh ${srctree}/arch/arm64/boot/dts/rockchip/.${DTB} -fi +#if [ "${ARCH}" == "arm64" ]; then +# ${srctree}/scripts/io-domain.sh ${srctree}/arch/arm64/boot/dts/rockchip/.${DTB} +#fi echo " Image: resource.img (with ${DTB} ${LOGO} ${LOGO_KERNEL}) is ready" diff --git a/kernel/security/apparmor/include/path.h b/kernel/security/apparmor/include/path.h index b6380c5..12abfdd 100644 --- a/kernel/security/apparmor/include/path.h +++ b/kernel/security/apparmor/include/path.h @@ -40,8 +40,10 @@ #include <linux/percpu.h> #include <linux/preempt.h> +#include <linux/locallock.h> DECLARE_PER_CPU(struct aa_buffers, aa_buffers); +DECLARE_LOCAL_IRQ_LOCK(aa_buffers_lock); #define ASSIGN(FN, A, X, N) ((X) = FN(A, N)) #define EVAL1(FN, A, X) ASSIGN(FN, A, X, 0) /*X = FN(0)*/ @@ -51,7 +53,17 @@ #define for_each_cpu_buffer(I) for ((I) = 0; (I) < MAX_PATH_BUFFERS; (I)++) -#ifdef CONFIG_DEBUG_PREEMPT +#ifdef CONFIG_PREEMPT_RT_BASE +static inline void AA_BUG_PREEMPT_ENABLED(const char *s) +{ + struct local_irq_lock *lv; + + lv = this_cpu_ptr(&aa_buffers_lock); + WARN_ONCE(lv->owner != current, + "__get_buffer without aa_buffers_lock\n"); +} + +#elif defined(CONFIG_DEBUG_PREEMPT) #define AA_BUG_PREEMPT_ENABLED(X) AA_BUG(preempt_count() <= 0, X) #else #define AA_BUG_PREEMPT_ENABLED(X) /* nop */ @@ -67,14 +79,15 @@ #define get_buffers(X...) \ do { \ - struct aa_buffers *__cpu_var = get_cpu_ptr(&aa_buffers); \ + struct aa_buffers *__cpu_var; \ + __cpu_var = get_locked_ptr(aa_buffers_lock, &aa_buffers); \ __get_buffers(__cpu_var, X); \ } while (0) #define put_buffers(X, Y...) \ do { \ __put_buffers(X, Y); \ - put_cpu_ptr(&aa_buffers); \ + put_locked_ptr(aa_buffers_lock, &aa_buffers); \ } while (0) #endif /* __AA_PATH_H */ diff --git a/kernel/security/apparmor/lsm.c b/kernel/security/apparmor/lsm.c index 898752b..690c8fc 100644 --- a/kernel/security/apparmor/lsm.c +++ b/kernel/security/apparmor/lsm.c @@ -45,7 +45,7 @@ int apparmor_initialized; DEFINE_PER_CPU(struct aa_buffers, aa_buffers); - +DEFINE_LOCAL_IRQ_LOCK(aa_buffers_lock); /* * LSM hook functions diff --git a/kernel/sound/core/control_compat.c b/kernel/sound/core/control_compat.c index 3fc2166..00d826b 100644 --- a/kernel/sound/core/control_compat.c +++ b/kernel/sound/core/control_compat.c @@ -319,7 +319,9 @@ err = snd_power_wait(card, SNDRV_CTL_POWER_D0); if (err < 0) goto error; + down_read(&card->controls_rwsem); err = snd_ctl_elem_read(card, data); + up_read(&card->controls_rwsem); if (err < 0) goto error; err = copy_ctl_value_to_user(userdata, valuep, data, type, count); @@ -347,7 +349,9 @@ err = snd_power_wait(card, SNDRV_CTL_POWER_D0); if (err < 0) goto error; + down_write(&card->controls_rwsem); err = snd_ctl_elem_write(card, file, data); + up_write(&card->controls_rwsem); if (err < 0) goto error; err = copy_ctl_value_to_user(userdata, valuep, data, type, count); diff --git a/kernel/sound/core/pcm_dmaengine.c b/kernel/sound/core/pcm_dmaengine.c index 02d3fb4..587489a 100644 --- a/kernel/sound/core/pcm_dmaengine.c +++ b/kernel/sound/core/pcm_dmaengine.c @@ -27,6 +27,7 @@ #include <sound/soc.h> #include <sound/dmaengine_pcm.h> +#include "pcm_local.h" struct dmaengine_pcm_runtime_data { struct dma_chan *dma_chan; @@ -140,11 +141,20 @@ static void dmaengine_pcm_dma_complete(void *arg) { struct snd_pcm_substream *substream = arg; - struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream); + struct dmaengine_pcm_runtime_data *prtd; + + snd_pcm_stream_lock_irq(substream); + if (PCM_RUNTIME_CHECK(substream)) { + snd_pcm_stream_unlock_irq(substream); + return; + } + + prtd = substream_to_prtd(substream); prtd->pos += snd_pcm_lib_period_bytes(substream); if (prtd->pos >= snd_pcm_lib_buffer_bytes(substream)) prtd->pos = 0; + snd_pcm_stream_unlock_irq(substream); snd_pcm_period_elapsed(substream); } diff --git a/kernel/sound/core/pcm_lib.c b/kernel/sound/core/pcm_lib.c index 64f5e48..546b9d6 100644 --- a/kernel/sound/core/pcm_lib.c +++ b/kernel/sound/core/pcm_lib.c @@ -43,6 +43,7 @@ #define trace_xrun(substream) #define trace_hw_ptr_error(substream, reason) #define trace_applptr(substream, prev, curr) +#define trace_applptr_start(substream, frame) #endif #define STRING_LENGTH_OF_INT 12 @@ -2139,6 +2140,8 @@ if (err < 0) return err; + trace_applptr_start(substream, size); + is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; if (interleaved) { if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED && diff --git a/kernel/sound/core/pcm_trace.h b/kernel/sound/core/pcm_trace.h index f18da20..535fbaa 100644 --- a/kernel/sound/core/pcm_trace.h +++ b/kernel/sound/core/pcm_trace.h @@ -141,6 +141,32 @@ ) ); +TRACE_EVENT(applptr_start, + TP_PROTO(struct snd_pcm_substream *substream, snd_pcm_uframes_t size), + TP_ARGS(substream, size), + TP_STRUCT__entry( + __field( unsigned int, card ) + __field( unsigned int, device ) + __field( unsigned int, number ) + __field( unsigned int, stream ) + __field( snd_pcm_uframes_t, size ) + ), + TP_fast_assign( + __entry->card = (substream)->pcm->card->number; + __entry->device = (substream)->pcm->device; + __entry->number = (substream)->number; + __entry->stream = (substream)->stream; + __entry->size = (size); + ), + TP_printk("pcmC%dD%d%s/sub%d: size=%lu", + __entry->card, + __entry->device, + __entry->stream ? "c" : "p", + __entry->number, + __entry->size + ) +); + #endif /* _PCM_TRACE_H */ /* This part must be outside protection */ diff --git a/kernel/sound/soc/codecs/Kconfig b/kernel/sound/soc/codecs/Kconfig index ff3c7fc..d57ba80 100644 --- a/kernel/sound/soc/codecs/Kconfig +++ b/kernel/sound/soc/codecs/Kconfig @@ -135,6 +135,7 @@ select SND_SOC_RK3228 select SND_SOC_RK3308 select SND_SOC_RK3328 + select SND_SOC_RK3528 select SND_SOC_RK817 if I2C select SND_SOC_RT274 if I2C select SND_SOC_RT286 if I2C @@ -840,6 +841,10 @@ select REGMAP_MMIO tristate "Rockchip RK3328 CODEC" +config SND_SOC_RK3528 + select REGMAP_MMIO + tristate "Rockchip RK3528 CODEC" + config SND_SOC_RK630 tristate "Rockchip RK630 CODEC" depends on MFD_RK630 diff --git a/kernel/sound/soc/codecs/Makefile b/kernel/sound/soc/codecs/Makefile index 4fb7a24..2518f6a 100644 --- a/kernel/sound/soc/codecs/Makefile +++ b/kernel/sound/soc/codecs/Makefile @@ -139,6 +139,7 @@ snd-soc-rk3228-objs := rk3228_codec.o snd-soc-rk3308-objs := rk3308_codec.o snd-soc-rk3328-objs := rk3328_codec.o +snd-soc-rk3528-objs := rk3528_codec.o snd-soc-rk630-objs := rk630_codec.o snd-soc-rk817-objs := rk817_codec.o snd-soc-rk-codec-digital-objs := rk_codec_digital.o @@ -415,6 +416,7 @@ obj-$(CONFIG_SND_SOC_RK3228) += snd-soc-rk3228.o obj-$(CONFIG_SND_SOC_RK3308) += snd-soc-rk3308.o obj-$(CONFIG_SND_SOC_RK3328) += snd-soc-rk3328.o +obj-$(CONFIG_SND_SOC_RK3528) += snd-soc-rk3528.o obj-$(CONFIG_SND_SOC_RK630) += snd-soc-rk630.o obj-$(CONFIG_SND_SOC_RK817) += snd-soc-rk817.o obj-$(CONFIG_SND_SOC_RK_CODEC_DIGITAL) += snd-soc-rk-codec-digital.o diff --git a/kernel/sound/soc/codecs/hdmi-codec.c b/kernel/sound/soc/codecs/hdmi-codec.c index 0cb4976..93fa207 100644 --- a/kernel/sound/soc/codecs/hdmi-codec.c +++ b/kernel/sound/soc/codecs/hdmi-codec.c @@ -14,6 +14,7 @@ */ #include <linux/module.h> #include <linux/string.h> +#include <linux/extcon-provider.h> #include <sound/core.h> #include <sound/jack.h> #include <sound/pcm.h> @@ -277,6 +278,11 @@ .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC }, }; +static const unsigned int hdmi_extcon_cable[] = { + EXTCON_DISP_HDMI_AUDIO, + EXTCON_NONE, +}; + struct hdmi_codec_priv { struct hdmi_codec_pdata hcd; struct snd_soc_dai_driver *daidrv; @@ -288,6 +294,7 @@ unsigned int chmap_idx; unsigned int mode; struct snd_soc_jack *jack; + struct extcon_dev *edev; unsigned int jack_status; }; @@ -498,7 +505,8 @@ WARN_ON(hcp->current_stream != substream); hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN; - hcp->hcd.ops->audio_shutdown(dai->dev->parent, hcp->hcd.data); + if (hcp->hcd.ops->audio_shutdown) + hcp->hcd.ops->audio_shutdown(dai->dev->parent, hcp->hcd.data); mutex_lock(&hcp->current_stream_lock); hcp->current_stream = NULL; @@ -774,10 +782,48 @@ { struct hdmi_codec_priv *hcp = dev_get_drvdata(dev); - if (plugged) + if (plugged) { hdmi_codec_jack_report(hcp, SND_JACK_LINEOUT); - else + extcon_set_state_sync(hcp->edev, + EXTCON_DISP_HDMI_AUDIO, true); + } else { hdmi_codec_jack_report(hcp, 0); + extcon_set_state_sync(hcp->edev, + EXTCON_DISP_HDMI_AUDIO, false); + } + + mutex_lock(&hcp->current_stream_lock); + if (hcp->current_stream) { + /* + * Workaround for HDMIIN and HDMIOUT plug-{in,out} when streaming. + * + * Actually, we should do stop stream both for HDMI_{OUT,IN} on + * plug-{out,in} event. but for better experience and depop stream, + * we optimize as follows: + * + * a) Do stop stream for HDMIIN on plug-out when streaming. + * because HDMIIN work as SLAVE mode, CLK lost after HDMI cable + * plugged out which will make stream stuck until ALSA timeout(10s). + * so, for better experience, we should stop stream at the moment. + * + * b) Do stop stream for HDMIOUT on plug-in when streaming. + * because HDMIOUT work as MASTER mode, there is no clk-issue like + * HDMIIN, but, on HDR situation, HDMI will be reconfigured which + * make HDMI audio configure lost, especially for NLPCM/HBR bitstream + * which require IEC937 packet alignment, so, for this situation, + * we stop stream to notify user to re-open and configure sound card + * and then go on streaming. + */ + int stream = hcp->current_stream->stream; + + if (stream == SNDRV_PCM_STREAM_PLAYBACK && plugged) + snd_pcm_stop(hcp->current_stream, SNDRV_PCM_STATE_SETUP); + else if (stream == SNDRV_PCM_STREAM_CAPTURE && !plugged) + snd_pcm_stop(hcp->current_stream, SNDRV_PCM_STATE_DISCONNECTED); + + dev_dbg(dev, "stream[%d]: %s\n", stream, plugged ? "plug in" : "plug out"); + } + mutex_unlock(&hcp->current_stream_lock); } static int hdmi_codec_set_jack(struct snd_soc_component *component, @@ -884,8 +930,7 @@ } dai_count = hcd->i2s + hcd->spdif; - if (dai_count < 1 || !hcd->ops || !hcd->ops->hw_params || - !hcd->ops->audio_shutdown) { + if (dai_count < 1 || !hcd->ops || !hcd->ops->hw_params) { dev_err(dev, "%s: Invalid parameters\n", __func__); return -EINVAL; } @@ -916,6 +961,18 @@ dev_set_drvdata(dev, hcp); + hcp->edev = devm_extcon_dev_allocate(&pdev->dev, hdmi_extcon_cable); + if (IS_ERR(hcp->edev)) { + dev_err(&pdev->dev, "Failed to allocate extcon device\n"); + return -ENOMEM; + } + + ret = devm_extcon_dev_register(&pdev->dev, hcp->edev); + if (ret < 0) { + dev_err(&pdev->dev, "Failed to register extcon device\n"); + return ret; + } + ret = devm_snd_soc_register_component(dev, &hdmi_driver, hcp->daidrv, dai_count); if (ret) { diff --git a/kernel/sound/soc/codecs/rk312x_codec.c b/kernel/sound/soc/codecs/rk312x_codec.c index 085c20a..2c742dc 100644 --- a/kernel/sound/soc/codecs/rk312x_codec.c +++ b/kernel/sound/soc/codecs/rk312x_codec.c @@ -1424,8 +1424,7 @@ struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_component *component = rtd->codec_dai->component; + struct snd_soc_component *component = dai->component; struct rk312x_codec_priv *rk312x = rk312x_priv; unsigned int rate = params_rate(params); unsigned int div; diff --git a/kernel/sound/soc/codecs/rk3528_codec.c b/kernel/sound/soc/codecs/rk3528_codec.c new file mode 100644 index 0000000..4e55c3e --- /dev/null +++ b/kernel/sound/soc/codecs/rk3528_codec.c @@ -0,0 +1,771 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * rk3528_codec.c - Rockchip RK3528 SoC Codec Driver + * + * Copyright (C) 2022 Rockchip Electronics Co., Ltd. + */ + +#include <linux/clk.h> +#include <linux/device.h> +#include <linux/delay.h> +#include <linux/module.h> +#include <linux/of_gpio.h> +#include <linux/of_platform.h> +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> +#include <linux/regmap.h> +#include <linux/reset.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/tlv.h> + +#include "rk3528_codec.h" + +#define CODEC_DRV_NAME "rk3528-acodec" + +struct rk3528_codec_priv { + const struct device *plat_dev; + struct reset_control *reset; + struct regmap *regmap; + struct clk *pclk; + struct clk *mclk; + struct gpio_desc *pa_ctl_gpio; + struct snd_soc_component *component; + u32 pa_ctl_delay_ms; +}; + +static void rk3528_codec_pa_ctrl(struct rk3528_codec_priv *rk3528, bool on) +{ + if (!rk3528->pa_ctl_gpio) + return; + + if (on) { + gpiod_direction_output(rk3528->pa_ctl_gpio, on); + msleep(rk3528->pa_ctl_delay_ms); + } else { + gpiod_direction_output(rk3528->pa_ctl_gpio, on); + } +} + +static int rk3528_codec_reset(struct snd_soc_component *component) +{ + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + + reset_control_assert(rk3528->reset); + usleep_range(10000, 11000); /* estimated value */ + reset_control_deassert(rk3528->reset); + + regmap_update_bits(rk3528->regmap, ACODEC_DIG00, + ACODEC_DAC_RST_MASK | + ACODEC_SYS_RST_MASK, + ACODEC_DAC_RST_N | + ACODEC_SYS_RST_N); + regmap_update_bits(rk3528->regmap, ACODEC_DIG02, + ACODEC_DAC_I2S_RST_MASK, + ACODEC_DAC_I2S_RST_N); + usleep_range(10000, 11000); /* estimated value */ + regmap_update_bits(rk3528->regmap, ACODEC_DIG00, + ACODEC_DAC_RST_MASK | + ACODEC_SYS_RST_MASK, + ACODEC_DAC_RST_P | + ACODEC_SYS_RST_P); + regmap_update_bits(rk3528->regmap, ACODEC_DIG02, + ACODEC_DAC_I2S_RST_MASK, + ACODEC_DAC_I2S_RST_P); + + return 0; +} + +static int rk3528_codec_power_on(struct rk3528_codec_priv *rk3528) +{ + /* vendor step 0, Supply the power of the digital part and reset the audio codec. */ + /* vendor step 1 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_POP_CTRL_MASK, + ACODEC_DAC_L_POP_CTRL_ON); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_POP_CTRL_MASK, + ACODEC_DAC_R_POP_CTRL_ON); + /* vendor step 2 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA01, + ACODEC_VREF_SEL_MASK, ACODEC_VREF_SEL(0xff)); + /* vendor step 3, supply the power of the analog part */ + /* vendor step 4 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA00, + ACODEC_VREF_MASK, ACODEC_VREF_EN); + + /* vendor step 5, Wait until the voltage of VCM keeps stable at the AVDD/2. */ + usleep_range(20000, 22000); + /* vendor step 6 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA01, + ACODEC_VREF_SEL_MASK, ACODEC_VREF_SEL(2)); + return 0; +} + +static int rk3528_codec_power_off(struct rk3528_codec_priv *rk3528) +{ + /* + * vendor step 0. Keep the power on and disable the DAC and ADC path. + */ + /* vendor step 1 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA01, + ACODEC_VREF_SEL_MASK, ACODEC_VREF_SEL(0xff)); + /* vendor step 2 */ + /* vendor step 3 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA00, + ACODEC_VREF_MASK, ACODEC_VREF_DIS); + /* vendor step 4. Wait until the voltage of VCM keep stable at AGND. */ + usleep_range(20000, 22000); + /* vendor step 5, power off the analog power supply */ + /* vendor step 6, power off the digital power supply */ + + return 0; +} + +static int rk3528_codec_dac_enable(struct rk3528_codec_priv *rk3528) +{ + /* vendor step 0, power up the codec and input the mute signal */ + /* vendor step 1 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA00, + ACODEC_IBIAS_DAC_MASK, + ACODEC_IBIAS_DAC_EN); + /* vendor step 2 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_BUF_MASK, + ACODEC_DAC_L_BUF_EN); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_BUF_MASK, + ACODEC_DAC_R_BUF_EN); + /* vendor step 3 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_POP_CTRL_MASK, + ACODEC_DAC_L_POP_CTRL_ON); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_POP_CTRL_MASK, + ACODEC_DAC_R_POP_CTRL_ON); + /* vendor step 4 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA09, + ACODEC_LINEOUT_L_MASK, + ACODEC_LINEOUT_L_EN); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0D, + ACODEC_LINEOUT_R_MASK, + ACODEC_LINEOUT_R_EN); + /* vendor step 5 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA09, + ACODEC_LINEOUT_L_INIT_MASK, + ACODEC_LINEOUT_L_INIT_WORK); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0D, + ACODEC_LINEOUT_R_INIT_MASK, + ACODEC_LINEOUT_R_INIT_WORK); + /* vendor step 6 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_VREF_MASK, + ACODEC_DAC_L_VREF_EN); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_VREF_MASK, + ACODEC_DAC_R_VREF_EN); + /* vendor step 7 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_CLK_MASK, + ACODEC_DAC_L_CLK_EN); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_CLK_MASK, + ACODEC_DAC_R_CLK_EN); + /* vendor step 8 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_MASK, + ACODEC_DAC_L_EN); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_MASK, + ACODEC_DAC_R_EN); + /* vendor step 9 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_INIT_MASK, + ACODEC_DAC_L_WORK); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_INIT_MASK, + ACODEC_DAC_R_WORK); + /* vendor step 10 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA09, + ACODEC_LINEOUT_L_MUTE_MASK, + ACODEC_LINEOUT_L_WORK); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0D, + ACODEC_LINEOUT_R_MUTE_MASK, + ACODEC_LINEOUT_R_WORK); + /* vendor step 11, select the gain */ + /* vendor step 12, play music */ + + return 0; +} + +static int rk3528_codec_dac_disable(struct rk3528_codec_priv *rk3528) +{ + /* vendor step 0, keep the dac channel work and input the mute signal */ + /* vendor step 1, select the gain */ + /* vendor step 2 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA09, + ACODEC_LINEOUT_L_MUTE_MASK, + ACODEC_LINEOUT_L_MUTE); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0D, + ACODEC_LINEOUT_R_MUTE_MASK, + ACODEC_LINEOUT_R_MUTE); + /* vendor step 3 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA09, + ACODEC_LINEOUT_L_INIT_MASK, + ACODEC_LINEOUT_L_INIT); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0D, + ACODEC_LINEOUT_R_INIT_MASK, + ACODEC_LINEOUT_R_INIT); + /* vendor step 4 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA09, + ACODEC_LINEOUT_L_MASK, + ACODEC_LINEOUT_L_DIS); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0D, + ACODEC_LINEOUT_R_MASK, + ACODEC_LINEOUT_R_DIS); + /* vendor step 5 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_MASK, + ACODEC_DAC_L_DIS); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_MASK, + ACODEC_DAC_R_DIS); + /* vendor step 6 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_CLK_MASK, + ACODEC_DAC_L_CLK_DIS); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_CLK_MASK, + ACODEC_DAC_R_CLK_DIS); + /* vendor step 7 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_VREF_MASK, + ACODEC_DAC_L_VREF_DIS); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_VREF_MASK, + ACODEC_DAC_R_VREF_DIS); + /* vendor step 8 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_POP_CTRL_MASK, + ACODEC_DAC_L_POP_CTRL_OFF); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_POP_CTRL_MASK, + ACODEC_DAC_R_POP_CTRL_OFF); + /* vendor step 9 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_BUF_MASK, + ACODEC_DAC_L_BUF_DIS); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_BUF_MASK, + ACODEC_DAC_R_BUF_DIS); + /* vendor step 10 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA00, + ACODEC_IBIAS_DAC_MASK, + ACODEC_IBIAS_DAC_DIS); + /* vendor step 9 */ + regmap_update_bits(rk3528->regmap, ACODEC_ANA08, + ACODEC_DAC_L_INIT_MASK, + ACODEC_DAC_L_INIT); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0C, + ACODEC_DAC_R_INIT_MASK, + ACODEC_DAC_R_INIT); + + return 0; +} + +static int rk3528_codec_dac_dig_config(struct rk3528_codec_priv *rk3528, + struct snd_pcm_hw_params *params) +{ + unsigned int dac_aif1 = 0; + + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + dac_aif1 |= ACODEC_DAC_I2S_16B; + break; + case SNDRV_PCM_FORMAT_S20_3LE: + dac_aif1 |= ACODEC_DAC_I2S_20B; + break; + case SNDRV_PCM_FORMAT_S24_LE: + dac_aif1 |= ACODEC_DAC_I2S_24B; + break; + case SNDRV_PCM_FORMAT_S32_LE: + dac_aif1 |= ACODEC_DAC_I2S_32B; + break; + default: + return -EINVAL; + } + + dac_aif1 |= ACODEC_DAC_I2S_I2S; + regmap_update_bits(rk3528->regmap, ACODEC_DIG01, + ACODEC_DAC_I2S_WL_MASK | + ACODEC_DAC_I2S_FMT_MASK, + dac_aif1); + regmap_update_bits(rk3528->regmap, ACODEC_DIG02, + ACODEC_DAC_I2S_RST_MASK, + ACODEC_DAC_I2S_RST_P); + + return 0; +} + +static int rk3528_set_dai_fmt(struct snd_soc_dai *codec_dai, + unsigned int fmt) +{ + struct snd_soc_component *component = codec_dai->component; + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + unsigned int dac_aif1 = 0, dac_aif2 = 0; + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: + dac_aif2 |= ACODEC_DAC_I2S_MST_FUNC_SLAVE; + dac_aif2 |= ACODEC_DAC_I2S_MST_IO_SLAVE; + break; + case SND_SOC_DAIFMT_CBM_CFM: + dac_aif2 |= ACODEC_DAC_I2S_MST_FUNC_MASTER; + dac_aif2 |= ACODEC_DAC_I2S_MST_IO_MASTER; + break; + default: + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + dac_aif1 |= ACODEC_DAC_I2S_I2S; + break; + case SND_SOC_DAIFMT_LEFT_J: + dac_aif1 |= ACODEC_DAC_I2S_LJM; + break; + default: + return -EINVAL; + } + + regmap_update_bits(rk3528->regmap, ACODEC_DIG01, + ACODEC_DAC_I2S_FMT_MASK, + dac_aif1); + regmap_update_bits(rk3528->regmap, ACODEC_DIG02, + ACODEC_DAC_I2S_MST_FUNC_MASK | + ACODEC_DAC_I2S_MST_IO_MASK, + dac_aif2); + + return 0; +} + +static int rk3528_mute_stream(struct snd_soc_dai *dai, int mute, int stream) +{ + struct snd_soc_component *component = dai->component; + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { + if (mute) { + /* Mute DAC LINEOUT */ + regmap_update_bits(rk3528->regmap, + ACODEC_ANA09, + ACODEC_LINEOUT_L_MUTE_MASK, + ACODEC_LINEOUT_L_MUTE); + regmap_update_bits(rk3528->regmap, + ACODEC_ANA0D, + ACODEC_LINEOUT_R_MUTE_MASK, + ACODEC_LINEOUT_R_MUTE); + rk3528_codec_pa_ctrl(rk3528, false); + } else { + /* Unmute DAC LINEOUT */ + regmap_update_bits(rk3528->regmap, + ACODEC_ANA09, + ACODEC_LINEOUT_L_MUTE_MASK, + ACODEC_LINEOUT_L_WORK); + regmap_update_bits(rk3528->regmap, + ACODEC_ANA0D, + ACODEC_LINEOUT_R_MUTE_MASK, + ACODEC_LINEOUT_R_WORK); + rk3528_codec_pa_ctrl(rk3528, true); + } + } + + return 0; +} + +static int rk3528_codec_default_gains(struct rk3528_codec_priv *rk3528) +{ + /* Prepare DAC gains */ + /* set LINEOUT default gains */ + regmap_update_bits(rk3528->regmap, ACODEC_DIG06, + ACODEC_DAC_DIG_GAIN_MASK, + ACODEC_DAC_DIG_GAIN(ACODEC_DAC_DIG_0DB)); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0B, + ACODEC_LINEOUT_L_GAIN_MASK, + ACODEC_DAC_LINEOUT_GAIN_0DB); + regmap_update_bits(rk3528->regmap, ACODEC_ANA0F, + ACODEC_LINEOUT_R_GAIN_MASK, + ACODEC_DAC_LINEOUT_GAIN_0DB); + + return 0; +} + +static int rk3528_codec_open_playback(struct rk3528_codec_priv *rk3528) +{ + rk3528_codec_dac_enable(rk3528); + + return 0; +} + +static int rk3528_codec_close_playback(struct rk3528_codec_priv *rk3528) +{ + rk3528_codec_dac_disable(rk3528); + return 0; +} + +static int rk3528_codec_dlp_down(struct rk3528_codec_priv *rk3528) +{ + return 0; +} + +static int rk3528_codec_dlp_up(struct rk3528_codec_priv *rk3528) +{ + rk3528_codec_power_on(rk3528); + + return 0; +} + +static int rk3528_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_component *component = dai->component; + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + rk3528_codec_open_playback(rk3528); + rk3528_codec_dac_dig_config(rk3528, params); + } + + return 0; +} + +static void rk3528_pcm_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_component *component = dai->component; + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + rk3528_codec_close_playback(rk3528); + + regcache_cache_only(rk3528->regmap, false); + regcache_sync(rk3528->regmap); +} + +static int rk3528_codec_prepare(struct rk3528_codec_priv *rk3528) +{ + /* Clear registers for ADC and DAC */ + rk3528_codec_close_playback(rk3528); + rk3528_codec_default_gains(rk3528); + + return 0; +} + +static int rk3528_set_sysclk(struct snd_soc_dai *dai, int clk_id, + unsigned int freq, int dir) +{ + struct snd_soc_component *component = dai->component; + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + int ret; + + if (!freq) + return 0; + + ret = clk_set_rate(rk3528->mclk, freq); + if (ret) + dev_err(rk3528->plat_dev, "Failed to set mclk %d\n", ret); + + return ret; +} + +static const struct snd_soc_dai_ops rk3528_dai_ops = { + .hw_params = rk3528_hw_params, + .set_fmt = rk3528_set_dai_fmt, + .mute_stream = rk3528_mute_stream, + .shutdown = rk3528_pcm_shutdown, + .set_sysclk = rk3528_set_sysclk, +}; + +static struct snd_soc_dai_driver rk3528_dai[] = { + { + .name = "rk3528-hifi", + .id = ACODEC_HIFI, + .playback = { + .stream_name = "HiFi Playback", + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_192000, + .formats = (SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S32_LE), + }, + .ops = &rk3528_dai_ops, + }, +}; + +static int rk3528_codec_probe(struct snd_soc_component *component) +{ + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + + rk3528->component = component; + rk3528_codec_reset(component); + rk3528_codec_dlp_up(rk3528); + rk3528_codec_prepare(rk3528); + regcache_cache_only(rk3528->regmap, false); + regcache_sync(rk3528->regmap); + + return 0; +} + +static void rk3528_codec_remove(struct snd_soc_component *component) +{ + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + + rk3528_codec_pa_ctrl(rk3528, false); + rk3528_codec_power_off(rk3528); + regcache_cache_only(rk3528->regmap, false); + regcache_sync(rk3528->regmap); +} + +static int rk3528_codec_suspend(struct snd_soc_component *component) +{ + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + + rk3528_codec_dlp_down(rk3528); + regcache_cache_only(rk3528->regmap, true); + clk_disable_unprepare(rk3528->mclk); + clk_disable_unprepare(rk3528->pclk); + + return 0; +} + +static int rk3528_codec_resume(struct snd_soc_component *component) +{ + struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component); + int ret = 0; + + ret = clk_prepare_enable(rk3528->pclk); + if (ret < 0) { + dev_err(rk3528->plat_dev, + "Failed to enable acodec pclk: %d\n", ret); + goto pclk_error; + } + + ret = clk_prepare_enable(rk3528->mclk); + if (ret < 0) { + dev_err(rk3528->plat_dev, + "Failed to enable acodec mclk: %d\n", ret); + goto mclk_error; + } + + regcache_cache_only(rk3528->regmap, false); + ret = regcache_sync(rk3528->regmap); + if (ret) + goto reg_error; + + rk3528_codec_dlp_up(rk3528); + + return 0; +reg_error: + clk_disable_unprepare(rk3528->mclk); +mclk_error: + clk_disable_unprepare(rk3528->pclk); +pclk_error: + return ret; +} + +static const DECLARE_TLV_DB_SCALE(rk3528_codec_dac_lineout_gain_tlv, + -3900, 150, 600); + +static const struct snd_kcontrol_new rk3528_codec_dapm_controls[] = { + /* DAC LINEOUT */ + SOC_SINGLE_RANGE_TLV("DAC LEFT LINEOUT Volume", + ACODEC_ANA0B, + ACODEC_LINEOUT_L_GAIN_SHIFT, + ACODEC_DAC_LINEOUT_GAIN_MIN, + ACODEC_DAC_LINEOUT_GAIN_MAX, + 0, rk3528_codec_dac_lineout_gain_tlv), + SOC_SINGLE_RANGE_TLV("DAC RIGHT LINEOUT Volume", + ACODEC_ANA0F, + ACODEC_LINEOUT_R_GAIN_SHIFT, + ACODEC_DAC_LINEOUT_GAIN_MIN, + ACODEC_DAC_LINEOUT_GAIN_MAX, + 0, rk3528_codec_dac_lineout_gain_tlv), +}; + +static const struct snd_soc_component_driver soc_codec_dev_rk3528 = { + .probe = rk3528_codec_probe, + .remove = rk3528_codec_remove, + .suspend = rk3528_codec_suspend, + .resume = rk3528_codec_resume, + .controls = rk3528_codec_dapm_controls, + .num_controls = ARRAY_SIZE(rk3528_codec_dapm_controls), +}; + +/* Set the default value or reset value */ +static const struct reg_default rk3528_codec_reg_defaults[] = { + { ACODEC_DIG00, 0x71 }, + { ACODEC_DIG03, 0x53 }, + { ACODEC_DIG07, 0x03 }, + { ACODEC_DIG08, 0xc3 }, + { ACODEC_DIG09, 0x28 }, + { ACODEC_DIG0A, 0x1 }, + { ACODEC_DIG0B, 0x80 }, + { ACODEC_DIG0D, 0xc3 }, + { ACODEC_DIG0E, 0xc3 }, + { ACODEC_DIG10, 0xf1 }, + { ACODEC_DIG11, 0xf1 }, + { ACODEC_ANA02, 0x77 }, + { ACODEC_ANA08, 0x20 }, + { ACODEC_ANA0A, 0x8 }, + { ACODEC_ANA0C, 0x20 }, + { ACODEC_ANA0E, 0x8 }, +}; + +static bool rk3528_codec_volatile_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case ACODEC_DIG00: + return true; + default: + return false; + } + return true; +} + +static const struct regmap_config rk3528_codec_regmap_config = { + .reg_bits = 32, + .reg_stride = 4, + .val_bits = 32, + .max_register = ACODEC_REG_MAX, + .volatile_reg = rk3528_codec_volatile_reg, + .reg_defaults = rk3528_codec_reg_defaults, + .num_reg_defaults = ARRAY_SIZE(rk3528_codec_reg_defaults), + .cache_type = REGCACHE_FLAT, +}; + +static const struct of_device_id rk3528_codec_of_match[] = { + { .compatible = "rockchip,rk3528-codec", }, + {}, +}; + +MODULE_DEVICE_TABLE(of, rk3528_codec_of_match); + +static int rk3528_platform_probe(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node; + struct rk3528_codec_priv *rk3528; + struct resource *res; + void __iomem *base; + int ret; + + rk3528 = devm_kzalloc(&pdev->dev, sizeof(*rk3528), GFP_KERNEL); + if (!rk3528) + return -ENOMEM; + + rk3528->plat_dev = &pdev->dev; + rk3528->reset = devm_reset_control_get_optional_exclusive(&pdev->dev, "acodec"); + if (IS_ERR(rk3528->reset)) + return PTR_ERR(rk3528->reset); + + rk3528->pa_ctl_gpio = devm_gpiod_get_optional(&pdev->dev, "pa-ctl", + GPIOD_OUT_LOW); + if (IS_ERR(rk3528->pa_ctl_gpio)) { + dev_err(&pdev->dev, "Unable to claim gpio pa-ctl\n"); + return -EINVAL; + } + + if (rk3528->pa_ctl_gpio) + of_property_read_u32(np, "pa-ctl-delay-ms", + &rk3528->pa_ctl_delay_ms); + + dev_info(&pdev->dev, "%s pa_ctl_gpio and pa_ctl_delay_ms: %d\n", + rk3528->pa_ctl_gpio ? "Use" : "No use", + rk3528->pa_ctl_delay_ms); + + /* Close external PA during startup. */ + rk3528_codec_pa_ctrl(rk3528, false); + + rk3528->pclk = devm_clk_get(&pdev->dev, "pclk"); + if (IS_ERR(rk3528->pclk)) { + dev_err(&pdev->dev, "Can't get acodec pclk\n"); + return -EINVAL; + } + + rk3528->mclk = devm_clk_get(&pdev->dev, "mclk"); + if (IS_ERR(rk3528->mclk)) { + dev_err(&pdev->dev, "Can't get acodec mclk\n"); + return -EINVAL; + } + + ret = clk_prepare_enable(rk3528->pclk); + if (ret < 0) { + dev_err(&pdev->dev, "Failed to enable acodec pclk: %d\n", ret); + return ret; + } + + ret = clk_prepare_enable(rk3528->mclk); + if (ret < 0) { + dev_err(&pdev->dev, "Failed to enable acodec mclk: %d\n", ret); + goto failed_1; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(base)) { + ret = PTR_ERR(base); + dev_err(&pdev->dev, "Failed to ioremap resource\n"); + goto failed; + } + + rk3528->regmap = devm_regmap_init_mmio(&pdev->dev, base, + &rk3528_codec_regmap_config); + if (IS_ERR(rk3528->regmap)) { + ret = PTR_ERR(rk3528->regmap); + dev_err(&pdev->dev, "Failed to regmap mmio\n"); + goto failed; + } + + platform_set_drvdata(pdev, rk3528); + ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_dev_rk3528, + rk3528_dai, ARRAY_SIZE(rk3528_dai)); + if (ret < 0) { + dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); + goto failed; + } + + return ret; + +failed: + clk_disable_unprepare(rk3528->mclk); +failed_1: + clk_disable_unprepare(rk3528->pclk); + + return ret; +} + +static int rk3528_platform_remove(struct platform_device *pdev) +{ + struct rk3528_codec_priv *rk3528 = + (struct rk3528_codec_priv *)platform_get_drvdata(pdev); + + clk_disable_unprepare(rk3528->mclk); + clk_disable_unprepare(rk3528->pclk); + + return 0; +} + +static struct platform_driver rk3528_codec_driver = { + .driver = { + .name = CODEC_DRV_NAME, + .of_match_table = of_match_ptr(rk3528_codec_of_match), + }, + .probe = rk3528_platform_probe, + .remove = rk3528_platform_remove, +}; +module_platform_driver(rk3528_codec_driver); + +MODULE_DESCRIPTION("ASoC rk3528 Codec Driver"); +MODULE_AUTHOR("Jason Zhu <jason.zhu@rock-chips.com>"); +MODULE_LICENSE("GPL"); diff --git a/kernel/sound/soc/codecs/rk3528_codec.h b/kernel/sound/soc/codecs/rk3528_codec.h new file mode 100644 index 0000000..edcca0e --- /dev/null +++ b/kernel/sound/soc/codecs/rk3528_codec.h @@ -0,0 +1,229 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * rk3528_codec.h - Rockchip RK3528 SoC Codec Driver + * + * Copyright (C) 2022 Rockchip Electronics Co., Ltd. + */ + +#ifndef __RK3528_CODEC_H__ +#define __RK3528_CODEC_H__ + +#define ACODEC_DIG00 0x00 /* REG 0x00 */ +#define ACODEC_DIG01 0x04 /* REG 0x01 */ +#define ACODEC_DIG02 0x08 /* REG 0x02 */ +#define ACODEC_DIG03 0x0c /* REG 0x03 */ +#define ACODEC_DIG04 0x10 /* REG 0x04 */ +#define ACODEC_DIG05 0x14 /* REG 0x05 */ +#define ACODEC_DIG06 0x18 /* REG 0x06 */ +#define ACODEC_DIG07 0x1c /* REG 0x07 */ +#define ACODEC_DIG08 0x20 /* REG 0x08 */ +#define ACODEC_DIG09 0x24 /* REG 0x09 */ +#define ACODEC_DIG0A 0x28 /* REG 0x0a */ +#define ACODEC_DIG0B 0x2c /* REG 0x0b */ +#define ACODEC_DIG0D 0x34 /* REG 0x0d */ +#define ACODEC_DIG0E 0x38 /* REG 0x0e */ +#define ACODEC_DIG10 0x40 /* REG 0x10 */ +#define ACODEC_DIG11 0x44 /* REG 0x11 */ + +#define ACODEC_ANA00 0x80 /* REG 0x20 */ +#define ACODEC_ANA01 0x84 /* REG 0x21 */ +#define ACODEC_ANA02 0x88 /* REG 0x22 */ +#define ACODEC_ANA08 0xa0 /* REG 0x28 */ +#define ACODEC_ANA09 0xa4 /* REG 0x29 */ +#define ACODEC_ANA0A 0xa8 /* REG 0x2a */ +#define ACODEC_ANA0B 0xac /* REG 0x2b */ +#define ACODEC_ANA0C 0xb0 /* REG 0x2c */ +#define ACODEC_ANA0D 0xb4 /* REG 0x2d */ +#define ACODEC_ANA0E 0xb8 /* REG 0x2e */ +#define ACODEC_ANA0F 0xbc /* REG 0x2f */ + +#define ACODEC_REG_MAX ACODEC_ANA0F + +/* ACODEC_DIG00 */ +#define ACODEC_DAC_RST_MASK (0x1 << 4) +#define ACODEC_DAC_RST_P (0x1 << 4) +#define ACODEC_DAC_RST_N (0x0 << 4) +#define ACODEC_REG_BIST_EN (0x1 << 1) +#define ACODEC_SYS_RST_MASK (0x1 << 0) +#define ACODEC_SYS_RST_P (0x1 << 0) +#define ACODEC_SYS_RST_N (0x0 << 0) + +/* ACODEC_DIG01 */ +#define ACODEC_DAC_I2S_WL_SHIFT 4 +#define ACODEC_DAC_I2S_WL_MASK (0x3 << ACODEC_DAC_I2S_WL_SHIFT) +#define ACODEC_DAC_I2S_32B (0x3 << ACODEC_DAC_I2S_WL_SHIFT) +#define ACODEC_DAC_I2S_24B (0x2 << ACODEC_DAC_I2S_WL_SHIFT) +#define ACODEC_DAC_I2S_20B (0x1 << ACODEC_DAC_I2S_WL_SHIFT) +#define ACODEC_DAC_I2S_16B (0x0 << ACODEC_DAC_I2S_WL_SHIFT) +#define ACODEC_DAC_I2S_FMT_SHIFT 2 +#define ACODEC_DAC_I2S_FMT_MASK (0x3 << ACODEC_DAC_I2S_FMT_SHIFT) +#define ACODEC_DAC_I2S_I2S (0x2 << ACODEC_DAC_I2S_FMT_SHIFT) +#define ACODEC_DAC_I2S_LJM (0x1 << ACODEC_DAC_I2S_FMT_SHIFT) + +/* ACODEC_DIG02 */ +#define ACODEC_DAC_I2S_LRP_MASK (0x1 << 7) +#define ACODEC_DAC_I2S_LRP_REVSL (0x1 << 7) +#define ACODEC_DAC_I2S_LRP_NORMAL (0x0 << 7) +#define ACODEC_DAC_I2S_LR_SWAP (0x1 << 6) +#define ACODEC_DAC_I2S_MST_FUNC_MASK (0x1 << 5) +#define ACODEC_DAC_I2S_MST_FUNC_MASTER (0x1 << 5) +#define ACODEC_DAC_I2S_MST_FUNC_SLAVE (0x0 << 5) +#define ACODEC_DAC_I2S_MST_IO_MASK (0x1 << 4) +#define ACODEC_DAC_I2S_MST_IO_MASTER (0x1 << 4) +#define ACODEC_DAC_I2S_MST_IO_SLAVE (0x0 << 4) +#define ACODEC_DAC_I2S_RST_MASK (0x1 << 0) +#define ACODEC_DAC_I2S_RST_P (0x1 << 0) +#define ACODEC_DAC_I2S_RST_N (0x0 << 0) + +/* ACODEC_DIG03 */ +#define ACODEC_DAC_MUTE_EN (0x1 << 7) +#define ACODEC_DAC_MUTE_SR_SHIFT 4 +#define ACODEC_DAC_MUTE_SR_MASK (0x7 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DAC_MUTE_SR_96K (0x7 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DAC_MUTE_SR_88K2 (0x6 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DAC_MUTE_SR_48K (0x5 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DAC_MUTE_SR_44K1 (0x4 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DAC_MUTE_SR_32K (0x3 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DAC_MUTE_SR_24K (0x2 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DAC_MUTE_SR_16K (0x1 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DAC_MUTE_SR_8K (0x0 << ACODEC_DAC_MUTE_SR_SHIFT) +#define ACODEC_DA_EN (0x1 << 3) +#define ACODEC_DITHER_EN (0x1 << 2) +#define ACODEC_DITHER_LEVEL (0x1 << 1) +#define ACODEC_DITHER_SIGN (0x1 << 0) + +/* ACODEC_DIG04 */ +#define ACODEC_DAC_DEEMP_SEL_MASK 0x3 +#define ACODEC_DAC_DEEMP_48K 0x3 +#define ACODEC_DAC_DEEMP_44K1 0x2 +#define ACODEC_DAC_DEEMP_32K 0x1 +#define ACODEC_DAC_DEEMP_DIS 0x0 + +/* ACODEC_DIG05 */ +#define ACODEC_DAC_R_BIST_SEL_SHIFT 6 +#define ACODEC_DAC_R_BIST_SEL_MASK (0x3 << ACODEC_DAC_R_BIST_SEL_SHIFT) +#define ACODEC_DAC_R_BIST_SEL_L (0x2 << ACODEC_DAC_R_BIST_SEL_SHIFT) +#define ACODEC_DAC_R_BIST_SEL_SINE (0x1 << ACODEC_DAC_R_BIST_SEL_SHIFT) +#define ACODEC_DAC_R_BIST_SEL_R (0x0 << ACODEC_DAC_R_BIST_SEL_SHIFT) +#define ACODEC_DAC_R_MUTE (0x1 << 4) +#define ACODEC_DAC_L_BIST_SEL_SHIFT 2 +#define ACODEC_DAC_L_BIST_SEL_MASK (0x3 << ACODEC_DAC_L_BIST_SEL_SHIFT) +#define ACODEC_DAC_L_BIST_SEL_R (0x2 << ACODEC_DAC_L_BIST_SEL_SHIFT) +#define ACODEC_DAC_L_BIST_SEL_SINE (0x1 << ACODEC_DAC_L_BIST_SEL_SHIFT) +#define ACODEC_DAC_L_BIST_SEL_L (0x0 << ACODEC_DAC_L_BIST_SEL_SHIFT) +#define ACODEC_DAC_J_MUTE (0x1 << 0) + +/* ACODEC_DIG06 */ +#define ACODEC_DAC_DIG_GAIN_SHIT 0 +#define ACODEC_DAC_DIG_GAIN_MASK (0xff << ACODEC_DAC_DIG_GAIN_SHIT) +/* 0.5dB every step , 1: -121dB, 255: 6dB */ +#define ACODEC_DAC_DIG_GAIN(x) ((x) & ACODEC_DAC_DIG_GAIN_MASK) +#define ACODEC_DAC_DIG_0DB 0xe1 + +/* ACODEC_ANA00 */ +#define ACODEC_IBIAS_DAC_MASK (0x1 << 1) +#define ACODEC_IBIAS_DAC_EN (0x1 << 1) +#define ACODEC_IBIAS_DAC_DIS (0x0 << 1) +#define ACODEC_VREF_MASK (0x1 << 0) +#define ACODEC_VREF_EN (0x1 << 0) +#define ACODEC_VREF_DIS (0x0 << 0) + +/* ACODEC_ANA01 */ +#define ACODEC_VREF_SEL_SHIFT 0 +/* Bit 0 is I0, bit 1 is 2 * I0 ... bit 7 is 128 * I0 */ +#define ACODEC_VREF_SEL_MASK (0xff << ACODEC_VREF_SEL_SHIFT) +#define ACODEC_VREF_SEL(x) ((x) & ACODEC_VREF_SEL_MASK) + +/* ACODEC_ANA02 */ +#define ACODEC_IBIAS_DAC_SEL_SHIFT 0 +/* Ibias_DAC = I0 * (BIT[3]*8+BIT[2]*4+BIT[1]*2+BIT[0]+1) */ +#define ACODEC_IBIAS_DAC_SEL (0xf << ACODEC_IBIAS_DAC_SEL_SHIFT) + +/* ACODEC_ANA08 */ +#define ACODEC_DAC_L_POP_CTRL_SHIFT 5 +#define ACODEC_DAC_L_POP_CTRL_MASK (0x3 << ACODEC_DAC_L_POP_CTRL_SHIFT) +#define ACODEC_DAC_L_POP_CTRL_ON (0x1 << ACODEC_DAC_L_POP_CTRL_SHIFT) +#define ACODEC_DAC_L_POP_CTRL_OFF (0x0 << ACODEC_DAC_L_POP_CTRL_SHIFT) +#define ACODEC_DAC_L_INIT_MASK (0x1 << 4) +#define ACODEC_DAC_L_WORK (0x1 << 4) +#define ACODEC_DAC_L_INIT (0x0 << 4) +#define ACODEC_DAC_L_VREF_MASK (0x1 << 3) +#define ACODEC_DAC_L_VREF_EN (0x1 << 3) +#define ACODEC_DAC_L_VREF_DIS (0x0 << 3) +#define ACODEC_DAC_L_BUF_MASK (0x1 << 2) +#define ACODEC_DAC_L_BUF_EN (0x1 << 2) +#define ACODEC_DAC_L_BUF_DIS (0x0 << 2) +#define ACODEC_DAC_L_CLK_MASK (0x1 << 1) +#define ACODEC_DAC_L_CLK_EN (0x1 << 1) +#define ACODEC_DAC_L_CLK_DIS (0x0 << 1) +#define ACODEC_DAC_L_MASK (0x1 << 0) +#define ACODEC_DAC_L_EN (0x1 << 0) +#define ACODEC_DAC_L_DIS (0x0 << 0) + +/* ACODEC_ANA09 */ +#define ACODEC_LINEOUT_L_MUTE_MASK (0x1 << 5) +#define ACODEC_LINEOUT_L_WORK (0x1 << 5) +#define ACODEC_LINEOUT_L_MUTE (0x0 << 5) +#define ACODEC_LINEOUT_L_INIT_MASK (0x1 << 4) +#define ACODEC_LINEOUT_L_INIT_WORK (0x1 << 4) +#define ACODEC_LINEOUT_L_INIT (0x0 << 4) +#define ACODEC_LINEOUT_L_MASK (0x1 << 0) +#define ACODEC_LINEOUT_L_EN (0x1 << 0) +#define ACODEC_LINEOUT_L_DIS (0x0 << 0) + +/* ACODEC_ANA0A */ +#define ACODEC_LINEOUT_L_SEL_SHIFT 0 +#define ACODEC_LINEOUT_L_SEL_MASK (0xf << ACODEC_LINEOUT_L_SEL_SHIFT) + +/* ACODEC_ANA0B */ +#define ACODEC_LINEOUT_L_GAIN_SHIFT 0 +/* 1.5dB every step. 0: -39dB, 0x1f: 0dB */ +#define ACODEC_LINEOUT_L_GAIN_MASK (0x1f << ACODEC_LINEOUT_L_GAIN_SHIFT) + +/* ACODEC_ANA0C */ +#define ACODEC_DAC_R_POP_CTRL_SHIFT 5 +#define ACODEC_DAC_R_POP_CTRL_MASK (0x3 << ACODEC_DAC_R_POP_CTRL_SHIFT) +#define ACODEC_DAC_R_POP_CTRL_ON (0x1 << ACODEC_DAC_R_POP_CTRL_SHIFT) +#define ACODEC_DAC_R_POP_CTRL_OFF (0x0 << ACODEC_DAC_R_POP_CTRL_SHIFT) +#define ACODEC_DAC_R_INIT_MASK (0x1 << 4) +#define ACODEC_DAC_R_WORK (0x1 << 4) +#define ACODEC_DAC_R_INIT (0x0 << 4) +#define ACODEC_DAC_R_VREF_MASK (0x1 << 3) +#define ACODEC_DAC_R_VREF_EN (0x1 << 3) +#define ACODEC_DAC_R_VREF_DIS (0x0 << 3) +#define ACODEC_DAC_R_BUF_MASK (0x1 << 2) +#define ACODEC_DAC_R_BUF_EN (0x1 << 2) +#define ACODEC_DAC_R_BUF_DIS (0x0 << 2) +#define ACODEC_DAC_R_CLK_MASK (0x1 << 1) +#define ACODEC_DAC_R_CLK_EN (0x1 << 1) +#define ACODEC_DAC_R_CLK_DIS (0x0 << 1) +#define ACODEC_DAC_R_MASK (0x1 << 0) +#define ACODEC_DAC_R_EN (0x1 << 0) +#define ACODEC_DAC_R_DIS (0x0 << 0) + +/* ACODEC_ANA0D */ +#define ACODEC_LINEOUT_R_MUTE_MASK (0x1 << 5) +#define ACODEC_LINEOUT_R_WORK (0x1 << 5) +#define ACODEC_LINEOUT_R_MUTE (0x0 << 5) +#define ACODEC_LINEOUT_R_INIT_MASK (0x1 << 4) +#define ACODEC_LINEOUT_R_INIT_WORK (0x1 << 4) +#define ACODEC_LINEOUT_R_INIT (0x0 << 4) +#define ACODEC_LINEOUT_R_MASK (0x1 << 0) +#define ACODEC_LINEOUT_R_EN (0x1 << 0) +#define ACODEC_LINEOUT_R_DIS (0x0 << 0) + +/* ACODEC_ANA0E */ +#define ACODEC_LINEOUT_R_SEL_SHIFT 0 +#define ACODEC_LINEOUT_R_SEL_MASK (0xf << ACODEC_LINEOUT_L_SEL_SHIFT) + +/* ACODEC_ANA0F */ +#define ACODEC_LINEOUT_R_GAIN_SHIFT 0 +/* 1.5dB every step. 0: -39dB, 0x1f: 0dB */ +#define ACODEC_LINEOUT_R_GAIN_MASK (0x1f << ACODEC_LINEOUT_L_GAIN_SHIFT) + +#define ACODEC_DAC_LINEOUT_GAIN_MAX 0x1e +#define ACODEC_DAC_LINEOUT_GAIN_MIN 0 +#define ACODEC_HIFI 0x0 +#define ACODEC_DAC_LINEOUT_GAIN_0DB 0x1a + +#endif /* __RK3528_CODEC_H__ */ diff --git a/kernel/sound/soc/codecs/rk817_codec.c b/kernel/sound/soc/codecs/rk817_codec.c index 6e9d024..66d1ca2 100644 --- a/kernel/sound/soc/codecs/rk817_codec.c +++ b/kernel/sound/soc/codecs/rk817_codec.c @@ -67,7 +67,10 @@ struct regmap *regmap; struct rk808 *rk817; struct clk *mclk; + struct mutex clk_lock; + unsigned int clk_capture; + unsigned int clk_playback; unsigned int stereo_sysclk; unsigned int rate; @@ -79,6 +82,7 @@ bool pdmdata_out_enable; bool use_ext_amplifier; bool adc_for_loopback; + bool resume_path; bool out_l2spk_r2hp; long int playback_path; @@ -506,10 +510,7 @@ static const char * const rk817_capture_path_mode[] = { "MIC OFF", "Main Mic", "Hands Free Mic", "BT Sco Mic"}; -static const char * const rk817_call_path_mode[] = { - "OFF", "RCV", "SPK", "HP", "HP_NO_MIC", "BT"}; /* 0-5 */ - -static const char * const rk817_modem_input_mode[] = {"OFF", "ON"}; +static const char * const rk817_binary_mode[] = {"OFF", "ON"}; static SOC_ENUM_SINGLE_DECL(rk817_playback_path_type, 0, 0, rk817_playback_path_mode); @@ -517,11 +518,8 @@ static SOC_ENUM_SINGLE_DECL(rk817_capture_path_type, 0, 0, rk817_capture_path_mode); -static SOC_ENUM_SINGLE_DECL(rk817_call_path_type, - 0, 0, rk817_call_path_mode); - -static SOC_ENUM_SINGLE_DECL(rk817_modem_input_type, - 0, 0, rk817_modem_input_mode); +static SOC_ENUM_SINGLE_DECL(rk817_resume_path_type, + 0, 0, rk817_binary_mode); static int rk817_playback_path_config(struct snd_soc_component *component, long pre_path, long target_path) @@ -533,10 +531,19 @@ DBG("%s : set playback_path %ld, pre_path %ld\n", __func__, rk817->playback_path, pre_path); - if (rk817->playback_path != OFF) - clk_prepare_enable(rk817->mclk); - else - clk_disable_unprepare(rk817->mclk); + mutex_lock(&rk817->clk_lock); + if (rk817->playback_path != OFF) { + if (rk817->clk_playback == 0) { + clk_prepare_enable(rk817->mclk); + rk817->clk_playback++; + } + } else { + if (rk817->clk_playback > 0) { + clk_disable_unprepare(rk817->mclk); + rk817->clk_playback--; + } + } + mutex_unlock(&rk817->clk_lock); switch (rk817->playback_path) { case OFF: @@ -720,10 +727,19 @@ DBG("%s : set capture_path %ld, pre_path %ld\n", __func__, rk817->capture_path, pre_path); - if (rk817->capture_path != MIC_OFF) - clk_prepare_enable(rk817->mclk); - else - clk_disable_unprepare(rk817->mclk); + mutex_lock(&rk817->clk_lock); + if (rk817->capture_path != MIC_OFF) { + if (rk817->clk_capture == 0) { + clk_prepare_enable(rk817->mclk); + rk817->clk_capture++; + } + } else { + if (rk817->clk_capture > 0) { + clk_disable_unprepare(rk817->mclk); + rk817->clk_capture--; + } + } + mutex_unlock(&rk817->clk_lock); switch (rk817->capture_path) { case MIC_OFF: @@ -842,12 +858,39 @@ ucontrol->value.integer.value[0]); } +static int rk817_resume_path_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component); + + DBG("%s : resume_path %ld\n", __func__, rk817->resume_path); + + ucontrol->value.integer.value[0] = rk817->resume_path; + + return 0; +} + +static int rk817_resume_path_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component); + + rk817->resume_path = ucontrol->value.integer.value[0]; + + return 0; +} + static struct snd_kcontrol_new rk817_snd_path_controls[] = { SOC_ENUM_EXT("Playback Path", rk817_playback_path_type, rk817_playback_path_get, rk817_playback_path_put), SOC_ENUM_EXT("Capture MIC Path", rk817_capture_path_type, rk817_capture_path_get, rk817_capture_path_put), + + SOC_ENUM_EXT("Resume Path", rk817_resume_path_type, + rk817_resume_path_get, rk817_resume_path_put), }; static int rk817_set_dai_sysclk(struct snd_soc_dai *codec_dai, @@ -892,8 +935,7 @@ struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_component *component = rtd->codec_dai->component; + struct snd_soc_component *component = dai->component; struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component); unsigned int rate = params_rate(params); unsigned char apll_cfg3_val; @@ -946,14 +988,22 @@ * is before playback/capture_path_put, therefore, we need to configure * APLL_CFG3/DTOP_DIGEN_CLKE/DDAC_SR_LMT0 for different sample rates. */ - snd_soc_component_write(component, RK817_CODEC_APLL_CFG3, apll_cfg3_val); - /* The 0x00 contains ADC_DIG_CLK_DIS and DAC_DIG_CLK_DIS */ - snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE, - dtop_digen_clke, 0x00); - snd_soc_component_update_bits(component, RK817_CODEC_DDAC_SR_LMT0, - DACSRT_MASK, dtop_digen_sr_lmt0); - snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE, - dtop_digen_clke, dtop_digen_clke); + if (!((substream->stream == SNDRV_PCM_STREAM_CAPTURE) && rk817->pdmdata_out_enable)) { + snd_soc_component_write(component, RK817_CODEC_APLL_CFG3, apll_cfg3_val); + /* The 0x00 contains ADC_DIG_CLK_DIS and DAC_DIG_CLK_DIS */ + snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE, + dtop_digen_clke, 0x00); + snd_soc_component_update_bits(component, RK817_CODEC_DDAC_SR_LMT0, + DACSRT_MASK, dtop_digen_sr_lmt0); + snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE, + dtop_digen_clke, dtop_digen_clke); + snd_soc_component_update_bits(component, RK817_CODEC_APLL_CFG5, + PLL_PW_DOWN, PLL_PW_DOWN); + usleep_range(50, 60); + snd_soc_component_update_bits(component, RK817_CODEC_APLL_CFG5, + PLL_PW_DOWN, PLL_PW_UP); + usleep_range(500, 600); + } switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: @@ -1144,6 +1194,15 @@ static int rk817_resume(struct snd_soc_component *component) { + struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component); + + if (rk817->resume_path) { + if (rk817->capture_path != MIC_OFF) + rk817_capture_path_config(component, OFF, rk817->capture_path); + if (rk817->playback_path != OFF) + rk817_playback_path_config(component, OFF, rk817->playback_path); + } + return 0; } @@ -1173,6 +1232,9 @@ clk_prepare_enable(rk817->mclk); rk817_reset(component); clk_disable_unprepare(rk817->mclk); + mutex_init(&rk817->clk_lock); + rk817->clk_capture = 0; + rk817->clk_playback = 0; snd_soc_add_component_controls(component, rk817_snd_path_controls, ARRAY_SIZE(rk817_snd_path_controls)); @@ -1193,6 +1255,7 @@ rk817_codec_power_down(component, RK817_CODEC_ALL); snd_soc_component_exit_regmap(component); + mutex_destroy(&rk817->clk_lock); mdelay(10); } diff --git a/kernel/sound/soc/generic/simple-card.c b/kernel/sound/soc/generic/simple-card.c index 3da9cd6..64bf356 100644 --- a/kernel/sound/soc/generic/simple-card.c +++ b/kernel/sound/soc/generic/simple-card.c @@ -108,12 +108,12 @@ if (ret < 0) return ret; - ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk, + ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk, SND_SOC_CLOCK_IN); if (ret && ret != -ENOTSUPP) goto err; - ret = snd_soc_dai_set_sysclk(cpu_dai, substream->stream, mclk, + ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk, SND_SOC_CLOCK_OUT); if (ret && ret != -ENOTSUPP) goto err; diff --git a/kernel/sound/soc/rockchip/Kconfig b/kernel/sound/soc/rockchip/Kconfig index 1690a40..6e9ab63 100644 --- a/kernel/sound/soc/rockchip/Kconfig +++ b/kernel/sound/soc/rockchip/Kconfig @@ -60,6 +60,7 @@ config SND_SOC_ROCKCHIP_SPDIF tristate "Rockchip SPDIF Device Driver" depends on CLKDEV_LOOKUP && SND_SOC_ROCKCHIP + select SND_PCM_IEC958 select SND_SOC_GENERIC_DMAENGINE_PCM help Say Y or M if you want to add support for SPDIF driver for diff --git a/kernel/sound/soc/rockchip/rockchip_hdmi.c b/kernel/sound/soc/rockchip/rockchip_hdmi.c index 69ff54c..3315407 100644 --- a/kernel/sound/soc/rockchip/rockchip_hdmi.c +++ b/kernel/sound/soc/rockchip/rockchip_hdmi.c @@ -213,6 +213,9 @@ codecs = devm_kcalloc(&pdev->dev, idx, sizeof(*codecs), GFP_KERNEL); + if (!codecs) + return -ENOMEM; + rk_data->dai.codecs = codecs; rk_data->dai.num_codecs = idx; idx = 0; diff --git a/kernel/sound/soc/rockchip/rockchip_i2s.c b/kernel/sound/soc/rockchip/rockchip_i2s.c index 262a954..5af12e4 100644 --- a/kernel/sound/soc/rockchip/rockchip_i2s.c +++ b/kernel/sound/soc/rockchip/rockchip_i2s.c @@ -61,6 +61,7 @@ bool is_master_mode; const struct rk_i2s_pins *pins; unsigned int bclk_fs; + spinlock_t lock; /* tx/rx lock */ unsigned int clk_trcm; unsigned int mclk_root_rate; @@ -69,9 +70,6 @@ bool mclk_calibrate; }; - -/* txctrl/rxctrl lock */ -static DEFINE_SPINLOCK(lock); static int i2s_runtime_suspend(struct device *dev) { @@ -124,12 +122,51 @@ regcache_sync(i2s->regmap); } +static int rockchip_i2s_clear(struct rk_i2s_dev *i2s) +{ + unsigned int clr = I2S_CLR_TXC | I2S_CLR_RXC; + unsigned int val = 0; + int ret; + + /* + * Workaround for FIFO clear on SLAVE mode: + * + * A Suggest to do reset hclk domain and then do mclk + * domain, especially for SLAVE mode without CLK in. + * at last, recovery regmap config. + * + * B Suggest to switch to MASTER, and then do FIFO clr, + * at last, bring back to SLAVE. + * + * Now we choose plan B here. + */ + if (!i2s->is_master_mode) + regmap_update_bits(i2s->regmap, I2S_CKR, + I2S_CKR_MSS_MASK, I2S_CKR_MSS_MASTER); + regmap_update_bits(i2s->regmap, I2S_CLR, clr, clr); + + ret = regmap_read_poll_timeout_atomic(i2s->regmap, I2S_CLR, val, + !(val & clr), 10, 100); + if (!i2s->is_master_mode) + regmap_update_bits(i2s->regmap, I2S_CKR, + I2S_CKR_MSS_MASK, I2S_CKR_MSS_SLAVE); + if (ret < 0) { + dev_warn(i2s->dev, "failed to clear fifo on %s mode\n", + i2s->is_master_mode ? "master" : "slave"); + goto reset; + } + + return 0; + +reset: + rockchip_i2s_reset(i2s); + + return ret; +} + static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) { - unsigned int val = 0; - int retry = 10; - - spin_lock(&lock); + spin_lock(&i2s->lock); if (on) { regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); @@ -153,33 +190,15 @@ I2S_XFER_RXS_STOP); udelay(150); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); - - regmap_read(i2s->regmap, I2S_CLR, &val); - - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s->regmap, I2S_CLR, &val); - retry--; - if (!retry) { - dev_warn(i2s->dev, "reset\n"); - rockchip_i2s_reset(i2s); - break; - } - } + rockchip_i2s_clear(i2s); } } - spin_unlock(&lock); + spin_unlock(&i2s->lock); } static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) { - unsigned int val = 0; - int retry = 10; - - spin_lock(&lock); + spin_lock(&i2s->lock); if (on) { regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); @@ -203,25 +222,10 @@ I2S_XFER_RXS_STOP); udelay(150); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); - - regmap_read(i2s->regmap, I2S_CLR, &val); - - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s->regmap, I2S_CLR, &val); - retry--; - if (!retry) { - dev_warn(i2s->dev, "reset\n"); - rockchip_i2s_reset(i2s); - break; - } - } + rockchip_i2s_clear(i2s); } } - spin_unlock(&lock); + spin_unlock(&i2s->lock); } static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai, @@ -779,6 +783,7 @@ if (!i2s) return -ENOMEM; + spin_lock_init(&i2s->lock); i2s->dev = &pdev->dev; i2s->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf"); @@ -819,20 +824,23 @@ i2s->mclk = devm_clk_get(&pdev->dev, "i2s_clk"); if (IS_ERR(i2s->mclk)) { dev_err(&pdev->dev, "Can't retrieve i2s master clock\n"); - return PTR_ERR(i2s->mclk); + ret = PTR_ERR(i2s->mclk); + goto err_clk; } - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - regs = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(regs)) - return PTR_ERR(regs); + regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(regs)) { + ret = PTR_ERR(regs); + goto err_clk; + } i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs, &rockchip_i2s_regmap_config); if (IS_ERR(i2s->regmap)) { dev_err(&pdev->dev, "Failed to initialise managed register map\n"); - return PTR_ERR(i2s->regmap); + ret = PTR_ERR(i2s->regmap); + goto err_clk; } i2s->playback_dma_data.addr = res->start + I2S_TXDR; @@ -901,8 +909,11 @@ goto err_suspend; } - if (of_property_read_bool(node, "rockchip,no-dmaengine")) - return ret; + if (of_property_read_bool(node, "rockchip,no-dmaengine")) { + dev_info(&pdev->dev, "Used for Multi-DAI\n"); + return 0; + } + ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); if (ret) { dev_err(&pdev->dev, "Could not register PCM\n"); @@ -916,7 +927,8 @@ i2s_runtime_suspend(&pdev->dev); err_pm_disable: pm_runtime_disable(&pdev->dev); - +err_clk: + clk_disable_unprepare(i2s->hclk); return ret; } diff --git a/kernel/sound/soc/rockchip/rockchip_i2s_tdm.c b/kernel/sound/soc/rockchip/rockchip_i2s_tdm.c index bcc2b76..1824ea5 100644 --- a/kernel/sound/soc/rockchip/rockchip_i2s_tdm.c +++ b/kernel/sound/soc/rockchip/rockchip_i2s_tdm.c @@ -35,10 +35,15 @@ #endif #define DEFAULT_MCLK_FS 256 +#define DEFAULT_FS 48000 #define CH_GRP_MAX 4 /* The max channel 8 / 2 */ #define MULTIPLEX_CH_MAX 10 #define CLK_PPM_MIN (-1000) #define CLK_PPM_MAX (1000) +#define MAXBURST_PER_FIFO 8 + +#define QUIRK_ALWAYS_ON BIT(0) +#define QUIRK_HDMI_PATH BIT(1) struct txrx_config { u32 addr; @@ -79,6 +84,7 @@ struct regmap *grf; struct snd_dmaengine_dai_dma_data capture_dma_data; struct snd_dmaengine_dai_dma_data playback_dma_data; + struct snd_pcm_substream *substreams[SNDRV_PCM_STREAM_LAST + 1]; struct reset_control *tx_reset; struct reset_control *rx_reset; const struct rk_i2s_soc_data *soc_data; @@ -102,9 +108,24 @@ unsigned int clk_trcm; unsigned int i2s_sdis[CH_GRP_MAX]; unsigned int i2s_sdos[CH_GRP_MAX]; + unsigned int quirks; int clk_ppm; atomic_t refcount; spinlock_t lock; /* xfer lock */ +}; + +static struct i2s_of_quirks { + char *quirk; + int id; +} of_quirks[] = { + { + .quirk = "rockchip,always-on", + .id = QUIRK_ALWAYS_ON, + }, + { + .quirk = "rockchip,hdmi-path", + .id = QUIRK_HDMI_PATH, + }, }; static int to_ch_num(unsigned int val) @@ -134,10 +155,9 @@ struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev); regcache_cache_only(i2s_tdm->regmap, true); - if (!IS_ERR(i2s_tdm->mclk_tx)) - clk_disable_unprepare(i2s_tdm->mclk_tx); - if (!IS_ERR(i2s_tdm->mclk_rx)) - clk_disable_unprepare(i2s_tdm->mclk_rx); + + clk_disable_unprepare(i2s_tdm->mclk_tx); + clk_disable_unprepare(i2s_tdm->mclk_rx); return 0; } @@ -147,28 +167,45 @@ struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev); int ret; - if (!IS_ERR(i2s_tdm->mclk_tx)) - clk_prepare_enable(i2s_tdm->mclk_tx); - if (!IS_ERR(i2s_tdm->mclk_rx)) - clk_prepare_enable(i2s_tdm->mclk_rx); + ret = clk_prepare_enable(i2s_tdm->mclk_tx); + if (ret) + goto err_mclk_tx; + + ret = clk_prepare_enable(i2s_tdm->mclk_rx); + if (ret) + goto err_mclk_rx; regcache_cache_only(i2s_tdm->regmap, false); regcache_mark_dirty(i2s_tdm->regmap); - ret = regcache_sync(i2s_tdm->regmap); - if (ret) { - if (!IS_ERR(i2s_tdm->mclk_tx)) - clk_disable_unprepare(i2s_tdm->mclk_tx); - if (!IS_ERR(i2s_tdm->mclk_rx)) - clk_disable_unprepare(i2s_tdm->mclk_rx); - } + if (ret) + goto err_regmap; + return 0; + +err_regmap: + clk_disable_unprepare(i2s_tdm->mclk_rx); +err_mclk_rx: + clk_disable_unprepare(i2s_tdm->mclk_tx); +err_mclk_tx: return ret; } static inline struct rk_i2s_tdm_dev *to_info(struct snd_soc_dai *dai) { return snd_soc_dai_get_drvdata(dai); +} + +static inline bool is_stream_active(struct rk_i2s_tdm_dev *i2s_tdm, int stream) +{ + unsigned int val; + + regmap_read(i2s_tdm->regmap, I2S_XFER, &val); + + if (stream == SNDRV_PCM_STREAM_PLAYBACK) + return (val & I2S_XFER_TXS_START); + else + return (val & I2S_XFER_RXS_START); } #ifdef HAVE_SYNC_RESET @@ -180,7 +217,7 @@ #define writeq(v,c) ({ __iowmb(); __raw_writeq((__force u64) cpu_to_le64(v), c); }) #endif -static void rockchip_snd_xfer_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm) +static void rockchip_i2s_tdm_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm) { int tx_bank, rx_bank, tx_offset, rx_offset, tx_id, rx_id; void __iomem *cru_reset, *addr; @@ -229,7 +266,7 @@ writeq(val, addr); break; } - /* fall through */ + /* fallthrough */ default: local_irq_save(flags); writel(BIT(tx_offset) | (BIT(tx_offset) << 16), @@ -243,7 +280,7 @@ udelay(10); } -static void rockchip_snd_xfer_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm) +static void rockchip_i2s_tdm_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm) { int tx_bank, rx_bank, tx_offset, rx_offset, tx_id, rx_id; void __iomem *cru_reset, *addr; @@ -291,7 +328,7 @@ writeq(val, addr); break; } - /* fall through */ + /* fallthrough */ default: local_irq_save(flags); writel((BIT(tx_offset) << 16), @@ -309,94 +346,26 @@ * make sure both tx and rx are reset at the same time for sync lrck * when clk_trcm > 0 */ -static void rockchip_snd_xfer_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm) +static void rockchip_i2s_tdm_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm) { - rockchip_snd_xfer_reset_assert(i2s_tdm); - rockchip_snd_xfer_reset_deassert(i2s_tdm); + rockchip_i2s_tdm_reset_assert(i2s_tdm); + rockchip_i2s_tdm_reset_deassert(i2s_tdm); } #else -static inline void rockchip_snd_xfer_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm) +static inline void rockchip_i2s_tdm_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm) { } -static inline void rockchip_snd_xfer_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm) +static inline void rockchip_i2s_tdm_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm) { } -static inline void rockchip_snd_xfer_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm) +static inline void rockchip_i2s_tdm_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm) { } #endif -/* only used when clk_trcm > 0 */ -static void rockchip_snd_txrxctrl(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai, int on) +static void rockchip_i2s_tdm_reset(struct reset_control *rc) { - struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai); - unsigned int val = 0; - unsigned long flags; - int retry = 10; - - spin_lock_irqsave(&i2s_tdm->lock, flags); - if (on) { - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_TDE_ENABLE, - I2S_DMACR_TDE_ENABLE); - else - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_RDE_ENABLE, - I2S_DMACR_RDE_ENABLE); - - if (atomic_inc_return(&i2s_tdm->refcount) == 1) { - rockchip_snd_xfer_reset_assert(i2s_tdm); - regmap_update_bits(i2s_tdm->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START); - rockchip_snd_xfer_reset_deassert(i2s_tdm); - } - } else { - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_TDE_ENABLE, - I2S_DMACR_TDE_DISABLE); - else - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_RDE_ENABLE, - I2S_DMACR_RDE_DISABLE); - - if (atomic_dec_and_test(&i2s_tdm->refcount)) { - regmap_update_bits(i2s_tdm->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); - - udelay(150); - regmap_update_bits(i2s_tdm->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); - - regmap_read(i2s_tdm->regmap, I2S_CLR, &val); - - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s_tdm->regmap, I2S_CLR, &val); - retry--; - if (!retry) { - dev_info(i2s_tdm->dev, "reset txrx\n"); - rockchip_snd_xfer_sync_reset(i2s_tdm); - break; - } - } - } - } - spin_unlock_irqrestore(&i2s_tdm->lock, flags); -} - -static void rockchip_snd_reset(struct reset_control *rc) -{ - if (IS_ERR(rc)) + if (IS_ERR_OR_NULL(rc)) return; reset_control_assert(rc); @@ -407,92 +376,264 @@ udelay(10); } -static void rockchip_snd_txctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on) +static int rockchip_i2s_tdm_clear(struct rk_i2s_tdm_dev *i2s_tdm, + unsigned int clr) { + struct reset_control *rst = NULL; unsigned int val = 0; - int retry = 10; + int ret = 0; - if (on) { - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); + switch (clr) { + case I2S_CLR_TXC: + rst = i2s_tdm->tx_reset; + break; + case I2S_CLR_RXC: + rst = i2s_tdm->rx_reset; + break; + case I2S_CLR_TXC | I2S_CLR_RXC: + break; + default: + return -EINVAL; + } - regmap_update_bits(i2s_tdm->regmap, I2S_XFER, - I2S_XFER_TXS_START, - I2S_XFER_TXS_START); + /* + * Workaround for FIFO clear on SLAVE mode: + * + * A Suggest to do reset hclk domain and then do mclk + * domain, especially for SLAVE mode without CLK in. + * at last, recovery regmap config. + * + * B Suggest to switch to MASTER, and then do FIFO clr, + * at last, bring back to SLAVE. + * + * Now we choose plan B here. + */ + if (!i2s_tdm->is_master_mode) + regmap_update_bits(i2s_tdm->regmap, I2S_CKR, + I2S_CKR_MSS_MASK, I2S_CKR_MSS_MASTER); + regmap_update_bits(i2s_tdm->regmap, I2S_CLR, clr, clr); + ret = regmap_read_poll_timeout_atomic(i2s_tdm->regmap, I2S_CLR, val, + !(val & clr), 10, 100); + if (!i2s_tdm->is_master_mode) + regmap_update_bits(i2s_tdm->regmap, I2S_CKR, + I2S_CKR_MSS_MASK, I2S_CKR_MSS_SLAVE); + + if (ret < 0) { + dev_warn(i2s_tdm->dev, "failed to clear %u on %s mode\n", + clr, i2s_tdm->is_master_mode ? "master" : "slave"); + goto reset; + } + + return 0; + +reset: + if (i2s_tdm->clk_trcm) + rockchip_i2s_tdm_sync_reset(i2s_tdm); + else + rockchip_i2s_tdm_reset(rst); + + return 0; +} + +/* + * HDMI controller ignores the first FRAME_SYNC cycle, Lost one frame is no big deal + * for LPCM, but it does matter for Bitstream (NLPCM/HBR), So, padding one frame + * before xfer the real data to fix it. + */ +static void rockchip_i2s_tdm_tx_fifo_padding(struct rk_i2s_tdm_dev *i2s_tdm, bool en) +{ + unsigned int val, w, c, i; + + if (!en) + return; + + regmap_read(i2s_tdm->regmap, I2S_TXCR, &val); + w = ((val & I2S_TXCR_VDW_MASK) >> I2S_TXCR_VDW_SHIFT) + 1; + c = to_ch_num(val & I2S_TXCR_CSR_MASK) * w / 32; + + for (i = 0; i < c; i++) + regmap_write(i2s_tdm->regmap, I2S_TXDR, 0x0); +} + +static void rockchip_i2s_tdm_fifo_xrun_detect(struct rk_i2s_tdm_dev *i2s_tdm, + int stream, bool en) +{ + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { + /* clear irq status which was asserted before TXUIE enabled */ + regmap_update_bits(i2s_tdm->regmap, I2S_INTCR, + I2S_INTCR_TXUIC, I2S_INTCR_TXUIC); + regmap_update_bits(i2s_tdm->regmap, I2S_INTCR, + I2S_INTCR_TXUIE_MASK, + I2S_INTCR_TXUIE(en)); } else { - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); - - regmap_update_bits(i2s_tdm->regmap, I2S_XFER, - I2S_XFER_TXS_START, - I2S_XFER_TXS_STOP); - - udelay(150); - if (i2s_tdm->is_master_mode) { - regmap_update_bits(i2s_tdm->regmap, I2S_CLR, - I2S_CLR_TXC, - I2S_CLR_TXC); - - regmap_read(i2s_tdm->regmap, I2S_CLR, &val); - - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s_tdm->regmap, I2S_CLR, &val); - retry--; - if (!retry) { - dev_warn(i2s_tdm->dev, "reset tx\n"); - rockchip_snd_reset(i2s_tdm->tx_reset); - break; - } - } - } else { - rockchip_snd_reset(i2s_tdm->tx_reset); - } + /* clear irq status which was asserted before RXOIE enabled */ + regmap_update_bits(i2s_tdm->regmap, I2S_INTCR, + I2S_INTCR_RXOIC, I2S_INTCR_RXOIC); + regmap_update_bits(i2s_tdm->regmap, I2S_INTCR, + I2S_INTCR_RXOIE_MASK, + I2S_INTCR_RXOIE(en)); } } -static void rockchip_snd_rxctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on) +static void rockchip_i2s_tdm_dma_ctrl(struct rk_i2s_tdm_dev *i2s_tdm, + int stream, bool en) { - unsigned int val = 0; - int retry = 10; + if (!en) + rockchip_i2s_tdm_fifo_xrun_detect(i2s_tdm, stream, 0); - if (on) { + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { + if (i2s_tdm->quirks & QUIRK_HDMI_PATH) + rockchip_i2s_tdm_tx_fifo_padding(i2s_tdm, en); + regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); - - regmap_update_bits(i2s_tdm->regmap, I2S_XFER, - I2S_XFER_RXS_START, - I2S_XFER_RXS_START); + I2S_DMACR_TDE_MASK, + I2S_DMACR_TDE(en)); + /* + * Explicitly delay 1 usec for dma to fill FIFO, + * though there was a implied HW delay that around + * half LRCK cycle (e.g. 2.6us@192k) from XFER-start + * to FIFO-pop. + * + * 1 usec is enough to fill at lease 4 entry each FIFO + * @192k 8ch 32bit situation. + */ + udelay(1); } else { regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); - - regmap_update_bits(i2s_tdm->regmap, I2S_XFER, - I2S_XFER_RXS_START, - I2S_XFER_RXS_STOP); - - udelay(150); - if (i2s_tdm->is_master_mode) { - regmap_update_bits(i2s_tdm->regmap, I2S_CLR, - I2S_CLR_RXC, - I2S_CLR_RXC); - - regmap_read(i2s_tdm->regmap, I2S_CLR, &val); - - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s_tdm->regmap, I2S_CLR, &val); - retry--; - if (!retry) { - dev_warn(i2s_tdm->dev, "reset rx\n"); - rockchip_snd_reset(i2s_tdm->rx_reset); - break; - } - } - } else { - rockchip_snd_reset(i2s_tdm->rx_reset); - } + I2S_DMACR_RDE_MASK, + I2S_DMACR_RDE(en)); } + + if (en) + rockchip_i2s_tdm_fifo_xrun_detect(i2s_tdm, stream, 1); +} + +static void rockchip_i2s_tdm_xfer_start(struct rk_i2s_tdm_dev *i2s_tdm, + int stream) +{ + if (i2s_tdm->clk_trcm) { + rockchip_i2s_tdm_reset_assert(i2s_tdm); + regmap_update_bits(i2s_tdm->regmap, I2S_XFER, + I2S_XFER_TXS_MASK | + I2S_XFER_RXS_MASK, + I2S_XFER_TXS_START | + I2S_XFER_RXS_START); + rockchip_i2s_tdm_reset_deassert(i2s_tdm); + } else if (stream == SNDRV_PCM_STREAM_PLAYBACK) { + regmap_update_bits(i2s_tdm->regmap, I2S_XFER, + I2S_XFER_TXS_MASK, + I2S_XFER_TXS_START); + } else { + regmap_update_bits(i2s_tdm->regmap, I2S_XFER, + I2S_XFER_RXS_MASK, + I2S_XFER_RXS_START); + } +} + +static void rockchip_i2s_tdm_xfer_stop(struct rk_i2s_tdm_dev *i2s_tdm, + int stream, bool force) +{ + unsigned int msk, val, clr; + + if (i2s_tdm->quirks & QUIRK_ALWAYS_ON && !force) + return; + + if (i2s_tdm->clk_trcm) { + msk = I2S_XFER_TXS_MASK | I2S_XFER_RXS_MASK; + val = I2S_XFER_TXS_STOP | I2S_XFER_RXS_STOP; + clr = I2S_CLR_TXC | I2S_CLR_RXC; + } else if (stream == SNDRV_PCM_STREAM_PLAYBACK) { + msk = I2S_XFER_TXS_MASK; + val = I2S_XFER_TXS_STOP; + clr = I2S_CLR_TXC; + } else { + msk = I2S_XFER_RXS_MASK; + val = I2S_XFER_RXS_STOP; + clr = I2S_CLR_RXC; + } + + regmap_update_bits(i2s_tdm->regmap, I2S_XFER, msk, val); + + /* delay for LRCK signal integrity */ + udelay(150); + + rockchip_i2s_tdm_clear(i2s_tdm, clr); +} + +static void rockchip_i2s_tdm_xfer_trcm_start(struct rk_i2s_tdm_dev *i2s_tdm) +{ + unsigned long flags; + + spin_lock_irqsave(&i2s_tdm->lock, flags); + if (atomic_inc_return(&i2s_tdm->refcount) == 1) + rockchip_i2s_tdm_xfer_start(i2s_tdm, 0); + spin_unlock_irqrestore(&i2s_tdm->lock, flags); +} + +static void rockchip_i2s_tdm_xfer_trcm_stop(struct rk_i2s_tdm_dev *i2s_tdm) +{ + unsigned long flags; + + spin_lock_irqsave(&i2s_tdm->lock, flags); + if (atomic_dec_and_test(&i2s_tdm->refcount)) + rockchip_i2s_tdm_xfer_stop(i2s_tdm, 0, false); + spin_unlock_irqrestore(&i2s_tdm->lock, flags); +} + +static void rockchip_i2s_tdm_trcm_pause(struct snd_pcm_substream *substream, + struct rk_i2s_tdm_dev *i2s_tdm) +{ + int stream = substream->stream; + int bstream = SNDRV_PCM_STREAM_LAST - stream; + + /* disable dma for both tx and rx */ + rockchip_i2s_tdm_dma_ctrl(i2s_tdm, stream, 0); + rockchip_i2s_tdm_dma_ctrl(i2s_tdm, bstream, 0); + rockchip_i2s_tdm_xfer_stop(i2s_tdm, bstream, true); +} + +static void rockchip_i2s_tdm_trcm_resume(struct snd_pcm_substream *substream, + struct rk_i2s_tdm_dev *i2s_tdm) +{ + int bstream = SNDRV_PCM_STREAM_LAST - substream->stream; + + /* + * just resume bstream, because current stream will be + * startup in the trigger-cmd-START + */ + rockchip_i2s_tdm_dma_ctrl(i2s_tdm, bstream, 1); + rockchip_i2s_tdm_xfer_start(i2s_tdm, bstream); +} + +static void rockchip_i2s_tdm_start(struct rk_i2s_tdm_dev *i2s_tdm, int stream) +{ + /* + * On HDMI-PATH-ALWAYS-ON situation, we almost keep XFER always on, + * so, for new data start, suggested to STOP-CLEAR-START to make sure + * data aligned. + */ + if ((i2s_tdm->quirks & QUIRK_HDMI_PATH) && + (i2s_tdm->quirks & QUIRK_ALWAYS_ON) && + (stream == SNDRV_PCM_STREAM_PLAYBACK)) { + rockchip_i2s_tdm_xfer_stop(i2s_tdm, stream, true); + } + + rockchip_i2s_tdm_dma_ctrl(i2s_tdm, stream, 1); + + if (i2s_tdm->clk_trcm) + rockchip_i2s_tdm_xfer_trcm_start(i2s_tdm); + else + rockchip_i2s_tdm_xfer_start(i2s_tdm, stream); +} + +static void rockchip_i2s_tdm_stop(struct rk_i2s_tdm_dev *i2s_tdm, int stream) +{ + rockchip_i2s_tdm_dma_ctrl(i2s_tdm, stream, 0); + + if (i2s_tdm->clk_trcm) + rockchip_i2s_tdm_xfer_trcm_stop(i2s_tdm); + else + rockchip_i2s_tdm_xfer_stop(i2s_tdm, stream, false); } static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai, @@ -659,72 +800,6 @@ return ret; } -static void rockchip_i2s_tdm_xfer_pause(struct snd_pcm_substream *substream, - struct rk_i2s_tdm_dev *i2s_tdm) -{ - int stream; - unsigned int val = 0; - int retry = 10; - - stream = SNDRV_PCM_STREAM_LAST - substream->stream; - if (stream == SNDRV_PCM_STREAM_PLAYBACK) - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_TDE_ENABLE, - I2S_DMACR_TDE_DISABLE); - else - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_RDE_ENABLE, - I2S_DMACR_RDE_DISABLE); - - regmap_update_bits(i2s_tdm->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); - - udelay(150); - regmap_update_bits(i2s_tdm->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); - - regmap_read(i2s_tdm->regmap, I2S_CLR, &val); - - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s_tdm->regmap, I2S_CLR, &val); - retry--; - if (!retry) { - dev_info(i2s_tdm->dev, "reset txrx\n"); - rockchip_snd_xfer_sync_reset(i2s_tdm); - break; - } - } -} - -static void rockchip_i2s_tdm_xfer_resume(struct snd_pcm_substream *substream, - struct rk_i2s_tdm_dev *i2s_tdm) -{ - int stream; - - stream = SNDRV_PCM_STREAM_LAST - substream->stream; - if (stream == SNDRV_PCM_STREAM_PLAYBACK) - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_TDE_ENABLE, - I2S_DMACR_TDE_ENABLE); - else - regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, - I2S_DMACR_RDE_ENABLE, - I2S_DMACR_RDE_ENABLE); - - rockchip_snd_xfer_reset_assert(i2s_tdm); - regmap_update_bits(i2s_tdm->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START); - rockchip_snd_xfer_reset_deassert(i2s_tdm); -} - static int rockchip_i2s_tdm_clk_set_rate(struct rk_i2s_tdm_dev *i2s_tdm, struct clk *clk, unsigned long rate, int ppm) @@ -840,6 +915,28 @@ return ret; } +static int rockchip_i2s_tdm_mclk_reparent(struct rk_i2s_tdm_dev *i2s_tdm) +{ + struct clk *parent; + int ret = 0; + + /* reparent to the same clk on TRCM mode */ + switch (i2s_tdm->clk_trcm) { + case I2S_CKR_TRCM_TXONLY: + parent = clk_get_parent(i2s_tdm->mclk_tx); + if (clk_has_parent(i2s_tdm->mclk_rx, parent)) + ret = clk_set_parent(i2s_tdm->mclk_rx, parent); + break; + case I2S_CKR_TRCM_RXONLY: + parent = clk_get_parent(i2s_tdm->mclk_rx); + if (clk_has_parent(i2s_tdm->mclk_tx, parent)) + ret = clk_set_parent(i2s_tdm->mclk_tx, parent); + break; + } + + return ret; +} + static int rockchip_i2s_tdm_set_mclk(struct rk_i2s_tdm_dev *i2s_tdm, struct snd_pcm_substream *substream, struct clk **mclk) @@ -862,6 +959,10 @@ goto err; ret = clk_set_rate(i2s_tdm->mclk_rx, i2s_tdm->mclk_rx_freq); + if (ret) + goto err; + + ret = rockchip_i2s_tdm_mclk_reparent(i2s_tdm); if (ret) goto err; @@ -895,6 +996,9 @@ unsigned int val = 0; if (!i2s_tdm->io_multiplex) + return 0; + + if (IS_ERR(i2s_tdm->grf)) return 0; if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { @@ -1006,24 +1110,18 @@ return false; } -static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai, - unsigned int div_bclk, - unsigned int div_lrck, - unsigned int fmt) +static int rockchip_i2s_tdm_params_trcm(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai, + unsigned int div_bclk, + unsigned int div_lrck, + unsigned int fmt) { struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai); unsigned long flags; - if (!i2s_tdm->clk_trcm) - return 0; - - if (!is_params_dirty(substream, dai, div_bclk, div_lrck, fmt)) - return 0; - spin_lock_irqsave(&i2s_tdm->lock, flags); if (atomic_read(&i2s_tdm->refcount)) - rockchip_i2s_tdm_xfer_pause(substream, i2s_tdm); + rockchip_i2s_tdm_trcm_pause(substream, i2s_tdm); regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV, I2S_CLKDIV_TXM_MASK | I2S_CLKDIV_RXM_MASK, @@ -1042,8 +1140,56 @@ fmt); if (atomic_read(&i2s_tdm->refcount)) - rockchip_i2s_tdm_xfer_resume(substream, i2s_tdm); + rockchip_i2s_tdm_trcm_resume(substream, i2s_tdm); spin_unlock_irqrestore(&i2s_tdm->lock, flags); + + return 0; +} + +static int rockchip_i2s_tdm_params(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai, + unsigned int div_bclk, + unsigned int div_lrck, + unsigned int fmt) +{ + struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai); + int stream = substream->stream; + + if (is_stream_active(i2s_tdm, stream)) + rockchip_i2s_tdm_xfer_stop(i2s_tdm, stream, true); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV, + I2S_CLKDIV_TXM_MASK, + I2S_CLKDIV_TXM(div_bclk)); + regmap_update_bits(i2s_tdm->regmap, I2S_CKR, + I2S_CKR_TSD_MASK, + I2S_CKR_TSD(div_lrck)); + regmap_update_bits(i2s_tdm->regmap, I2S_TXCR, + I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK, + fmt); + } else { + regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV, + I2S_CLKDIV_RXM_MASK, + I2S_CLKDIV_RXM(div_bclk)); + regmap_update_bits(i2s_tdm->regmap, I2S_CKR, + I2S_CKR_RSD_MASK, + I2S_CKR_RSD(div_lrck)); + regmap_update_bits(i2s_tdm->regmap, I2S_RXCR, + I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK, + fmt); + } + + /* + * Bring back CLK ASAP after cfg changed to make SINK devices active + * on HDMI-PATH-ALWAYS-ON situation, this workaround for some TVs no + * sound issue. at the moment, it's 8K@60Hz display situation. + */ + if ((i2s_tdm->quirks & QUIRK_HDMI_PATH) && + (i2s_tdm->quirks & QUIRK_ALWAYS_ON) && + (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) { + rockchip_i2s_tdm_xfer_start(i2s_tdm, SNDRV_PCM_STREAM_PLAYBACK); + } return 0; } @@ -1110,29 +1256,31 @@ struct snd_soc_dai *dai) { struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai); + struct snd_dmaengine_dai_dma_data *dma_data; struct clk *mclk; int ret = 0; unsigned int val = 0; unsigned int mclk_rate, bclk_rate, div_bclk = 4, div_lrck = 64; - if (i2s_tdm->is_master_mode) { - if (i2s_tdm->mclk_calibrate) - rockchip_i2s_tdm_calibrate_mclk(i2s_tdm, substream, - params_rate(params)); + dma_data = snd_soc_dai_get_dma_data(dai, substream); + dma_data->maxburst = MAXBURST_PER_FIFO * params_channels(params) / 2; - ret = rockchip_i2s_tdm_set_mclk(i2s_tdm, substream, &mclk); - if (ret) - goto err; + if (i2s_tdm->mclk_calibrate) + rockchip_i2s_tdm_calibrate_mclk(i2s_tdm, substream, + params_rate(params)); - mclk_rate = clk_get_rate(mclk); - bclk_rate = i2s_tdm->bclk_fs * params_rate(params); - if (!bclk_rate) { - ret = -EINVAL; - goto err; - } - div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate); - div_lrck = bclk_rate / params_rate(params); + ret = rockchip_i2s_tdm_set_mclk(i2s_tdm, substream, &mclk); + if (ret) + goto err; + + mclk_rate = clk_get_rate(mclk); + bclk_rate = i2s_tdm->bclk_fs * params_rate(params); + if (!bclk_rate) { + ret = -EINVAL; + goto err; } + div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate); + div_lrck = bclk_rate / params_rate(params); switch (params_format(params)) { case SNDRV_PCM_FORMAT_S8: @@ -1148,6 +1296,7 @@ val |= I2S_TXCR_VDW(24); break; case SNDRV_PCM_FORMAT_S32_LE: + case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE: val |= I2S_TXCR_VDW(32); break; default: @@ -1160,29 +1309,13 @@ goto err; val |= ret; - if (i2s_tdm->clk_trcm) { - rockchip_i2s_trcm_mode(substream, dai, div_bclk, div_lrck, val); - } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV, - I2S_CLKDIV_TXM_MASK, - I2S_CLKDIV_TXM(div_bclk)); - regmap_update_bits(i2s_tdm->regmap, I2S_CKR, - I2S_CKR_TSD_MASK, - I2S_CKR_TSD(div_lrck)); - regmap_update_bits(i2s_tdm->regmap, I2S_TXCR, - I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK, - val); - } else { - regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV, - I2S_CLKDIV_RXM_MASK, - I2S_CLKDIV_RXM(div_bclk)); - regmap_update_bits(i2s_tdm->regmap, I2S_CKR, - I2S_CKR_RSD_MASK, - I2S_CKR_RSD(div_lrck)); - regmap_update_bits(i2s_tdm->regmap, I2S_RXCR, - I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK, - val); - } + if (!is_params_dirty(substream, dai, div_bclk, div_lrck, val)) + return 0; + + if (i2s_tdm->clk_trcm) + rockchip_i2s_tdm_params_trcm(substream, dai, div_bclk, div_lrck, val); + else + rockchip_i2s_tdm_params(substream, dai, div_bclk, div_lrck, val); ret = rockchip_i2s_io_multiplex(substream, dai); @@ -1200,22 +1333,12 @@ case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - if (i2s_tdm->clk_trcm) - rockchip_snd_txrxctrl(substream, dai, 1); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - rockchip_snd_rxctrl(i2s_tdm, 1); - else - rockchip_snd_txctrl(i2s_tdm, 1); + rockchip_i2s_tdm_start(i2s_tdm, substream->stream); break; case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - if (i2s_tdm->clk_trcm) - rockchip_snd_txrxctrl(substream, dai, 0); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - rockchip_snd_rxctrl(i2s_tdm, 0); - else - rockchip_snd_txctrl(i2s_tdm, 0); + rockchip_i2s_tdm_stop(i2s_tdm, substream->stream); break; default: ret = -EINVAL; @@ -1305,6 +1428,93 @@ .put = rockchip_i2s_tdm_clk_compensation_put, }; +/* loopback mode select */ +enum { + LOOPBACK_MODE_DIS = 0, + LOOPBACK_MODE_1, + LOOPBACK_MODE_2, + LOOPBACK_MODE_2_SWAP, +}; + +static const char *const loopback_text[] = { + "Disabled", + "Mode1", + "Mode2", + "Mode2 Swap", +}; + +static SOC_ENUM_SINGLE_EXT_DECL(loopback_mode, loopback_text); + +static int rockchip_i2s_tdm_loopback_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_component_get_drvdata(component); + unsigned int reg = 0, mode = 0; + + pm_runtime_get_sync(component->dev); + regmap_read(i2s_tdm->regmap, I2S_XFER, ®); + pm_runtime_put(component->dev); + + switch (reg & I2S_XFER_LP_MODE_MASK) { + case I2S_XFER_LP_MODE_2_SWAP: + mode = LOOPBACK_MODE_2_SWAP; + break; + case I2S_XFER_LP_MODE_2: + mode = LOOPBACK_MODE_2; + break; + case I2S_XFER_LP_MODE_1: + mode = LOOPBACK_MODE_1; + break; + default: + mode = LOOPBACK_MODE_DIS; + break; + } + + ucontrol->value.enumerated.item[0] = mode; + + return 0; +} + +static int rockchip_i2s_tdm_loopback_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_component_get_drvdata(component); + unsigned int val = 0, mode = ucontrol->value.enumerated.item[0]; + + if (mode < LOOPBACK_MODE_DIS || + mode > LOOPBACK_MODE_2_SWAP) + return -EINVAL; + + switch (mode) { + case LOOPBACK_MODE_2_SWAP: + val = I2S_XFER_LP_MODE_2_SWAP; + break; + case LOOPBACK_MODE_2: + val = I2S_XFER_LP_MODE_2; + break; + case LOOPBACK_MODE_1: + val = I2S_XFER_LP_MODE_1; + break; + default: + val = I2S_XFER_LP_MODE_DIS; + break; + } + + pm_runtime_get_sync(component->dev); + regmap_update_bits(i2s_tdm->regmap, I2S_XFER, I2S_XFER_LP_MODE_MASK, val); + pm_runtime_put(component->dev); + + return 0; +} + +static const struct snd_kcontrol_new rockchip_i2s_tdm_snd_controls[] = { + SOC_ENUM_EXT("I2STDM Digital Loopback Mode", loopback_mode, + rockchip_i2s_tdm_loopback_get, + rockchip_i2s_tdm_loopback_put), +}; + static int rockchip_i2s_tdm_dai_probe(struct snd_soc_dai *dai) { struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai); @@ -1340,7 +1550,30 @@ return 0; } +static int rockchip_i2s_tdm_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai); + + if (i2s_tdm->substreams[substream->stream]) + return -EBUSY; + + i2s_tdm->substreams[substream->stream] = substream; + + return 0; +} + +static void rockchip_i2s_tdm_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai); + + i2s_tdm->substreams[substream->stream] = NULL; +} + static const struct snd_soc_dai_ops rockchip_i2s_tdm_dai_ops = { + .startup = rockchip_i2s_tdm_startup, + .shutdown = rockchip_i2s_tdm_shutdown, .hw_params = rockchip_i2s_tdm_hw_params, .set_sysclk = rockchip_i2s_tdm_set_sysclk, .set_fmt = rockchip_i2s_tdm_set_fmt, @@ -1350,6 +1583,8 @@ static const struct snd_soc_component_driver rockchip_i2s_tdm_component = { .name = DRV_NAME, + .controls = rockchip_i2s_tdm_snd_controls, + .num_controls = ARRAY_SIZE(rockchip_i2s_tdm_snd_controls), }; static bool rockchip_i2s_tdm_wr_reg(struct device *dev, unsigned int reg) @@ -1400,6 +1635,7 @@ { switch (reg) { case I2S_TXFIFOLR: + case I2S_INTCR: case I2S_INTSR: case I2S_CLR: case I2S_TXDR: @@ -1453,9 +1689,11 @@ u32 reg = 0, val = 0, trcm = i2s_tdm->clk_trcm; int i; + if (IS_ERR(i2s_tdm->grf)) + return 0; + switch (trcm) { case I2S_CKR_TRCM_TXONLY: - /* fall through */ case I2S_CKR_TRCM_RXONLY: break; default: @@ -1591,7 +1829,8 @@ SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE), + SNDRV_PCM_FMTBIT_S32_LE | + SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE), }, .capture = { .stream_name = "Capture", @@ -1602,7 +1841,8 @@ SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE), + SNDRV_PCM_FMTBIT_S32_LE | + SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE), }, .ops = &rockchip_i2s_tdm_dai_ops, }; @@ -1758,6 +1998,34 @@ return rockchip_i2s_tdm_path_prepare(i2s_tdm, np, 1); } +static irqreturn_t rockchip_i2s_tdm_isr(int irq, void *devid) +{ + struct rk_i2s_tdm_dev *i2s_tdm = (struct rk_i2s_tdm_dev *)devid; + struct snd_pcm_substream *substream; + u32 val; + + regmap_read(i2s_tdm->regmap, I2S_INTSR, &val); + if (val & I2S_INTSR_TXUI_ACT) { + dev_warn_ratelimited(i2s_tdm->dev, "TX FIFO Underrun\n"); + regmap_update_bits(i2s_tdm->regmap, I2S_INTCR, + I2S_INTCR_TXUIC, I2S_INTCR_TXUIC); + substream = i2s_tdm->substreams[SNDRV_PCM_STREAM_PLAYBACK]; + if (substream) + snd_pcm_stop_xrun(substream); + } + + if (val & I2S_INTSR_RXOI_ACT) { + dev_warn_ratelimited(i2s_tdm->dev, "RX FIFO Overrun\n"); + regmap_update_bits(i2s_tdm->regmap, I2S_INTCR, + I2S_INTCR_RXOIC, I2S_INTCR_RXOIC); + substream = i2s_tdm->substreams[SNDRV_PCM_STREAM_CAPTURE]; + if (substream) + snd_pcm_stop_xrun(substream); + } + + return IRQ_HANDLED; +} + static int rockchip_i2s_tdm_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; @@ -1769,8 +2037,7 @@ #ifdef HAVE_SYNC_RESET bool sync; #endif - int ret; - int val; + int ret, val, i, irq; ret = rockchip_i2s_tdm_dai_prepare(pdev, &soc_dai); if (ret) @@ -1788,6 +2055,10 @@ spin_lock_init(&i2s_tdm->lock); i2s_tdm->soc_data = (const struct rk_i2s_soc_data *)of_id->data; + + for (i = 0; i < ARRAY_SIZE(of_quirks); i++) + if (of_property_read_bool(node, of_quirks[i].quirk)) + i2s_tdm->quirks |= of_quirks[i].id; i2s_tdm->bclk_fs = 64; if (!of_property_read_u32(node, "rockchip,bclk-fs", &val)) { @@ -1813,8 +2084,6 @@ soc_dai->playback.channels_min = 0; i2s_tdm->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf"); - if (IS_ERR(i2s_tdm->grf)) - return PTR_ERR(i2s_tdm->grf); #ifdef HAVE_SYNC_RESET sync = of_device_is_compatible(node, "rockchip,px30-i2s-tdm") || @@ -1892,23 +2161,32 @@ i2s_tdm->mclk_root1_freq = i2s_tdm->mclk_root1_initial_freq; } - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - regs = devm_ioremap_resource(&pdev->dev, res); + regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); if (IS_ERR(regs)) return PTR_ERR(regs); i2s_tdm->regmap = devm_regmap_init_mmio(&pdev->dev, regs, - &rockchip_i2s_tdm_regmap_config); + &rockchip_i2s_tdm_regmap_config); if (IS_ERR(i2s_tdm->regmap)) return PTR_ERR(i2s_tdm->regmap); + irq = platform_get_irq(pdev, 0); + if (irq > 0) { + ret = devm_request_irq(&pdev->dev, irq, rockchip_i2s_tdm_isr, + IRQF_SHARED, node->name, i2s_tdm); + if (ret) { + dev_err(&pdev->dev, "failed to request irq %u\n", irq); + return ret; + } + } + i2s_tdm->playback_dma_data.addr = res->start + I2S_TXDR; i2s_tdm->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - i2s_tdm->playback_dma_data.maxburst = 8; + i2s_tdm->playback_dma_data.maxburst = MAXBURST_PER_FIFO; i2s_tdm->capture_dma_data.addr = res->start + I2S_RXDR; i2s_tdm->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - i2s_tdm->capture_dma_data.maxburst = 8; + i2s_tdm->capture_dma_data.maxburst = MAXBURST_PER_FIFO; ret = rockchip_i2s_tdm_tx_path_prepare(i2s_tdm, node); if (ret < 0) { @@ -1932,6 +2210,36 @@ goto err_pm_disable; } + if (i2s_tdm->quirks & QUIRK_ALWAYS_ON) { + unsigned int rate = DEFAULT_FS * DEFAULT_MCLK_FS; + unsigned int div_bclk = DEFAULT_FS * DEFAULT_MCLK_FS; + unsigned int div_lrck = i2s_tdm->bclk_fs; + + div_bclk = DIV_ROUND_CLOSEST(rate, div_lrck * DEFAULT_FS); + + /* assign generic freq */ + clk_set_rate(i2s_tdm->mclk_rx, rate); + clk_set_rate(i2s_tdm->mclk_tx, rate); + + ret = rockchip_i2s_tdm_mclk_reparent(i2s_tdm); + if (ret) + goto err_pm_disable; + + regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV, + I2S_CLKDIV_RXM_MASK | I2S_CLKDIV_TXM_MASK, + I2S_CLKDIV_RXM(div_bclk) | I2S_CLKDIV_TXM(div_bclk)); + regmap_update_bits(i2s_tdm->regmap, I2S_CKR, + I2S_CKR_RSD_MASK | I2S_CKR_TSD_MASK, + I2S_CKR_RSD(div_lrck) | I2S_CKR_TSD(div_lrck)); + + if (i2s_tdm->clk_trcm) + rockchip_i2s_tdm_xfer_trcm_start(i2s_tdm); + else + rockchip_i2s_tdm_xfer_start(i2s_tdm, SNDRV_PCM_STREAM_PLAYBACK); + + pm_runtime_forbid(&pdev->dev); + } + regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, I2S_DMACR_TDL_MASK, I2S_DMACR_TDL(16)); regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, I2S_DMACR_RDL_MASK, @@ -1951,8 +2259,11 @@ goto err_suspend; } - if (of_property_read_bool(node, "rockchip,no-dmaengine")) - return ret; + if (of_property_read_bool(node, "rockchip,no-dmaengine")) { + dev_info(&pdev->dev, "Used for Multi-DAI\n"); + return 0; + } + ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); if (ret) { dev_err(&pdev->dev, "Could not register PCM\n"); @@ -1978,14 +2289,21 @@ if (!pm_runtime_status_suspended(&pdev->dev)) i2s_tdm_runtime_suspend(&pdev->dev); - if (!IS_ERR(i2s_tdm->mclk_tx)) - clk_prepare_enable(i2s_tdm->mclk_tx); - if (!IS_ERR(i2s_tdm->mclk_rx)) - clk_prepare_enable(i2s_tdm->mclk_rx); - if (!IS_ERR(i2s_tdm->hclk)) - clk_disable_unprepare(i2s_tdm->hclk); + clk_disable_unprepare(i2s_tdm->mclk_tx); + clk_disable_unprepare(i2s_tdm->mclk_rx); + clk_disable_unprepare(i2s_tdm->hclk); return 0; +} + +static void rockchip_i2s_tdm_platform_shutdown(struct platform_device *pdev) +{ + struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(&pdev->dev); + + pm_runtime_get_sync(i2s_tdm->dev); + rockchip_i2s_tdm_stop(i2s_tdm, SNDRV_PCM_STREAM_PLAYBACK); + rockchip_i2s_tdm_stop(i2s_tdm, SNDRV_PCM_STREAM_CAPTURE); + pm_runtime_put(i2s_tdm->dev); } #ifdef CONFIG_PM_SLEEP @@ -2023,6 +2341,7 @@ static struct platform_driver rockchip_i2s_tdm_driver = { .probe = rockchip_i2s_tdm_probe, .remove = rockchip_i2s_tdm_remove, + .shutdown = rockchip_i2s_tdm_platform_shutdown, .driver = { .name = DRV_NAME, .of_match_table = of_match_ptr(rockchip_i2s_tdm_match), diff --git a/kernel/sound/soc/rockchip/rockchip_i2s_tdm.h b/kernel/sound/soc/rockchip/rockchip_i2s_tdm.h index fa41f81..2a8c489 100644 --- a/kernel/sound/soc/rockchip/rockchip_i2s_tdm.h +++ b/kernel/sound/soc/rockchip/rockchip_i2s_tdm.h @@ -144,12 +144,16 @@ #define I2S_DMACR_RDE_SHIFT 24 #define I2S_DMACR_RDE_DISABLE (0 << I2S_DMACR_RDE_SHIFT) #define I2S_DMACR_RDE_ENABLE (1 << I2S_DMACR_RDE_SHIFT) +#define I2S_DMACR_RDE_MASK (1 << I2S_DMACR_RDE_SHIFT) +#define I2S_DMACR_RDE(x) ((x) << I2S_DMACR_RDE_SHIFT) #define I2S_DMACR_RDL_SHIFT 16 #define I2S_DMACR_RDL(x) (((x) - 1) << I2S_DMACR_RDL_SHIFT) #define I2S_DMACR_RDL_MASK (0x1f << I2S_DMACR_RDL_SHIFT) #define I2S_DMACR_TDE_SHIFT 8 #define I2S_DMACR_TDE_DISABLE (0 << I2S_DMACR_TDE_SHIFT) #define I2S_DMACR_TDE_ENABLE (1 << I2S_DMACR_TDE_SHIFT) +#define I2S_DMACR_TDE_MASK (1 << I2S_DMACR_TDE_SHIFT) +#define I2S_DMACR_TDE(x) ((x) << I2S_DMACR_TDE_SHIFT) #define I2S_DMACR_TDL_SHIFT 0 #define I2S_DMACR_TDL(x) ((x) << I2S_DMACR_TDL_SHIFT) #define I2S_DMACR_TDL_MASK (0x1f << I2S_DMACR_TDL_SHIFT) @@ -162,8 +166,8 @@ #define I2S_INTCR_RFT(x) (((x) - 1) << I2S_INTCR_RFT_SHIFT) #define I2S_INTCR_RXOIC BIT(18) #define I2S_INTCR_RXOIE_SHIFT 17 -#define I2S_INTCR_RXOIE_DISABLE (0 << I2S_INTCR_RXOIE_SHIFT) -#define I2S_INTCR_RXOIE_ENABLE (1 << I2S_INTCR_RXOIE_SHIFT) +#define I2S_INTCR_RXOIE_MASK (1 << I2S_INTCR_RXOIE_SHIFT) +#define I2S_INTCR_RXOIE(x) ((x) << I2S_INTCR_RXOIE_SHIFT) #define I2S_INTCR_RXFIE_SHIFT 16 #define I2S_INTCR_RXFIE_DISABLE (0 << I2S_INTCR_RXFIE_SHIFT) #define I2S_INTCR_RXFIE_ENABLE (1 << I2S_INTCR_RXFIE_SHIFT) @@ -172,8 +176,8 @@ #define I2S_INTCR_TFT_MASK (0x1f << I2S_INTCR_TFT_SHIFT) #define I2S_INTCR_TXUIC BIT(2) #define I2S_INTCR_TXUIE_SHIFT 1 -#define I2S_INTCR_TXUIE_DISABLE (0 << I2S_INTCR_TXUIE_SHIFT) -#define I2S_INTCR_TXUIE_ENABLE (1 << I2S_INTCR_TXUIE_SHIFT) +#define I2S_INTCR_TXUIE_MASK (1 << I2S_INTCR_TXUIE_SHIFT) +#define I2S_INTCR_TXUIE(x) ((x) << I2S_INTCR_TXUIE_SHIFT) /* * INTSR @@ -199,12 +203,37 @@ * XFER * Transfer start register */ +/* + * lp mode2 swap: + * i2s sdi0_l <- i2s sdo0_l + * i2s sdi0_r <- codec sdo_r + * + * lp mode2: + * i2s sdi0_l <- codec sdo_l + * i2s sdi0_r <- i2s sdo0_r + * + * lp mode1: + * i2s sdi0_l <- codec sdo_l + * i2s sdi0_r <- codec sdo_r + * i2s sdi1_l <- i2s sdo0_l + * i2s sdi1_r <- i2s sdo0_r + * + */ +#define I2S_XFER_LP_MODE_MASK GENMASK(4, 2) +#define I2S_XFER_LP_MODE_2_SWAP (BIT(4) | BIT(3)) +#define I2S_XFER_LP_MODE_2 BIT(3) +#define I2S_XFER_LP_MODE_1 BIT(2) +#define I2S_XFER_LP_MODE_DIS 0 #define I2S_XFER_RXS_SHIFT 1 #define I2S_XFER_RXS_STOP (0 << I2S_XFER_RXS_SHIFT) #define I2S_XFER_RXS_START (1 << I2S_XFER_RXS_SHIFT) +#define I2S_XFER_RXS_MASK (1 << I2S_XFER_RXS_SHIFT) +#define I2S_XFER_RXS(x) ((x) << I2S_XFER_RXS_SHIFT) #define I2S_XFER_TXS_SHIFT 0 #define I2S_XFER_TXS_STOP (0 << I2S_XFER_TXS_SHIFT) #define I2S_XFER_TXS_START (1 << I2S_XFER_TXS_SHIFT) +#define I2S_XFER_TXS_MASK (1 << I2S_XFER_TXS_SHIFT) +#define I2S_XFER_TXS(x) ((x) << I2S_XFER_TXS_SHIFT) /* * CLR diff --git a/kernel/sound/soc/rockchip/rockchip_multi_dais.c b/kernel/sound/soc/rockchip/rockchip_multi_dais.c index 88fb11c..06d80a1 100644 --- a/kernel/sound/soc/rockchip/rockchip_multi_dais.c +++ b/kernel/sound/soc/rockchip/rockchip_multi_dais.c @@ -80,9 +80,19 @@ { struct rk_mdais_dev *mdais = to_info(dai); struct snd_soc_dai *child; + unsigned int *channel_maps; int ret = 0, i = 0; + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + channel_maps = mdais->playback_channel_maps; + else + channel_maps = mdais->capture_channel_maps; + for (i = 0; i < mdais->num_dais; i++) { + /* skip DAIs which have no channel mapping */ + if (!channel_maps[i]) + continue; + child = mdais->dais[i].dai; if (child->driver->ops && child->driver->ops->trigger) { ret = child->driver->ops->trigger(substream, diff --git a/kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c b/kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c index c057fa8..e2a0de7 100644 --- a/kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c +++ b/kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c @@ -601,6 +601,9 @@ pos = buf_size - state.residue; frames = bytes_to_frames(substream->runtime, pos); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + return frames; + #ifdef CONFIG_SND_SOC_ROCKCHIP_VAD if (prtd->vpos) frames = bytes_to_frames(substream->runtime, prtd->vpos); diff --git a/kernel/sound/soc/rockchip/rockchip_multicodecs.c b/kernel/sound/soc/rockchip/rockchip_multicodecs.c index ee45076..8b1cb5f 100644 --- a/kernel/sound/soc/rockchip/rockchip_multicodecs.c +++ b/kernel/sound/soc/rockchip/rockchip_multicodecs.c @@ -19,9 +19,18 @@ * */ +#include <linux/extcon-provider.h> +#include <linux/gpio.h> +#include <linux/iio/consumer.h> +#include <linux/iio/iio.h> +#include <linux/input.h> +#include <linux/interrupt.h> +#include <linux/irq.h> #include <linux/module.h> +#include <linux/of_gpio.h> #include <linux/platform_device.h> #include <linux/slab.h> +#include <linux/workqueue.h> #include <sound/core.h> #include <sound/jack.h> #include <sound/pcm.h> @@ -29,39 +38,321 @@ #include <sound/soc.h> #include <sound/soc-dapm.h> -#include "../codecs/rk3308_codec_provider.h" - #define DRV_NAME "rk-multicodecs" -#define MAX_CODECS 2 #define WAIT_CARDS (SNDRV_CARDS - 1) #define DEFAULT_MCLK_FS 256 + +struct adc_keys_button { + u32 voltage; + u32 keycode; +}; + +struct input_dev_poller { + void (*poll)(struct input_dev *dev); + + unsigned int poll_interval_ms; + struct input_dev *input; + struct delayed_work work; +}; struct multicodecs_data { struct snd_soc_card snd_card; struct snd_soc_dai_link dai_link; + struct snd_soc_jack *jack_headset; + struct gpio_desc *hp_ctl_gpio; + struct gpio_desc *spk_ctl_gpio; + struct gpio_desc *hp_det_gpio; + struct iio_channel *adc; + struct extcon_dev *extcon; + struct delayed_work handler; unsigned int mclk_fs; bool codec_hp_det; + u32 num_keys; + u32 last_key; + u32 keyup_voltage; + const struct adc_keys_button *map; + struct input_dev *input; + struct input_dev_poller *poller; }; -static struct snd_soc_jack mc_hp_jack; +static const unsigned int headset_extcon_cable[] = { + EXTCON_JACK_MICROPHONE, + EXTCON_JACK_HEADPHONE, + EXTCON_NONE, +}; + +static void mc_set_poll_interval(struct input_dev_poller *poller, unsigned int interval) +{ + if (poller) + poller->poll_interval_ms = interval; +} + +static void mc_keys_poller_queue_work(struct input_dev_poller *poller) +{ + unsigned long delay; + + delay = msecs_to_jiffies(poller->poll_interval_ms); + if (delay >= HZ) + delay = round_jiffies_relative(delay); + + queue_delayed_work(system_freezable_wq, &poller->work, delay); +} + +static void mc_keys_poller_work(struct work_struct *work) +{ + struct input_dev_poller *poller = + container_of(work, struct input_dev_poller, work.work); + + poller->poll(poller->input); + mc_keys_poller_queue_work(poller); +} + +static void mc_keys_poller_start(struct input_dev_poller *poller) +{ + if (poller->poll_interval_ms > 0) { + poller->poll(poller->input); + mc_keys_poller_queue_work(poller); + } +} + +static void mc_keys_poller_stop(struct input_dev_poller *poller) +{ + cancel_delayed_work_sync(&poller->work); +} + +static int mc_keys_setup_polling(struct multicodecs_data *mc_data, + void (*poll_fn)(struct input_dev *dev)) +{ + struct input_dev_poller *poller; + + poller = devm_kzalloc(mc_data->snd_card.dev, sizeof(*poller), GFP_KERNEL); + if (!poller) + return -ENOMEM; + + INIT_DELAYED_WORK(&poller->work, mc_keys_poller_work); + poller->input = mc_data->input; + poller->poll = poll_fn; + mc_data->poller = poller; + + return 0; +} + +static void mc_keys_poll(struct input_dev *input) +{ + struct multicodecs_data *mc_data = input_get_drvdata(input); + int i, value, ret; + u32 diff, closest = 0xffffffff; + int keycode = 0; + + ret = iio_read_channel_processed(mc_data->adc, &value); + if (unlikely(ret < 0)) { + /* Forcibly release key if any was pressed */ + value = mc_data->keyup_voltage; + } else { + for (i = 0; i < mc_data->num_keys; i++) { + diff = abs(mc_data->map[i].voltage - value); + if (diff < closest) { + closest = diff; + keycode = mc_data->map[i].keycode; + } + } + } + + if (abs(mc_data->keyup_voltage - value) < closest) + keycode = 0; + + if (mc_data->last_key && mc_data->last_key != keycode) + input_report_key(input, mc_data->last_key, 0); + + if (keycode) + input_report_key(input, keycode, 1); + + input_sync(input); + mc_data->last_key = keycode; +} + +static int mc_keys_load_keymap(struct device *dev, + struct multicodecs_data *mc_data) +{ + struct adc_keys_button *map; + struct fwnode_handle *child; + int i = 0; + + mc_data->num_keys = device_get_child_node_count(dev); + if (mc_data->num_keys == 0) { + dev_err(dev, "keymap is missing\n"); + return -EINVAL; + } + + map = devm_kmalloc_array(dev, mc_data->num_keys, sizeof(*map), GFP_KERNEL); + if (!map) + return -ENOMEM; + + device_for_each_child_node(dev, child) { + if (fwnode_property_read_u32(child, "press-threshold-microvolt", + &map[i].voltage)) { + dev_err(dev, "Key with invalid or missing voltage\n"); + fwnode_handle_put(child); + return -EINVAL; + } + map[i].voltage /= 1000; + + if (fwnode_property_read_u32(child, "linux,code", + &map[i].keycode)) { + dev_err(dev, "Key with invalid or missing linux,code\n"); + fwnode_handle_put(child); + return -EINVAL; + } + + i++; + } + mc_data->map = map; + return 0; +} + +static void adc_jack_handler(struct work_struct *work) +{ + struct multicodecs_data *mc_data = container_of(to_delayed_work(work), + struct multicodecs_data, + handler); + struct snd_soc_jack *jack_headset = mc_data->jack_headset; + int adc, ret = 0; + + if (!gpiod_get_value(mc_data->hp_det_gpio)) { + snd_soc_jack_report(jack_headset, 0, SND_JACK_HEADSET); + extcon_set_state_sync(mc_data->extcon, + EXTCON_JACK_HEADPHONE, false); + extcon_set_state_sync(mc_data->extcon, + EXTCON_JACK_MICROPHONE, false); + if (mc_data->poller) + mc_keys_poller_stop(mc_data->poller); + + return; + } + if (!mc_data->adc) { + /* no ADC, so is headphone */ + snd_soc_jack_report(jack_headset, SND_JACK_HEADPHONE, SND_JACK_HEADSET); + extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_HEADPHONE, true); + extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_MICROPHONE, false); + return; + } + ret = iio_read_channel_processed(mc_data->adc, &adc); + if (ret < 0) { + /* failed to read ADC, so assume headphone */ + snd_soc_jack_report(jack_headset, SND_JACK_HEADPHONE, SND_JACK_HEADSET); + extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_HEADPHONE, true); + extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_MICROPHONE, false); + + } else { + snd_soc_jack_report(jack_headset, + snd_soc_jack_get_type(jack_headset, adc), + SND_JACK_HEADSET); + extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_HEADPHONE, true); + + if (snd_soc_jack_get_type(jack_headset, adc) == SND_JACK_HEADSET) { + extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_MICROPHONE, true); + if (mc_data->poller) + mc_keys_poller_start(mc_data->poller); + } + } +}; + +static irqreturn_t headset_det_irq_thread(int irq, void *data) +{ + struct multicodecs_data *mc_data = (struct multicodecs_data *)data; + + queue_delayed_work(system_power_efficient_wq, &mc_data->handler, msecs_to_jiffies(200)); + + return IRQ_HANDLED; +}; + +static int mc_hp_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_card *card = w->dapm->card; + struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(card); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + gpiod_set_value_cansleep(mc_data->hp_ctl_gpio, 1); + break; + case SND_SOC_DAPM_PRE_PMD: + gpiod_set_value_cansleep(mc_data->hp_ctl_gpio, 0); + break; + default: + return 0; + + } + + return 0; +} + +static int mc_spk_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_card *card = w->dapm->card; + struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(card); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + gpiod_set_value_cansleep(mc_data->spk_ctl_gpio, 1); + break; + case SND_SOC_DAPM_PRE_PMD: + gpiod_set_value_cansleep(mc_data->spk_ctl_gpio, 0); + break; + default: + return 0; + + } + + return 0; +} + +static const struct snd_soc_dapm_widget mc_dapm_widgets[] = { + + SND_SOC_DAPM_HP("Headphone", NULL), + SND_SOC_DAPM_SPK("Speaker", NULL), + SND_SOC_DAPM_MIC("Main Mic", NULL), + SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_SUPPLY("Speaker Power", + SND_SOC_NOPM, 0, 0, + mc_spk_event, + SND_SOC_DAPM_POST_PMU | + SND_SOC_DAPM_PRE_PMD), + SND_SOC_DAPM_SUPPLY("Headphone Power", + SND_SOC_NOPM, 0, 0, + mc_hp_event, + SND_SOC_DAPM_POST_PMU | + SND_SOC_DAPM_PRE_PMD), +}; + +static const struct snd_kcontrol_new mc_controls[] = { + SOC_DAPM_PIN_SWITCH("Headphone"), + SOC_DAPM_PIN_SWITCH("Speaker"), + SOC_DAPM_PIN_SWITCH("Main Mic"), + SOC_DAPM_PIN_SWITCH("Headset Mic"), +}; static int rk_multicodecs_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai; struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(rtd->card); unsigned int mclk; - int ret; + int ret, i; mclk = params_rate(params) * mc_data->mclk_fs; - ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk, - SND_SOC_CLOCK_IN); - if (ret && ret != -ENOTSUPP) { - pr_err("Set codec_dai sysclk failed: %d\n", ret); - goto out; + for (i = 0; i < rtd->num_codecs; i++) { + codec_dai = rtd->codec_dais[i]; + ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk, + SND_SOC_CLOCK_IN); + if (ret && ret != -ENOTSUPP) { + pr_err("Set codec_dai sysclk failed: %d\n", ret); + goto out; + } } ret = snd_soc_dai_set_sysclk(cpu_dai, substream->stream, mclk, @@ -80,16 +371,97 @@ static int rk_dailink_init(struct snd_soc_pcm_runtime *rtd) { struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_card *card = rtd->card; + struct snd_soc_jack *jack_headset; + int ret, irq; + struct snd_soc_jack_pin *pins; + struct snd_soc_jack_zone *zones; + struct snd_soc_jack_pin jack_pins[] = { + { + .pin = "Headphone", + .mask = SND_JACK_HEADPHONE, + }, { + .pin = "Headset Mic", + .mask = SND_JACK_MICROPHONE, + }, + }; + struct snd_soc_jack_zone headset_zones[] = { + { + .min_mv = 0, + .max_mv = 222, + .jack_type = SND_JACK_HEADPHONE, + }, { + .min_mv = 223, + .max_mv = 1500, + .jack_type = SND_JACK_HEADSET, + }, { + .min_mv = 1501, + .max_mv = UINT_MAX, + .jack_type = SND_JACK_HEADPHONE, + } + }; + + if ((!mc_data->codec_hp_det) && (gpiod_to_irq(mc_data->hp_det_gpio) < 0)) { + dev_info(card->dev, "Don't need to map headset detect gpio to irq\n"); + return 0; + } + + jack_headset = devm_kzalloc(card->dev, sizeof(*jack_headset), GFP_KERNEL); + if (!jack_headset) + return -ENOMEM; + + pins = devm_kmemdup(card->dev, jack_pins, + sizeof(*jack_pins) * ARRAY_SIZE(jack_pins), GFP_KERNEL); + if (!pins) + return -ENOMEM; + + zones = devm_kmemdup(card->dev, headset_zones, + sizeof(*headset_zones) * ARRAY_SIZE(headset_zones), GFP_KERNEL); + if (!zones) + return -ENOMEM; + + ret = snd_soc_card_jack_new(card, "Headset", + SND_JACK_HEADSET, + jack_headset, + pins, ARRAY_SIZE(jack_pins)); + if (ret) + return ret; + ret = snd_soc_jack_add_zones(jack_headset, ARRAY_SIZE(headset_zones), zones); + if (ret) + return ret; + + mc_data->jack_headset = jack_headset; if (mc_data->codec_hp_det) { - snd_soc_card_jack_new(rtd->card, "Headphones", - SND_JACK_HEADPHONE, - &mc_hp_jack, NULL, 0); + struct snd_soc_dai *codec_dai; + int i; -#ifdef CONFIG_SND_SOC_RK3308 - if (rk3308_codec_set_jack_detect_cb) - rk3308_codec_set_jack_detect_cb(rtd->codec_dai->component, &mc_hp_jack); -#endif + /* set jack for the first successful one */ + for (i = 0; i < rtd->num_codecs; i++) { + codec_dai = rtd->codec_dais[i]; + ret = snd_soc_component_set_jack(codec_dai->component, + jack_headset, NULL); + if (ret >= 0) + break; + } + } else { + irq = gpiod_to_irq(mc_data->hp_det_gpio); + if (irq >= 0) { + ret = devm_request_threaded_irq(card->dev, irq, NULL, + headset_det_irq_thread, + IRQF_TRIGGER_RISING | + IRQF_TRIGGER_FALLING | + IRQF_ONESHOT, + "headset_detect", + mc_data); + if (ret) { + dev_err(card->dev, "Failed to request headset detect irq"); + return ret; + } + + queue_delayed_work(system_power_efficient_wq, + &mc_data->handler, msecs_to_jiffies(50)); + } } return 0; @@ -216,8 +588,9 @@ struct multicodecs_data *mc_data; struct of_phandle_args args; struct device_node *node; + struct input_dev *input; u32 val; - int count; + int count, value; int ret = 0, i = 0, idx = 0; const char *prefix = "rockchip,"; @@ -244,13 +617,18 @@ link->stream_name = link->name; link->init = rk_dailink_init; link->ops = &rk_ops; + link->ignore_pmdown_time = 1; card->dai_link = link; card->num_links = 1; + card->dapm_widgets = mc_dapm_widgets; + card->num_dapm_widgets = ARRAY_SIZE(mc_dapm_widgets); + card->controls = mc_controls; + card->num_controls = ARRAY_SIZE(mc_controls); card->num_aux_devs = 0; count = of_count_phandle_with_args(np, "rockchip,codec", NULL); - if (count < 0 || count > MAX_CODECS) + if (count < 0) return -EINVAL; /* refine codecs, remove unavailable node */ @@ -267,6 +645,9 @@ codecs = devm_kcalloc(&pdev->dev, idx, sizeof(*codecs), GFP_KERNEL); + if (!codecs) + return -ENOMEM; + link->codecs = codecs; link->num_codecs = idx; idx = 0; @@ -305,6 +686,101 @@ mc_data->codec_hp_det = of_property_read_bool(np, "rockchip,codec-hp-det"); + mc_data->adc = devm_iio_channel_get(&pdev->dev, "adc-detect"); + + if (IS_ERR(mc_data->adc)) { + if (PTR_ERR(mc_data->adc) != -EPROBE_DEFER) { + mc_data->adc = NULL; + dev_warn(&pdev->dev, "Failed to get ADC channel"); + } + } else { + if (mc_data->adc->channel->type != IIO_VOLTAGE) + return -EINVAL; + + if (device_property_read_u32(&pdev->dev, "keyup-threshold-microvolt", + &mc_data->keyup_voltage)) { + dev_warn(&pdev->dev, "Invalid or missing keyup voltage\n"); + return -EINVAL; + } + mc_data->keyup_voltage /= 1000; + + ret = mc_keys_load_keymap(&pdev->dev, mc_data); + if (ret) + return ret; + + input = devm_input_allocate_device(&pdev->dev); + if (IS_ERR(input)) { + dev_err(&pdev->dev, "failed to allocate input device\n"); + return PTR_ERR(input); + } + + input_set_drvdata(input, mc_data); + + input->name = "headset-keys"; + input->phys = "headset-keys/input0"; + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + __set_bit(EV_KEY, input->evbit); + for (i = 0; i < mc_data->num_keys; i++) + __set_bit(mc_data->map[i].keycode, input->keybit); + + if (device_property_read_bool(&pdev->dev, "autorepeat")) + __set_bit(EV_REP, input->evbit); + + mc_data->input = input; + ret = mc_keys_setup_polling(mc_data, mc_keys_poll); + if (ret) { + dev_err(&pdev->dev, "Unable to set up polling: %d\n", ret); + return ret; + } + + if (!device_property_read_u32(&pdev->dev, "poll-interval", &value)) + mc_set_poll_interval(mc_data->poller, value); + + ret = input_register_device(mc_data->input); + if (ret) { + dev_err(&pdev->dev, "Unable to register input device: %d\n", ret); + return ret; + } + } + + INIT_DEFERRABLE_WORK(&mc_data->handler, adc_jack_handler); + + mc_data->spk_ctl_gpio = devm_gpiod_get_optional(&pdev->dev, + "spk-con", + GPIOD_OUT_LOW); + if (IS_ERR(mc_data->spk_ctl_gpio)) + return PTR_ERR(mc_data->spk_ctl_gpio); + + mc_data->hp_ctl_gpio = devm_gpiod_get_optional(&pdev->dev, + "hp-con", + GPIOD_OUT_LOW); + if (IS_ERR(mc_data->hp_ctl_gpio)) + return PTR_ERR(mc_data->hp_ctl_gpio); + + mc_data->hp_det_gpio = devm_gpiod_get_optional(&pdev->dev, "hp-det", GPIOD_IN); + if (IS_ERR(mc_data->hp_det_gpio)) + return PTR_ERR(mc_data->hp_det_gpio); + + mc_data->extcon = devm_extcon_dev_allocate(&pdev->dev, headset_extcon_cable); + if (IS_ERR(mc_data->extcon)) { + dev_err(&pdev->dev, "allocate extcon failed\n"); + return PTR_ERR(mc_data->extcon); + } + + ret = devm_extcon_dev_register(&pdev->dev, mc_data->extcon); + if (ret) { + dev_err(&pdev->dev, "failed to register extcon: %d\n", ret); + return ret; + } + + ret = snd_soc_of_parse_audio_routing(card, "rockchip,audio-routing"); + if (ret < 0) + dev_warn(&pdev->dev, "Audio routing invalid/unspecified\n"); + snd_soc_card_set_drvdata(card, mc_data); ret = devm_snd_soc_register_card(&pdev->dev, card); diff --git a/kernel/sound/soc/rockchip/rockchip_pdm.c b/kernel/sound/soc/rockchip/rockchip_pdm.c index d7f1f97..1a8ee0f 100644 --- a/kernel/sound/soc/rockchip/rockchip_pdm.c +++ b/kernel/sound/soc/rockchip/rockchip_pdm.c @@ -207,22 +207,35 @@ return snd_soc_dai_get_drvdata(dai); } -static void rockchip_pdm_drop_fifo(struct rk_pdm_dev *pdm) -{ - int cnt, val, i; - - /* drop the dirty data */ - regmap_read(pdm->regmap, PDM_FIFO_CTRL, &cnt); - for (i = 0; i < PDM_FIFO_CNT(cnt); i++) - regmap_read(pdm->regmap, PDM_RXFIFO_DATA, &val); -} - static void rockchip_pdm_rxctrl(struct rk_pdm_dev *pdm, int on) { + unsigned long flags; + if (on) { - rockchip_pdm_drop_fifo(pdm); + /* The PDM device need to delete some unused data + * since the pdm of various manufacturers can not + * be stable quickly. This is done by commit "ASoC: + * rockchip: pdm: Fix pop noise in the beginning". + * + * But we do not know how many data we delete, this + * cause channel disorder. For example, we record + * two channel 24-bit sound, then delete some starting + * data. Because the deleted starting data is uncertain, + * the next data may be left or right channel and cause + * channel disorder. + * + * Luckily, we can use the PDM_RX_CLR to fix this. + * Use the PDM_RX_CLR to clear fifo written data and + * address, but can not clear the read data and address. + * In initial state, the read data and address are zero. + */ + local_irq_save(flags); + regmap_update_bits(pdm->regmap, PDM_SYSCONFIG, + PDM_RX_CLR_MASK, + PDM_RX_CLR_WR); regmap_update_bits(pdm->regmap, PDM_DMA_CTRL, PDM_DMA_RD_MSK, PDM_DMA_RD_EN); + local_irq_restore(flags); } else { regmap_update_bits(pdm->regmap, PDM_DMA_CTRL, PDM_DMA_RD_MSK, PDM_DMA_RD_DIS); @@ -976,8 +989,10 @@ if (ret != 0 && ret != -ENOENT) goto err_suspend; - if (of_property_read_bool(node, "rockchip,no-dmaengine")) + if (of_property_read_bool(node, "rockchip,no-dmaengine")) { + dev_info(&pdev->dev, "Used for Multi-DAI\n"); return 0; + } ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); if (ret) { diff --git a/kernel/sound/soc/rockchip/rockchip_sai.c b/kernel/sound/soc/rockchip/rockchip_sai.c index fa0a8bb..c626142 100644 --- a/kernel/sound/soc/rockchip/rockchip_sai.c +++ b/kernel/sound/soc/rockchip/rockchip_sai.c @@ -24,6 +24,10 @@ #define FW_RATIO_MAX 8 #define FW_RATIO_MIN 1 +#define MAXBURST_PER_FIFO 8 + +#define DEFAULT_FS 48000 +#define QUIRK_ALWAYS_ON BIT(0) enum fpw_mode { FPW_ONE_BCLK_WIDTH, @@ -41,14 +45,28 @@ struct snd_dmaengine_dai_dma_data capture_dma_data; struct snd_dmaengine_dai_dma_data playback_dma_data; struct snd_pcm_substream *substreams[SNDRV_PCM_STREAM_LAST + 1]; + unsigned int tx_lanes; + unsigned int rx_lanes; + unsigned int quirks; enum fpw_mode fpw; - int fw_ratio; + int fw_ratio; bool has_capture; bool has_playback; bool is_master_mode; + bool is_tdm; }; -static int sai_runtime_suspend(struct device *dev) +static const struct sai_of_quirks { + char *quirk; + int id; +} of_quirks[] = { + { + .quirk = "rockchip,always-on", + .id = QUIRK_ALWAYS_ON, + }, +}; + +static int rockchip_sai_runtime_suspend(struct device *dev) { struct rk_sai_dev *sai = dev_get_drvdata(dev); unsigned int val; @@ -68,14 +86,19 @@ regcache_cache_only(sai->regmap, true); clk_disable_unprepare(sai->mclk); + clk_disable_unprepare(sai->hclk); return 0; } -static int sai_runtime_resume(struct device *dev) +static int rockchip_sai_runtime_resume(struct device *dev) { struct rk_sai_dev *sai = dev_get_drvdata(dev); int ret; + + ret = clk_prepare_enable(sai->hclk); + if (ret) + goto err_hclk; ret = clk_prepare_enable(sai->mclk); if (ret) @@ -99,6 +122,8 @@ err_regmap: clk_disable_unprepare(sai->mclk); err_mclk: + clk_disable_unprepare(sai->hclk); +err_hclk: return ret; } @@ -359,19 +384,42 @@ return ret; } +static unsigned int rockchip_sai_lanes_auto(struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct rk_sai_dev *sai = snd_soc_dai_get_drvdata(dai); + unsigned int lanes = 1; + + if (!sai->is_tdm) + lanes = DIV_ROUND_UP(params_channels(params), 2); + + return lanes; +} + static int rockchip_sai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct rk_sai_dev *sai = snd_soc_dai_get_drvdata(dai); + struct snd_dmaengine_dai_dma_data *dma_data; unsigned int mclk_rate, bclk_rate, div_bclk; unsigned int ch_per_lane, lanes, slot_width; unsigned int val, fscr, reg; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dma_data = snd_soc_dai_get_dma_data(dai, substream); + dma_data->maxburst = MAXBURST_PER_FIFO * params_channels(params) / 2; + + lanes = rockchip_sai_lanes_auto(params, dai); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { reg = SAI_TXCR; - else + if (sai->tx_lanes) + lanes = sai->tx_lanes; + } else { reg = SAI_RXCR; + if (sai->rx_lanes) + lanes = sai->rx_lanes; + } switch (params_format(params)) { case SNDRV_PCM_FORMAT_S8: @@ -391,12 +439,13 @@ return -EINVAL; } - regmap_update_bits(sai->regmap, reg, SAI_XCR_VDW_MASK, val); + val |= SAI_XCR_CSR(lanes); + + regmap_update_bits(sai->regmap, reg, SAI_XCR_VDW_MASK | SAI_XCR_CSR_MASK, val); regmap_read(sai->regmap, reg, &val); slot_width = SAI_XCR_SBW_V(val); - lanes = SAI_XCR_CSR_V(val); ch_per_lane = params_channels(params) / lanes; regmap_update_bits(sai->regmap, reg, SAI_XCR_SNB_MASK, @@ -525,6 +574,8 @@ regmap_update_bits(sai->regmap, SAI_RXCR, SAI_XCR_SBW_MASK, SAI_XCR_SBW(slot_width)); pm_runtime_put(dai->dev); + + sai->is_tdm = true; return 0; } @@ -699,7 +750,7 @@ sai->playback_dma_data.addr = res->start + SAI_TXDR; sai->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - sai->playback_dma_data.maxburst = 8; + sai->playback_dma_data.maxburst = MAXBURST_PER_FIFO; } if (sai->has_capture) { @@ -714,7 +765,7 @@ sai->capture_dma_data.addr = res->start + SAI_RXDR; sai->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - sai->capture_dma_data.maxburst = 8; + sai->capture_dma_data.maxburst = MAXBURST_PER_FIFO; } regmap_update_bits(sai->regmap, SAI_DMACR, SAI_DMACR_TDL_MASK, @@ -728,8 +779,8 @@ return 0; } -static const char * const tcsr_text[] = { "SDOx1", "SDOx2", "SDOx3", "SDOx4" }; -static const char * const rcsr_text[] = { "SDIx1", "SDIx2", "SDIx3", "SDIx4" }; +static const char * const tx_lanes_text[] = { "Auto", "SDOx1", "SDOx2", "SDOx3", "SDOx4" }; +static const char * const rx_lanes_text[] = { "Auto", "SDIx1", "SDIx2", "SDIx3", "SDIx4" }; static const char * const edge_text[] = { "Rising Edge", "Dual Edge" }; static const char * const edge_shift_text[] = { "Normal", "Shift 1 Edge" }; @@ -771,7 +822,8 @@ /* TXCR */ static SOC_ENUM_SINGLE_DECL(tsft_enum, SAI_TXCR, 22, edge_shift_text); -static SOC_ENUM_SINGLE_DECL(tcsr_enum, SAI_TXCR, 20, tcsr_text); +static const struct soc_enum tx_lanes_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tx_lanes_text), tx_lanes_text); static SOC_ENUM_SINGLE_DECL(tsjm_enum, SAI_TXCR, 19, sjm_text); static SOC_ENUM_SINGLE_DECL(tfbm_enum, SAI_TXCR, 18, fbm_text); static SOC_ENUM_SINGLE_DECL(tvdj_enum, SAI_TXCR, 10, vdj_text); @@ -786,7 +838,8 @@ /* RXCR */ static SOC_ENUM_SINGLE_DECL(rsft_enum, SAI_RXCR, 22, edge_shift_text); -static SOC_ENUM_SINGLE_DECL(rcsr_enum, SAI_RXCR, 20, rcsr_text); +static const struct soc_enum rx_lanes_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_lanes_text), rx_lanes_text); static SOC_ENUM_SINGLE_DECL(rsjm_enum, SAI_RXCR, 19, sjm_text); static SOC_ENUM_SINGLE_DECL(rfbm_enum, SAI_RXCR, 18, fbm_text); static SOC_ENUM_SINGLE_DECL(rvdj_enum, SAI_RXCR, 10, vdj_text); @@ -874,19 +927,75 @@ return 1; } +static int rockchip_sai_tx_lanes_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk_sai_dev *sai = snd_soc_component_get_drvdata(component); + + ucontrol->value.enumerated.item[0] = sai->tx_lanes; + + return 0; +} + +static int rockchip_sai_tx_lanes_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk_sai_dev *sai = snd_soc_component_get_drvdata(component); + int num; + + num = ucontrol->value.enumerated.item[0]; + if (num >= ARRAY_SIZE(tx_lanes_text)) + return -EINVAL; + + sai->tx_lanes = num; + + return 1; +} + +static int rockchip_sai_rx_lanes_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk_sai_dev *sai = snd_soc_component_get_drvdata(component); + + ucontrol->value.enumerated.item[0] = sai->rx_lanes; + + return 0; +} + +static int rockchip_sai_rx_lanes_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rk_sai_dev *sai = snd_soc_component_get_drvdata(component); + int num; + + num = ucontrol->value.enumerated.item[0]; + if (num >= ARRAY_SIZE(rx_lanes_text)) + return -EINVAL; + + sai->rx_lanes = num; + + return 1; +} + static DECLARE_TLV_DB_SCALE(fs_shift_tlv, 0, 8192, 0); static const struct snd_kcontrol_new rockchip_sai_controls[] = { SOC_ENUM("Transmit Edge Shift", tsft_enum), - SOC_ENUM("Transmit SDOx Select", tcsr_enum), + SOC_ENUM_EXT("Transmit SDOx Select", tx_lanes_enum, + rockchip_sai_tx_lanes_get, rockchip_sai_tx_lanes_put), SOC_ENUM("Transmit Store Justified Mode", tsjm_enum), SOC_ENUM("Transmit First Bit Mode", tfbm_enum), SOC_ENUM("Transmit Valid Data Justified", tvdj_enum), SOC_ENUM("Transmit Slot Bit Width", tsbw_enum), SOC_ENUM("Receive Edge Shift", rsft_enum), - SOC_ENUM("Receive SDIx Select", rcsr_enum), + SOC_ENUM_EXT("Receive SDIx Select", rx_lanes_enum, + rockchip_sai_rx_lanes_get, rockchip_sai_rx_lanes_put), SOC_ENUM("Receive Store Justified Mode", rsjm_enum), SOC_ENUM("Receive First Bit Mode", rfbm_enum), SOC_ENUM("Receive Valid Data Justified", rvdj_enum), @@ -966,6 +1075,50 @@ return IRQ_HANDLED; } +static int rockchip_sai_keep_clk_always_on(struct rk_sai_dev *sai) +{ + unsigned int mclk_rate, bclk_rate, div_bclk; + + sai->is_master_mode = true; + + /* init I2S fmt default */ + rockchip_sai_fmt_create(sai, SND_SOC_DAIFMT_I2S); + + regmap_update_bits(sai->regmap, SAI_FSCR, + SAI_FSCR_FW_MASK | + SAI_FSCR_FPW_MASK, + SAI_FSCR_FW(64) | + SAI_FSCR_FPW(32)); + + mclk_rate = clk_get_rate(sai->mclk); + bclk_rate = DEFAULT_FS * 64; + div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate); + + regmap_update_bits(sai->regmap, SAI_CKR, SAI_CKR_MDIV_MASK, + SAI_CKR_MDIV(div_bclk)); + + pm_runtime_forbid(sai->dev); + + dev_info(sai->dev, "CLK-ALWAYS-ON: mclk: %d, bclk: %d, fsync: %d\n", + mclk_rate, bclk_rate, DEFAULT_FS); + + return 0; +} + +static int rockchip_sai_parse_quirks(struct rk_sai_dev *sai) +{ + int ret = 0, i = 0; + + for (i = 0; i < ARRAY_SIZE(of_quirks); i++) + if (of_property_read_bool(sai->dev->of_node, of_quirks[i].quirk)) + sai->quirks |= of_quirks[i].id; + + if (sai->quirks & QUIRK_ALWAYS_ON) + ret = rockchip_sai_keep_clk_always_on(sai); + + return ret; +} + static int rockchip_sai_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; @@ -1022,13 +1175,13 @@ return PTR_ERR(sai->hclk); } - ret = clk_prepare_enable(sai->hclk); + ret = rockchip_sai_parse_quirks(sai); if (ret) return ret; pm_runtime_enable(&pdev->dev); if (!pm_runtime_enabled(&pdev->dev)) { - ret = sai_runtime_resume(&pdev->dev); + ret = rockchip_sai_runtime_resume(&pdev->dev); if (ret) goto err_runtime_disable; } @@ -1051,29 +1204,52 @@ err_runtime_suspend: if (!pm_runtime_status_suspended(&pdev->dev)) - sai_runtime_suspend(&pdev->dev); + rockchip_sai_runtime_suspend(&pdev->dev); err_runtime_disable: pm_runtime_disable(&pdev->dev); - clk_disable_unprepare(sai->hclk); return ret; } static int rockchip_sai_remove(struct platform_device *pdev) { - struct rk_sai_dev *sai = dev_get_drvdata(&pdev->dev); - pm_runtime_disable(&pdev->dev); if (!pm_runtime_status_suspended(&pdev->dev)) - sai_runtime_suspend(&pdev->dev); - - clk_disable_unprepare(sai->hclk); + rockchip_sai_runtime_suspend(&pdev->dev); return 0; } +#ifdef CONFIG_PM_SLEEP +static int rockchip_sai_suspend(struct device *dev) +{ + struct rk_sai_dev *sai = dev_get_drvdata(dev); + + regcache_mark_dirty(sai->regmap); + + return 0; +} + +static int rockchip_sai_resume(struct device *dev) +{ + struct rk_sai_dev *sai = dev_get_drvdata(dev); + int ret = pm_runtime_get_sync(dev); + + if (ret < 0) { + pm_runtime_put_noidle(dev); + return ret; + } + + ret = regcache_sync(sai->regmap); + pm_runtime_put(dev); + + return ret; +} +#endif /* CONFIG_PM_SLEEP */ + static const struct dev_pm_ops rockchip_sai_pm_ops = { - SET_RUNTIME_PM_OPS(sai_runtime_suspend, sai_runtime_resume, NULL) + SET_RUNTIME_PM_OPS(rockchip_sai_runtime_suspend, rockchip_sai_runtime_resume, NULL) + SET_SYSTEM_SLEEP_PM_OPS(rockchip_sai_suspend, rockchip_sai_resume) }; static struct platform_driver rockchip_sai_driver = { diff --git a/kernel/sound/soc/rockchip/rockchip_spdif.c b/kernel/sound/soc/rockchip/rockchip_spdif.c index e8b6a2e..80a2df2 100644 --- a/kernel/sound/soc/rockchip/rockchip_spdif.c +++ b/kernel/sound/soc/rockchip/rockchip_spdif.c @@ -20,6 +20,7 @@ #include <linux/mfd/syscon.h> #include <linux/regmap.h> #include <sound/pcm_params.h> +#include <sound/pcm_iec958.h> #include <sound/dmaengine_pcm.h> #include "rockchip_spdif.h" @@ -31,7 +32,25 @@ RK_SPDIF_RK3366, }; -#define RK3288_GRF_SOC_CON2 0x24c +/* + * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | + * CS0: | Mode | d | c | b | a | + * CS1: | Category Code | + * CS2: | Channel Number | Source Number | + * CS3: | Clock Accuracy | Sample Freq | + * CS4: | Ori Sample Freq | Word Length | + * CS5: | | CGMS-A | + * CS6~CS23: Reserved + * + * a: use of channel status block + * b: linear PCM identification: 0 for lpcm, 1 for nlpcm + * c: copyright information + * d: additional format information + */ +#define CS_BYTE 6 +#define CS_FRAME(c) ((c) << 16 | (c)) + +#define RK3288_GRF_SOC_CON2 0x24c struct rk_spdif_dev { struct device *dev; @@ -114,7 +133,19 @@ struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai); unsigned int val = SPDIF_CFGR_HALFWORD_ENABLE; int srate, mclk; - int ret; + int ret, i; + u8 cs[CS_BYTE]; + u16 *fc = (u16 *)cs; + + ret = snd_pcm_create_iec958_consumer_hw_params(params, cs, sizeof(cs)); + if (ret < 0) + return ret; + + for (i = 0; i < CS_BYTE / 2; i++) + regmap_write(spdif->regmap, SPDIF_CHNSRn(i), CS_FRAME(fc[i])); + + regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CSE_MASK, + SPDIF_CFGR_CSE_EN); srate = params_rate(params); mclk = srate * 128; @@ -128,6 +159,11 @@ break; case SNDRV_PCM_FORMAT_S24_LE: val |= SPDIF_CFGR_VDW_24; + val |= SPDIF_CFGR_ADJ_RIGHT_J; + break; + case SNDRV_PCM_FORMAT_S32_LE: + val |= SPDIF_CFGR_VDW_24; + val |= SPDIF_CFGR_ADJ_LEFT_J; break; default: return -EINVAL; @@ -141,10 +177,14 @@ return ret; } + regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CLR_MASK, + SPDIF_CFGR_CLR_EN); + udelay(1); ret = regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CLK_DIV_MASK | SPDIF_CFGR_HALFWORD_ENABLE | - SDPIF_CFGR_VDW_MASK, val); + SDPIF_CFGR_VDW_MASK | + SPDIF_CFGR_ADJ_MASK, val); return ret; } @@ -214,14 +254,11 @@ .stream_name = "Playback", .channels_min = 2, .channels_max = 2, - .rates = (SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000), + .rates = SNDRV_PCM_RATE_8000_192000, .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | - SNDRV_PCM_FMTBIT_S24_LE), + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S32_LE), }, .ops = &rk_spdif_dai_ops, }; @@ -238,6 +275,9 @@ case SPDIF_INTCR: case SPDIF_XFER: case SPDIF_SMPDR: + case SPDIF_VLDFRn(0) ... SPDIF_VLDFRn(11): + case SPDIF_USRDRn(0) ... SPDIF_USRDRn(11): + case SPDIF_CHNSRn(0) ... SPDIF_CHNSRn(11): return true; default: return false; @@ -253,6 +293,9 @@ case SPDIF_INTSR: case SPDIF_XFER: case SPDIF_SMPDR: + case SPDIF_VLDFRn(0) ... SPDIF_VLDFRn(11): + case SPDIF_USRDRn(0) ... SPDIF_USRDRn(11): + case SPDIF_CHNSRn(0) ... SPDIF_CHNSRn(11): return true; default: return false; @@ -275,7 +318,7 @@ .reg_bits = 32, .reg_stride = 4, .val_bits = 32, - .max_register = SPDIF_SMPDR, + .max_register = SPDIF_VERSION, .writeable_reg = rk_spdif_wr_reg, .readable_reg = rk_spdif_rd_reg, .volatile_reg = rk_spdif_volatile_reg, diff --git a/kernel/sound/soc/rockchip/rockchip_spdif.h b/kernel/sound/soc/rockchip/rockchip_spdif.h index 3ef1277..18dca7e 100644 --- a/kernel/sound/soc/rockchip/rockchip_spdif.h +++ b/kernel/sound/soc/rockchip/rockchip_spdif.h @@ -20,6 +20,18 @@ #define SPDIF_CFGR_CLK_DIV_MASK (0xff << SPDIF_CFGR_CLK_DIV_SHIFT) #define SPDIF_CFGR_CLK_DIV(x) (x << SPDIF_CFGR_CLK_DIV_SHIFT) +#define SPDIF_CFGR_CLR_MASK BIT(7) +#define SPDIF_CFGR_CLR_EN BIT(7) +#define SPDIF_CFGR_CLR_DIS 0 + +#define SPDIF_CFGR_CSE_MASK BIT(6) +#define SPDIF_CFGR_CSE_EN BIT(6) +#define SPDIF_CFGR_CSE_DIS 0 + +#define SPDIF_CFGR_ADJ_MASK BIT(3) +#define SPDIF_CFGR_ADJ_LEFT_J BIT(3) +#define SPDIF_CFGR_ADJ_RIGHT_J 0 + #define SPDIF_CFGR_HALFWORD_SHIFT 2 #define SPDIF_CFGR_HALFWORD_DISABLE (0 << SPDIF_CFGR_HALFWORD_SHIFT) #define SPDIF_CFGR_HALFWORD_ENABLE (1 << SPDIF_CFGR_HALFWORD_SHIFT) @@ -59,5 +71,9 @@ #define SPDIF_INTSR (0x0010) #define SPDIF_XFER (0x0018) #define SPDIF_SMPDR (0x0020) +#define SPDIF_VLDFRn(x) (0x0060 + (x) * 4) +#define SPDIF_USRDRn(x) (0x0090 + (x) * 4) +#define SPDIF_CHNSRn(x) (0x00c0 + (x) * 4) +#define SPDIF_VERSION (0x01c0) #endif /* _ROCKCHIP_SPDIF_H */ diff --git a/kernel/tools/lib/traceevent/Makefile b/kernel/tools/lib/traceevent/Makefile index 05f8a0f..b7f7e4e 100644 --- a/kernel/tools/lib/traceevent/Makefile +++ b/kernel/tools/lib/traceevent/Makefile @@ -263,7 +263,7 @@ xargs echo "U w W" | tr 'w ' 'W\n' | sort -u | xargs echo`;\ if [ "$$symbol_type" = "U W" ];then \ (echo '{'; \ - $(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u;\ + $(NM) -u -D $1 | awk 'NF>1 {sub("@.*", "", $$2); print "\t"$$2";"}' | sort -u;\ echo '};'; \ ) > $2; \ else \ diff --git a/kernel/tools/perf/bench/bench.h b/kernel/tools/perf/bench/bench.h index 6c9fcd7..b3e418a 100644 --- a/kernel/tools/perf/bench/bench.h +++ b/kernel/tools/perf/bench/bench.h @@ -2,6 +2,10 @@ #ifndef BENCH_H #define BENCH_H +#include <sys/time.h> + +extern struct timeval bench__start, bench__end, bench__runtime; + /* * The madvise transparent hugepage constants were added in glibc * 2.13. For compatibility with older versions of glibc, define these diff --git a/kernel/tools/perf/bench/futex-hash.c b/kernel/tools/perf/bench/futex-hash.c index 9aa3a67..ee9b280 100644 --- a/kernel/tools/perf/bench/futex-hash.c +++ b/kernel/tools/perf/bench/futex-hash.c @@ -35,7 +35,7 @@ static bool fshared = false, done = false, silent = false; static int futex_flag = 0; -struct timeval start, end, runtime; +struct timeval bench__start, bench__end, bench__runtime; static pthread_mutex_t thread_lock; static unsigned int threads_starting; static struct stats throughput_stats; @@ -101,8 +101,8 @@ { /* inform all threads that we're done for the day */ done = true; - gettimeofday(&end, NULL); - timersub(&end, &start, &runtime); + gettimeofday(&bench__end, NULL); + timersub(&bench__end, &bench__start, &bench__runtime); } static void print_summary(void) @@ -112,7 +112,7 @@ printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), - (int) runtime.tv_sec); + (int)bench__runtime.tv_sec); } int bench_futex_hash(int argc, const char **argv) @@ -159,7 +159,7 @@ threads_starting = nthreads; pthread_attr_init(&thread_attr); - gettimeofday(&start, NULL); + gettimeofday(&bench__start, NULL); for (i = 0; i < nthreads; i++) { worker[i].tid = i; worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex)); @@ -202,7 +202,7 @@ pthread_mutex_destroy(&thread_lock); for (i = 0; i < nthreads; i++) { - unsigned long t = worker[i].ops/runtime.tv_sec; + unsigned long t = worker[i].ops / bench__runtime.tv_sec; update_stats(&throughput_stats, t); if (!silent) { if (nfutexes == 1) diff --git a/kernel/tools/perf/bench/futex-lock-pi.c b/kernel/tools/perf/bench/futex-lock-pi.c index 8e9c475..017609a 100644 --- a/kernel/tools/perf/bench/futex-lock-pi.c +++ b/kernel/tools/perf/bench/futex-lock-pi.c @@ -35,7 +35,6 @@ static bool done = false, fshared = false; static unsigned int nthreads = 0; static int futex_flag = 0; -struct timeval start, end, runtime; static pthread_mutex_t thread_lock; static unsigned int threads_starting; static struct stats throughput_stats; @@ -62,7 +61,7 @@ printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), - (int) runtime.tv_sec); + (int)bench__runtime.tv_sec); } static void toggle_done(int sig __maybe_unused, @@ -71,8 +70,8 @@ { /* inform all threads that we're done for the day */ done = true; - gettimeofday(&end, NULL); - timersub(&end, &start, &runtime); + gettimeofday(&bench__end, NULL); + timersub(&bench__end, &bench__start, &bench__runtime); } static void *workerfn(void *arg) @@ -183,7 +182,7 @@ threads_starting = nthreads; pthread_attr_init(&thread_attr); - gettimeofday(&start, NULL); + gettimeofday(&bench__start, NULL); create_threads(worker, thread_attr, cpu); pthread_attr_destroy(&thread_attr); @@ -209,7 +208,7 @@ pthread_mutex_destroy(&thread_lock); for (i = 0; i < nthreads; i++) { - unsigned long t = worker[i].ops/runtime.tv_sec; + unsigned long t = worker[i].ops / bench__runtime.tv_sec; update_stats(&throughput_stats, t); if (!silent) diff --git a/kernel/tools/perf/bench/sched-messaging.c b/kernel/tools/perf/bench/sched-messaging.c index f9d7641..a5d30b2 100644 --- a/kernel/tools/perf/bench/sched-messaging.c +++ b/kernel/tools/perf/bench/sched-messaging.c @@ -69,11 +69,10 @@ /* Block until we're ready to go */ static void ready(int ready_out, int wakefd) { - char dummy; struct pollfd pollfd = { .fd = wakefd, .events = POLLIN }; /* Tell them we're ready. */ - if (write(ready_out, &dummy, 1) != 1) + if (write(ready_out, "R", 1) != 1) err(EXIT_FAILURE, "CLIENT: ready write"); /* Wait for "GO" signal */ @@ -88,6 +87,7 @@ unsigned int i, j; ready(ctx->ready_out, ctx->wakefd); + memset(data, 'S', sizeof(data)); /* Now pump to every receiver. */ for (i = 0; i < nr_loops; i++) { diff --git a/kernel/tools/perf/tests/bp_account.c b/kernel/tools/perf/tests/bp_account.c index a20cbc4..624e4ef 100644 --- a/kernel/tools/perf/tests/bp_account.c +++ b/kernel/tools/perf/tests/bp_account.c @@ -22,7 +22,7 @@ #include "perf.h" #include "cloexec.h" -volatile long the_var; +static volatile long the_var; static noinline int test_function(void) { diff --git a/kernel/tools/perf/util/parse-events.c b/kernel/tools/perf/util/parse-events.c index 0eff0c3..601f51a 100644 --- a/kernel/tools/perf/util/parse-events.c +++ b/kernel/tools/perf/util/parse-events.c @@ -223,21 +223,15 @@ path = zalloc(sizeof(*path)); if (!path) return NULL; - path->system = malloc(MAX_EVENT_LENGTH); - if (!path->system) { + if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) { free(path); return NULL; } - path->name = malloc(MAX_EVENT_LENGTH); - if (!path->name) { + if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) { zfree(&path->system); free(path); return NULL; } - strncpy(path->system, sys_dirent->d_name, - MAX_EVENT_LENGTH); - strncpy(path->name, evt_dirent->d_name, - MAX_EVENT_LENGTH); return path; } } @@ -1312,7 +1306,6 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, char *str, struct list_head **listp) { - struct list_head *head; struct parse_events_term *term; struct list_head *list; struct perf_pmu *pmu = NULL; @@ -1329,19 +1322,30 @@ list_for_each_entry(alias, &pmu->aliases, list) { if (!strcasecmp(alias->name, str)) { + struct list_head *head; + char *config; + head = malloc(sizeof(struct list_head)); if (!head) return -1; INIT_LIST_HEAD(head); - if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - str, 1, false, &str, NULL) < 0) + config = strdup(str); + if (!config) return -1; + if (parse_events_term__num(&term, + PARSE_EVENTS__TERM_TYPE_USER, + config, 1, false, &config, + NULL) < 0) { + free(list); + free(config); + return -1; + } list_add_tail(&term->list, head); if (!parse_events_add_pmu(parse_state, list, pmu->name, head, true, true)) { - pr_debug("%s -> %s/%s/\n", str, + pr_debug("%s -> %s/%s/\n", config, pmu->name, alias->str); ok++; } @@ -1350,8 +1354,10 @@ } } } - if (!ok) + if (!ok) { + free(list); return -1; + } *listp = list; return 0; } @@ -2625,30 +2631,51 @@ char *config, unsigned idx) { struct event_symbol *sym; + char *str; struct parse_events_term temp = { .type_val = PARSE_EVENTS__TERM_TYPE_STR, .type_term = PARSE_EVENTS__TERM_TYPE_USER, - .config = config ?: (char *) "event", + .config = config, }; + if (!temp.config) { + temp.config = strdup("event"); + if (!temp.config) + return -ENOMEM; + } BUG_ON(idx >= PERF_COUNT_HW_MAX); sym = &event_symbols_hw[idx]; - return new_term(term, &temp, (char *) sym->symbol, 0); + str = strdup(sym->symbol); + if (!str) + return -ENOMEM; + return new_term(term, &temp, str, 0); } int parse_events_term__clone(struct parse_events_term **new, struct parse_events_term *term) { + char *str; struct parse_events_term temp = { .type_val = term->type_val, .type_term = term->type_term, - .config = term->config, + .config = NULL, .err_term = term->err_term, .err_val = term->err_val, }; - return new_term(new, &temp, term->val.str, term->val.num); + if (term->config) { + temp.config = strdup(term->config); + if (!temp.config) + return -ENOMEM; + } + if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) + return new_term(new, &temp, NULL, term->val.num); + + str = strdup(term->val.str); + if (!str) + return -ENOMEM; + return new_term(new, &temp, str, 0); } int parse_events_copy_term_list(struct list_head *old, diff --git a/kernel/tools/perf/util/parse-events.y b/kernel/tools/perf/util/parse-events.y index 8d7578b..12ca88b 100644 --- a/kernel/tools/perf/util/parse-events.y +++ b/kernel/tools/perf/util/parse-events.y @@ -636,9 +636,11 @@ PE_DRV_CFG_TERM { struct parse_events_term *term; + char *config = strdup($1); + ABORT_ON(!config); ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, - $1, $1, &@1, NULL)); + config, $1, &@1, NULL)); $$ = term; } diff --git a/kernel/virt/kvm/arm/arch_timer.c b/kernel/virt/kvm/arm/arch_timer.c index 17cecc9..217d39f 100644 --- a/kernel/virt/kvm/arm/arch_timer.c +++ b/kernel/virt/kvm/arm/arch_timer.c @@ -67,7 +67,7 @@ static void soft_timer_start(struct hrtimer *hrt, u64 ns) { hrtimer_start(hrt, ktime_add_ns(ktime_get(), ns), - HRTIMER_MODE_ABS); + HRTIMER_MODE_ABS_HARD); } static void soft_timer_cancel(struct hrtimer *hrt, struct work_struct *work) @@ -638,10 +638,10 @@ vcpu_ptimer(vcpu)->cntvoff = 0; INIT_WORK(&timer->expired, kvm_timer_inject_irq_work); - hrtimer_init(&timer->bg_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + hrtimer_init(&timer->bg_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); timer->bg_timer.function = kvm_bg_timer_expire; - hrtimer_init(&timer->phys_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + hrtimer_init(&timer->phys_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); timer->phys_timer.function = kvm_phys_timer_expire; vtimer->irq.irq = default_vtimer_irq.irq; diff --git a/kernel/virt/kvm/arm/arm.c b/kernel/virt/kvm/arm/arm.c index b943ec5..ddc6db1 100644 --- a/kernel/virt/kvm/arm/arm.c +++ b/kernel/virt/kvm/arm/arm.c @@ -725,7 +725,7 @@ * involves poking the GIC, which must be done in a * non-preemptible context. */ - preempt_disable(); + migrate_disable(); kvm_pmu_flush_hwstate(vcpu); @@ -774,7 +774,7 @@ kvm_timer_sync_hwstate(vcpu); kvm_vgic_sync_hwstate(vcpu); local_irq_enable(); - preempt_enable(); + migrate_enable(); continue; } @@ -852,7 +852,7 @@ /* Exit types that need handling before we can be preempted */ handle_exit_early(vcpu, run, ret); - preempt_enable(); + migrate_enable(); ret = handle_exit(vcpu, run, ret); } -- Gitblit v1.6.2