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